Adatbázistervezés Blog

Az adatbázistervezéstől az üzleti intelligencia rendszerekig (nem csak) kisvállalkozóknak
Home » Adatbázistervezés Blog | T-SQL

Az a fránya NULL...

5. október 2016 by Babaics Alexandra 0 Megjegyzések

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!




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ő!

 

De akkor, 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 (azaz 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ű” (tehát IS NOT NULL).

 

 

 

Ezek elég egyszerű példák voltak. Nézzünk egy kicsit haladóbbat!

 

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 (Useres) az összes rekordot, jobb oldalról (Companies) viszont csak az egyezőket. Ahol nem talál egyezést, akkor 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 Babaics Alexandra       babaics.alexandra@adatbazistervezes.hu Adatbázistervezés.hu

2 Teszt User                   testuser@testuser.hu                               NULL

 

Ha az előbbi lekérdezés tartalmazza a Where feltételt (azaz WHERE  C.Company IS NULL -t), akkor csak a 2-es Teszt User (illetve a további NULL-os sorok) jelennek 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 (Segítségnyújtás stb.).



Megjegyzések lezárva