POWRÓT NA STRONĘ SZKOŁY

Typy połączeń

Na tych zajęciach podsumujemy i utrwalimy stosowanie różnych typów połączeń tabel. W tym celu, utworzymy bardzo prostą bazę szkola, składającą się z dwóch bardzo prostych tabel uczniowie oraz klasy, a następnie przetestujemy podstawowe typy połączeń.

tabele bazy szkola
Tabele bazy danych szkola

Ćwiczenie 4_2_5_1. Utworzenie bazy danych szkola

Zastosuj polecenie SQL:
CREATE DATABASE szkola DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Utworzenie bazy danych szkola
Rysunek 4_2_5_1. Utworzenie bazy danych szkola

Ćwiczenie 4_2_5_2. Utworzenie tabel bazy danych szkola

Zastosuj polecenie SQL:

CREATE TABLE uczniowie
(
  id_uczen INT UNSIGNED NOT NULL PRIMARY KEY,
  nazwisko CHAR(50) NOT NULL
);          
CREATE TABLE klasy
(
  id_uczen INT UNSIGNED,
  klasa CHAR(20)
);
Utworzenie tabel bazy danych szkola
Rysunek 4_2_5_2. Utworzenie tabel bazy danych szkola

Ćwiczenie 4_2_5_3. Wypełnienie tabel danymi

Zastosuj polecenie SQL:

INSERT INTO uczniowie VALUES
  (1, 'Mądry'),
  (2, 'Zdolny'),
  (3, 'Pracowity'),
  (4, 'Zaradny'),
  (5, 'Ambitny');

INSERT INTO klasy VALUES
  (2, '1 A'),
  (4, '1 A'),
  (5, '2 B');
Tabela uczniowie
Rysunek 4_2_5_4. Tabela uczniowie
Tabela klasy
Rysunek 4_2_5_5. Tabela klasy

Ćwiczenie 4_2_5_4. Połączenie inner join

Jest to najprostsze połączenie. Umożliwia pobrać wszystkie rekordy z tabeli A mające odpowiedniki w tabeli B. Mówiąc inaczej, pobierana jest część wspólna tych tabel. Klauzula pozwala na łączenie 2 lub więcej tabel. W naszym przykładzie elementem wspólnym tabel, na podstawie którego wykonywane jest porównywanie jest "id_uczen". Zastosuj następujące zapytanie SQL:

SELECT * FROM uczniowie
  INNER JOIN klasy
  ON uczniowie.id_uczen = klasy.id_uczen;
Połączenie inner join
Rysunek 4_2_5_6. Połączenie inner join

Identyczny efekt uzyskamy, stosując zapytanie:

SELECT * FROM uczniowie, klasy
  WHERE uczniowie.id_uczen = klasy.id_uczen;

Ćwiczenie 4_2_5_5. Połączenie equi-join

Jest to szczególny przypadek inner join, w którym do porównań używa się tylko znaków równości. Tak więc poprzedni przykład jest połączeniem typu equi-join. MySQL umożliwia dla equi-join, zastosowanie wersji skróconej:

SELECT * FROM uczniowie
  INNER JOIN klasy
  USING(id_uczen);
Połączenie equi-join
Rysunek 4_2_5_7. Połączenie equi-join

Ćwiczenie 4_2_5_6. Połączenie left join

Jest to najczęstsze z używanych połączeń. Pozwala pobrać wszystkie rekordy z tabeli A wraz z odpowiadającymi im rekordami z tabeli B nawet wtedy, gdy w tabeli B nie ma odpowiedników dla rekordów z tabeli A.

SELECT * FROM uczniowie
LEFT JOIN klasy ON uczniowie.id_uczen = klasy.id_uczen;
Połączenie left join
Rysunek 4_2_5_8. Połączenie left join

Wiersze w których nie ma odpowiedników, zostały wypełnione wartościami NULL.

Ćwiczenie 4_2_5_7. Połączenie cross join

Jest to najciekawsze z połączeń. W wyniku daje wszystkie możliwe kombinacje rekordów z tabeli A z rekordami z tabeli B (iloczyn kartezjański). Należy o tym pamiętać, jeżeli chcielibyśmy wykonać takie połączenie dwóch dużych tabel. Liczba wyników jest iloczynem liczby rekordów tabeli A i liczby rekordów tabeli B. Równoznaczym typem połączenia, jest full join.

SELECT * FROM uczniowie
CROSS JOIN klasy;
Połączenie cross join
Rysunek 4_2_5_9. Połączenie cross join