SQL-työhaastatteluun valmistautuminen · Oppitunti

RIGHT- ja FULL OUTER JOIN -liitosten semantiikka

Milloin kumpaakin tarvitaan ja miten RIGHT JOIN kirjoitetaan LEFT JOINiksi

Oppitunti 2/413 vaihetta

RIGHT- ja FULL OUTER JOIN -liitosten semantiikka on ilmainen SQL-työhaastatteluun valmistautuminen-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu SQL-työhaastatteluun valmistautuminen-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. SQL-työhaastatteluun valmistautuminen-kurssilla on yhteensä 4 oppituntia.

LEFT JOINia pidemmälle

Kun LEFT JOIN on hallussa, haastattelijat testaavat sen peilikuvaa ja molempien yhdistelmää: RIGHT JOINia ja FULL OUTER JOINia.

  • RIGHT JOIN säilyttää oikean taulun jokaisen rivin.
  • FULL OUTER JOIN säilyttää molempien taulujen ilman vastinetta olevat rivit.

Tässä oppitunnissa määritellään kummatkin täsmällisesti ja näytetään haastattelijoiden suosima muunnos: minkä tahansa RIGHT JOINin voi muuttaa LEFT JOINiksi.

RIGHT JOINin määritelmä

RIGHT JOIN (tai RIGHT OUTER JOIN) säilyttää kaikki oikean taulun rivit eli sen taulun, joka kirjoitetaan JOIN-avainsanan jälkeen. Ilman vastinetta olevien oikean taulun rivien vasemman taulun sarakkeiden arvoksi tulee NULL.

Se on LEFT JOINin täsmällinen peilikuva. LEFT säilyttää ensimmäisenä nimetyn taulun, RIGHT toisen.

SELECT c.name, o.amount
FROM orders o
RIGHT JOIN customers c
  ON o.customer_id = c.id;
-- keeps ALL customers, even those
-- with no order (Carol -> amount NULL)

Taulut uudelleen

Samat tiedot kuin aiemmin. Carolilla (asiakas 3) ei ole tilausta. Tässä kaikki orders-taulun rivit viittaavat olemassa olevaan asiakkaaseen, joten kun customers on säilytettävä puoli, yksikään tilaus ei jää orvoksi.

-- customers           orders
-- 1 | Alice           10 | 1 | 50
-- 2 | Bob             11 | 1 | 75
-- 3 | Carol           12 | 2 | 20

RIGHT JOINin muuntaminen LEFT JOINiksi

Haastattelun ydin on tämä: RIGHT JOINia käytetään käytännössä harvoin, koska taulujen järjestyksen voi aina vaihtaa ja käyttää LEFT JOINia. Alla olevat kaksi kyselyä ovat loogisesti identtisiä.

Monet tyyliohjeet kieltävät RIGHT JOINin kokonaan, koska vasemmalta oikealle lukeminen ja vasemman taulun säilyttäminen on aina helpompi hahmottaa.

-- RIGHT JOIN
SELECT c.name, o.amount
FROM orders o
RIGHT JOIN customers c ON o.customer_id = c.id;

-- Equivalent LEFT JOIN (preferred)
SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id;

FULL OUTER JOINin määritelmä

FULL OUTER JOIN säilyttää molempien taulujen ilman vastinetta olevat rivit. Sen voi ajatella olevan LEFT JOINin ja RIGHT JOINin yhdistelmä:

  • Vastineelliset parit näkyvät normaalisti.
  • Vasemman taulun rivit, joille ei löydy vastinetta: oikean taulun sarakkeet ovat NULL-arvoja.
  • Oikean taulun rivit, joille ei löydy vastinetta: vasemman taulun sarakkeet ovat NULL-arvoja.

Se vastaa kysymykseen: "Näytä kaikki molemmilta puolilta ja kohdista vastineelliset rivit toisiinsa."

SELECT c.name, o.id AS order_id
FROM customers c
FULL OUTER JOIN orders o
  ON o.customer_id = c.id;

Milloin FULL OUTER on parhaimmillaan

FULL OUTER JOIN on ensisijainen valinta täsmäytykseen: kahden sellaisen tietojoukon vertailuun, joiden pitäisi vastata toisiaan mutta jotka eivät välttämättä vastaa.

Kuvitellaan orders-taulu ja erillinen payments-taulu. FULL OUTER JOIN order id:n perusteella tuo samaan tulokseen esiin sekä tilaukset, joille ei ole maksua, että maksut, joille ei ole vastaavaa tilausta. Puuttuva puoli näkyy kummassakin tapauksessa NULL-arvoina.

SELECT o.id AS order_id, p.id AS payment_id
FROM orders o
FULL OUTER JOIN payments p
  ON p.order_id = o.id
WHERE o.id IS NULL OR p.id IS NULL;
-- rows where one side is missing

SQL-murteiden tuntemus

Haastattelija saattaa testata siirrettävyyden tuntemustanne. MySQL:ssä ei ole FULL OUTER JOIN -avainsanaa (versioon 8 asti). Postgres, SQL Server ja Oracle tukevat sitä.

MySQL:ssä tämän voi toteuttaa yhdistämällä LEFT JOINin ja RIGHT JOINin UNION-operaattorilla (joka poistaa päällekkäiset osumarivit). Tämän eron tunteminen osoittaa käytännön kokemusta.

-- FULL OUTER JOIN emulated in MySQL
SELECT c.name, o.id FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
UNION
SELECT c.name, o.id FROM customers c
RIGHT JOIN orders o ON o.customer_id = c.id;

Neljä JOIN-tyyppiä yhdellä silmäyksellä

Pitäkää tämä taulukko mielessänne. ”Säilytettävä” tarkoittaa, että osumattomat rivit säilyvät NULL-arvojen kanssa.

  • INNER JOIN: vain osumarivit. Mikään ei säily.
  • LEFT JOIN: kaikki vasemman puolen rivit säilyvät.
  • RIGHT JOIN: kaikki oikean puolen rivit säilyvät.
  • FULL OUTER JOIN: molempien puolten rivit säilyvät.

Jokainen ulkoliitoksia koskeva haastattelukysymys palautuu siihen, mikä puoli tai mitkä puolet halutaan säilyttää.

Oikean JOIN-tyypin valitseminen

Valitkaa JOIN-tyyppi kysymällä: ”Mitkä osumattomat rivit minun on säilytettävä?”

  • Jos tarvitsette vain päätaulun rivit: LEFT JOIN (sijoittakaa päätaulu ensimmäiseksi).
  • Jos tarvitsette molemmat osumattomien rivien joukot täsmäytystä varten: FULL OUTER JOIN.
  • Jos vain osumat ovat merkityksellisiä: INNER JOIN.

RIGHT JOINia ei yleensä valita suoraan, vaan se muotoillaan LEFT JOINiksi.

Täsmäytysesimerkki

Ottakaa FULL OUTER JOIN käyttöön merkitsemällä jokaisen rivin tila. CASE-lauseke kertoo NULL-arvojen kuvion perusteella, kumpi puoli puuttuu. Tämä on klassinen auditointikysely.

SELECT
  COALESCE(o.id, p.order_id) AS ord,
  CASE
    WHEN p.id IS NULL THEN 'no payment'
    WHEN o.id IS NULL THEN 'orphan payment'
    ELSE 'matched'
  END AS status
FROM orders o
FULL OUTER JOIN payments p ON p.order_id = o.id;

Yleinen harhaluulo

Ehdokkaat ajattelevat usein, että FULL OUTER JOIN palauttaa osumattomien rivien karteesisen tulon. Näin ei ole. Kummankin puolen osumattomat rivit esiintyvät täsmälleen kerran NULL-arvoilla täydennettyinä, eikä niitä koskaan kerrota keskenään.

Osumarivit noudattavat edelleen tavallista liitoksen monistumista: tuloksena on yksi rivi kutakin osumaparia kohden. Sama fan-out-sääntö pätee kaikkiin liitoksiin.

Pikatarkistus

Haastattelija pyytää teitä muotoilemaan kyselyn uudelleen tiimille, joka kieltää RIGHT JOINin käytön.

Kertaus

RIGHT JOIN säilyttää oikean taulun ja FULL OUTER JOIN säilyttää molemmat taulut. RIGHT JOIN voidaan aina muotoilla LEFT JOINiksi vaihtamalla taulujen järjestystä, minkä vuoksi tiimit suosivat LEFT JOINia.

  • FULL OUTER JOIN sopii erinomaisesti kahden aineiston täsmäyttämiseen.
  • MySQL:stä puuttuu FULL OUTER JOIN; sen voi toteuttaa yhdistämällä LEFT JOINin, RIGHT JOINin ja UNION-operaattorin.
  • Valitkaa JOIN-tyyppi päättämällä, mitkä osumattomat rivit haluatte säilyttää.
  • Osumattomat rivit esiintyvät kerran NULL-arvoilla täydennettyinä, eivät koskaan karteesisena tulona.
Aloita maksutta

Opi SQL tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
30
Oppitunnit
120

Usein kysytyt kysymykset

Onko oppitunti ”RIGHT- ja FULL OUTER JOIN -liitosten semantiikka” ilmainen?

Kyllä – oppitunnin ”RIGHT- ja FULL OUTER JOIN -liitosten semantiikka” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko SQL-työhaastatteluun valmistautuminen-kurssin, päivitä CoddyKit PROhon. SQL-työhaastatteluun valmistautuminen-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”RIGHT- ja FULL OUTER JOIN -liitosten semantiikka”?

Milloin kumpaakin tarvitaan ja miten RIGHT JOIN kirjoitetaan LEFT JOINiksi Harjoittelet SQL-työhaastatteluun valmistautuminen-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni SQL-työhaastatteluun valmistautuminen-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin SQL-työhaastatteluun valmistautuminen-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.

Kuinka kauan ”RIGHT- ja FULL OUTER JOIN -liitosten semantiikka”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä SQL-työhaastatteluun valmistautuminen-oppitunnilla?

Kyllä. Jokainen SQL-työhaastatteluun valmistautuminen-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. LEFT JOIN ja täsmäämättömien rivien säilyttäminen
  2. RIGHT- ja FULL OUTER JOIN -liitosten semantiikka
  3. Täsmäämättömien rivien etsiminen (anti-join)
  4. WHERE-ehto ulkoisessa liitoksessa
← Takaisin: SQL-työhaastatteluun valmistautuminen