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ő:
![](https://cdn.codegym.cc/images/article/66aba568-a02a-45e0-9939-6beebbb190ed/512.jpeg)
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:![](https://cdn.codegym.cc/images/article/d3cc4f4a-b340-4b3a-9ae0-3e38eca36bb2/512.jpeg)
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.
GO TO FULL VERSION