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.
GO TO FULL VERSION