45 NULL ile çalışma
- NULL bilinmeyen veya eksik veri için kullanılır.
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.