Veritabanı Tasarımı Alt Sorgu Temelleri
Konular Verilerin elde edilmesi için alt sorguların tanımlanması ve açıklanması WHERE yantümcesinde tek satır alt sorgu oluşturulması ve çalıştırılması Tek satır ve çoklu satır alt sorguların arasındaki fark İkili ve ikili olmayan alt sorguların arasındaki fark EXISTS ve NOT EXISTS operatörlerini sorgulamada kullanma 2
Amaç Bu ders boyunca, bir veritabanından veri ayıklamak için sorgular oluşturduk. Tüm bilgilere sahip olmadığınız bir sorgu yazmak isterseniz ne yaparsınız? Bir sorgu içerisine başka bir sorgu yerleştirerek bu sorunu çözebilirsiniz. İç sorgu alt sorgu olarak ifade edilir. Alt sorgu bilmediğiniz bir bilgi üzerinde çalışır. Dış sorgu bu bilgiyi kullanarak bilmek istediğiniz bilgiyi ulaşır. Eğer tablodaki verilerin kendisine bağlı bir durum ile bir tablodan satırları seçmek gerekirse iki sorguyu bir sorguda birleştirmek çok yararlı olabilir. 3
Alt Sorgu Örneği Bir alt sorgu başka bir SELECT ifadesinin içine gömülü olan başka bir SELECT deyimidir. Alt sorgu ana sorgudan önce yürütülür. Alt sorgunun sonucu ana veya dış sorgu tarafından kullanılır. Alt sorgu sözdizimi: SELECT seçim_listesi FROM tablo WHERE ifade_operatörü (SELECT seçim_listesi FROM tablo); 4
Alt Sorgu Örneği Alt sorgular WHERE, HAVING ve FROM yantümcelerini içererek bir dizi SQL ifadesinin içinde yer alabilir. SELECT seçim_listesi FROM tablo WHERE ifade_operatörü (SELECT seçim_listesi FROM tablo); 5
Alt Sorguları Kullanmak için Yönergeler Yönergeler: Alt sorgu parantez içine alınır. Alt sorgu karşılaştırma ifadesinin sağ tarafına yerleştirilir. Dış ve iç sorgular farklı tablolardan veri alabilir. Sadece ORDER BY yantümcesi bir SELECT deyimi için kullanılabilir; kullanıldığı takdirde, bu dış sorguda son ifade olmalıdır. Alt sorgu kendi ORDER BY yantümcesine sahip olamaz. Alt sorgu sayısındaki tek sınırlama sorguların kullandığı tampon boyutudur. 6
Alt Sorguların İki Türü Alt sorguların iki tipi vardır: Tek satır operatörleri (> =,> =, <, <>, <=) kullanan ve iç sorgudan tek satır döndüren tek satır alt sorguları Çoklu-satır operatörleri (IN, ANY, ALL) kullanan ve iç sorgudan birden fazla satır döndürebilen çoklu satır alt sorguları 7
Alt Sorgu Örneği Monique Tuttle dan sonra doğmuş Gloabal Fast Foods personelin isimlerini öğrenmek istersek ne yaparız? Bilmeniz gereken ilk şey, "Monique ne zaman doğdu?", sorusuna cevap vermektir. Onun doğum tarihini biliyorsanız, o zaman ondan sonra kimlerin doğum tarihleri olduğunu bulabilirsiniz. SELECT staff_id, first_name, last_name, birth_date FROM f_staffs WHERE birth_date >= (SELECT birth_date FROM f_staffs WHERE last_name = Tuttle ); 8
Alt Sorgu ve NULL Bir alt sorgu, bir null değeri döndürür veya hiçbir satır döndürmezse, dış sorgu alt sorgu sonuçlarını(null) alır ve WHERE yantümcesinde bu sonucu kullanır. SELECT last_name WHERE department_id = (SELECT department_id WHERE last_name = Grant ); No data found. Dış sorgu herhangi bir satır döndürmez çünkü herhangi bir değeri NULL ile karşılaştırmak NULL sonucu verir. 9
Alt Sorgu ve NULL Grant gibi aynı bölümde kimler çalışır? Grant'ın department_id değeri null. Null ile karşılaştıran bir şey null döndürür. SELECT last_name WHERE department_id = (SELECT department_id WHERE last_name = Grant ); No data found. 10
Çoklu Sütun Alt Sorguları Alt sorgular, bir veya daha fazla sütun kullanabilir. Birden fazla sütun kullanılırsa, çoklu sütun alt sorgu denir. Bir çoklu sütun sorgu ikili ve ya ikili olmayan karşılaştırmalar içerebilir. SELECT employee_id, manager_id, department_id WHERE (manager_id,department_id) IN (SELECT manager_id,department_id WHERE employee_id IN (149,174)) AND employee_id NOT IN (149,174) 11
Çoklu Sütun Alt Sorguları Kırmızı vurgulanan alt sorgu ve sonucu ile çoklu-sütun ikili alt sorgu gösterilmektedir. Sorgu müdürleri ve birimleri, 149 ve 174 çalışanlarının müdürleri ve birimleriyle aynı olan kayıtları listelemektedir. SELECT employee_id, manager_id, department_id WHERE (manager_id,department_id) IN (SELECT manager_id,department_id WHERE employee_id IN (149,174)) AND employee_id NOT IN (149,174) 12
Çoklu Sütun Alt Sorguları Çift-olmayan çoklu-sütun alt sorgusu ayrıca alt sorguda birden fazla sütun kullanır, ama onları bir defada karşılaştırır, böylece karşılaştırmalar farklı alt sorgularda gerçekleşir. SELECT employee_id, manager_id, department_id WHERE manager_id IN (SELECT manager_id WHERE employee_id IN (174,199)) AND department_id IN (SELECT department_id WHERE employee_id IN (174,199)) AND employee_id NOT IN(174,199); 13
Çoklu Sütun Alt Sorguları Çift-olmayan çoklu-sütun alt sorgusu çalıştırırken karşılaştırmak istediğiniz her bir sütun için bir alt sorgu yazmalısınız. SELECT employee_id, manager_id, department_id WHERE manager_id IN (SELECT manager_id WHERE employee_id IN (174,199)) AND department_id IN (SELECT department_id WHERE employee_id IN (174,199)) AND employee_id NOT IN(174,199); 14
Çoklu Sütun Alt Sorguları Sağdaki örnekte çoklü-sütun çift olmayan alt sorgular kırmızı ile gösterilen alt sorgulardır. Bu sorgu 174 veya 199 nolu çalışanlar ile ortak bir manager_id veya department_id yesahip olan çalışanların listesidir. SELECT employee_id, manager_id, department_id WHERE manager_id IN (SELECT manager_id WHERE employee_id IN (174,199)) AND department_id IN (SELECT department_id WHERE employee_id IN (174,199)) AND employee_id NOT IN(174,199); 15
Alt Sorgularda EXISTS ve NOT EXISTS EXISTS ve onun zıttı NOT EXISTS, alt sorgulardaki eşleşmeleri test ederken kullanılan iki ifadedir. EXISTS TRUE için test eder veya alt sorguda eşleşen sonuç vardır. "Hangi çalışanlar yönetici değildir?" sorusunu yanıtlamak için, önce, "Yöneticiler kimlerdir?" sorusunu sormak ve daha sonra "Kim yöneticiler listesinde kim yok?" sorusunu sormak gerekir. 16
Alt Sorgularda EXISTS ve NOT EXISTS Aynı sorgu NOT IN yerine NOT EXISTS ile birlikte yürütülürse, sonuç çok farklı olur. Bu sorgunun sonucu da yönetici olmayan hiçbir çalışan yoktur olarak göstermektedir. Yani tüm çalışanların zaten yönetici olduğunu ifade eder. Bu sonuca sebep olan nedir? SELECT count(*) t1 WHERE t1.employee_id NOT IN (SELECT t2.manager_id t2 ); 17
Alt Sorgularda EXISTS ve NOT EXISTS Garip sonucun nedeni sorgu tarafından döndürülen NULL değerinden kaynaklanmaktadır. Çalışanlar tablosundaki satırlardan birinde yönetici yoktur ve bu tüm sonucu yanlış yapmaktadır. Alt sorgular üç değer döndürebilir: TRUE, FALSE ve UNKNOWN. Alt sorgudaki NULL değer Oracle ın değerlendiremediği UNKNOWN döndürür. SELECT count(*) t1 WHERE t1.employee_id NOT IN (SELECT t2.manager_id t2 ); 18
Alt Sorgularda EXISTS ve NOT EXISTS Oracle tarafından EXISTS ve NOT EXISTS in değerlendirilmesi IN ve NOT IN in değerlendirilmesinden çok faklıdır. Bir EXISTS çalıştırıldığında, dış tabloda tam tablo taraması gerçekleştirir ve sonra da Oracle koşulun doğru olup olmadığını görmek için döngü oluşturur. FOR x IN ( SELECT * t1 ) LOOP IF ( EXISTS ( SELECT NULL t2 WHERE t1.emplolyee_id = t2.manager_id ) THEN OUTPUT THE RECORD END IF END LOOP 19
Alt Sorgularda EXISTS ve NOT EXISTS Bu dış tablo üzerinde herhangi var olan dizinleri kullanırken daha hızlı çalıştırır. EXISTS dış tablo dizinlerini kullanamaz. Tablo boyutu da önemli bir faktördür ve ifadelerin daha hızlı çalışmasını etkiler. Büyük bir iç tablo ile birleştirilen küçük bir dış tablo EXISTS kullanarak IN kullanımından daha da hızlı çalışır. Not: NULL ile çalışırken dikkatli olunuz. 20