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