Kezdőknek sokszor fejtörést szokott okozni „az a fránya NULL az adatbázisban”. Itt az ideje, hogy megnézzük közelebbről!
De mi az a NULL?
A NULL az "üres értékű" mezőt reprezentálja, konkrétabban, ha egy mező értéke nincs kitöltve.
Sokan keverik a nulla értékkel, de nagyon fontos, hogy a NULL az nem egyenlő 0-val, szöveges mező esetén pedig nem egyenlő az üres string-gel. Sőt! A NULL még a NULL-lal sem egyenlő!!! A NULL semmivel sem egyenlő!
Hogyan találjuk meg?
Mivel a NULL nem egyenlő semmivel, az azt jelenti, hogy se nem kisebb, se nem nagyobb semminél, következésképp a =, <, or <> operátorok nem használhatók.
A megoldás az IS NULL illetve IS NOT NULL operátor lesznek.
Nézzünk példákat!
Adott a következő adatbázistáblánk, amelyben a versenyzőink pontszámát tároljuk.
Ha megnézzük a tábla tartalmát, a VersenyzoPontszam oszlopban a NULL-ok mutatják, hogy kinek nem vittük fel még az adatait. A SQL Server Management Studio még ki is emeli a NULL értékeket halvány sárgával.
A példa kedvéért most kis létszámú versenyzőnk van, de képzeljük el, ha több ezren versenyeznek! Gyakori eset, hogy többen pontoznak, így az eredményeket össze-vissza kapjuk meg.
1. Ilyenkor jól jöhet, ha kilistázzuk, hogy mely versenyzők eredménye hiányzik, azaz a VersenyzoPontszam mező „értéke” még NULL (IS NULL)
2. De az még jobb, ha már publikáljuk azoknak az eredményét, akiknek már rögzítettük. Tehát listázzuk azokat, akiknek már van eredménye, azaz a VersenyzoPontszam nem NULL „értékű” (IS NOT NULL).
Ezek elég egyszerű példák voltak.
Nézzünk egy picivel haladóbb példát!
Tegyük fel, hogy van egy rendszerünk, amelyben - első lépésben - regisztráltak az ügyfeleink, majd -második lépésben - felvihették a saját vállalkozásuk adatait. Hogyan tudnánk kiszűrni azokat, illetve lekérdezni az e-mail címüket, akik csak regisztráltak, de nem vitték fel a vállalkozásuk adatait?
Így:
SELECT U.UserID, U.UserName, U.Email, C.Company
FROM Users U
LEFT JOIN Companies C
ON U.UserID = C.UserID
WHERE C.Company IS NULL
Miért így?
Két táblában tároljuk a feladatban releváns adatokat. Látható, hogy Left Join-nal kötjük össze őket a UserID alapján.
A Left Join azt jelenti, hogy vesszük baloldalról (Users) az összes rekordot, jobb oldalról (Companies) viszont csak az egyezőket. Ahol nem talál egyezést, ott NULL-t kapunk eredményként. Emiatt tudunk szűrni a Where feltételben az NULL-okra, visszanyerve azokat a felhasználóinkat, akikhez még nincs vállalkozás regisztrálva.
Ilyen jellegű az eredmény, UserID, UserName, Email, Company megjelenítve, ha az előbbi lekérdezést futtatjuk Where feltétel nélkül.
UserID UserName Email Company
1 Teszt User1 testuser1@testuser1.hu Test Company
2 Teszt User2 testuser2@testuser2.hu NULL
…
Ha az előbbi lekérdezés tartalmazná a WHERE C.Company IS NULL feltételt, akkor csak a Teszt User2 (illetve a további NULL-os sorok) jelennének meg az eredményben. Tehát csak azokat a felhasználókat mutatja, akik regisztráltak már, de nem vitték még fel a vállalkozásuk adatait.
A visszakapott lista alapján pedig dönthetünk a további teendőkről pl. segíthetünk felvinni az adatokat ;-)