VERİTABANI ŞEMASI
- Sarki(sarkino, adi, turu, uzunluk, bestno, yazarno)
- Sarkici(sarkicino, adi, soyadi, turu)
- CD(cdno,adi, yili, fiyati, sarkicino, stok)
- CDSarki(cdno, sarkino, sirasi)
- Besteci(bestno, adi, soyadi)
- Sozyazari(yazarno, adi, soyadi)
SORGULAR
- En yüksek stoğa sahip CDlerdeki şarkıları besteleyen bestecilerin ad ve soyadlarını IN kullanarak listeleyiniz. IN operatörünü bir kez kullanmanız yeterlidir.
Sorunun IN kullanmadan cevabı şöyledir:
SELECT besteci.adi, besteci.soyadi FROM besteci b, sarki s, CDSarki CDS, CD WHERE b.bestno=s.bestno AND s.sarkino=CDS.sarkino AND CDS.cdno=CD.cdno AND stok = (SELECT MAX(stok) FROM CD)
Burada WHERE içindeki = ifadelerinden herhangi biri için IN kullanılabilir. Örnek:
SELECT besteci.adi, besteci.soyadi FROM besteci b, CDSarki CDS, CD WHERE s.sarkino=CDS.sarkino AND CDS.cdno=CD.cdno AND stok = (SELECT MAX(stok) FROM CD) AND b.bestno IN (SELECT bestno FROM sarki)
veya şu cevap ta doğru kabul edilebilir:
SELECT besteci.adi, besteci.soyadi FROM besteci b, sarki s, CDSarki CDS, CD WHERE b.bestno=s.bestno AND s.sarkino=CDS.sarkino AND CDS.cdno=CD.cdno AND stok IN (SELECT MAX(stok) FROM CD)
- ‘Dede Efendi’nin bestelediği şarkıların hepsinden daha uzun şarkıları okuyan şarkıcıların isimlerini > ALL kullanarak listeleyiniz.
Bir şarkıcının bir şarkıyı okuması, veritabanı şeması gereği ancak o şarkıcının bir CDsi içinde o şarkının bulunması ile olabilir. Bu yüzden şarkıcı ile şarkı arasındaki ilişki ancak Sarkici, CD, CDsarki, Sarki tabloları kullanılarak ifade edilebilir.
SELECT r.adi, r.soyadi FROM sarkici r, CD, CDSarki CDS, Sarki s WHERE s.sarkicino=CD.sarkicino AND CD.cdno=CDS.cdno AND CDS.sarkino=s.sarkino AND s.uzunluk > ALL = (SELECT uzunluk –Dede Efendinin bestelediği FROM sarki a, bestci b — sarkıların uzunlukları WHERE a.nestno=b.bestno AND b.adi=’Dede Efendi’)
- CDleri aracılığı ile tüm şarkıları okuyan şarkıcıların kayıtlarını listeleyiniz.
Bu bir bölme sorusudur. Bölme için kullanılan SQL kalıbını kullanabiliriz. Corrolated query kullanıyoruz. Ayrıca COUNT ile de yapılabilir:
SELECT r.* FROM sarkici r WHERE NOT EXISTS (SELECT sarkino — tüm şarkılar FROM sarki EXCEPT SELECT sarkino — r’nin okuduğu şarkılar FROM sarki s, CDSarki CDS, CD WHERE s.sarkino=CDS.sarkino AND CDS.cdno=Cd.cdno AND CD.sarkicino=r.sarkicino)
- CD uzunluğu (yani CDdeki şarkıların uzunlukları toplamı) ortalama CD uzunluğundan az olan CDlerdeki ortalama şarkı sayısını (bu ortalama tek bir değerdir) listeleyiniz.
Bu sorgu tek adımda yapılamayacağı için WITH kullanmalıyız. Eğer MySQL kullanıyorsanız WITH’i desteklemediğini göreceksiniz. O zaman WITH yerine FROM içinde altsorgu veya Temporary table (geçici tablo) veya VIEW (sanal tablo) da kullanılabilir. Aslında VIEWlerin bu amaçla kullanılması doğru değil. Ama kullanandan puan kırılmayacaktır.
Adımlar
- Her CD için toplam sarkı uzunluğunu ve sarkı sayılarını bul (Bu adımda Cd sayısı kadar kayıt oluşur)
- Bu toplam şarkı uzunlukların ortalamasını ORT bul. (Bu adımda tek bir kayıt oluşur)
- Toplam şarkı uzunluğu ORTden daha az olan CDlerin şarkı sayıları ortalamasını hesapla
WITH sayilar AS SELECT cdno, SUM(uzunluk) CDuzunluk, COUNT(sarkino) CDSarkiSayisi FROM CDSarki CDS, Sarki s WHERE CDS.sarkino=s.sarkino GROUP BY CDS.cdno
WITH ortalama AS SELECT AVG(CDuzunluk) ortToplamUzunluk FROM sayilar
SELECT AVG(CDSarkiSayisi) FROM sayilar s, ortalama o WHERE s.CDuzunluk < o.ortUzunluk
- İçerisinde bir türden en fazla bir şarkı içeren Cdlerin adlarını UNİQUE kullanarak listeleyiniz.
Bazı veritabanı sistemlerinde UNIQUE desteği olmadığından bu sorguyu çalıştıramasa bile doğru yazana puan verilecektir. Ayrıca bu sorgu COUNT kullanılarak yapılabilir. Bunu yapabilmek için bir CDdeki şarkıların türleri bir altsorgu içerisinde listelenir ve bunların içerisinde tekrarlı değer olup olmadığına UNIQUE ile bakılır. Dikkat edilmesi gereken nokta burada alt sorguda correlated query kullanacağımızdır.
SELECT CD.adi FROM CD, CDSarki CDS WHERE CD.cdno=CDS.cdno AND UNIQUE(SELECT turu FROM sarki WHERE CDS.sarkino=s.sarkino)
- İçerisinde her türden en az bir tane şarkı içeren (yani tüm türlerden şarkı içeren) Cdlerin şarkıcılarının kayıtlarını listeleyiniz. Bu da bir bölme işlemi ve correlated alt sorgu gerektiriyor. COUNT ile de yapılabilir.
SELECT s.*
FROM sarkici s, CD WHERE s.sarkicino=CD.sarkicino AND NOT EXISTS (SELECT turu –tüm turler FROM sarki EXCEPT SELECT turu — CD’deki şarkı türleri FROM sarki r, CDSarki CDS WHERE r.sarkino=CDS.sarkino AND CDS.cdno=CD.cdno)
- Ad ve soyadları aynı söz yazarı ve besteci tarafından yazılan ve bestelenen şarkıların uzunlukları ortalamasını listeleyiniz. (Bir şarkının söz yazarını adı ve soyadıyla bestecisinin adı ve soyadı aynı olmalı) Bu sorgu iki adımda çözülür. İlk adımda istenen adana escort şarkıların uzunlukları, 2. adım da bu uzunlukların ortalaması bulunur.
SELECT AVG(ortalama) FROM (SELECT uzunluk FROM sarki s, besteci b, sozyazari y WHERE s.bestno=b.bestno AND s.yazarno=y.yazarno AND b.adi=y.adi AND b.soyadi=y.soyadi) AS temp
- ‘Pop’ müzik türünde şarkı söylemeyen (Cdlerinde pop müzik olmayan), şarkıcıların ‘sanat’ müziği türündeki şarkılarının bestecilerinin soyadlarını tekrarsız olarak azalan sırada listeleyiniz. Bu sorguda NOT EXISTS ile pop türünde şarkısı olmayan şarkıcıları seçebiliriz. NOT EXISTS yerine MINUS/EXCEPT yani küme farkı da kullanılabilir. SELECT * yerine istediğiniz bir alanı da yazabilirsiniz.
Örnek:
SELECT s.sarkino SELECT DISTINCT b.soyadi FROM besteci b, sarki s, CDSarki CDS, CD WHERE b.bestno=s.bestno AND s.sarkino=CDS.sarkino AND s.turu=’sanat’ AND CDs.cdno=CD.cdno AND NOT EXISTS (SELECT * –CD.sarkicino’lu şarkıcının pop türünde şarkısı yoktur
FROM sarki d, CDSarki e, CD f WHERE s.sarkino=e.sarkino AND e.cdno=f.cdno AND s.turu=’pop’ AND f.sarkicino=CD.sarkicino)
- Kendi müzik türünden (sarkıcı bodrum escort tablosundaki turu alanını kullanınız) farklı bir türde şarkı (şarkı tablosundaki turu alanını kullanınız) söylemeyen şarkıcıların CDlerinin kayıtlarını listeleyen sorguyu Temp adlı bir sanal tabloda saklayınız. Kendi şarkı turundan başka CDlerinde şarkısı bulunmayan şarkıcılar için NOT EXISTS kullanabiliriz.
CREATE VIEW temp AS SELECT CD.* FROM CD, sarkici s WHERE CD.sarkicino=s.sarkicino AND NOT EXISTS(SELECT turu FROM sarki r, CDSarki CDS WHERE s.turu=r.turu AND r.sarkino=CDS.sarkino AND CDS.cdno=CD.cdno)
- Fiyatı en yüksek Cdlerde bulunan uzunlukları 2 dakikadan kısa şarkıların kaç farklı CDde geçtiklerini listeleyiniz. (Böyle şarkılar birden fazla Cdde geçebilir. Uygun örnekler bulunuz) Fiyati en yüksek CDler bir alt sorgu ile bulunur. Bu fiyata sahip Cdlerdeki uzunlukları 2 dakikadan kısa eskisehir escort olan şarkılar bir sorgu ile bulunur. Bu sorgu sonucu şarkılara göre gruplanır ve her şarkı için DISTINCT cdno’ları saydırılır.
SELECT COUNT(distinct CD.cdno) FROM sarki s, CDSarki CDS, CD, (SELECT MAX(fiyati) enyuksekfiyat FROM CD) e WHERE s.sarkino=CDS.sarkino AND CDS.cdno=CD.cdno AND CD.fiyat=e.enyuksekfiyat AND s.uzunluk < 2 GROUP BY s.sarkino