IN-, ANY- ja ALL-alikyselyt
Jäsenyyttä testaavat alikyselyt ja kuuluisa NULL-arvoihin liittyvä NOT IN -ansa
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.> ANYtarkoittaa, että arvo on minimiä suurempi;> ALLtarkoittaa, että se on maksimia suurempi.NOT INpalauttaa huomaamatta nolla riviä, jos alikyselyssä on NULL-arvo — varmista ehtoIS NOT NULLtai käytäNOT EXISTS-ehtoa.- Tavallinen
INsietää NULL-arvoja; monisarakkeinenINtoimii joissakin SQL-murteissa.
Seuraavaksi: EXISTS vastaan IN sekä suorituskykykysymys, jota haastattelijat rakastavat esittää kokeneemmille hakijoille.
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
- Skalaarialikyselyt SELECT- ja WHERE-lausekkeissa
- FROM-lausekkeen alikyselyt (johdetut taulut)
- IN-, ANY- ja ALL-alikyselyt
- EXISTS- ja IN-funktioiden suorituskyky