2008 09 Güz Yarıyılı MT 487 Bilgisayarda Veri Yapıları Final Çalışma Soruları Hayali bir şirket için BizimŞirket isimli bir veritabanı oluşturulmuş ve aşağıdaki tablolar yapılmıştır. Lütfen tabloları dikkatlice inceleyip, açıklamaları okuduktan sonra sorulara geçiniz. TABLOLAR Kategoriler MalSağlayanlar Müşteriler Personel SiparişDetaylar Siparişler Sayfa 1 / 5
Taşımacılar Ürünler AÇIKLAMALAR Ürünler tablosundaki KategoriNo yabancı anahtardır ve Kategoriler tablosundaki KategoriNo ile ilişkilendirilmiştir. Ürünler tablosundaki MalSağlayanNO yabancı anahtardır ve MalSağlayanlar tablosundaki MalSağlayanNO ile ilişkilendirilmiştir. Siparişler tablosundaki MüşteriID yabancı anahtardır ve Müşteriler tablosundaki MüşteriID ile ilişkilendirilmiştir. Siparişler tablosundaki PersonelNo yabancı anahtardır ve Personel tablosundaki PersonelNo ile ilişkilendirilmiştir. Siparişler tablosundaki GönderildiğiVasıta yabancı anahtardır ve Taşımacılar tablosundaki TaşıyanNO ile ilişkilendirilmiştir. SiparişDetaylar tablosundaki Sipariş_NO yabancı anahtardır ve Siparişler tablosundaki Sipariş_NO ile ilişkilendirilmiştir. SiparişDetaylar tablosundaki ÜrünNO yabancı anahtardır ve Ürünler tablosundaki ÜrünNO ile ilişkilendirilmiştir. Kategoriler, MalSağlayanlar, Personel, Siparişler, Taşımacılar, Ürünler tablolarının ilk kolonları için IDENTITY(1,1) geçerlidir. SiparişDetaylar tablosu üzerinde ([BirimFiyat]>=(0)) olacak şekilde, ([İndirim]>=(0) AND [İndirim]<=(1)) olacak şekilde ve ([Miktar]>(0)) olacak şekilde üç kısıtlama vardır. Ürünler tablosu üzerinde ([SiparişEdilenBirim]>=(0)) olacak şekilde, ([StoktakiBirim]>=(0)) olacak şekilde, ([BirimFiyat]>=(0)) olacak şekilde ve ([YenidenSiparişSeviyesi]>=(0)) olacak şekilde dört kısıtlama vardır. Personel tablosu üzerinde ([DogumTarihi]<getdate()) olacak şekilde bir kısıtlama vardır. SiparişDetaylar tablosunda Sipariş_NO, ÜrünNO ikilisinin bütün olarak birincil anahtar olduğuna dikkat ediniz. Bu bilgiler ışığında aşağıdaki sorulara cevap veriniz. Sayfa 2 / 5
1. Adresindeki Ülke bilgisinde Almanya geçen Müşterilerin tüm bilgilerini veren aşağıdaki SQL deyimini MüşteriID, ŞirketAd, Adres, Sehir, PostaKodu, Ülke, Telefon, Faks Müşteriler WHERE (Ülke = 'Almanya') 2. Almanya daki firmalardan sağlanan ve Tatlılar kategorisinde yer alan Ürünlerin ÜrünNO, ÜrünAd ve BirimFiyat bilgilerini listeleyen aşağıdaki SQL deyimini WHERE Ü.ÜrünNO, Ü.ÜrünAd, Ü.BirimFiyat Kategoriler K INNER JOIN Ürünler Ü ON K.KategoriNo = Ü.KategoriNo INNER JOIN MalSağlayanlar M ON Ü.MalSağlayanNO = M.MalSağlayanNO (M.Ülke = 'Almanya') AND (K.KategoriAd = 'Tatlılar') 3. Hiçbir sipariş alamamış Personellerin PersonelNo, Ad, SoyAd bilgilerini listeleyen aşağıdaki SQL deyimini WHERE P.PersonelNo, P.Ad, P.SoyAd Personel P LEFT OUTER JOIN Siparişler S ON P.PersonelNo = S.PersonelNo (S.PersonelNo IS NULL) 4. Sonuç kümesi olarak ÜrünNO, ToplamMiktar şeklinde iki bilgi getiren ve her bir Ürün den toplam kaç adet sipariş verildiğini gösteren aşağıdaki SQL deyimini ÜrünNO, SUM(Miktar) ToplamMiktar SiparişDetaylar GROUP BY ÜrünNO 5. Osman Tekin isimli bir kişi yeni işe başlamıştır. Doğum Tarihi 6 Haziran 1975 olduğuna göre bu yeni çalışanı Personel tablosuna giren aşağıdaki SQL deyimini INSERT INTO Personel (SoyAd, Ad, DogumTarihi) VALUES ('Tekin', 'Osman', '6.6.1975') 6. Bir önceki soruda bahsedilen yeni personelin Satış Temsilcisi unvanıyla işe başladığı bilgisi unutulduğuna göre bu eksikliği gidermek için Personel tablosunu güncelleyen aşağıdaki SQL deyimini tamamlayınız (Bir önceki soruda girilen yeni personelin PersonelNo sunun 27 olduğu bilinmektedir). UPDATE Personel SET Unvan = 'Satış Temsilcisi' WHERE (PersonelNo = 27) 7. ŞirketAd ı ABC Pazarlama olan Müşterinin 2008 yılında kaç adet sipariş verdiğini gösteren aşağıdaki SQL deyimini Sayfa 3 / 5
COUNT(*) SAY Siparişler S INNER JOIN Müşteriler M ON S.MüşteriID = M.MüşteriID WHERE (S.SiparişDate >= '01.01.2008') AND (S.SiparişDate < '01.01.2009') AND (M.ŞirketAd = 'ABC Pazarlama') 8. Her bir kategoride kaç farklı çeşit Ürün olduğunu gösteren aşağıdaki SQL deyimini K.KategoriAd, COUNT(DISTINCT Ü.ÜrünAd) SAY Ürünler Ü INNER JOIN Kategoriler K ON Ü.KategoriNo = K.KategoriNo GROUP BY K.KategoriAd 9. ŞirketAdı @ŞirketAd, Şehiri @Sehir, Ülkesi @Ülke ve Telefonu @Telefon ile verilen yeni bir Mal sağlayıcıyı, MalSağlayanlar tablosuna giren sp_ms_gir isimli saklı yordamı oluşturan aşağıdaki SQL deyimini tamamlayınız (Bu saklı yordam ile girilen bir Mal sağlayıcının daima yeni bir Mal sağlayıcı olduğu varsayılmaktadır). CREATE PROCEDURE sp_ms_gir @ŞirketAd nvarchar(40), @Sehir nvarchar(15), @Ülke nvarchar(15), @Telefon nvarchar(24) INSERT INTO MalSağlayanlar (ŞirketAd,Sehir,Ülke,Telefon) VALUES (@ŞirketAd,@Sehir,@Ülke,@Telefon) 10. ŞirketAdı XYZ Pazarlama, Şehiri Ankara, Ülkesi Turkey ve Telefonu 00903123386084 olan yeni bir mal sağlayıcıyı MalSağlayanlar tablosuna bir önceki sorudaki saklı yordamı kullanarak giren bir SQL deyimi yazınız. EXEC sp_ms_gir XYZ Pazarlama, Ankara, Turkey, 00903123386084 11. Hiç sipariş vermemiş olan Müşterilerin ŞirketAd, Sehir, Ülke ve Telefon bilgilerinin listesini veren v_hic_siparis_vermemis isimli bir VIEW oluşturan aşağıdaki SQL deyimini CREATE VIEW v_hic_siparis_vermemis M.ŞirketAd, M.Sehir, M.Ülke, M.Telefon Siparişler S RIGHT OUTER JOIN Müşteriler M ON S.MüşteriID = M.MüşteriID WHERE (S.MüşteriID IS NULL) 12. Sırasıyla, bir Ürün numarası, bir başlangıç tarihi ve bir bitiş tarihi verildiğinde Sipariş tarihi olarak bu başlangıç ile bitiş tarihleri arasında olan ve ürün numarası verilen Ürün numarası olan siparişlerden Miktar olarak toplam kaç adet sipariş verildiği Sayfa 4 / 5
bilgisini veren fn_ürün_sip isimli bir FONKSIYON oluşturan aşağıdaki SQL deyimini CREATE FUNCTION fn_ürün_sip ( @ÜrünNO INT, @BasTarih DATETIME, @BitTarih DATETIME) RETURNS INT BEGIN DECLARE @SAYI INT @SAYI = SUM(SD.Miktar) SiparişDetaylar SD INNER JOIN Siparişler S ON SD.Sipariş_NO = S.Sipariş_NO WHERE (S.SiparişDate >= @BasTarih) AND (S.SiparişDate <= @BitTarih) AND (SD.ÜrünNO = @ÜrünNO) END RETURN @SAYI 13. Şirketimizin bu zamana kadar çalıştığı Mal Sağlayıcı firmaların daha çok hangi ülkelerden olduğu merak edilmektedir. Bu sebeple hangi ülkeden kaç tane Mal Sağlayıcı firmayla çalışıldığını Sayıya göre azalan sırada gösteren aşağıdaki SQL deyimini Ülke, COUNT(Ülke) SAYI MalSağlayanlar GROUP BY Ülke ORDER BY SAYI DESC 14. Tek seferde Miktar olarak en fazla sayıda Ürün Sipariş etmiş Müşterinin Telefonunu gösteren aşağıdaki SQL deyimini M.Telefon Müşteriler M INNER JOIN Siparişler S ON M.MüşteriID = S.MüşteriID INNER JOIN SiparişDetaylar SD ON S.Sipariş_NO = SD.Sipariş_NO WHERE (SD.Miktar = ( MAX(Miktar) MaxMik SiparişDetaylar)) 15. Personellerimize doğum günü kutlamayı düşünüyoruz. Bu sebeple aşağıdaki SQL çalıştırıldığı gün kişinin doğum günü olacak şekildeki personellerin Ad ve Soyadlarını listeleyen aşağıdaki SQL deyimini Ad, SoyAd Personel WHERE (DAY(DogumTarihi) = DAY(GETDATE())) AND (MONTH(DogumTarihi) = MONTH(GETDATE())) Sayfa 5 / 5