Veritabanı Tasarımı COUNT, DISTINCT, NVL
Konular COUNT grup fonksiyonu kullanarak SQL sorgusu oluşturmak ve çalıştırmak Grup fonksiyonları ile DISTINCT ve NVL fonksiyonu kullanmak 2
Amaç SQL fonksiyonları elle yapılması gereken hesaplamalar yapmak için birlikte çalışma sağlar. Okulunuzda öğrencilerin tümünü saymak zorunda olduğunuz örneği hatırlıyor musunuz? Zor bir görev! Sadece elle gerçekleştirmek için yeterince el yoktur. Neyse ki, SQL grup fonksiyonları bu tür istekleri kolayca işleyebilir. 3
COUNT COUNT(ifade): Sütundaki null olmayan değerlerin sayısını verir. SELECT COUNT (YEAR) FROM d_cds WHERE year < 2001; COUNT (YEAR) 5 COUNT (DISTINCT ifade): Sütundaki benzersiz null olmayan değerlerin sayısını verir. SELECT COUNT (DISTINCT year) FROM d_cds WHERE year < 2001; COUNT (DISTINCT YEAR) 4 4
COUNT ve NULL Değerler Tabloda null kayıtları da içeren 6 yorum kaydı listelenmektedir. Fakat count fonksiyonu sadece 5 döndürmüştür, neden? SELECT comments FROM d_play_list_items; COUNT comments sütununu sayar ama sütundaki null değerleri atlar. COMMENTS Play late (null) Play early Play after cake cutting Play first Play for the father SELECT COUNT(comments) FROM d_play_list_items; COUNT (COMMENTS) 5 5
COUNT (Tüm Satırları) COUNT (*) SELECT deyiminin kriterlerini karşılayan bir tablodaki satır sayısını döndürür. Saymak için özel bir sütun belirtir. Sonuç kümesinde döndürülen satırların sayısını sayar. SELECT COUNT (*) FROM d_cds WHERE year < 2001; COUNT (*) 5 Örneğin, 2001 yılından önce üretilmiş olan CD'lerde DJ sayısını bulmak için, COUNT SELECT deyimi içinde kullanılabilir. Bir veya daha fazla sütun boş değerlere sahip olsa da tüm satırları saymak için COUNT (*) kullanırız. 6
DISTINCT DISTINCT anahtar sözcüğü bir sorguda sadece yinelenmeyen değerleri veya yinelenmeyen değerlerin kombinasyonlarını döndürmek için kullanılır. SELECT year as CD Year FROM d_cds; Yukarıdaki sorguyu inceleyin. DISTINCT anahtarını kullanmadan, sorgu yinelenen değerleri içeren tüm değerleri döndürür. CD Year 1997 2000 2002 1999 2000 2001 1998 2004 7
DISTINCT Örneği Yinelenen satırları ortadan kaldırmak için burada gösterildiği gibi DISTINCT anahtar sözcüğünü kullanın. SELECT DISTINCT year AS CD Year FROM d_cds; DISTINCT anahtar sözcüğünü kullanarak yinelenen değerler sadece bir kez döndü. CD Years 1997 1998 1999 2000 2001 2002 2004 8
DISTINCT Yinelenmeyen DISTINCT anahtarı, birden fazla sütunu seçmek için kullanıldığında seçili sütunların yinelenmeyen kombinasyonları dönecektir. Aşağıda gösterilen sonuç kümesini inceleyin. Yıl ve başlık kombinasyonu çiftlerinde herhangi bir yineleme söz konusu değildir. SELECT DISTINCT year, title FROM d_cds; 9 YEAR TITLE 1997 The Celebrants Live in Concert 1998 Graduation Songbook 1999 Songs from My Childhood 2000 Cape Diem 2000 Party Music for All Occasions 2001 Here Comes the Bride 2002 Back to the Shire 2004 Whirled Peas
DISTINCT Kullanımı DISTINCT anahtarı tüm grup fonksiyonları ile kullanılabilir. DISTINCT kullanımı fonksiyona sadece yinelenmeyen değerleri dikkate aldırır. SELECT SUM(salary) FROM employees WHERE department_id = 90; SELECT SUM(DISTINCT salary) FROM employees WHERE department_id = 90; Neden üstteki iki tablo farklı sonuçlar üretmektedir? 10
DISTINCT ve COUNT COUNT gibi bir grup fonksiyonu ile DISTINCT kullanırken, sonuç kümesi yinelenmeyen sütun değerlerinin sayısını dönecektir. SELECT COUNT (DISTINCT job_id) FROM employees; COUNT (DISTINCT job_id) 12 SELECT COUNT (DISTINCT salary) FROM employees; COUNT (DISTINCT salary) 18 Kaç farklı iş çalışanlara tahsis edilir? Kaç farklı maaş miktarı çalışanlara ödenir? 11
NVL Bazen grup işlevlerinde boş değerleri dahil etmek tercih edilir. Örneğin, her gün müşteri siparişlerinin ortalama sayısı her ay ne kadar yiyecek sipariş verileceği tahmininde kullanılabilir. Bazı günler restoran kapalı olur ve hiçbir müşteriye servis edilmez, fakat restoran sahibi kapalı olduğu günleri de dahil ederek ortalama hesaplama yapar. Bu hesap sadece müşterileri olan günlerin sayılmasından daha iyi bir göstergedir. Null değerleri içerecek şekilde SELECT deyimi şu şekilde yazılır: SELECT AVG(NVL(customer_orders, 0)) 12