Az allekérdezés egy táblát ad vissza
És végül, a harmadik lehetőség az, amikor az allekérdezés a teljes táblát adja vissza. Ez a leggyakoribb lehetőség.
Nagyon gyakran vannak olyan helyzetek, amikor egy bizonyos táblázatot szeretnénk egy kicsit módosítani. És csak ezután csatlakoztassa (a JOIN ON operátor segítségével) a javított táblát egy másikkal.
Kezdjük a legegyszerűbb esettel, ahol két táblát JOIN-al kapcsoltunk össze:
SELECT * FROM employee e JOIN task t ON e.id = t.emploee_id
És amint valószínűleg emlékszel, vannak olyan feladatok a feladattáblázatban , amelyek nincsenek hozzárendelve senkihez: az alkalmazott_azonosítója NULL .
Készítsünk egy javított táblázatot , ahol az összes függő feladatot a rendezőhöz rendeljük (azonosítója = 4).
Ehhez az IFNULL() függvényt használjuk :
SELECT id, IFNULL(employee_id, 4) AS employee_id, name, deadline FROM task
És ennek a lekérdezésnek az eredménye:
id | munkavállalói azonosító | 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 | Vegyél kávét | 2022-09-01 |
6 | 4 | Takarítsd ki az irodát | (NULLA) |
7 | 4 | Élvezd az életet | (NULLA) |
8 | 6 | Élvezd az életet | (NULLA) |
A javított cella pirossal van jelölve.
Most cseréljük be a javított táblázatunkat a lekérdezésbe:
SELECT * FROM employee e JOIN task t ON e.id = t.emploee_id
A feladattábla helyett .
Egy ilyen kérés valahogy így nézne ki:
SELECT * FROM employee e JOIN (
SELECT id, IFNULL(employee_id, 4) AS employee_id, name, deadline
FROM task
) t ON e.id = t.emploee_id
A feladat szó helyett zárójelet írtunk, és ebbe helyeztük el a kérés törzsét.
Egyébként a beágyazott lekérdezés alias t (alias) nagyon hasznos volt. A beágyazott lekérdezésnek a táblákkal ellentétben nincs saját neve, ezért az álnév nagyon nem a helyén van.
És itt van egy ilyen lekérdezés eredménye:
id | név | Foglalkozása | fizetés | kor | csatlakozás dátuma | id | munkavállalói azonosító | 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 | 6 | 4 | Takarítsd ki az irodát |
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 | 4 | 5 | Vegyél kávét |
5 | Kirienko Anasztázia | Irodavezető | 40000 | 25 | 2015-10-10 | 5 | 5 | Vegyél kávét |
5 | Kirienko Anasztázia | Irodavezető | 40000 | 25 | 2015-10-10 | 3 | 5 | Vegyél kávét |
6 | Vaska | macska | 1000 | 3 | 2018-11-11 | 8 | 6 | Élvezd az életet |
Igazgatónknak az a feladata, hogy "takarítsa ki az irodát", szerintem gyorsan talál valakit, akit delegálhat :) A WITH utasítással
Mellesleg, a MySQL 8-as verziójától kezdve már nem kell minden segédlekérdezést közvetlenül a végső lekérdezésbe helyeznie. Külön-külön is végrehajthatók. Ehhez a WITH utasítást használjuk .
Lehetővé teszi egy virtuális tábla (lekérdezés nevű) létrehozását, amelynek megjelenését egy sablon adja meg:
WITH Name AS (request)
Gyakran előfordul, hogy a lekérdezés névtelen oszlopokat tartalmaz, például COUNT(*), amelyekhez nem rendelt egyedi nevet. Ebben az esetben a WITH utasításnak lehetősége van új oszlopneveket megadni az allekérdezéshez.
Második formáját a sablon adja:
WITH Name(column1, column2, …) AS (request)
Annyi virtuális táblát (elnevezett lekérdezést) használhat, amennyit csak akar, és hivatkozhat bennük egymásra. Kérésének általános formája a következő lesz:
WITH name1 AS (request1),
name2 AS (request2),
name3 AS (request3)
SELECT * FROM name1 JOIN name2 ON …
Vegyük most ijesztő kérdésünket:
SELECT * FROM employee e JOIN (
SELECT id, IFNULL(employee_id, 4) AS employee_id, name, deadline
FROM task
) t ON e.id = t.emploee_id
És írd át a WITH utasítással:
WITH task2(id, employee_id, name, deadline)
AS (SELECT id, IFNULL(employee_id, 4), name, deadline FROM task)
SELECT * FROM employee e JOIN task2 t ON e.id = t.emploee_id
Vagy megteheti oszlopnevek nélkül is, de akkor meg kell adnia egy álnevet az IFNULL() függvényhez:
WITH task2 AS (
SELECT id, IFNULL(employee_id, 4) AS employee_id, name, deadline FROM task
)
SELECT * FROM employee e JOIN task2 t ON e.id = t.emploee_id
GO TO FULL VERSION