Anledningar till YTTRE JOIN

Kommer du förresten ihåg när vi slog ihop våra kalkylblad och våra kontorsstäduppgifter försvann eftersom det inte fanns någon städare än?

Om du kör en fråga som denna:

SELECT * FROM task

Då får vi detta resultat:

id emploee_id namn deadline
1 1 Fixa en bugg på frontend 2022-06-01
2 2 Fixa en bugg på backend 2022-06-15
3 5 Köp kaffe 2022-07-01
4 5 Köp kaffe 2022-08-01
5 5 Ska köpa kaffe 2022-09-01
6 (NULL) Städa kontoret (NULL)
7 4 Njut av livet (NULL)
8 6 Njut av livet (NULL)

Uppgiften "Clear Office" försvinner om vi försöker sammanfoga uppgiftstabellen med anställdtabellen med anställd_id.

För att lösa detta problem har olika modifierare lagts till i JOIN-operatorn som gör att sådana föräldralösa rader kan lagras utan ett par i en annan tabell.

Låt mig påminna dig om den klassiska formen av JOIN-operatören:

table 1 JOIN table 2 ON condition

Vi kan säga till SQL Server att se till att all data från den vänstra tabellen (tabell1) finns i den sammanfogade tabellen. Även om det inte finns något par för dem i rätt tabell. För att göra detta behöver du bara skriva:

table 1 LEFT JOIN table 2 ON condition

Om du vill att den sammanfogade tabellen ska ha alla rader från den högra tabellen måste du skriva:

table 1 RIGHT JOIN table 2 ON
 condition

Låt oss skriva en fråga som kommer att kombinera alla uppgifter och anställda så att uppgifter utan utförare inte går förlorade. För att göra detta, skriv en fråga:

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

Och resultatet av denna fråga:

id namn ockupation lön ålder join_date id emploee_id namn
1 Ivanov Ivan Programmerare 100 000 25 2012-06-30 1 1 Fixa en bugg på frontend
2 Petrov Petr Programmerare 80 000 23 2013-08-12 2 2 Fixa en bugg på backend
4 Rabinovich Moisha Direktör 200 000 35 2015-05-12 7 4 Njut av livet
5 Kirienko Anastasia Kontors chef 40 000 25 2015-10-10 3 5 Köp kaffe
5 Kirienko Anastasia Kontors chef 40 000 25 2015-10-10 4 5 Köp kaffe
5 Kirienko Anastasia Kontors chef 40 000 25 2015-10-10 5 5 Köp kaffe
6 Vaska katt 1000 3 2018-11-11 8 6 Njut av livet
(NULL) (NULL) (NULL) (NULL) (NULL) (NULL) 6 (NULL) Städa kontoret

Ytterligare en rad har lagts till i vår tabell, och intressant nog finns det många NULL-värden i den. All data som togs från personaltabellen visas som NULL, eftersom det inte fanns någon exekutor från personaltabellen för uppgiften "Rent kontor".

JOIN-typer

Det finns 4 typer av JOINs totalt. De presenteras i tabellen nedan:

Kort inlägg lång ingång Förklaring
1 ANSLUTA SIG INRE KOPPLING Endast poster som finns i tabellerna A och B
2 VÄNSTER GÅ MED VÄNSTER YTTRE FOGA Alla rader utan ett par från tabell A måste vara
3 HÖGER GÅ MED HÖGER YTTRE JOIN Alla rader utan ett par från tabell B måste vara
4 YTTRE FOGA FULLSTÄNDIG YTTRE JOIN Alla rader av baspar från tabellerna A och B måste vara

För enkelhetens skull, om vi representerar tabeller som uppsättningar, kan JOIN visas som en bild:

Set intersection betyder att det för en tabell finns en motsvarande post från en annan tabell som den refererar till.

Fråga från intervjun

Ibland bombarderas nybörjare programmerare med en mycket enkel fråga vid en intervju. Med tanke på våra tabeller kan den formuleras enligt följande:

"Skriv en fråga som visar en lista över alla anställda för vilka det inte finns några uppgifter ." Låt oss först försöka omformulera den här frågan lite: "Skriv en fråga som visar en lista över alla anställda från personaltabellen för vilka det inte finns några uppgifter i uppgiftstabellen. " Vi behöver få det här setet:

Det finns många sätt att lösa det här problemet på, men jag börjar med det enklaste: Först kan du gå med i våra tabeller med en LEFT JOIN och sedan använda WHERE för att utesluta alla rader för vilka den saknade informationen fylldes med NULL.

SELECT * FROM employee e LEFT JOIN task t ON e.id = t.emploee_id  
WHERE t.id IS NULL 

Och resultatet av denna fråga:

id namn ockupation lön ålder join_date id emploee_id namn
3 Ivanov Sergey Testare 40 000 trettio 2014-01-01 (NULL) (NULL) (NULL)

Den enda nackdelen med denna lösning är att här innehåller raderna i tabellen NULL, och av villkoret måste vi visa en lista över anställda.

För att göra detta måste du antingen lista de obligatoriska kolumnerna i personaltabellen i SELECT, eller om du behöver visa alla kan du skriva följande konstruktion:

SELECT e.* FROM employee e, task t 

Den fullständiga begäran kommer att se ut så här:

SELECT e.*  
FROM employee e RIGHT JOIN task t ON e.id = t.emploee_id  
WHERE t.id IS NULL 

resultatet av denna fråga:

id namn ockupation lön ålder join_date
3 Ivanov Sergey Testare 40 000 trettio 2014-01-01

Resten av metoderna lämnas till dig för läxor. Jag vill inte beröva dig nöjet att hitta dem själv.