Öğrenci No: Ad Soyad: İmza: MT 487 Bilgisayarda Veri Yapıları 2005-06 Güz Yarıyıl Sonu Sınavı 20.01.2006 AÇIKLAMALAR Cevaplar toplam 60 puan üzerinden değerlendirilecektir. Her soru 4 puandır. Soruları aşağıda verilen OtoKira veritabanını ve bu veritabanına ait dosyaları kullanarak cevaplandırınız. KiralananYer TABLOLAR SatışYerNo int Adres varchar(255) Not null Telefon varchar(20) Not null Müşteri MüşteriNo int Ad varchar(20) Not null Soyad varchar(20) Not null Adres varchar(255) Not null Telefon varchar(10) Not null PlakaNo varchar(10) Marka varchar(15) Not null Model varchar(15) Not null Renk varchar(15) KişiSayısı smallint Not null KiraBedeli money Not null SatışYerNo int KiralananYer KiraNo int KiraBaşlangıçGün smalldatetime Not null TeslimEdilenGün smalldatetime DEFAULT(0) MüşteriNo int Müşteri PlakaNo varchar(10) Tabloların birincil anahtarları ve Identity olup olmadıkları, kısıtlamalarda açıklanmıştır. Ayrıca bir tablonun bir başka tablo ile ilişkisi, yabancı anahtar açıklaması ile belirtilmiştir. Örneğin, tablosu ile KiralananYer tablosu, SatışYerNo kolonu ile ilişkilendirilmiştir. KiraBedeli kolonununda yazılan değer günlük kira bedelidir. Kiralar günlük hesaplandığından bir aracın aynı gün içinde iki defa kiralanmadığı varsayılmaktadır. Bu nedenle (KiraBaşlangıçGün, MüşteriNo, PlakaNo) üçlüsü tablosunda her satırı tek türlü belirlemektedir. SQL Server da bir smalldatetime kolonu 0 ise bu değer tarih formatına çevrilince 01.01.1900 tarihine dönüşmektedir. O halde bir araç kiralanmış ve henüz geri getirilmemiş ise TeslimEdilenGün = 0 veya TeslimEdilenGün = '01.01.1900' dır. O halde TeslimEdilenGün <> 0 veya TeslimEdilenGün <> '01.01.1900' ise araç TeslimEdilenGün kolonunda yazılan günde teslim edilmiştir. Bu bilgiler ışığında aşağıdaki sorulara cevap veriniz.
1. ların tüm bilgilerini ve bağlı oldukları kiralama noktasının adres ve telefonunu içeren tam listesini veren aşağıdaki SQL deyimini tamamlayınız. A.PlakaNo, A.Marka, A.Model, A.Renk, K.Adres, A.KişiSayısı, A.KiraBedeli, K.Telefon A INNER JOIN KiralananYer K ON A.SatışYerNo = K.SatışYerNo 2. Henüz geri getirilmeyen araçların, kiralayan müşteri ile birlikte listesini veren aşağıdaki SQL deyimini tamamlayınız. A.PlakaNo, A.Marka, A.Model, M.Ad, M.Soyad, M.Telefon, K.KiraBaşlangıçGün A INNER JOIN K ON A.PlakaNo = K.PlakaNo INNER JOIN Müşteri M ON K.MüşteriNo = M.MüşteriNo ( K.TeslimEdilenGün = 0) 3. '03.13.2005' tarihinde kiraya verilen ve halen kirada olan araçların plaka numaraları ile modellerinin listesini veren aşağıdaki SQL deyimini tamamlayınız. A.PlakaNo, A.Model A INNER JOIN K ON A.PlakaNo = K.PlakaNo ( K.KiraBaşlangıçGün = '03.13.2005' ) AND ( K.TeslimEdilenGün = 0 ) 4. '03.13.2005' tarihinde 2842 numaralı müşteriye kiralanan '01XX333' nolu aracın kiralandığını belirten bilgileri tablosuna giren SQL deyimini INSERT INTO ( KiraBaşlangıçGün, MüşteriNo, PlakaNo ) VALUES ( '03.13.2005', 2842, '01XX333' )
5. 41 numaralı müşterinin '03.23.2005' tarihinde kiraladığı '34XX222' plaka numaralı araç '03.25.2005' tarihinde teslim edildiğine göre tablosunu güncelleyen SQL deyimini UPDATE SET TeslimEdilenGün = '03.25.2005' ( MüşteriNo = 41 ) AND ( KiraBaşlangıçGün = '03.23.2005' ) AND ( PlakaNo = '34XX222' ) 6. tablosunda, KiraNo = 5 olarak numaralandırılmış satırda bulunan araç teslim edildiğine göre müşterinin ödeyeceği ücreti belirleyen SQL deyimini DATEDIFF(day, K.KiraBaşlangıçGün, K.TeslimEdilenGün ) * A.KiraBedeli Ücret K INNER JOIN A ON K.PlakaNo = A.PlakaNo ( K.KiraNo = 5 ) 7. tablosunda KiraNo = 6 olarak numaralandırılmış satırda bulunan aracın iade edildiği gün '03.24.2005' olduğuna göre tablosunu güncelleyen SQL deyimini UPDATE SET TeslimEdilenGün = '03.24.2005' ( KiraNo = 6 ) 8. En genel olarak tablosunda @KiraNo numarası ile numaralandırılmış satırda bulunan aracın iade edildiği gün @TeslimEdilenGün olduğuna göre tablosunu güncelleyen sx Güncelle_2 saklı yordamını CREATE PROCEDURE sx Güncelle_2 @KiraNo int, @TeslimEdilenGün smalldatetime
UPDATE SET TeslimEdilenGün = @TeslimEdilenGün ( KiraNo = @KiraNo ) 9. Halen kirada olan tüm araçların listesini veren v_kirada isimli VIEW CREATE VIEW v_kirada KiraNo, KiraBaşlangıçGün, PlakaNo, MüşteriNo ( TeslimEdilenGün = 0 ) 10. Kirada olmayan araçların plaka no, model ve marka bilgilerini veren v_kiradadegil isimli VIEW CREATE VIEW v_kiradadegil A.PlakaNo, A.Marka, A.Model A LEFT OUTER JOIN K ON A.PlakaNo = K.PlakaNo ( K.PlakaNo IS NULL) UNION A.PlakaNo, A.Marka, A.Model A INNER JOIN K ON A.PlakaNo = K.PlakaNo ( K.TeslimEdilenGün >0) 11. Arabaların birbirinden farklı renklerini veren bir SQL deyimi DISTINCT Renk 12. Markası Renault ve modeli Scenic olan araçların bulundukları yerlere göre sayısını listeleyen bir SQL deyimi COUNT( PlakaNo ) Say, SatışYerNo
( Marka = 'Renault' ) AND ( Model = 'Scenic' ) GROUP BY SatışYerNo 13. Yeni araç alımında bunu araç tablosuna ekleyen aşağıdaki sx Gir isimli saklı yordamı tamamlayınız. CREATE PROCEDURE sx Gir @PlakaNo varchar(10), @Marka varchar(15), @Model varchar(15), @Renk varchar(15), @KişiSayısı smallint, @KiraBedeli money, @SatışYerNo int INSERT INTO (PlakaNo, Marka, Model, Renk, KişiSayısı, KiraBedeli, SatışYerNo) VALUES ( @PlakaNo, @Marka, @Model, @Renk, @KişiSayısı, @KiraBedeli, @SatışYerNo ) 14. Yeni alınan Mavi renkli, markası Ford, modeli Focus olan 4 kişilik, 01DD555 plaka numaralı araç kira bedeli 40 YTL olmak üzere, 6 numaralı satış yerine verildiğine göre bu bilgiyi sx Gir yordamı ile tablosuna ekleyen bir SQL deyimi EXECUTE sx Gir 01DD555, Ford, Focus, Mavi, 4, 40, 6 15. Kaç farklı müşteri araba kiralamıştır sorusunun cevabını veren bir SQL deyimi yazınız (Not: aracın teslim edilip edilmemesi önemli değil, kiralama işinin yapılmış olması yeterli). COUNT(DISTINCT MüşteriNo ) SAY