Veritabanı Yönetim Sistemleri-I Ders 4 Alt sorgular
Alt sorgular Bir alt sorgu (subquery) bir SELECT sorgusunun içine yazılan ikinci bir SELECT sorgusudur. İç içe yazılan sorgular, aşağıdan yukarıya (veya içten dışa) doğru çalıştırılarak, her sorgunun sonucu diğer sorguya girdi olarak verilir ve en sonunda, en dıştaki sorgunun sonucu alınır Özellikle birden fazla tabloya aynı anda erişilmesi gereken durumlarda alt sorgu ile sorgulamak kolay ve hızlı sonuçlar üretebilir
Alt sorgular Alt sorguların genelde kullanıldığı belli başlı durumlar şunlardır WHERE .. IN anahtar kelimeleri ile bir sorgunun sonucu diğer sorguya şart olarak eklendiği durumlar WHERE … EXISTS ile sorgunun sonucu dönen kayıt olup olmadığı kontrol edilir SELECT listesine yeni sütun olarak eklenen alt sorgular
sip_id alanı siparişi veren müşterinin id bilgisini tutmaktadır Alt sorgular Birinci durum için örnek: Belli bir müşteriye ait (ör: 10000001 kodu müşteri) sipariş edilen ürünlerin listesini almak istenildiği durum siparisler sip_id alanı siparişi veren müşterinin id bilgisini tutmaktadır sip_edilen siparisler ve sip_edilen tabloları birbirlerine sip_num alanı ile mantıksal olarak bağlıdırlar
Alt sorgular Normalde bir müşteriye ait siparişi almak için gereken SQL sorgusu Bu müşteriye ait siparişlerin numaraları (sip_edilen tablosunu sorgulamak için kullanılacak)
Alt sorgular Az önceki sip_num bilgilerini kullanarak bu müşteriye ait siparişlerin ürünlerini sip_edilen tablosundan sorgulayabiliriz
2005, 2009 üretecek ve bu sonucu üst sorguya verecek Alt sorgular Bu iki sorguyu ayrı ayrı elle yazıp, birleştirmek yerine alt sorgu mantığını kullanarak, birinci sorgunun çıktısını otomatik olarak ikinci (üst) sorguya verebiliriz 2005, 2009 üretecek ve bu sonucu üst sorguya verecek
Alt sorgular 2004 içinde sipariş vermiş olan müşterilerin must_ad, must_ulke bilgilerini listeleyen
Alt sorgular Alt sorgu yazarken dikkat edilmesi gerekenler Alt sorgu her zaman tek bir sütun döndürmek zorundadır. Eğer alt sorgu iki sütun içerirse, hata oluşacaktır Alt sorgudan dönen sütun veri türü ile üst sorguda kıyaslanan sütun veri türü aynı veya uyumlu olmalıdır
Alt sorgular Alt sorgularda eşitlik kıyaslanmadığı durumlarda olabilir, böyle zamanlarda diğer SQL operatörleri de kullanılabilir >, >=, <, <=, <> gibi Fakat bu tarz kıyaslamalarda alt sorgu sadece tek bir sütun ve tek bir satır döndürmek zorundadır
Alt sorgular Fiyatı, ürünler tablosundaki ortalama fiyattan daha büyük olan ürünleri listeleyiniz Muhtemel kullanılacak sorgular SELECT * FROM urunler WHERE urun_fiyat > ?????? SELECT AVG(urun_fiyat) FROM urunler
Alt sorgular
Alt sorgular Benzer şekilde En büyük fiyata sahip ürünü listelemek istersek
Alt sorgular WHERE ile birlikte kullanılan alt sorgular birden fazla iç içe sorguyu içerebilir Ör: “BR01” kodlu ürünü sipariş eden müşterilerin adlarını listeleyiniz. musteriler tablosu sorgusu (Verilen müşteri id’lere ait müşterlerin adlarının listelenmesi) Siparisler tablosu sorgusu (Verilen sipariş numaralarını hangi müşteri id’lerin ilişkili olduğunu tespiti) Sip_edilen tablosu sorgusu (BR01 kodlu ürünün dahil olduğu sipariş numaralarının tespiti)
Alt sorgular
Alt sorgular Alt sorguların ikinci türünde, alttaki sorgunun sonuç döndürüp döndürmemesi kontrol edilir. Bu durumda EXISTS operatörü kullanılır Eğer dönen alt sorgu sonuç içeriyorsa TRUE Sonuç içermiyorsa FALSE üreterek WHERE içinde bir şart olarak kullanılır
Alt sorgular Ürünler tablosunda herhangi bir ürünü bulunan satıcıların tüm bilgilerini listelemek istediğimizi düşünelim Herhangi bir satıcının (ör: DLL01 kodlu satıcı) ürünü olup olmadığını veren sorgu SELECT * FROM urunler WHERE satici_id = ‘DLL01’ Bu sorgu sonuç döndürürse ürünü var, sonuç döndürmezse ürünü yok demektir Bu sorgunun tüm satıcıları döndüren listeye adapte edilerek, satıcıların bu şarta göre listelenmesi gerekmektedir
Alt sorgular Alttaki sorguda satici_id üstteki tablodaki satici_id ile kıyaslanıyor (satici_id = s.satici_id) Dolayısıyla alt sorgu, üstteki tablonun her satırı için ayrı ayrı çalıştırılarak, ayrı ayrı sonuçlar üretiyor
Alt sorgular Benzer mantıkla, bu listenin tam tersini, yani ürünü olmayan satıcıları da NOT EXISTS ile alabiliriz
Alt sorgular Aynı mantıkla bulabileceğimiz Siparişi olan ve Siparişi olmayan müşterilerin listelenmesi için gerekli sorgular
Alt sorgular Üçüncü alt sorgu türü SELECT listesine ayrı bir sütun olarak alt sorguların sonucunun eklendiği durumlardır Bu durumdaki alt sorgular Tek değer (tek satır ve tek sütun) döndürmek zorundadır Herhangi bir türde değer içerebilir Bu tarz alt sorgulardan SELECT listesine istenen sayıda eklenebilir
Alt sorgular Her müşterinin id, ad değerleri yanında, toplam sipariş sayısını yanına yazdıralım Alt sorgu her satır için ayrı ayrı çalışacak ve COUNT(*) sonucunu üretecektir
Alt sorgular Her satıcının adı ve ürün sayısı, ortalama ürün fiyatı listelenmesi 1. Alt sorgu (adet) 2. Alt sorgu (ortalama fiy.)