Årsager til YDRE JOIN
Kan du i øvrigt huske, da vi slog vores regneark sammen, og vores kontorrengøringsopgaver forsvandt, fordi der endnu ikke var renset?
Hvis du kører en forespørgsel som denne:
SELECT * FROM task
Så får vi dette resultat:
id | emploee_id | navn | deadline |
---|---|---|---|
1 | 1 | Ret en fejl på frontend | 2022-06-01 |
2 | 2 | Ret en fejl på backend | 2022-06-15 |
3 | 5 | Køb kaffe | 2022-07-01 |
4 | 5 | Køb kaffe | 2022-08-01 |
5 | 5 | Vil købe kaffe | 2022-09-01 |
6 | (NUL) | Ryd op på kontoret | (NUL) |
7 | 4 | Nyd livet | (NUL) |
8 | 6 | Nyd livet | (NUL) |
"Clear Office"-opgaven forsvinder, hvis vi forsøger at forbinde opgavetabellen med medarbejdertabellen efter medarbejder_id.
For at løse dette problem er der tilføjet forskellige modifikatorer til JOIN-operatoren, som gør det muligt at lagre sådanne forældreløse rækker uden et par i en anden tabel.
Lad mig minde dig om den klassiske form for JOIN-operatøren:
table 1 JOIN table 2 ON
condition
Vi kan bede SQL Server om at sikre, at alle data fra den venstre tabel (tabel1) er til stede i den samlede tabel. Også selvom der ikke er et par til dem i den rigtige tabel. For at gøre dette skal du bare skrive:
table 1 LEFT JOIN table 2 ON condition
Hvis du ønsker, at den sammenføjede tabel skal have alle rækkerne fra den højre tabel , så skal du skrive:
table 1 RIGHT JOIN table 2 ON
condition
Lad os skrive en forespørgsel, der vil kombinere alle opgaver og medarbejdere, så opgaver uden en udførende ikke går tabt. For at gøre dette skal du skrive en forespørgsel:
SELECT * FROM employee e RIGHT JOIN task t ON e.id = t.emploee_id
Og resultatet af denne forespørgsel:
id | navn | beskæftigelse | løn | alder | join_date | id | emploee_id | navn |
---|---|---|---|---|---|---|---|---|
1 | Ivanov Ivan | Programmer | 100.000 | 25 | 2012-06-30 | 1 | 1 | Ret en fejl på frontend |
2 | Petrov Petr | Programmer | 80.000 | 23 | 2013-08-12 | 2 | 2 | Ret en fejl på backend |
4 | Rabinovich Moisha | Direktør | 200.000 | 35 | 2015-05-12 | 7 | 4 | Nyd livet |
5 | Kirienko Anastasia | Kontorchef | 40.000 | 25 | 2015-10-10 | 3 | 5 | Køb kaffe |
5 | Kirienko Anastasia | Kontorchef | 40.000 | 25 | 2015-10-10 | 4 | 5 | Køb kaffe |
5 | Kirienko Anastasia | Kontorchef | 40.000 | 25 | 2015-10-10 | 5 | 5 | Køb kaffe |
6 | Vaska | kat | 1000 | 3 | 2018-11-11 | 8 | 6 | Nyd livet |
(NUL) | (NUL) | (NUL) | (NUL) | (NUL) | (NUL) | 6 | (NUL) | Ryd op på kontoret |
Endnu en række er blevet tilføjet til vores tabel, og interessant nok er der mange NULL-værdier i den. Alle data, der blev hentet fra medarbejdertabellen, vises som NULL, da der ikke var nogen eksekutør fra medarbejdertabellen til opgaven "Rent kontor".
JOIN typer
Der er 4 typer JOINs i alt. De er præsenteret i nedenstående tabel:
Kort indgang | lang indgang | Forklaring | |
---|---|---|---|
1 | TILSLUTTE | INDRE JOIN | Kun poster, der er i tabel A og B |
2 | VENSTRE JOIN | VENSTRE YDRE JOIN | Alle rækker uden et par fra tabel A skal være |
3 | HØJRE JOIN | HØJRE YDRE JOIN | Alle rækker uden et par fra tabel B skal være |
4 | YDRE SAMLING | FULD YDRE TILSLUTNING | Alle rækker af basepar fra tabel A og B skal være |
For nemheds skyld, hvis vi repræsenterer tabeller som sæt, kan JOIN vises som et billede:
Sæt skæringspunkt betyder, at der for en tabel er en tilsvarende post fra en anden tabel, som den refererer til.
Spørgsmål fra interviewet
Nogle gange bliver nybegyndere bombarderet med et meget simpelt spørgsmål ved et interview. Med vores tabeller kan det formuleres som følger:
"Skriv en forespørgsel, der viser en liste over alle medarbejdere, for hvem der ikke er nogen opgaver ." Lad os først prøve at omformulere dette spørgsmål lidt: "Skriv en forespørgsel, der viser en liste over alle medarbejdere fra medarbejdertabellen, for hvilke der ikke er nogen opgaver i opgavetabellen ." Vi skal have dette sæt:Der er mange måder at løse dette problem på, men jeg starter med den enkleste: Først kan du forbinde vores tabeller med en LEFT JOIN, og derefter bruge WHERE til at udelukke alle rækker, for hvilke de manglende data var polstret med NULLs.
SELECT * FROM employee e LEFT JOIN task t ON e.id = t.emploee_id
WHERE t.id IS NULL
Og resultatet af denne forespørgsel:
id | navn | beskæftigelse | løn | alder | join_date | id | emploee_id | navn |
---|---|---|---|---|---|---|---|---|
3 | Ivanov Sergey | Tester | 40.000 | tredive | 2014-01-01 | (NUL) | (NUL) | (NUL) |
Den eneste ulempe ved denne løsning er, at her indeholder rækkerne i tabellen NULL, og vi skal efter betingelse vise en liste over medarbejdere.
For at gøre dette skal du enten angive de nødvendige kolonner i medarbejdertabellen i SELECT, eller hvis du skal vise dem alle, kan du skrive følgende konstruktion:
SELECT e.* FROM employee e, task t
Den komplette anmodning vil se således ud:
SELECT e.*
FROM employee e RIGHT JOIN task t ON e.id = t.emploee_id
WHERE t.id IS NULL
resultatet af denne forespørgsel:
id | navn | beskæftigelse | løn | alder | join_date |
---|---|---|---|---|---|
3 | Ivanov Sergey | Tester | 40.000 | tredive | 2014-01-01 |
Resten af metoderne er overladt til dig til lektier. Jeg vil ikke fratage dig fornøjelsen af at finde dem selv.
GO TO FULL VERSION