EXISTS- ja IN-funktioiden suorituskyky
Milloin EXISTS lopettaa haun aikaisin ja on IN-funktiota tehokkaampi, mikä on yleinen kokeneiden hakijoiden haastattelukysymys
EXISTS- ja IN-funktioiden suorituskyky on ilmainen Valmistautuminen ohjelmointihaastatteluihin-oppitunti CoddyKitissä. Tämä on oppitunti 4/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 Valmistautuminen ohjelmointihaastatteluihin-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Valmistautuminen ohjelmointihaastatteluihin-kurssilla on yhteensä 4 oppituntia.
Mitä EXISTS oikeastaan testaa
EXISTS ottaa alikyselyn ja palauttaa toden heti, kun alikysely tuottaa vähintään yhden rivin. Palautettujen arvojen merkityksellä ei ole väliä — ainoastaan sillä, onko yhtään riviä olemassa.
- Se on totuusarvotesti, jota käytetään
WHERE-lauseessa. - Se on lähes aina korreloitu: sisempi kysely viittaa ulomman kyselyn riviin.
Tämä yksinkertainen kysymys esitetään lähes jokaisessa keskitason ja senior-tason SQL-haastattelussa.
Perusmuotoinen EXISTS-kysely
Etsikää asiakkaat, jotka ovat tehneet vähintään yhden tilauksen. Sisempi kysely korreloituu ehdolla o.customer_id = c.id; EXISTS palauttaa toden heti, kun yksikin vastaava tilaus löytyy.
Huomatkaa SELECT 1 — valittu arvo ei ole merkityksellinen, joten useimmat kehittäjät kirjoittavat 1 tai *. Haastattelijat hyväksyvät kumman tahansa; optimoija jättää EXISTS-lauseen valintalistan huomiotta.
SELECT c.name
FROM customers c
WHERE EXISTS (
SELECT 1 FROM orders o
WHERE o.customer_id = c.id
);Oikosulkutoiminta
Avainsana, jonka haastattelijat haluavat kuulla, on short-circuit. EXISTS lopettaa sisemmän kyselyn läpikäynnin heti, kun se löytää yhden vastaavan rivin. Sen ei koskaan tarvitse muodostaa tai poistaa kaksoiskappaleita koko osumalistasta.
IN puolestaan muodostaa käsitteellisesti alikyselyn arvoista joukon ja tarkistaa sitten jäsenyyden. Suurilla tai runsaasti kaksoiskappaleita sisältävillä sisemmillä joukoilla tällä erolla on merkitystä.
Sama kysely IN-operaattorilla
Tässä on IN-vastine asiakkaita, joilla on tilauksia, hakevalle kyselylle. Loogisesti tulos on sama, mutta toimintamekanismi on erilainen: alikysely ei ole korreloitu, vaan tuottaa luettelon asiakastunnuksista, joihin ulompi kysely vertaa.
Nykyaikaiset optimoijat tuottavat näistä usein saman suoritussuunnitelman — mutta suurilla ja paljon kaksoiskappaleita sisältävillä orders-tauluilla EXISTS voi olla nopeampi, koska se lopettaa ensimmäiseen osumaan.
SELECT c.name
FROM customers c
WHERE c.id IN (
SELECT o.customer_id FROM orders o
);NOT EXISTS on parempi kuin NOT IN
Tämä on koko oppitunnin tärkein johtopäätös. NOT EXISTS on turvallinen tapa ilmaista anti-join. Toisin kuin NOT IN, se ei rikkoudu sisemmän kyselyn NULL-arvoista.
Tällä löydetään luotettavasti kaikki asiakkaat, joilla ei ole tilauksia, vaikka orders.customer_id sisältäisi NULL-arvoja.
SELECT c.name
FROM customers c
WHERE NOT EXISTS (
SELECT 1 FROM orders o
WHERE o.customer_id = c.id
);Miksi NOT EXISTS on NULL-arvojen suhteen turvallinen
NOT EXISTS kysyy vain: löysikö korreloitu alikysely yhtään vastaavaa riviä? — kyse on selkeästä kyllä–ei-kysymyksestä. NULL-arvoinen customer_id ei yksinkertaisesti koskaan täytä ehtoa o.customer_id = c.id, joten se ei vastaa eikä saastuta logiikkaa.
Verratkaa tätä NOT IN -ehtoon, jossa listan NULL-arvo pakottaa tulokseksi UNKNOWN ja pudottaa kaikki rivit pois. Siksi kokeneet haastattelijat suosivat anti-joinien yhteydessä NOT EXISTS -ehtoa.
Milloin IN on itse asiassa parempi
Olkaa tasapuolisia — IN ei ole aina huonompi. Kun alikysely palauttaa pienen, kiinteän ja duplikaatittoman listan, IN on selkeä ja nopea:
- Kourallinen literaaliarvoja tai pieni hakutaulu.
- Korreloimaton kysely, jonka optimoija voi suorittaa kerran ja tallentaa välimuistiin.
Alla oleva kysely on täysin idiomaattinen; EXISTS-käyttö tässä tilanteessa olisi ylimitoitettua suunnittelua.
SELECT name
FROM products
WHERE category_id IN (
SELECT id FROM categories WHERE active = true
);Rehellinen nykyajan vastaus
Kypsät optimoijat, kuten Postgres sekä viimeaikaiset SQL Server- ja MySQL-versiot, muuntavat usein IN- ja EXISTS-ehdot samaksi semi-join-suunnitelmaksi. Siksi suorituskyky on tavallisissa positiivisissa jäsenyystarkistuksissa usein identtinen.
Edelleen merkitykselliset erot:
NOT INvastaanNOT EXISTS— NULL-arvojen vaikutus oikeellisuuteen, ei vain nopeuteen.- Erittäin suuret tai indeksoimattomat sisemmät taulut — EXISTS tekee oikosulun.
EXISTS vai JOIN olemassaolon tarkistuksessa
Haastattelijat esittävät myös toisenlaisen kysymyksen: miksei vain käytettäisi JOIN-liitosta? Pelkkään olemassaolon tarkistamiseen käytetty liitos voi monistaa rivejä, jos oikealla puolella on kaksoiskappaleita, jolloin tarvitaan DISTINCT. EXISTS ei koskaan monista ulomman kyselyn riviä.
Siksi pelkässä olemassaolon tarkistuksessa EXISTS on selkeämpi kuin JOIN ... DISTINCT. Käyttäkää liitosta, kun todella tarvitsette toisen taulun sarakkeita.
SELECT DISTINCT c.name
FROM customers c
JOIN orders o ON o.customer_id = c.id;Indeksointi ratkaisee
Suorituskykyvastaus on puutteellinen ilman indeksejä. Korreloitu EXISTS suorittaa sisemmän haun jokaiselle ulomman kyselyn riville, joten indeksi korreloitavassa sarakkeessa — tässä orders(customer_id) — tekee siitä nopean.
Kun mainitsette "Indeksoisin liitossarakkeen, johon alikysely korreloituu", muutatte oppikirjavastauksen käytännölliseksi vastaukseksi, jota haastattelijat arvostavat.
CREATE INDEX idx_orders_customer_id
ON orders (customer_id);Haastatteluvastaus
Sanokaa: "EXISTS on korreloitu totuusarvotesti, joka tekee oikosulun ensimmäisen vastaavan rivin kohdalla, kun taas IN tarkistaa jäsenyyden arvolistassa. Positiivisissa tarkistuksissa nykyaikaiset optimoijat tuottavat usein saman semi-join-suunnitelman. Todellinen ero on NOT EXISTSin ja NOT INin välillä: NOT EXISTS on NULL-arvojen suhteen turvallinen, joten suosin sitä anti-joinien yhteydessä — ja varmistan, että korreloitu sarake on indeksoitu."
Pikatarkistus
EXISTS- ja IN-ehtojen välisen keskustelun ydin.
Kertaus
EXISTS vastaan IN, ratkaistu:
EXISTSon korreloitu totuusarvotesti, joka tekee oikosulun ensimmäisen vastaavan rivin kohdalla; sisemmän kyselyn valintalistalla ei ole merkitystä.INtarkistaa jäsenyyden arvojoukossa ja sopii erinomaisesti pieniin, duplikaatittomiin ja korreloimattomiin listoihin.- Positiivisissa tarkistuksissa nykyaikaiset optimoijat valitsevat usein saman semi-join-suunnitelman.
- Suosikaa anti-joinien yhteydessä
NOT EXISTS-ehtoaNOT IN-ehdon sijaan — se on NULL-arvojen suhteen turvallinen. Indeksoikaa korreloitu sarake.
Tähän päättyy Subqueries Deep Dive -kurssi.
Opi Valmistautuminen ohjelmointihaastatteluihin 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
- 90
- Oppitunnit
- 360
Usein kysytyt kysymykset
Onko oppitunti ”EXISTS- ja IN-funktioiden suorituskyky” ilmainen?
Kyllä – oppitunnin ”EXISTS- ja IN-funktioiden suorituskyky” 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 Valmistautuminen ohjelmointihaastatteluihin-kurssin, päivitä CoddyKit PROhon. Valmistautuminen ohjelmointihaastatteluihin-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”EXISTS- ja IN-funktioiden suorituskyky”?
Milloin EXISTS lopettaa haun aikaisin ja on IN-funktiota tehokkaampi, mikä on yleinen kokeneiden hakijoiden haastattelukysymys Harjoittelet Valmistautuminen ohjelmointihaastatteluihin-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Valmistautuminen ohjelmointihaastatteluihin-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Valmistautuminen ohjelmointihaastatteluihin-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.
Kuinka kauan ”EXISTS- ja IN-funktioiden suorituskyky”-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ä Valmistautuminen ohjelmointihaastatteluihin-oppitunnilla?
Kyllä. Jokainen Valmistautuminen ohjelmointihaastatteluihin-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