Powody DOŁĄCZENIA ZEWNĘTRZNEGO
Nawiasem mówiąc, pamiętasz, kiedy połączyliśmy nasze arkusze kalkulacyjne i nasze zadania związane ze sprzątaniem biura zniknęły, ponieważ nie było jeszcze sprzątacza?
Jeśli uruchomisz takie zapytanie:
SELECT * FROM task
Otrzymujemy wtedy taki wynik:
ID | identyfikator_pracownika | nazwa | termin ostateczny |
---|---|---|---|
1 | 1 | Napraw błąd w interfejsie użytkownika | 2022-06-01 |
2 | 2 | Napraw błąd w backendzie | 2022-06-15 |
3 | 5 | Kup kawę | 2022-07-01 |
4 | 5 | Kup kawę | 2022-08-01 |
5 | 5 | Kupię kawę | 2022-09-01 |
6 | (ZERO) | Posprzątaj biuro | (ZERO) |
7 | 4 | Ciesz się życiem | (ZERO) |
8 | 6 | Ciesz się życiem | (ZERO) |
Zadanie „Wyczyść biuro” znika, jeśli spróbujemy połączyć tabelę zadań z tabelą pracowników przez id_pracownika.
Aby rozwiązać ten problem, do operatora JOIN dodano różne modyfikatory, które umożliwiają przechowywanie takich osieroconych wierszy bez pary w innej tabeli.
Przypomnę klasyczną postać operatora JOIN:
table 1 JOIN table 2 ON condition
Możemy powiedzieć SQL Serverowi, aby upewnił się, że wszystkie dane z lewej tabeli (tabela1) są obecne w połączonej tabeli. Nawet jeśli nie ma dla nich pary w prawym stoliku. Aby to zrobić, wystarczy napisać:
table 1 LEFT JOIN table 2 ON condition
Jeśli chcesz, aby połączona tabela zawierała wszystkie wiersze z prawej tabeli , musisz napisać:
table 1 RIGHT JOIN table 2 ON
condition
Napiszmy zapytanie, które połączy wszystkie zadania i pracowników, aby zadania bez executora nie przepadły. W tym celu napisz zapytanie:
SELECT * FROM employee e RIGHT JOIN task t ON e.id = t.emploee_id
I wynik tego zapytania:
ID | nazwa | zawód | wynagrodzenie | wiek | data_dołączenia | ID | identyfikator_pracownika | nazwa |
---|---|---|---|---|---|---|---|---|
1 | Iwanow Iwan | Programista | 100000 | 25 | 2012-06-30 | 1 | 1 | Napraw błąd w interfejsie użytkownika |
2 | Pietrow Pietr | Programista | 80000 | 23 | 2013-08-12 | 2 | 2 | Napraw błąd w backendzie |
4 | Rabinowicz Mojsza | Dyrektor | 200000 | 35 | 2015-05-12 | 7 | 4 | Ciesz się życiem |
5 | Kirienko Anastazja | Kierownik biura | 40000 | 25 | 2015-10-10 | 3 | 5 | Kup kawę |
5 | Kirienko Anastazja | Kierownik biura | 40000 | 25 | 2015-10-10 | 4 | 5 | Kup kawę |
5 | Kirienko Anastazja | Kierownik biura | 40000 | 25 | 2015-10-10 | 5 | 5 | Kup kawę |
6 | Vaska | kot | 1000 | 3 | 2018-11-11 | 8 | 6 | Ciesz się życiem |
(ZERO) | (ZERO) | (ZERO) | (ZERO) | (ZERO) | (ZERO) | 6 | (ZERO) | Posprzątaj biuro |
Do naszej tabeli dołączył kolejny wiersz i co ciekawe jest w nim sporo wartości NULL. Wszystkie dane pobrane z tabeli pracowników są wyświetlane jako NULL, ponieważ z tabeli pracowników nie było executora dla zadania „Czyszczenie biura”.
typy DOŁĄCZ
W sumie są 4 rodzaje JOINów. Przedstawiono je w poniższej tabeli:
Krótki wpis | długi wpis | Wyjaśnienie | |
---|---|---|---|
1 | DOŁĄCZYĆ | POŁĄCZENIE WEWNĘTRZNE | Tylko rekordy znajdujące się w tabelach A i B |
2 | LEWY DOŁĄCZ | LEWE DOŁĄCZENIE ZEWNĘTRZNE | Wszystkie wiersze bez pary z tabeli A muszą być |
3 | PRAWO DOŁĄCZ | PRAWE ŁĄCZENIE ZEWNĘTRZNE | Wszystkie wiersze bez pary z tabeli B muszą być |
4 | POŁĄCZENIE ZEWNĘTRZNE | PEŁNE POŁĄCZENIE ZEWNĘTRZNE | Wszystkie rzędy par zasad z tabel A i B muszą być |
Dla uproszczenia, jeśli przedstawiamy tabele jako zestawy, wówczas JOIN można wyświetlić jako obraz:

Przecięcie zestawu oznacza, że dla jednej tabeli istnieje odpowiedni rekord z innej tabeli, do której się odnosi.
Pytanie z wywiadu
Czasami początkujący programiści są bombardowani bardzo prostym pytaniem podczas rozmowy kwalifikacyjnej. Biorąc pod uwagę nasze tabele, można go sformułować w następujący sposób:
„Napisz zapytanie, które wyświetli listę wszystkich pracowników, dla których nie ma zadań .” Najpierw spróbujmy nieco przeformułować to pytanie: „Napisz zapytanie, które wyświetli listę wszystkich pracowników z tabeli pracowników, dla których nie ma zadań w tabeli zadań ”. Musimy zdobyć ten zestaw:
Istnieje wiele sposobów rozwiązania tego problemu, ale zacznę od najprostszego: po pierwsze, możesz połączyć nasze tabele LEFT JOIN, a następnie użyć WHERE, aby wykluczyć wszystkie wiersze, dla których brakujące dane zostały uzupełnione wartościami NULL.
SELECT * FROM employee e LEFT JOIN task t ON e.id = t.emploee_id WHERE t.id IS NULL
I wynik tego zapytania:
ID | nazwa | zawód | wynagrodzenie | wiek | data_dołączenia | ID | identyfikator_pracownika | nazwa |
---|---|---|---|---|---|---|---|---|
3 | Iwanow Siergiej | Próbnik | 40000 | trzydzieści | 2014-01-01 | (ZERO) | (ZERO) | (ZERO) |
Jedyną wadą tego rozwiązania jest to, że tutaj wiersze w tabeli zawierają NULL, a pod warunkiem musimy wyświetlić listę pracowników.
Aby to zrobić, musisz albo wyświetlić wymagane kolumny tabeli pracowników w SELECT, albo jeśli chcesz wyświetlić je wszystkie, możesz napisać następującą konstrukcję:
SELECT e.* FROM employee e, task t
Kompletne żądanie będzie wyglądać następująco:
SELECT e.* FROM employee e RIGHT JOIN task t ON e.id = t.emploee_id WHERE t.id IS NULL
wynik tego zapytania:
ID | nazwa | zawód | wynagrodzenie | wiek | data_dołączenia |
---|---|---|---|---|---|
3 | Iwanow Siergiej | Próbnik | 40000 | trzydzieści | 2014-01-01 |
Resztę metod pozostawiamy do pracy domowej. Nie chcę pozbawić Cię przyjemności samodzielnego ich odnalezienia.
GO TO FULL VERSION