A KÜLSŐ CSATLAKOZÁS okai

Egyébként emlékszel arra, amikor összevontuk a táblázatainkat, és eltűntek az irodatakarítási feladataink, mert még nem volt takarító?

Ha lefuttat egy ilyen lekérdezést:

SELECT * FROM task

Akkor ezt az eredményt kapjuk:

id employee_id név határidő
1 1 Javítson ki egy hibát a kezelőfelületen 2022-06-01
2 2 Javítson ki egy hibát a háttérben 2022-06-15
3 5 Vegyél kávét 2022-07-01
4 5 Vegyél kávét 2022-08-01
5 5 Kávét fog venni 2022-09-01
6 (NULLA) Takarítsd ki az irodát (NULLA)
7 4 Élvezd az életet (NULLA)
8 6 Élvezd az életet (NULLA)

Az „Iroda törlése” feladat eltűnik, ha megpróbáljuk a feladattáblát az alkalmazotti táblával az alkalmazotti azonosítóval összekapcsolni.

A probléma megoldására a JOIN operátorhoz különféle módosítókat adtak, amelyek lehetővé teszik az ilyen árva sorok pár nélküli tárolását egy másik táblában.

Hadd emlékeztesselek a JOIN operátor klasszikus formájára:

table 1 JOIN table 2 ON condition

Megmondhatjuk az SQL Servernek, hogy győződjön meg arról, hogy a bal oldali tábla (tábla1) összes adata jelen van az egyesített táblában. Még akkor is, ha nincs nekik pár a megfelelő táblázatban. Ehhez csak annyit kell írnia:

table 1 LEFT JOIN table 2 ON condition

Ha azt szeretné, hogy az egyesített táblázat minden sora a megfelelő táblából legyen , akkor a következőt kell írnia:

table 1 RIGHT JOIN table 2 ON
 condition

Írjunk egy lekérdezést, amely egyesíti az összes feladatot és alkalmazottat, hogy a végrehajtó nélküli feladatok ne vesszenek el. Ehhez írjon egy lekérdezést:

SELECT * FROM employee e RIGHT JOIN task t ON e.id = t.emploee_id

És ennek a lekérdezésnek az eredménye:

id név Foglalkozása fizetés kor csatlakozás dátuma id employee_id név
1 Ivanov Iván Programozó 100 000 25 2012-06-30 1 1 Javítson ki egy hibát a kezelőfelületen
2 Petrov Petr Programozó 80000 23 2013-08-12 2 2 Javítson ki egy hibát a háttérben
4 Rabinovics Moisa Rendező 200 000 35 2015-05-12 7 4 Élvezd az életet
5 Kirienko Anasztázia Irodavezető 40000 25 2015-10-10 3 5 Vegyél kávét
5 Kirienko Anasztázia Irodavezető 40000 25 2015-10-10 4 5 Vegyél kávét
5 Kirienko Anasztázia Irodavezető 40000 25 2015-10-10 5 5 Vegyél kávét
6 Vaska macska 1000 3 2018-11-11 8 6 Élvezd az életet
(NULLA) (NULLA) (NULLA) (NULLA) (NULLA) (NULLA) 6 (NULLA) Takarítsd ki az irodát

Egy újabb sor került a táblázatunkba, és érdekes módon sok NULL érték van benne. Az alkalmazotti táblából vett összes adat NULL-ként jelenik meg, mivel az alkalmazotti táblából nem volt végrehajtó a „Tiszta iroda” feladathoz.

JOIN típusok

Összesen 4 fajta JOIN létezik. Ezeket az alábbi táblázat mutatja be:

Rövid bejegyzés hosszú belépő Magyarázat
1 CSATLAKOZIK BELSŐ ÖSSZEKAPCSOLÁS Csak az A és B táblázatban szereplő rekordok
2 BAL CSATLAKOZÁS BAL KÜLSŐ CSATLAKOZÁS Az A táblázat minden pár nélküli sorának lennie kell
3 JOBB CSATLAKOZÁS JOBB KÜLSŐ CSATLAKOZÁS A B táblázat összes pár nélküli sorának ilyennek kell lennie
4 KÜLSŐ CSATLAKOZÁS TELJES KÜLSŐ CSATLAKOZÁS Az A és B táblák bázispárjainak minden sorában szerepelnie kell

Az egyszerűség kedvéért, ha a táblázatokat halmazként ábrázoljuk, akkor a JOIN képként is megjeleníthető:

A beállított metszéspont azt jelenti, hogy az egyik táblához van egy másik tábla megfelelő rekordja, amelyre hivatkozik.

Kérdés az interjúból

Néha a kezdő programozókat egy nagyon egyszerű kérdéssel bombázzák az interjún. Táblázataink ismeretében a következőképpen fogalmazható meg:

"Írjon egy lekérdezést, amely megjeleníti azon alkalmazottak listáját, akiknek nincs feladata ." Először próbáljuk meg kicsit átfogalmazni ezt a kérdést: "Írjon egy lekérdezést, amely megjeleníti az alkalmazottak táblájából az összes olyan alkalmazott listáját, amelyhez nincs feladat a feladattáblázatban ." Meg kell szereznünk ezt a készletet:

Számos módja van ennek a problémának a megoldására, de a legegyszerűbbel kezdem: Először a tábláinkat egy LEFT JOIN-nal kapcsolhatja össze, majd a WHERE segítségével kizárhatja az összes olyan sort, amelynél a hiányzó adatok NULL-lal lettek kitöltve.

SELECT * FROM employee e LEFT JOIN task t ON e.id = t.emploee_id  
WHERE t.id IS NULL 

És ennek a lekérdezésnek az eredménye:

id név Foglalkozása fizetés kor csatlakozás dátuma id employee_id név
3 Ivanov Szergej Vizsgáló 40000 harminc 2014-01-01 (NULLA) (NULLA) (NULLA)

A megoldás egyetlen hátránya, hogy itt a táblázat sorai NULL-t tartalmaznak, és feltétel szerint meg kell jelenítenünk az alkalmazottak listáját.

Ehhez vagy ki kell listázni a SELECT-ben a munkavállalói tábla szükséges oszlopait, vagy ha mindet meg kell jeleníteni, akkor a következő konstrukciót írhatjuk:

SELECT e.* FROM employee e, task t 

A teljes kérelem így fog kinézni:

SELECT e.*  
FROM employee e RIGHT JOIN task t ON e.id = t.emploee_id  
WHERE t.id IS NULL 

ennek a lekérdezésnek az eredménye:

id név Foglalkozása fizetés kor csatlakozás dátuma
3 Ivanov Szergej Vizsgáló 40000 harminc 2014-01-01

A többi módszert rád bízzuk a házi feladatra. Nem akarlak megfosztani attól az örömtől, hogy magad találd meg őket.