OtoKira bir çok yerde kiralama noktası olan bir araba kiralama şirketidir. Bu şirket bu kiralama noktalarında değişik araçlara sahiptir. Bu şirketin veri tabanı aşağıdaki tablolardan oluşmaktadır. KiralananYer SatışYerNo int Birincil anahtar, IDENTITY(1,1) Adres varchar(255) Not null Telefon varchar(20) Not null Araç AraçPlakaNo varchar(10) Birincil anahtar 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 Yabancı anahtar (KiralananYer) Müşteri MüşteriNo int Birincil anahtar, IDENTITY(1,1) Ad varchar(20) Not null Soyad varchar(20) Not null Adres varchar(255) Not null Telefon varchar(10) Not null Kiralama KiraNo int Birincil anahtar, IDENTITY(1,1) KiraBaşlangıçGün smalldatetime Not null TeslimEdilenGün smalldatetime DEFAULT(0) MüşteriNo int Yabancı anahtar (Müşteri) AraçPlakaNo varchar(10) Yabancı anahtar (Araç) SQL server da bir smalldatetime kolonu 0 ise bu 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, aksi halde bu kolona anlamlı bir tarih girilmiştir. OtoKira veri tabanı ile ilgili sorgular. 1. Araçların tüm bilgilerini ve bağlı oldukları kiralama noktasının adres ve telefonunu içeren tam listesi:
A.AraçPlakaNo, A.Marka, A.Model, A.Renk, K.Adres, A.KişiSayısı, A.KiraBedeli, K.Telefon Araç A INNER JOIN KiralananYer K ON A.SatışYerNo = K.SatışYerNo 2. Henüz geri getirilmeyen araçları, kiralayan müşteri ile birlikte veren liste. A.AraçPlakaNo, A.Marka, A.Model, M.Ad, M.Soyad, M.Telefon, K.KiraBaşlangıçGün Araç A INNER JOIN INNER JOIN Müşteri M ON K.MüşteriNo = M.MüşteriNo WHERE (K.TeslimEdilenGün = 0) 3. '01.01.2006' tarihinden önce kiraya verilen ve halen kirada olan araçların plaka numaraları nı içeren liste: A.AraçPlakaNo Araç A INNER JOIN WHERE (K.TeslimEdilenGün = 0) AND (K.KiraBaşlangıçGün < '01.01.2006') 4. Kiralama tablosuna '01.01.2006' tarihinde 2842 numaralı müşteriye kiralanan '01XX333' nolu aracın kiralandığını belirten bilgileri Kiralama dosyasına giren SQL. INSERT INTO Kiralama (KiraBaşlangıçGün, MüşteriNo, AraçPlakaNo) VALUES ('01.01.2006', 2842, '01 XX333') 5. En genel olarak Kiralama tablosuna @KiraBaşlangıçGün, @MüşteriNo, @AraçPlakaNo verildiğinde bu bilgileri giren saklı yordam. (Not : TeslimEdilenGün henüz belli olmadığından bu kolona boş veri girilmektedir. ) CREATE PROCEDURE sx_kiralama_gir @KiraBaşlangıçGün smalldatetime, @MüşteriNo int, @AraçPlakaNo varchar(10) INSERT INTO Kiralama (KiraBaşlangıçGün, MüşteriNo, AraçPlakaNo) VALUES (@KiraBaşlangıçGün, @MüşteriNo, @AraçPlakaNo) 6. '01.01.2006' tarihinde 2842 numaralı müşteriye kiralanan '01XX333' nolu aracın kiralandığını belirten bilgileri Kiralama tablosuna sx_kiralama_gir yordamı nı kullanarak giren SQL.
EXECUTE sx_kiralama_gir '01.01.2006', 2842, '01 XX333' 7. 41 numaralı müşterinin '03.23.2005' tarihinde kiraladığı '34XX222' plaka numaralı araç '03.25.2005' tarihinde teslim edildiğine göre Kiralama tablosunu güncelleyen SQL. SET TeslimEdilenGün = '03.25.2005' WHERE (KiraBaşlangıçGün = '03.23.2005') AND (MüşteriNo = 41) AND (AraçPlakaNo = '34XX222') 8. En genel olarak @KiraBaşlangıçGün günü @MüşteriNo ya kiralanan @AraçPlakaNo plaka numaralı araç @TeslimEdilenGün de iade edildiğinde Kiralama tablosunu güncelleyen saklı yordam. CREATE PROCEDURE sx_kiralama_güncelle @KiraBaşlangıçGün smalldatetime, @TeslimEdilenGün smalldatetime, @MüşteriNo int, @AraçPlakaNo varchar(10) SET TeslimEdilenGün = @TeslimEdilenGün WHERE (KiraBaşlangıçGün = @KiraBaşlangıçGün) AND (MüşteriNo = @MüşteriNo) AND (AraçPlakaNo = @AraçPlakaNo) 9. 41 numaralı müşterinin '03.23.2005' tarihinde kiraladığı '34XX222' plaka numaralı araç '03.25.2005' tarihinde teslim edildiğine göre Kiralama tablosunu sx_kiralama_güncelle yordamını kullanarak güncelleyen SQL. EXECUTE sx_kiralama_güncelle '03.23.2005', '03.25.2005', 41, '34XX222' 10. Kiralama tablosunda KiraNo = 6 olarak numaralandırılmış satırda bulunan aracın iade edildiği gün 03.24.2005 olduğuna göre Kiralama tablosunu güncelleyen SQL. SET TeslimEdilenGün = 03.24.2005 WHERE (KiraNo = 6) 11. En genel olarak Kiralama tablosunda @KiraNo no ile numaralandırı lmış satırda bulunan aracın iade edildiği gün @TeslimEdilenGün olduğuna göre Kiralama tablosunu güncelleyen saklıyordam. CREATE PROCEDURE sx_kiralama_güncelle_2 @KiraNo int, @TeslimEdilenGün smalldatetime SET TeslimEdilenGün = @TeslimEdilenGün WHERE (KiraNo = @KiraNo)
12. Kiralama tablosunda KiraNo = 6 olarak numaralandırılmış satırda bulunan aracın iade edildiği gün 03.24.2005 olduğuna göre Kiralama tablosunu sx_kiralama_güncelle_2 yordamını kullanarak güncelleyen SQL. EXECUTE sx_kiralama_güncelle_2 6, '03.24.2005' 13. 34 numaralı müşterinin '03.13.2005' tarihinde kiraladığı '34XX111' plaka numaralı araç teslim edildiğine göre müşterinin ödeyeceği ücreti belirleyen SQL deyimi. DATEDIFF(day, K.KiraBaşlangıçGün, K.TeslimEdilenGün)*A.KiraBedeli Ücret Kiralama K INNER JOIN WHERE (K.KiraBaşlangıçGün = '03.13.2005') AND (K.MüşteriNo = 34) AND (K.AraçPlakaNo = '34XX111') 14. 'Yeşil' araçların plaka numaraları, marka, model ile bulundukları yerlerin Adres ve Telefon listesi. A.AraçPlakaNo, A.Marka, A.Model, K.Adres, K.Telefon Araç A INNER JOIN KiralananYer K ON A.SatışYerNo = K.SatışYerNo WHERE (A.Renk = 'Yeşil') 15. 03.13.2005 tarihinde kiralanan araçların listesi. WHERE A.AraçPlakaNo, A.Marka, A.Model, M.Ad, M.Soyad, M.Telefon Araç A INNER JOIN INNER JOIN Müşteri M ON K.MüşteriNo = M.MüşteriNo (K.KiraBaşlangıçGün = '03.13.2005') 16. '34XX111' plaka numaralı araçtan '12.31.2005' tarihine kadar elde edilen toplam kira. SUM(DATEDIFF(day, K.KiraBaşlangıçGün, K.TeslimEdilenGün) * A.KiraBedeli) ToplamKira Kiralama K INNER JOIN WHERE (K.KiraBaşlangıçGün <= '12.31.2005') AND (K.AraçPlakaNo = '34XX111') 17. Halen kirada olan tüm araçların listesini veren bir VIEW. CREATE VIEW v_kirada KiraNo, KiraBaşlangıçGün, AraçPlakaNo, MüşteriNo Kiralama WHERE (TeslimEdilenGün = 0)
18. Kirada olmayan en az bir defa kiralanmış araçların plaka no, model ve marka bilgileri. DISTINCT A.AraçPlakaNo, A.Marka, A.Model Araç A INNNER JOIN WHERE (K.TeslimEdilenGün > 0) 19. Kirada olmayan araçların plaka no, model ve marka bilgilerini veren bir VIEW. CREATE VIEW v_kiradadegil A.AraçPlakaNo, A.Marka, A.Model dbo.araç A LEFT OUTER JOIN dbo. WHERE (K.AraçPlakaNo IS NULL) UNION A.AraçPlakaNo, A.Marka, A.Model dbo.araç A INNER JOIN dbo. WHERE (K. TeslimEdilenGün >0) 20. 7 günden daha fazla kiralanan araçların listesi. A.AraçPlakaNo, A.Marka, A.Model,A.Renk Araç A INNER JOIN WHERE (DATEDIFF(day, K.KiraBaşlangıçGün, K.TeslimEdilenGün)>7) 21. Arabaların birbirinden farklı renkleri. DISTINCT Renk Araç 22. Markası Renault ve modeli Scenic olan araçların bulundukları yerlere göre sayısını listeleyen bir SQL. COUNT(AraçPlakaNo) AraçSay, SatışYerNo Araç A WHERE (Marka = 'Renault') AND (Model = 'Scenic') GROUP BY SatışYerNo 23. v_kiradadegil VIEW unu kullanarak Markası 'VolksWagen' ve modeli 'Polo' olup da kirada olmayan araçların bulundukları yerlere göre sayısını listeleyen bir SQL. COUNT(A.AraçPlakaNo) AraçSay, A.SatışYerNo Araç A INNER JOIN v_kiradadegil V ON A.AraçPlakaNo = V.AraçPlakaNo
WHERE (A.Model = 'Polo') AND (A.Marka = 'VolksWagen ') GROUP BY A.SatışYerNo 24. SatışYerNo su 3 olan yerden hali hazırda kiralanmış durumda bulunan (yani halen şirkete teslim edilmemiş olan) Mercedes marka araçların sayısını veren SQL. COUNT(A.AraçPlakaNo) SAY Araç A INNER JOIN KiralananYer KY ON A.SatışYerNo = KY.SatışYerNo INNER JOIN WHERE (A.Marka = 'Mercedes') AND (K.TeslimEdilenGün = 0) AND (KY.SatışYerNo = 3) 25. Şu ana kadar en fazla hangi marka aracın kaç defa kiralandığını söyleyen SQL (Not: Şu anda kirada olanlar da dahil olmak üzere ve TOP deyimini kullanarak). TOP 1 A.Marka, COUNT(*) SAY Kiralama K INNER JOIN GROUP BY A.Marka ORDER BY COUNT(*) DESC 26. Yeni araç alımında bunu araç tablosuna ekleyen bir saklı yordam. CREATE PROCEDURE sx_araç_gir @AraçPlakaNo varchar(10), @Marka varchar(15), @Model varchar(15), @Renk varchar(15), @KişiSayısı smallint, @KiraBedeli money, @SatışYerNo int INSERT INTO Araç (AraçPlakaNo, Marka, Model, Renk, KişiSayısı, KiraBedeli, SatışYerNo) VALUES (@AraçPlakaNo, @Marka, @Model, @Renk, @KişiSayısı, @KiraBedeli, @SatışYerNo) 27. Hiç kiralanmamış olan araçların, araç plaka numaralarını listeleyen bir SQL. WHERE A.AraçPlakaNo Araç A LEFT OUTER JOIN (K.KiraNo IS NULL) 28. Adresinde Adana geçen müşterilerin, adresinde Adana geçmeyen Kiralama yerlerinden kiraladıkları araçların kiralama bilgilerini gösteren bir SQL.
K.KiraNo, K.KiraBaşlangıçGün, K.TeslimEdilenGün, K.MüşteriNo, K.AraçPlakaNo Kiralama K INNER JOIN Müşteri M ON K.MüşteriNo = M.MüşteriNo INNER JOIN INNER JOIN KiralananYer KY ON A.SatışYerNo = KY.SatışYerNo WHERE (M.Adres LIKE '%Adana%') AND (KY.Adres NOT LIKE '%Adana%') 29. Kiralama bedeli bakımından en pahalı araçların detaylarını gösteren bir SQL. * Araç WHERE (KiraBedeli = ( MAX(Kirabedeli) Araç)) 30. Şirkete en fazla para kazandıran Müşterinin Müşteri numarasını ve kazandırdığı toplam para miktarını gösteren bir SQL. TOP 1 K.MüşteriNo, SUM(DATEDIFF(day, K.KiraBaşlangıçGün, K.TeslimEdilenGün) * A.KiraBedeli) ToplamÜcret, A.KiraBedeli, K.KiraNo Kiralama K INNER JOIN WHERE (K.TeslimEdilenGün > 0) GROUP BY K.MüşteriNo, A.KiraBedeli, K.KiraNo ORDER BY ToplamÜcret DESC 31. Kaç (farklı) müşteri araba kiralamıştır sorusunun cevabını veren bir SQL. COUNT(DISTINCT MüşteriNo) SAY Kiralama 32. En az üç defa araba kiralamış müşterilerden kiralama adetlerini ve Müşteri numaralarını listeleyen bir SQL. (Not: her defasında bir tane araba kiralandığını varsayalım) MüşteriNo, COUNT(MüşteriNo) TAdet Kiralama WHERE (MüşteriNo IN ( MüşteriNo Kiralama GROUP BY MüşteriNo HAVING (COUNT(*) >= 1))) GROUP BY MüşteriNo