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