Årsaker til YTRE JOIN
Husker du forresten da vi slo sammen regnearkene våre og kontorrengjøringsoppgavene våre forsvant fordi det ikke fantes noen renere ennå?
Hvis du kjører et søk som dette:
SELECT * FROM task
Da får vi dette resultatet:
id | emploee_id | Navn | frist |
---|---|---|---|
1 | 1 | Rett opp en feil på frontend | 2022-06-01 |
2 | 2 | Rett opp en feil på backend | 2022-06-15 |
3 | 5 | Kjøp kaffe | 2022-07-01 |
4 | 5 | Kjøp kaffe | 2022-08-01 |
5 | 5 | Skal kjøpe kaffe | 2022-09-01 |
6 | (NULL) | Rydd opp på kontoret | (NULL) |
7 | 4 | Nyt livet | (NULL) |
8 | 6 | Nyt livet | (NULL) |
"Tøm kontor"-oppgaven forsvinner hvis vi prøver å slå sammen oppgavetabellen med ansatttabellen etter ansatt_id.
For å løse dette problemet er det lagt til ulike modifikatorer i JOIN-operatoren som gjør at slike foreldreløse rader kan lagres uten et par i en annen tabell.
La meg minne deg om den klassiske formen for JOIN-operatøren:
table 1 JOIN table 2 ON
condition
Vi kan fortelle SQL Server å sørge for at alle data fra den venstre tabellen (tabell1) er tilstede i den sammenføyde tabellen. Selv om det ikke er noen par for dem i riktig tabell. For å gjøre dette trenger du bare å skrive:
table 1 LEFT JOIN table 2 ON condition
Hvis du vil at den sammenføyde tabellen skal ha alle radene fra den høyre tabellen , må du skrive:
table 1 RIGHT JOIN table 2 ON
condition
La oss skrive en spørring som vil kombinere alle oppgaver og ansatte slik at oppgaver uten utførende ikke går tapt. For å gjøre dette, skriv en spørring:
SELECT * FROM employee e RIGHT JOIN task t ON e.id = t.emploee_id
Og resultatet av denne spørringen:
id | Navn | okkupasjon | lønn | alder | join_date | id | emploee_id | Navn |
---|---|---|---|---|---|---|---|---|
1 | Ivanov Ivan | Programmerer | 100 000 | 25 | 2012-06-30 | 1 | 1 | Rett opp en feil på frontend |
2 | Petrov Petr | Programmerer | 80 000 | 23 | 2013-08-12 | 2 | 2 | Rett opp en feil på backend |
4 | Rabinovich Moisha | Regissør | 200 000 | 35 | 2015-05-12 | 7 | 4 | Nyt livet |
5 | Kirienko Anastasia | Kontorsjef | 40 000 | 25 | 2015-10-10 | 3 | 5 | Kjøp kaffe |
5 | Kirienko Anastasia | Kontorsjef | 40 000 | 25 | 2015-10-10 | 4 | 5 | Kjøp kaffe |
5 | Kirienko Anastasia | Kontorsjef | 40 000 | 25 | 2015-10-10 | 5 | 5 | Kjøp kaffe |
6 | Vaska | katt | 1000 | 3 | 2018-11-11 | 8 | 6 | Nyt livet |
(NULL) | (NULL) | (NULL) | (NULL) | (NULL) | (NULL) | 6 | (NULL) | Rydd opp på kontoret |
En annen rad er lagt til tabellen vår, og interessant nok er det mange NULL-verdier i den. Alle data som ble hentet fra ansatttabellen vises som NULL, siden det ikke var noen eksekutør fra ansatttabellen for oppgaven "Rent kontor".
JOIN-typer
Det er 4 typer JOINs totalt. De er presentert i tabellen nedenfor:
Kort oppføring | lang inngang | Forklaring | |
---|---|---|---|
1 | BLI MED | INDRE BLI MED | Bare poster som er i tabell A og B |
2 | VENSTRE BLI MED | VENSTRE YTRE JOIN | Alle rader uten et par fra tabell A må være |
3 | HØYRE BLI MED | HØYRE YTRE SKJØT | Alle rader uten et par fra tabell B må være |
4 | YTRE SKJØT | FULL YTTRE FØLGING | Alle rader med basepar fra tabell A og B skal være |
For enkelhets skyld, hvis vi representerer tabeller som sett, kan JOIN vises som et bilde:
Sett skjæringspunkt betyr at for en tabell er det en tilsvarende post fra en annen tabell som den refererer til.
Spørsmål fra intervjuet
Noen ganger blir nybegynnere programmerere bombardert med et veldig enkelt spørsmål under et intervju. Gitt våre tabeller kan den formuleres som følger:
"Skriv en spørring som viser en liste over alle ansatte som det ikke er noen oppgaver for ." Først, la oss prøve å omformulere dette spørsmålet litt: "Skriv en spørring som vil vise en liste over alle ansatte fra ansatttabellen som det ikke er noen oppgaver for i oppgavetabellen ." Vi må få dette settet:Det er mange måter å løse dette problemet på, men jeg starter med den enkleste: Først kan du slå sammen tabellene våre med en LEFT JOIN, og deretter bruke WHERE for å ekskludere alle rader der de manglende dataene ble polstret med NULL.
SELECT * FROM employee e LEFT JOIN task t ON e.id = t.emploee_id
WHERE t.id IS NULL
Og resultatet av denne spørringen:
id | Navn | okkupasjon | lønn | alder | join_date | id | emploee_id | Navn |
---|---|---|---|---|---|---|---|---|
3 | Ivanov Sergey | Tester | 40 000 | tretti | 2014-01-01 | (NULL) | (NULL) | (NULL) |
Den eneste ulempen med denne løsningen er at her inneholder radene i tabellen NULL, og etter betingelse må vi vise en liste over ansatte.
For å gjøre dette, må du enten liste de nødvendige kolonnene i ansatttabellen i SELECT, eller hvis du trenger å vise dem alle, kan du skrive følgende konstruksjon:
SELECT e.* FROM employee e, task t
Den fullstendige forespørselen vil se slik ut:
SELECT e.*
FROM employee e RIGHT JOIN task t ON e.id = t.emploee_id
WHERE t.id IS NULL
resultatet av denne spørringen:
id | Navn | okkupasjon | lønn | alder | join_date |
---|---|---|---|---|---|
3 | Ivanov Sergey | Tester | 40 000 | tretti | 2014-01-01 |
Resten av metodene er overlatt til deg for lekser. Jeg vil ikke frata deg gleden av å finne dem selv.