Az a fránya NULL...

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.

 Versenyzők tábla

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. 

 Versenyzők tábla select

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)

 Versenyzők tábla hiányzó eredmények

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).

 Versenyzők akiknek van eredménye

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 ;-)

Megjegyzés Hozzáfűzése