MT 487 Bilgisayarda Veri Yapıları 2005-06 Güz Yarıyıl Sonu Sınavı
20.01.2006 Öğrenci No:
Ad Soyad:
İmza:
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.
TABLOLAR
KiralananYer Araç
Kolon adı Tip Kısıtlama SatışYerNo int
IDENTITY(1,1) Adres varchar(255) Not null Telefon varchar(20) Not null
Kolon adı Tip Kısıtlama Araç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
Müşteri Kiralama Kolon adı Tip Kısıtlama
MüşteriNo int
IDENTITY(1,1) Ad varchar(20) Not null Soyad varchar(20) Not null Adres varchar(255) Not null Telefon varchar(10) Not null
Kolon adı Tip Kısıtlama KiraNo int
IDENTITY(1,1) KiraBaşlangıçGün smalldatetime Not null TeslimEdilenGün smalldatetime DEFAULT(0) MüşteriNo int
Müşteri AraçPlakaNo varchar(10)
Araç
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, Araç 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, AraçPlakaNo) üçlüsü Araç 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. Araç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.
SELECT A.AraçPlakaNo, A.Marka, A.Model, A.Renk, K.Adres, A.KişiSayısı, A.KiraBedeli, K.Telefon
FROM Araç 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.
SELECT A.AraçPlakaNo, A.Marka, A.Model, M.Ad, M.Soyad, M.Telefon, K.KiraBaşlangıçGün
FROM Araç A INNER JOIN
Kiralama K ON A.AraçPlakaNo = K.AraçPlakaNo INNER JOIN Müşteri M ON K.MüşteriNo = M.MüşteriNo
WHERE ( 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.
SELECT A.AraçPlakaNo, A.Model FROM Araç A INNER JOIN
Kiralama K ON A.AraçPlakaNo = K.AraçPlakaNo WHERE ( 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 Kiralama tablosuna giren SQL deyimini yazınız.
INSERT INTO Kiralama
( KiraBaşlangıçGün, MüşteriNo, Araç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 Kiralama tablosunu güncelleyen SQL deyimini yazınız.
UPDATE Kiralama
SET TeslimEdilenGün = '03.25.2005' WHERE ( MüşteriNo = 41 ) AND ( KiraBaşlangıçGün = '03.23.2005' ) AND ( AraçPlakaNo = '34XX222' )
6. Kiralama tablosunda, KiraNo = 5 olarak numaralandırılmış satırda bulunan araç teslim edildiğine göre müşterinin ödeyeceği ücreti belirleyen SQL deyimini yazınız.
SELECT
DATEDIFF(day, K.KiraBaşlangıçGün, K.TeslimEdilenGün ) * A.KiraBedeli AS Ücret FROM Kiralama K INNER JOIN
Araç A
ON K.AraçPlakaNo = A.AraçPlakaNo WHERE ( K.KiraNo = 5 )
7. 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 deyimini yazınız.
UPDATE Kiralama
SET TeslimEdilenGün = '03.24.2005' WHERE ( KiraNo = 6 )
8. En genel olarak Kiralama tablosunda @KiraNo numarası ile numaralandırılmış satırda bulunan aracın iade edildiği gün @TeslimEdilenGün olduğuna göre Kiralama tablosunu güncelleyen sx_Kiralama_Güncelle_2 saklı yordamını yazınız.
CREATE PROCEDURE sx_Kiralama_Güncelle_2 @KiraNo int,
@TeslimEdilenGün smalldatetime
AS
UPDATE Kiralama
SET TeslimEdilenGün = @TeslimEdilenGün WHERE ( KiraNo = @KiraNo )
9. Halen kirada olan tüm araçların listesini veren v_Kirada isimli VIEW yazınız.
CREATE VIEW v_Kirada AS
SELECT KiraNo, KiraBaşlangıçGün, AraçPlakaNo, MüşteriNo FROM Kiralama
WHERE ( TeslimEdilenGün = 0 )
10. Kirada olmayan araçların plaka no, model ve marka bilgilerini veren v_KiradaDegil isimli VIEW yazınız.
CREATE VIEW v_KiradaDegil AS
SELECT A.AraçPlakaNo, A.Marka, A.Model FROM Araç A LEFT OUTER JOIN
Kiralama K ON A.AraçPlakaNo = K.AraçPlakaNo WHERE ( K.AraçPlakaNo IS NULL)
UNION
SELECT A.AraçPlakaNo, A.Marka, A.Model FROM Araç A INNER JOIN
Kiralama K ON A.AraçPlakaNo = K.AraçPlakaNo WHERE ( K.TeslimEdilenGün >0)
11. Arabaların birbirinden farklı renklerini veren bir SQL deyimi yazınız.
SELECT DISTINCT Renk FROM Araç
12. Markası Renault ve modeli Scenic olan araçların bulundukları yerlere göre sayısını listeleyen bir SQL deyimi yazınız.
SELECT COUNT( AraçPlakaNo ) AS AraçSay, SatışYerNo FROM Araç
WHERE ( Marka = 'Renault' ) AND ( Model = 'Scenic' )
GROUP BY SatışYerNo
13. Yeni araç alımında bunu araç tablosuna ekleyen aşağıdaki sx_Araç_Gir isimli saklı yordamı tamamlayınız.
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
AS
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 )
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_Araç_Gir yordamı ile Araç tablosuna ekleyen bir SQL deyimi yazınız.
EXECUTE sx_Araç_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).
SELECT COUNT(DISTINCT MüşteriNo ) AS SAY FROM Kiralama