45  NULL ile çalışma

SELECT * FROM Customer
WHERE Company is NULL;

45.1 Null Matematiksel İşlemler

İşlem yaparken matematikte ki \(\infty\) gibi bir sabit olarak düşünebilirsiniz. NULL ile yapılan matematiksel işlemler NULL döndürür.

Null ile toplama çıkarma çarpma bölme

Null’a herhangi bir şey toplama çıkarma çarpma bölme sonucu null olur.

  • 3 + NULL = NULL
  • NULL + 3 = NULL
  • 3 - NULL = NULL
  • NULL - 3 = NULL
  • 3 / NULL = NULL
  • NULL / 3 = NULL
  • 3 * NULL = NULL
  • NULL * 3 = NULL
select 3 + NULL as toplama1
, NULL + 3 as toplama2
, 3 - NULL as cıkarma1
, NULL - 3 as cıkarma2
, 3 / NULL as bolme1
, NULL / 3 as bolme2
, 3 * NULL as carpma1
, NULL * 3 as carpma2;
  • Null’u sıfırla çarpmak null’ı verir
select 0 * null, null * 0;

NULL ile betik birleştirme

  • ‘str degeri’ + NULL = NULL
SELECT 'str degeri' + NULL;

NULL eşitlik

Bir Sonsuz değeri, diğer bir sonsuz değere eşit değildir.

  • \(\infty\) \(!=\) \(\infty\)

Aynı şekilde, bir NULL değeri, diğer bir NULL değere eşit değildir.

  • NULL \(!=\) NULL
select null = null, null != null;

Karşılaştırmalar null değerleri için her zaman yanlış(false) döndürür

* NULL = NULL returns NULL
* NULL != NULL returns NULL
select null = null, null != null;

Bir değerin null olup olmadığı IS NULL ile kontrol edilmelidir.

NULL IS NULL returns true

SELECT NULL IS NULL;

Aşağıdaki sorgu 0 satır döndürür. Çünkü Company değeri NULL olan satırlarda bile NULL karşılaştırmaları NULL döndürür. NULL ise doğru yanlış değeri olarak hep yanlış düşünülür. Bundan dolayı hiç satır gelmez.

SELECT * FROM Customer
WHERE Company = NULL;

Bu sorgunun doğru yazımı IS NULL iledir.

SELECT * FROM Customer
WHERE Company is NULL;

NULL ve false

Null ve false karşılaştırması false sonucu verir çünkü AND işleminde bir taraf yanlış ise diğer tarafın ne olduğu önemli değildir.

select null AND false as NullVeYanlış1 ,NOT (null AND false) as NOT_NullVeYanlış ,NOT NULL as NOT_NULL ;

NULL veya Doğru

Null veya doğru karşılaştırması doğru sonucu verir çünkü OR işleminde bir taraf doğru ise diğer tarafın ne olduğu önemli değildir.

select null OR true;

NULL ve Case

Case ifadesinde NULL kontrolü IS NULL ile yapılmalıdır. Aşağıdaki sorgu 0 sonucu verir. Case ifadesinde null sonucu elde edildiği için ELSE çalıştırılır.

select CASE WHEN null THEN 1 ELSE 0 END;

Yukarıdaki sorgunun aşağıdaki null karşılaştırmasından pek farkı yoktur.

select null = null, null != null;

SELECT DISTINCT

NULL değerleri SELECT DISTINCT sorgularında 1 tane gibi gösterilir. Aşağıdaki sorguda bir tek NULL gelmektedir.

SELECT DISTINCT Company FROM Customer

Ama Firma değeri NULL olan 49 Müşteri vardır.

SELECT COUNT(*) FROM Customer
WHERE Company IS NULL;

UNION

NULL değerleri UNION sorgularında 1 tane gibi gösterilir. Aşağıdaki sorguda bir tek NULL gelmektedir.

SELECT State FROM Customer
UNION
SELECT State FROM Employee

Ama State değeri NULL olan 29 Müşteri vardır.

SELECT COUNT(*) FROM Customer
WHERE State IS NULL;

45.2 3 Değerli Mantık (NULL, True, False)

p q p OR q p AND q p = q
True True True True True
True False True False False
True Unknown True Unknown Unknown
False True True False False
False False False False True
False Unknown Unknown False Unknown
Unknown True True Unknown Unknown
Unknown False Unknown False Unknown
Unknown Unknown Unknown Unknown Unknown
p NOT p
True False
False True
Unknown Unknown

45.3 NULL veri tabanlarında çalışma

Aşağıdaki tablo SQLite’da ve Diğer Veritabanı Motorlarında NULL İşleme dokumantasyonundan alınmış ve türkçeleştirilmiştir.

SQLite Oracle MS-SQL
Null’a herhangi bir şey eklemek null verir Yes Yes Yes
Null’u sıfırla çarpmak null’ı verir Yes Yes Yes
null’lar UNIQUE sütununda farklıdır Yes Yes No
null’lar SELECT DISTINCT’te farklıdır No No No
null’lar UNION’da farklıdır No No No
“CASE WHEN null THEN 1 ELSE 0 END” 0 mıdır? Yes Yes Yes
“null OR true” doğru mudur? Yes Yes Yes
“not (null AND false)” doğru mudur? Yes Yes Yes

Yukarıdaki tabloda görülebileceği gibi çalıştığımız 3 veri tabanında da null hemen hemen aynı çalışmaktadır. Bir tek Tablolarda Unique değerler için SQL-Server farklı çalışmaktadır.