Kolmiarvoinen logiikka ja UNKNOWN
Miksi NULL = NULL ei ole tosi ja miten UNKNOWN leviää ehtojen kautta
Kolmiarvoinen logiikka ja UNKNOWN on ilmainen SQL-työhaastatteluun valmistautuminen-oppitunti CoddyKitissä. Tämä on oppitunti 1/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.
Miksi NULL aiheuttaa kokelaille ongelmia
NULL on yleisin väärien vastausten aiheuttaja SQL-haastatteluissa. Ansa syntyy siitä, että sitä käsitellään tavallisen arvon tavoin, vaikka todellisuudessa NULL tarkoittaa ”tuntematonta” tai ”puuttuvaa”, ei nollaa eikä tyhjää merkkijonoa.
Haastattelijat käyttävät tätä mielellään, koska syntaksi näyttää oikealta, mutta tulos on huomaamatta väärä. He saattavat näyttää suodattimen, jonka ”pitäisi” palauttaa rivin, ja kysyä, miksi se ei palauta mitään.
Tässä oppitunnissa rakennatte ajattelumallin, joka selkeyttää kaikki NULL-aiheiset kysymykset: kolmiarvoisen logiikan. Kun sisäistätte, että vertailut voivat palauttaa arvon TRUE, FALSE tai UNKNOWN, loppu seuraa loogisesti.
NULL ei ole arvo
Haastattelussa tärkein yksittäinen lause on: NULL tarkoittaa arvon puuttumista, ei ole itsessään arvo.
Ette siis voi verrata sitä =-operaattorilla samalla tavalla kuin lukuja. Tietokanta ei tiedä, ovatko kaksi tuntematonta arvoa samoja, joten se ei voi päätyä arvoon TRUE tai FALSE.
NULL = 5ei ole FALSE, vaan UNKNOWNNULL = NULLei ole TRUE, vaan UNKNOWNNULL <> NULLon myös UNKNOWN
Siksi naiivi yhtäsuuruuteen perustuva suodatin NULL-arvoja sisältävässä sarakkeessa pudottaa rivejä huomaamatta.
Kaksiarvoinen ja kolmiarvoinen logiikka
Useimmat ohjelmointikielet käyttävät kaksiarvoista logiikkaa: lauseke on joko TRUE tai FALSE. SQL lisää kolmannen lopputuloksen, UNKNOWN, aina kun vertailussa on mukana NULL.
SQL:n predikaatti voi siis saada yhden kolmesta tuloksesta: TRUE, FALSE tai UNKNOWN. WHERE-lause säilyttää rivin vain, jos sen predikaatin tulos on täsmälleen TRUE. Suodatuksessa UNKNOWN toimii kuten FALSE, mutta loogisesti kyse ei ole samasta asiasta.
Haastattelijat testaavat, tunnetteko tämän eron, koska UNKNOWN käyttäytyy NOT-operaattorin yhteydessä eri tavalla kuin FALSE.
Suodatin, joka pudottaa rivejä huomaamatta
Tässä on klassinen esimerkki. Oletetaan, että bonus on joskus NULL. Rekrytoija kysyy: ”Tämän kyselyn pitäisi palauttaa kaikki, joiden bonus ei ole 1000. Miksi se ohittaa työntekijät, joilla ei ole bonusta?”
Rivillä, jolla bonus on NULL, bonus <> 1000 tuottaa tuloksen UNKNOWN, ei TRUE. WHERE-lause säilyttää vain TRUE-rivit, joten nämä työntekijät jäävät pois.
Ratkaisu on käsitellä NULL-arvo erikseen, kuten seuraavassa oppitunnissa käsitellään. Tärkeintä on nyt tunnistaa, että puuttuvat rivit ovat logiikan seuraus eivätkä ohjelmointivirhe.
SELECT name, bonus
FROM employees
WHERE bonus <> 1000;
-- Rows where bonus IS NULL are excluded:
-- NULL <> 1000 evaluates to UNKNOWN, not TRUENULL AND-lausekkeissa
Kolmiarvoinen logiikka muuttaa AND-operaattorin toimintaa. Opetelkaa sääntö ulkoa, niin voitte vastata mihin tahansa totuustaulukkoa koskevaan kysymykseen heti.
- TRUE AND UNKNOWN = UNKNOWN
- FALSE AND UNKNOWN = FALSE
- UNKNOWN AND UNKNOWN = UNKNOWN
Ajatus on tämä: AND tarvitsee vain yhden FALSE-arvon ollakseen varmasti FALSE. Siksi FALSE AND mikä tahansa pysyy arvona FALSE. TRUE AND tuntematon on kuitenkin edelleen tuntematon, koska tuntematon puoli voi osoittautua kummaksi tahansa.
-- If status = 'active' is TRUE but bonus = 100 is UNKNOWN:
SELECT *
FROM employees
WHERE status = 'active' AND bonus = 100;
-- Combined result is UNKNOWN, so the row is NOT returnedNULL OR-lausekkeissa
OR toimii AND-operaattorin peilikuvana. Se tarvitsee vain yhden TRUE-arvon ollakseen varmasti TRUE, joten TRUE ohittaa tuntemattoman.
- TRUE OR UNKNOWN = TRUE
- FALSE OR UNKNOWN = UNKNOWN
- UNKNOWN OR UNKNOWN = UNKNOWN
Rivi voi siis täyttää OR-ehdon, vaikka yksi haara olisi tuntematon, kunhan toinen haara on aidosti TRUE. Tämä on yleinen jatkokysymys AND-kysymyksen jälkeen.
SELECT *
FROM employees
WHERE department = 'Sales' OR bonus = 100;
-- A Sales employee with NULL bonus:
-- TRUE OR UNKNOWN = TRUE, so the row IS returnedNOT vaihtaa TRUE- ja FALSE-arvot, mutta ei UNKNOWN-arvoa
Tämä on hienovarainen kohta, jonka haastattelijat säästävät usein viimeiseksi. NOT vaihtaa TRUE-arvon FALSE-arvoksi ja FALSE-arvon TRUE-arvoksi, mutta NOT UNKNOWN on edelleen UNKNOWN.
Siksi epäonnistunutta ehtoa ei voi vain kääriä NOT-operaattorin sisään tuloksen kääntämiseksi. Jos bonus = 1000 on NULL-rivillä UNKNOWN, myös NOT (bonus = 1000) on UNKNOWN, joten rivi jää edelleen pois.
Negaatio ei tuo NULL-rivejä takaisin. Vain eksplisiittinen IS NULL -testi tekee sen.
-- For a row where bonus IS NULL:
-- bonus = 1000 -> UNKNOWN
-- NOT (bonus = 1000) -> UNKNOWN (still excluded)
SELECT * FROM employees WHERE NOT (bonus = 1000);Esimerkki: NOT IN -ansa
Tämä on yksi useimmin kysytyistä NULL-arvoituksista. NOT IN palauttaa listan sisältäessä NULL-arvon ei yhtään riviä, mikä yllättää kokelaat, jotka odottavat sen vain ohittavan NULL-arvon.
Sisäisesti x NOT IN (1, 2, NULL) laajenee muotoon x <> 1 AND x <> 2 AND x <> NULL. Viimeinen vertailu on UNKNOWN, ja TRUE AND TRUE AND UNKNOWN pelkistyy arvoksi UNKNOWN, joten mikään rivi ei täytä ehtoa.
Turvallinen vaihtoehto on NOT EXISTS, johon tämä ongelma ei vaikuta.
-- Returns ZERO rows if the subquery yields any NULL
SELECT name
FROM employees
WHERE manager_id NOT IN (SELECT manager_id FROM managers);
-- Each comparison against NULL becomes UNKNOWN,
-- and the AND-chain collapses to UNKNOWN for every row.Miksi UNKNOWN toimii WHERE-lauseessa kuten FALSE
Yleinen jatkokysymys kuuluu: ”Jos UNKNOWN ei ole FALSE, miksi rivi pudotetaan aivan kuten FALSE-rivi?”
Vastaus on täsmällinen: WHERE-, ON- ja HAVING-lauseet käyttävät vain TRUE -sääntöä. Sekä FALSE että UNKNOWN epäonnistuvat tässä tarkistuksessa, joten suodatuksessa ne näyttävät samoilta.
Ero tulee esiin vasta negaation ja CHECK-rajoitteiden yhteydessä. CHECK-rajoite hyväksyy rivin, kun ehto on TRUE tai UNKNOWN, joten NULL voi päästä läpi CHECK-tarkistuksesta, jonka oletitte estävän sen.
-- CHECK passes on TRUE or UNKNOWN, so NULL salary is allowed:
-- CONSTRAINT salary_positive CHECK (salary > 0)
-- INSERT ... salary = NULL -> NULL > 0 is UNKNOWN -> allowedSyvällisempi esimerkki: COUNT ja totuusarvojen aukko
Kootaan asia realistiseen haastattelutehtävään. ”Meillä on 100 työntekijää. SELECT COUNT(*) WHERE bonus = 100 palauttaa 30, ja WHERE bonus <> 100 palauttaa 50. Mihin muut 20 katosivat?”
Puuttuvilla 20 työntekijällä on NULL-bonus. Kumpikaan ehdoista = 100 ja <> 100 ei tuota heille arvoa TRUE, vaan molempien tulos on UNKNOWN, joten he jäävät kokonaan kummankin suodattimen ulkopuolelle.
Vastaus, jonka haastattelijat haluavat kuulla, kuuluu: ”Luokat eivät summaudu kokonaismääräksi, koska NULL ei täytä kumpaakaan predikaattia.”
SELECT
COUNT(*) FILTER (WHERE bonus = 100) AS eq_100,
COUNT(*) FILTER (WHERE bonus <> 100) AS ne_100,
COUNT(*) FILTER (WHERE bonus IS NULL) AS null_bonus,
COUNT(*) AS total
FROM employees;Haastattelun avainkohdat
Kun NULL-logiikka tulee esiin, tuokaa esiin nämä kohdat osoittaaksenne senioritason osaamisen:
- NULL tarkoittaa tuntematonta; sen kanssa tehdyt vertailut tuottavat UNKNOWN-tuloksen.
- SQL käyttää kolmiarvoista logiikkaa: TRUE, FALSE ja UNKNOWN.
- WHERE-, ON- ja HAVING-lauseet säilyttävät vain TRUE -tuloksen saavat rivit.
NOT UNKNOWNon edelleen UNKNOWN, joten negaatio ei palauta NULL-rivejä.NOT INpalauttaa NULL-arvon sisältävällä listalla tyhjän tuloksen; suosikaaNOT EXISTS-rakennetta.
Esitelkää ensin malli ja käykää sitten läpi totuustaulukko. Tämä järjestys osoittaa, että ymmärrätte syyn ettekä vain yksittäistä temppua.
Pikatesti
Testatkaa kolmiarvoisen logiikan ymmärtämistänne.
Kertaus
Teillä on nyt NULL-arvoihin liittyvä keskeinen ajattelumalli:
- NULL on tuntematon, ei arvo; älkää koskaan verratko sitä operaattoreilla
=tai<>. - SQL käyttää kolmiarvoista logiikkaa: predikaatit palauttavat arvon TRUE, FALSE tai UNKNOWN.
- Suodatuslauseet säilyttävät vain TRUE -tuloksen saavat rivit; UNKNOWN-rivit katoavat kuten FALSE-rivit.
NOTvaihtaa TRUE- ja FALSE-arvot, mutta jättää UNKNOWN-arvon ennalleen.NOT IN+ NULL -ansa palauttaa nolla riviä; käyttäkää sen sijaanNOT EXISTS-rakennetta.
Seuraavaksi käsitellään oikea tapa testata NULL-arvoja operaattoreilla IS NULL, IS NOT NULL ja NULL-turvallisilla yhtäsuuruusoperaattoreilla.
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 ”Kolmiarvoinen logiikka ja UNKNOWN” ilmainen?
Kyllä – oppitunnin ”Kolmiarvoinen logiikka ja UNKNOWN” 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 ”Kolmiarvoinen logiikka ja UNKNOWN”?
Miksi NULL = NULL ei ole tosi ja miten UNKNOWN leviää ehtojen kautta 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 1/4.
Kuinka kauan ”Kolmiarvoinen logiikka ja UNKNOWN”-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
- Kolmiarvoinen logiikka ja UNKNOWN
- IS NULL, IS NOT NULL ja NULL-turvallinen yhtäsuuruus
- COALESCE, NULLIF ja ISNULL
- NULL-arvot koostefunktioissa, liitoksissa ja DISTINCTissä