Nagbabalik ng talahanayan ang Subquery

At sa wakas, ang pangatlong opsyon ay kapag ibinalik ng subquery ang buong talahanayan. Ito ang pinakakaraniwang opsyon.

Kadalasan mayroong mga sitwasyon kung kailan gusto nating mag-tweak ng kaunti sa isang tiyak na talahanayan. At pagkatapos lamang sumali (gamit ang JOIN ON operator) ang naitama na talahanayan sa isa pa.

Magsimula tayo sa pinakasimpleng kaso, kung saan pinagsama natin ang dalawang talahanayan na may JOIN:

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

At sa malamang naaalala mo, may mga gawain sa talahanayan ng gawain na hindi itinalaga sa sinuman: employee_id is NULL .

Bumuo tayo ng isang naitama na talahanayan , kung saan itinalaga natin ang lahat ng nakabitin na gawain sa direktor (kanyang ID = 4).

Upang gawin ito, ginagamit namin ang function na IFNULL() :

SELECT id, IFNULL(employee_id, 4) AS employee_id, name, deadline FROM task 

At ang resulta ng query na ito:

id employee_id pangalan deadline
1 1 Ayusin ang isang bug sa frontend 2022-06-01
2 2 Ayusin ang isang bug sa backend 2022-06-15
3 5 Bumili ng kape 2022-07-01
4 5 Bumili ng kape 2022-08-01
5 5 Bumili ng kape 2022-09-01
6 4 Linisin ang opisina (WALA)
7 4 Masiyahan sa buhay (WALA)
8 6 Masiyahan sa buhay (WALA)

Ang naitama na cell ay minarkahan ng pula.

Ngayon ay palitan natin ang aming naitama na talahanayan sa query:

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

Sa halip na ang talahanayan ng gawain .

Ang ganitong kahilingan ay magmumukhang ganito:

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

Sa halip na ang salitang gawain , nagsulat kami ng mga panaklong at inilagay ang katawan ng kahilingan sa mga ito.

Sa pamamagitan ng paraan, ang alias t (alias) para sa nested query ay lubhang kapaki-pakinabang. Ang isang nested query, hindi tulad ng isang table, ay walang sariling pangalan, kaya ang alias ay napaka-out of place.

At narito ang resulta ng naturang query:

id pangalan hanapbuhay suweldo edad Sumali sa date id employee_id pangalan
1 Ivanov Ivan Programmer 100000 25 2012-06-30 1 1 Ayusin ang isang bug sa frontend
2 Petrov Petr Programmer 80000 23 2013-08-12 2 2 Ayusin ang isang bug sa backend
4 Rabinovich Moisha Direktor 200000 35 2015-05-12 6 4 Linisin ang opisina
4 Rabinovich Moisha Direktor 200000 35 2015-05-12 7 4 Masiyahan sa buhay
5 Kirienko Anastasia Tagapamahala ng Opisina 40000 25 2015-10-10 4 5 Bumili ng kape
5 Kirienko Anastasia Tagapamahala ng Opisina 40000 25 2015-10-10 5 5 Bumili ng kape
5 Kirienko Anastasia Tagapamahala ng Opisina 40000 25 2015-10-10 3 5 Bumili ng kape
6 Vaska pusa 1000 3 2018-11-11 8 6 Masiyahan sa buhay

Ang aming direktor ay may tungkulin na "maglinis ng opisina", sa palagay ko ay mabilis siyang makakahanap ng isang taong delegado nito :) Gamit ang WITH operator

Siyanga pala, simula sa bersyon 8 ng MySQL, hindi mo na kailangang ilagay ang lahat ng iyong mga subquery sa loob mismo ng huling query. Maaari silang isagawa nang hiwalay. Para dito, ginagamit ang WITH statement .

Pinapayagan ka nitong lumikha ng isang virtual na talahanayan (pinangalanang query) at ang hitsura nito ay ibinibigay ng isang template:

WITH Name AS (request) 

Kadalasan mayroong mga pagkakataon na ang iyong subquery ay may mga hindi pinangalanang column, gaya ng COUNT(*), na hindi mo pa natatalagahan ng natatanging pangalan. Sa kasong ito, ang WITH statement ay may opsyon na tumukoy ng mga bagong pangalan ng column para sa subquery.

Ang pangalawang anyo nito ay ibinigay ng template:

WITH Name(column1, column2, …) AS (request) 

Maaari kang gumamit ng maraming virtual na talahanayan (pinangalanang mga query) hangga't gusto mo at sumangguni sa bawat isa sa mga ito. Ang pangkalahatang anyo ng iyong kahilingan ay magkakaroon ng ganito:

WITH name1 AS (request1),  
       	name2 AS (request2), 
       	name3 AS (request3) 
SELECT * FROM name1 JOIN name2 ON

Ngayon kunin natin ang aming nakakatakot na query:

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  

At muling isulat ito gamit ang WITH statement:

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

O maaari mong gawin nang walang mga pangalan ng column, ngunit pagkatapos ay kailangan mong tukuyin ang isang alias para sa IFNULL() function:

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