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.