Anasayfa / Yazılım / SQL / NULL Veriler

NULL Veriler

NULL demek herhangi bir veri satırında ilgili kolona hiçbir verinin girilmemesi demektir. Şöyle bir site düşünelim. Kitap satışı yapan bir e-ticaret sitesi var ve bu sitenin müşteriler tablosu mevcut. Müşteri bilgileri bu tabloda tutuluyor. İşte müşteri adı, müşteri soyadı, müşteri yaşı, müşteri telefonu, şehri, semti vb diğer bilgiler. Biz bir takım bilgileri girmesi için tablomuzda bazı alanları zorunlu bazı alanları ise opsiyonel olarak isterse doldurabilir şeklinde bırakıyoruz. Telefon alanı da opsiyonel alanlardan birisi olmuş olsun. Müşteri bilgi formunda telefon alanını doldurmadığında bilgi formu yine kayıt yapıyor olsun, telefon alanı da boş olan her müşteri bilgisi yani her müşteri satırında da telefon kolonu boş olur yani NULL olur. Şimdi bu müşterinin telefonu yok mu demektir? Tabii ki değil, müşteri ya cidden telefonu yok ya da opsiyonel bir durum olduğu için bu alanı es geçip doldurmamıştır. İşte NULL verilerin söz konusu olduğu veriler ile çalışırken bir takım veri tutarsızlıkları ile başbaşa kalabiliriz. Sorgularımızı yazdığımızda eksik sonuçlar alabilme olasılığımız söz konusudur. Şimdi bu problemi örneklerle açıklayalım. AdventureWorks veritabanı üzerinde çalışıyorum.

SELECT MiddleName FROM Person.Person;

Person.Person tablosundan MiddleName alanlarını çekiyorum. Sonuç olarak karşıma 19972 satır geliyor.

211201

Daha sonra aşağıdaki sorguyu yazıyorum.

SELECT MiddleName FROM Person.Person WHERE MiddleName = 'E';

Person.Person tablosundan MiddleName alanı E olan verileri çekiyorum, 736 sonuç dönüyor.

211202

Daha sonra aşağıdaki sorguyu yazıyorum.

SELECT MiddleName FROM Person.Person WHERE MiddleName != 'E';

211203

Person.Person tablosundan MiddleName alanı E olmayan verileri çekiyorum, 10737 sonuç dönüyor. Yani bir önceki sorgumun tam tersi. Ee bu durumda bir mantıksal hata var! Şimdi ben tüm verileri 19972 buldum. E olanları 736 buldum. 19972-736 dediğimde de E olmayanları bulmam gerek, geri dönmesi beklenen sonuç : 19236 olmalı. Peki geri ne döndü? 10737.. Arada tam 8499 veri yok. Ben tam 8499 veriyi sorgumda listeleyemedim. Bu çok ama çok büyük bir tehlike, çok büyük bir risk. Çok büyük bir hata, milyonluk bir iş yapıyorsunuz varsayınız büyük bir hata ile karşı karşıyasınız 🙂

Neyse olayı bayağı büyüttüm, artık önemi kavradık ve yazı daha dikkatlice okunuyor 🙂 Ama aslında olay cidden büyük.

Şimdi peki bu sorunu nasıl aşabiliriz. Eğer biz bir tabloda NULL olabilir bir alan tanımladı isek ve bu alanın da daha sonra listelenmesini istiyor isek mutlaka Null alanları da dikkate alacak bir sorgu yazmalıyız. Dolayısı ile ben eğer aşağıdaki gibi bir sorgu yazarsam doğru sonuçları almış olurum..

SELECT MiddleName FROM Person.Person WHERE MiddleName IS NULL OR MiddleName != 'E';

211204

İşte şimdi doğru sonuç döndü. Tam 19236 adet. Sağ altta görebilirsiniz. İşte doğru sonuca ulaşabilmek için NULL olan alanları da dikkate alarak sorguma IS NULL deyimini ekledim. Bu durumu asla unutmayınız.

Şimdi şu sonuçları alacak sorguları yazmaya çalışalım.

Production.Product tablosundan Color alanı boş olanların ProductID, Name, ProductNumber, Color, Size, Style alanlarının listelenmesini sağlayan sorguyu yazalım.

SELECT ProductID, Name, ProductNumber, Color, Size, Style FROM Production.Product
WHERE Color IS NULL

211205

248 sonuç döndü.

Production.Product tablosundan Color alanı Red olanların ProductID, Name, ProductNumber, Color, Size, Style alanlarının listelenmesini sağlayan sorguyu yazalım. Yalnız biliyoruz ki Color alanında NULL’da olabilir, bunu dikkate alalım.

SELECT ProductID, Name, ProductNumber, Color, Size, Style FROM Production.Product
WHERE Color IS NULL OR Color <> 'Red'

211206

466 sonuç döner.

Production.Product tablosundan Style, Size veya Color alanlarından en az herhangi birisinin bir değere sahip olduğu satırların (verilerin) ProductID, Name, ProductNumber, Color, Size, Style alanlarını listeleyelim.

SELECT ProductID, Name, ProductNumber, Color, Size, Style FROM Production.Product
WHERE Color IS NOT NULL OR Size IS NOT NULL OR Style IS NOT NULL;

211207

256 sonuç döner..

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir