Burada umarım konumumu netleştireceğim.
Bu NULL = NULL
değerlendirme FALSE
yanlıştır. Hacker ve Mister doğru cevap verdi NULL
. İşte nedeni. Dewayne Christensen, Scott Ivey'e bir yorumda bana şunları yazdı :
Aralık olduğu için mevsimlik bir örnek verelim. Ağacın altında iki hediyem var. Şimdi bana aynı şeyden iki tane alıp almadığımı söyle.
Farklı olabilirler veya eşit olabilirler, her iki hediyeyi de açana kadar bilemezsiniz . Kim bilir? Birbirini tanımayan ve her ikisi de size aynı hediyeyi vermiş olan iki kişiyi davet ettiniz - nadir ama imkansız değil § .
Öyleyse soru: bu iki UNKNOWN sunum aynı mı (eşit, =)? Doğru cevap: BİLİNMİYOR (yani NULL
).
Bu örnek, ".. ( false
veya null
sisteminize bağlı olarak) .." nin doğru bir cevap olduğunu göstermeyi amaçladı - bu değil, sadece NULL
3VL'de doğru (veya yanlış cevaplar veren bir sistemi kabul etmeniz uygun mu? )
Bu soruya verilecek doğru cevap şu iki noktayı vurgulamalıdır:
- üç değerli mantık (3VL) mantığa aykırıdır (emin olmak için Stackoverflow'da ve diğer forumlarda bu konuyla ilgili sayısız diğer soruya bakın);
- SQL tabanlı DBMS'ler genellikle 3VL'ye bile saygı göstermezler, bazen yanlış yanıtlar verirler (orijinal posterin iddia ettiği gibi, bu durumda SQL Server yapar).
Bu yüzden yineliyorum: SQL, eşitliğin refleksif özelliğini yorumlamaya zorlamak için iyi değildir, ki bu şunu ifade eder:
for any x, x = x
§§ (sade İngilizce'de: söylemin evreni ne olursa olsun, bir "şey" her zaman kendisine eşittir ).
.. bir 3il içinde ( TRUE
, FALSE
, NULL
). İnsanların beklenti 2il (uyumlaştıracağını TRUE
, FALSE
hatta SQL diğer tüm değerleri için geçerli olduğu), yani x = x
her zaman için değerlendirmek TRUE
istisnasız - x'in olası değeri için,.
Ayrıca NULL'ların, ilişki değişkenlerinin bir parçası olarak öznitelik değerleri (??) olarak atayabilecekleri geçerli "değer olmayanlar " (savunucuları gibi) olduğuna dikkat edin. Dolayısıyla, bunlar yalnızca mantıksal ifadelerin türü için değil, her türden (etki alanı) kabul edilebilir değerlerdir.
Demek istediğim şuydu : NULL
değer olarak "tuhaf bir canavar". Örtüşme olmadan şunu söylemeyi tercih ederim: saçma .
Bu formülasyonun çok daha net ve daha az tartışmalı olduğunu düşünüyorum - yetersiz İngilizce yeterliliğim için üzgünüm.
Bu, NULL'lerin sorunlarından yalnızca biridir . Mümkünse onlardan tamamen kaçınmak daha iyidir.
§ Burada değerlerle ilgileniyoruz , bu nedenle iki hediyenin her zaman iki farklı fiziksel nesne olması, geçerli bir itiraz değildir; Eğer ikna olmadıysanız özür dilerim, burası değer ve "nesne" semantiği arasındaki farkı açıklayacak yer değildir (İlişkisel Cebir başlangıçtan itibaren değer anlamsallığına sahiptir - Codd'un bilgi ilkesine bakın; bazı SQL DBMS uygulamacılarının Ortak bir anlam bile umursamıyorum).
§§ , bildiğim kadarıyla, bu, antik çağlardan beri kabul edilen bir aksiyomdur (bir şekilde veya başka bir şekilde, ancak her zaman 2VL'de yorumlanır) ve tam olarak çünkü çok sezgiseldir. 3VL'ler (gerçekte bir mantık ailesidir) çok daha yeni bir gelişmedir (ancak ilk ne zaman geliştirildiğinden emin değilim).
Yan not: Eğer birisi SQL NULL'ları gerekçelendirmek için Alt , Birim ve Seçenek Türlerini tanıtacaksa , ancak NULL'larla SQL uygulamalarının nasıl sağlam bir sisteme sahip olduğunu gösteren oldukça ayrıntılı bir incelemeden sonra ikna olacağım ve sonunda, NULL'ların (bu "tam olmayan değerler") gerçekte ne olduğu.
Aşağıda bazı yazarlardan alıntı yapacağım. Herhangi bir hata ya da eksiklik muhtemelen benimdir ve orijinal yazarlara ait değildir.
Joe Celko SQL NULL'larda
Joe Celko'nun bu forumda sık sık alıntı yaptığını görüyorum. Görünüşe göre burada çok saygın bir yazar. Ben de kendi kendime dedim ki: "SQL NULL'lar hakkında ne yazdı? NULL'ların sayısız problemini nasıl açıklıyor?". Bir arkadaşımın akıllılar için Joe Celko'nun SQL'sinin bir e-kitap sürümü var: gelişmiş SQL programlama, 3. sürüm . Bakalım.
İlk olarak, içindekiler tablosu. Beni en çok etkileyen şey, NULL'dan kaç kez bahsedildiği ve çok çeşitli bağlamlarda:
3.4 Aritmetik ve NULL'lar 109
3.5
NULL'a ve NULL'dan Değerleri Dönüştürme 110
3.5.1 NULLIF () Fonksiyonu 110
6 NULL'lar: SQL'de Eksik Veriler 185
6.4 NULL'ları Karşılaştırma 190
6.5
NULL'lar ve Mantık 190 6.5.1 Alt Sorgu Öngörülerinde NULLS 191
6.5.2 Standart SQL Çözümleri 193
6.6 Matematik ve NULL'lar 193
6.7 Fonksiyonlar ve NULL'lar 193
6.8 NULL'lar ve Konak Dilleri 194
6.9 NULL'lar için Tasarım Önerileri 195
6.9.1 Ana Bilgisayar Programlarından NULL'lerden Kaçınma 197
6.10 Birden Fazla NULL Değerine İlişkin Bir Not 198
10.1 IS NULL Predicate 241
10.1. 1 NULL Kaynakları 242
...
ve bunun gibi. Bana "iğrenç özel durum" gibi geliyor.
Telif hakkı nedeniyle kendimi temel konularla sınırlamaya çalışarak, bu kitaptan alıntılarla bu davalardan bazılarına gideceğim. Bence bu alıntılar "adil kullanım" doktrini kapsamına giriyor ve kitabı satın almaya teşvik bile edebiliyorlar - bu yüzden hiç kimsenin şikayet etmemesini umuyorum (aksi takdirde hepsini olmasa da çoğunu silmem gerekecek). Ayrıca, aynı nedenle kod parçacıklarını bildirmekten de kaçınmalıyım. Bunun için üzgünüm. Ayrıntılı muhakeme hakkında okumak için kitabı satın alın.
Aşağıda, parantez içindeki sayfa numaraları.
BOŞ DEĞİL Kısıtlaması (11)
En önemli sütun kısıtlaması, bir sütunda NULL kullanımını yasaklayan NOT NULL'dur. Bu kısıtlamayı rutin olarak kullanın ve yalnızca iyi bir nedeniniz olduğunda kaldırın. Verilerle ilgili sorgulamalar yaptığınızda NULL değerlerin komplikasyonlarından kaçınmanıza yardımcı olacaktır .
Bu bir değer değil ; bir değerin gidebileceği bir yeri tutan bir işarettir.
Yine bu "değer ama tam anlamıyla bir değer değil" saçmalığı. Gerisi bana oldukça mantıklı geliyor.
(12)
Kısacası, NULL'lar SQL'de daha sonra tartışacağımız birçok düzensiz özelliğe neden olur. En iyi bahsiniz, kaçınamadığınız durumlarda NULL'ların durumlarını ve kurallarını ezberlemektir.
SQL, NULLs ve infinite eğilimleri:
(104) BÖLÜM 3: SQL'DE SAYISAL VERİ
SQL, matematik için IEEE modelini çeşitli nedenlerle kabul etmemiştir.
...
SQL'de matematik için IEEE kurallarına izin verilseydi, sonsuz için tür dönüştürme kurallarına ve dönüşümden sonra sonsuz bir tam sayısal değeri temsil etmenin bir yoluna ihtiyacımız olacaktı. İnsanların NULL'larla yeterince sorunu var, o yüzden oraya gitmeyelim.
SQL uygulamaları, belirli bağlamlarda NULL'un gerçekte ne anlama geldiğine karar vermedi:
3.6.2 Üstel Fonksiyonlar (116)
Sorun, logaritmaların tanımsız olmasıdır (x <= 0). Bazı SQL uygulamaları bir hata mesajı verirken bazıları NULL ve DB2 / 400 döndürür ; sürüm 3 sürüm 1, sonuç olarak * NEGINF ("negatif sonsuzluk" un kısaltması) döndürdü.
Joe Celko, David McGoveran ve CJ Date'den alıntı yapıyor:
6 NULL: SQL'de Eksik Veri (185)
Onların kitabında Sybase ve SQL Server Bir Kılavuz , David McGoveran ve CJ tarihi şunları söyledi: “Şu anda tanımlanmış ve SQL uygulandığı şekliyle En az, boş değerlere daha bu yazarın görüşü, değer oldukları ve kaçınılmalıdır çok daha sorunludur; çok garip ve tutarsız davranışlar sergilerler ve zengin bir hata ve kafa karışıklığı kaynağı olabilirler. (Lütfen bu yorumların ve eleştirilerin yalnızca SQL Server için değil, SQL tarzı NULL'leri destekleyen tüm sistemler için geçerli olduğunu unutmayın.) "
Uyuşturucu bağımlılığı olarak NULL'lar :
(186/187)
Bu kitabın geri kalanında, çelişkili görünebilir, ancak değildir onları kullanmamanızı tavsiye edeceğim . NULL'u bir ilaç olarak düşünün; doğru kullanın ve sizin için işe yarar, ancak kötüye kullanırsanız her şeyi mahvedebilir. En iyi politikanız, mümkün olduğunda BOŞ'lardan kaçınmak ve gerektiğinde bunları doğru şekilde kullanmaktır.
Buradaki tek itirazım, belirli uygulama davranışlarıyla kötü bir şekilde etkileşime giren "bunları doğru şekilde kullanmaktır".
6.5.1 Alt Sorgu Tahminlerinde NULLS (191/192)
İnsanlar, bir alt sorgunun genellikle NULL ile karşılaştırmayı gizlediğini unutur. Şu iki tabloyu düşünün:
...
Sonuç boş olacaktır. Bu mantık dışıdır , ancak doğrudur.
(ayırıcı)
6.5.2 Standart SQL Çözümleri (193)
SQL-92, formun yeni bir yüklemini ekleyerek bazı 3VL (üç değerli mantık) problemlerini çözdü:
<arama koşulu> [DEĞİL] DOĞRU | YANLIŞ | BİLİNMEYEN
Ancak UNKNOWN kendi başına bir sorun kaynağıdır, bu nedenle CJ Date, aşağıda alıntılanan kitabında bölüm 4.5'te öneriyor . SQL'de Boş Değerlerden Kaçınma :
- UNKNOWN anahtar kelimesini hiçbir bağlamda kullanmayın.
Aşağıda bağlantısı verilen UNKNOWN'daki "ASIDE" bölümünü okuyun .
6.8 NULL'lar ve Konak Dilleri (194)
Ancak, bir ana bilgisayar programına geçirilmeleri gerektiğinde NULL'ların nasıl işlendiğini bilmelisiniz. Gömme işleminin tanımlandığı hiçbir standart ana bilgisayar dili NULL'leri desteklemez, bu da onları veritabanı şemanızda kullanmaktan kaçınmanız için başka bir iyi nedendir.
(ayırıcı)
6.9 NULL'lar için Tasarım Önerileri (195)
Mümkün olduğunda tüm temel tablolarınızı tüm sütunlarda NOT NULL kısıtlamaları ile bildirmek iyi bir fikirdir. NULL'lar SQL bilmeyenlerin kafasını karıştırır ve NULL'lar pahalıdır.
İtiraz: NULL'lar SQL'i iyi bilen kişilerin bile kafasını karıştırır, aşağıya bakınız.
(195)
YABANCI ANAHTARlarda BOŞ'lardan kaçınılmalıdır. SQL, bu "şüphenin faydası" ilişkisine izin verir, ancak birleştirmeleri içeren sorgularda bilgi kaybına neden olabilir. Örneğin, Envanterde bir Siparişler tablosu tarafından YABANCI ANAHTAR olarak atıfta bulunulan bir parça numarası kodu verildiğinde, BOŞ olan parçaların bir listesini almakta sorun yaşarsınız. Bu zorunlu bir ilişkidir; olmayan bir parçayı sipariş edemezsiniz.
(ayırıcı)
6.9.1 Ana Bilgisayar Programlarından NULL'lardan Kaçınma (197)
Bazı programlama disiplinleri ile Ana Bilgisayar Programlarından veritabanına NULL koymayı önleyebilirsiniz.
...
- Eksik verilerin programlama ve raporlama üzerindeki etkisini belirleme:
NULL içeren sayısal sütunlar bir sorundur, çünkü toplama işlevlerini kullanan sorgular yanıltıcı sonuçlar sağlayabilir.
(ayırıcı)
(227)
Boş bir kümenin TOPLA () değeri her zaman NULL olur. Bu numarayı kullanırken yapılan en yaygın programlama hatalarından biri, birden fazla satır döndürebilen bir sorgu yazmaktır. Düşünmediyseniz, son örneği şu şekilde yazmış olabilirsiniz: ...
(ayırıcı)
10.1.1 NULL Kaynakları (242)
NULL'ların nerede oluşabileceğini hatırlamak önemlidir. Bir sütundaki olası bir değerden daha fazlasıdırlar . Boş kümelerdeki toplama işlevleri, OUTER JOIN'ler, NULL'larla aritmetik ifadeler ve OLAP operatörlerinin tümü NULL döndürür. Bu yapılar genellikle GÖRÜNÜM'lerde sütun olarak görünür.
(ayırıcı)
(301)
NULL'larla ilgili başka bir sorun, IN tahminlerini EXISTS tahminlerine dönüştürmeye çalıştığınızda bulunur.
(ayırıcı)
16.3 TÜM Tahmin ve Ekstrema İşlevleri (313)
İlk bakışta bu iki yüklemin SQL'de aynı olmaması mantığa aykırıdır:
...
Ancak ekstremma işlevlerinin kurallarını hatırlamanız gerekir - daha büyük veya en küçük değerleri döndürmeden önce tüm NULL'leri çıkarırlar. ALL koşulu, NULL'leri düşürmez, böylece onları sonuçlarda elde edebilirsiniz.
(ayırıcı)
(315)
Bununla birlikte, standarttaki tanım olumsuz olarak ifade edilmiştir, böylece BOŞLAR şüpheden faydalanır. ...
Gördüğünüz gibi, UNIQUE kısıtlamalarda NULL'lardan kaçınmak iyi bir fikirdir.
GROUP BY tartışılıyor:
NULL'lar birbirlerine eşitmiş gibi davranılır ve kendi gruplarını oluşturur. Her grup daha sonra eskisinin yerini alan yeni bir sonuç tablosunda tek bir satıra indirgenir.
Bu, GROUP BY yan tümcesi için NULL = NULL, 3VL'de olduğu gibi NULL olarak değerlendirilmediği, ancak TRUE olarak değerlendirildiği anlamına gelir.
SQL standardı kafa karıştırıcı:
ORDER BY ve NULL'lar (329)
NULL olan bir sıralama anahtarı değerinin NULL olmayan bir değerden büyük veya küçük olarak kabul edilip edilmeyeceği uygulama tanımlıdır, ancak ...
... Her iki şekilde de yapan SQL ürünleri var.
Mart 1999'da Chris Farrar, geliştiricilerinden birinin sorduğu ve SQL Standardının anladığımı sandığım bir bölümünü incelemesine neden olan bir soruyu gündeme getirdi . Chris , spesifikasyonun genel anlayışıyla gerçek ifadesi arasında bazı farklılıklar buldu .
Ve bunun gibi. Celko tarafından yeterli olduğunu düşünüyorum.
SQL NULL'larında CJ Tarihi
CJ Date, NULL'lar hakkında daha radikaldir: SQL'de NULL'lardan kaçının, nokta. Aslında, SQL ve İlişkisel Teorisi: Doğru SQL Kodu Nasıl Yazılır'ın 4. bölümü, "ÇİFTLEME YOK, BOŞLUK YOK" başlıklı,
"4.4 Boşlukların Nesi Yanlış?" ve "4.5 SQL'de Boş Değerlerden Kaçınma" (bağlantıyı takip edin: Google Kitaplar sayesinde bazı sayfaları çevrimiçi olarak okuyabilirsiniz).
Fabian Pascal, SQL NULLs üzerinde
Onun itibaren Veritabanı Yönetimi Pratik Sorunları - Düşünme Pratisyen için bir Başvurusu (hiçbir alıntılar on-line, üzgünüm):
10.3 Pratik Çıkarımlar
10.3.1 SQL NULL'leri
... SQL, 3VL'nin doğasında bulunan sorunların yanı sıra pek çok tuhaflık, komplikasyon, mantıksızlık ve doğrudan hatalardan muzdariptir [10, 11]; aralarında şunlar yer almaktadır:
- Toplama işlevleri (örneğin, SUM (), AVG ()) NULL'leri yoksayar (COUNT () hariç).
- Satırları olmayan bir tablodaki skaler bir ifade, 0 yerine hatalı olarak NULL olarak değerlendirilir.
- "NULL = NULL" ifadesi NULL olarak değerlendirilir, ancak aslında SQL'de geçersizdir; yine de ORDER BY, NULL'ları eşit kabul eder ("normal" değerlerden önce veya sonra gelen her şey DBMS satıcısına bırakılır).
- "X IS NOT NULL" ifadesi, 2VL'de olduğu gibi "NOT (x IS NULL)" 'a eşit değildir.
...
Ticari olarak uygulanan tüm SQL lehçeleri bu 3VL yaklaşımını izler ve bu nedenle, yalnızca bu sorunları ortaya çıkarmakla kalmaz , aynı zamanda ürünlere göre değişen özel uygulama sorunları da vardır .