SQL-työhaastatteluun valmistautuminen · Oppitunti

IN-, ANY- ja ALL-alikyselyt

Jäsenyyttä testaavat alikyselyt ja kuuluisa NULL-arvoihin liittyvä NOT IN -ansa

Oppitunti 3/413 vaihetta

IN-, ANY- ja ALL-alikyselyt on ilmainen SQL-työhaastatteluun valmistautuminen-oppitunti CoddyKitissä. Tämä on oppitunti 3/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.

Joukon jäsenyyttä testaavat alikyselyt

Kun alikysely palauttaa arvolistan, voitte testata jäsenyyttä sen perusteella käyttämällä IN-, ANY- tai ALL-operaattoria. Näillä SQL kysyy: kuuluuko tämä arvo tähän joukkoon? tai onko se suurempi kuin jokainen tai jokin tämän joukon alkio?

  • IN — vastaa mihin tahansa listan arvoon.
  • ANY/SOME — tosi, jos vertailu pätee vähintään yhteen alkioon.
  • ALL — tosi vain, jos vertailu pätee jokaiseen alkioon.

IN alikyselyn kanssa

Yleisin tapaus: etsitte työntekijät, jotka työskentelevät missä tahansa osastossa, joka sijaitsee paikassa 'NYC'. Alikysely palauttaa joukon osastotunnuksia, ja IN säilyttää rivit, jotka vastaavat jotakin niistä.

Tämä on luontevasti luettava muoto, jota haastattelijat odottavat yleensä ensimmäisenä.

SELECT name
FROM employees
WHERE dept_id IN (
  SELECT id FROM departments WHERE city = 'NYC'
);

= ANY tarkoittaa samaa kuin IN

Haastattelijoiden suosima näppärä yhtäpitävyys: = ANY (subquery) tarkoittaa täsmälleen samaa kuin IN (subquery). Molemmat ovat tosia, kun arvo vastaa vähintään yhtä joukon alkiota.

Alla oleva kysely palauttaa täsmälleen saman tuloksen kuin edellinen. ANY ja sen synonyymi SOME yleistivät tämän myös muihin operaattoreihin, kuten > ja <.

SELECT name
FROM employees
WHERE dept_id = ANY (
  SELECT id FROM departments WHERE city = 'NYC'
);

ANY vertailuoperaattorin kanssa

ANY on tehokas yhdessä operaattorin > tai < kanssa. salary > ANY (set) on tosi, jos palkka ylittää vähintään pienimmän alkion — toisin sanoen, jos se on minimiä suurempi.

Tällä löydetään työntekijät, jotka ansaitsevat enemmän kuin vähintään yksi henkilö osastolla 5.

SELECT name, salary
FROM employees
WHERE salary > ANY (
  SELECT salary FROM employees WHERE dept_id = 5
);

ALL vertailuoperaattorin kanssa

salary > ALL (set) on tosi vain, jos palkka ylittää jokaisen alkion — toisin sanoen, jos se on maksimia suurempi. Tällä löydetään työntekijät, jotka ansaitsevat enemmän kuin kaikki osaston 5 työntekijät.

Painakaa oikotie mieleen: > ALL = suurempi kuin MAX, > ANY = suurempi kuin MIN. Haastattelijat testaavat tätä jatkuvasti.

SELECT name, salary
FROM employees
WHERE salary > ALL (
  SELECT salary FROM employees WHERE dept_id = 5
);

NOT IN: kuuluisa NULL-ansa

Tässä on alikyselyhaastattelujen yleisin kompa. Jos NOT IN -lauseen alikysely palauttaa edes yhden NULL-arvon, koko NOT IN voi palauttaa nolla riviä — ei odottamianne orporivejä.

Miksi? x NOT IN (1, 2, NULL) laajenee muotoon x <> 1 AND x <> 2 AND x <> NULL. Viimeinen vertailu on UNKNOWN, joten AND-ehto ei voi koskaan olla tosi.

SELECT name
FROM customers
WHERE id NOT IN (
  SELECT customer_id FROM orders
);

Miksi kysely rikkoutuu huomaamatta

Jos orders.customer_id sallii NULL-arvot ja jollakin rivillä on siinä NULL, edellinen kysely palauttaa nolla riviä, vaikka asiakkaita, joilla ei ole tilauksia, selvästi olisi.

  • NULL-arvon esiintyminen muuttaa logiikan muotoon UNKNOWN.
  • Virhettä ei ilmoiteta — kysely palauttaa vain väärän eli tyhjän tuloksen.

Tämän vaaran mainitseminen ääneen haastattelussa antaa vahvan vaikutelman osaamisesta.

NOT IN:n korjaaminen NULL-arvojen tapauksessa

Haastattelijat hyväksyvät kolme turvallista korjausta:

  • Sulje NULL-arvot pois alikyselyssä: lisää WHERE customer_id IS NOT NULL.
  • Kirjoita kysely uudelleen käyttämällä NOT EXISTS -ehtoa, joka käsittelee NULL-arvot oikein.
  • Käytä LEFT JOIN ... IS NULL -anti-liitosta.

Alla oleva suojattu versio palauttaa todellisen listan asiakkaista, joilla ei ole tilauksia.

SELECT name
FROM customers
WHERE id NOT IN (
  SELECT customer_id FROM orders
  WHERE customer_id IS NOT NULL
);

IN toimii NULL-arvojen kanssa

Rauhoittava vastakohta: tavallinen IN eli negaation sisältämätön versio ei rikkoudu listan NULL-arvoista. x IN (1, 2, NULL) on tosi, jos x on 1 tai 2; NULL ei vain koskaan täsmää.

NULL-vaara koskee nimenomaan NOT IN -ehtoa. Näiden kahden tapauksen eron tunteminen erottaa itsevarman vastauksen arvauksesta.

Monisarakkeinen IN

Jotkin SQL-murteet, kuten Postgres ja MySQL, sallivat IN-operaattorin käytön usean sarakkeen muodostamaan tupleen, jolloin pareja verrataan kerralla. Tällä löydetään tilausrivit, joiden (tuote, alue) -yhdistelmä esiintyy kampanjataulussa.

SQL Server ei tue riviarvon IN-operaattoria; siellä kysely kirjoitettaisiin uudelleen EXISTS-ehdolla. Tämän siirrettävyysrajoitteen mainitseminen tekee haastattelijoihin vaikutuksen.

SELECT *
FROM order_lines
WHERE (product_id, region) IN (
  SELECT product_id, region FROM promotions
);

Haastatteluvastaus

Sanokaa näin: "IN testaa joukon jäsenyyttä ja vastaa operaattoria = ANY. Vertailuoperaattorien kanssa > ANY tarkoittaa, että arvo on minimiä suurempi, ja > ALL tarkoittaa, että se on maksimia suurempi. Suurin ansa on NOT IN yhdessä alikyselyn kanssa, joka voi palauttaa NULL-arvon — tällöin kysely palauttaa huomaamatta nolla riviä, joten käytän ehtoa IS NOT NULL tai vaihdan NOT EXISTS -muotoon."

Tällä vastauksella käsittelette yhdellä kertaa jäsenyyden, ANY/ALL-semanttiikan ja NULL-ansan.

Pikatarkistus

Haastattelijan suosituin alikyselyansa.

Kertaus

Jäsenyyttä testaavat alikyselyt hallussa:

  • IN = = ANY: vastaa mihin tahansa joukon alkioon.
  • > ANY tarkoittaa, että arvo on minimiä suurempi; > ALL tarkoittaa, että se on maksimia suurempi.
  • NOT IN palauttaa huomaamatta nolla riviä, jos alikyselyssä on NULL-arvo — varmista ehto IS NOT NULL tai käytä NOT EXISTS -ehtoa.
  • Tavallinen IN sietää NULL-arvoja; monisarakkeinen IN toimii joissakin SQL-murteissa.

Seuraavaksi: EXISTS vastaan IN sekä suorituskykykysymys, jota haastattelijat rakastavat esittää kokeneemmille hakijoille.

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 ”IN-, ANY- ja ALL-alikyselyt” ilmainen?

Kyllä – oppitunnin ”IN-, ANY- ja ALL-alikyselyt” 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 ”IN-, ANY- ja ALL-alikyselyt”?

Jäsenyyttä testaavat alikyselyt ja kuuluisa NULL-arvoihin liittyvä NOT IN -ansa 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 3/4.

Kuinka kauan ”IN-, ANY- ja ALL-alikyselyt”-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. Skalaarialikyselyt SELECT- ja WHERE-lausekkeissa
  2. FROM-lausekkeen alikyselyt (johdetut taulut)
  3. IN-, ANY- ja ALL-alikyselyt
  4. EXISTS- ja IN-funktioiden suorituskyky
← Takaisin: SQL-työhaastatteluun valmistautuminen