EBE-368 Veri Tabanı Yönetim Sistemleri SQL Dr. Dilek Küçük
SQL Sorgu Dili [1] Ogrenci no ad soyad yas ortalama 21325 Necla Yılmaz 18 2,9 21345 Öykü Okan 20 2,1 21378 Elçin Demir 19 3,3 21389 Özgür Kara 19 3,1 21370 Serkan Özdemir 20 1,8 Ders ders_adi kredi VTYS111 3 TARIH300 4 TURKCE222 2 MANTIK250 3 DersKaydi ogrenci_no ders harf_notu 21345 VTYS111 A 21389 TARIH300 B 21378 TURKCE222 A 2
SQL Sorgu Dili [2] SELECT [DISTINCT] select-listesi FROM from-listesi WHERE koşul SELECT DISTINCT ad, yas FROM Ogrenci; ad yas Necla 18 Öykü 20 Elçin 19 Özgür 19 Serkan 20 3
SQL Sorgu Dili [3] SELECT O.no, O.ad, O. soyad, O.yas, O.ortalama FROM Ogrenci AS O WHERE ortalama > 3; no ad soyad yas ortalama 21378 Elçin Demir 19 3,3 21389 Özgür Kara 19 3,1 WHERE den sonraki koşul; AND, OR, veya NOT ile birleştirilmiş <ifade> <operatör> <ifade> şeklinde koşullar olabilir. <ifade> bir kolon ismi veya sabit ve bir aritmetik ifade, <operatör> ise <, <=, =, <>, >=, > operatörlerinden biri olabilir. 4
SQL Sorgu Dili [4] VTYS111 dersini alan öğrencilerin adlarını bulunuz. SELECT O.ad FROM Ogrenci O, DersKaydi DK, WHERE O.no = DK.ogrenci_no AND DK.ders = VTYS111 ; ad Öykü 5
SQL Sorgu Dili [5] Kredisi 4 olan dersleri alan öğrencilerin ad ve soyadlarını bulunuz. SELECT O.ad, O.soyad FROM Ogrenci O, DersKaydi DK, Ders D WHERE O.no = DK.ogrenci_no AND DK.ders = D.ders_adi AND D.kredi = 4; ad Özgür soyad Kara 6
SQL Sorgu Dili [6] En az bir ders alan öğrencilerin ad ve soyadlarını bulunuz. SELECT O.ad, O.soyad FROM Ogrenci O, DersKaydi DK WHERE O.no = DK.ogrenci_no; ad Öykü Elçin Özgür soyad Okan Demir Kara 7
SQL Sorgu Dili [7] SELECT O.ad O.soyad as ogrenci_adi FROM Ogrenci O WHERE yas > 19; ogrenci_adi Öykü Okan Serkan Özdemir SELECT ad, soyad FROM Ogrenci WHERE ad like Ö% ; ad Öykü Özgür soyad Okan Kara 8
SQL Sorgu Dili [8] UNION, INTERSECT, EXCEPT SELECT ad, soyad SELECT ad, soyad FROM Ogrenci FROM Ogrenci WHERE ortalama > 3 UNION SELECT ad, soyad WHERE yas < 20 INTERSECT SELECT ad, soyad FROM Ogrenci FROM Ogrenci WHERE ortalama < 2; WHERE ortalama > 3; SELECT ad, soyad FROM Ogrenci WHERE ortalama > 3 OR ortalama < 2; SELECT ad, soyad FROM Ogrenci WHERE yas < 20 AND ortalama > 3; 9
SQL Sorgu Dili [9] ÇOK DÜZEYLİ SORGULAR (NESTED QUERIES) VTYS111 dersini alan öğrencilerin adlarını bulunuz. SELECT ad FROM Ogrenci WHERE no IN (SELECT ogrenci_no FROM DersKaydi WHERE ders = VTYS111 ); 10
SQL Sorgu Dili [10] Kredisi 4 olan dersleri alan öğrencilerin ad ve soyadlarını bulunuz. SELECT ad, soyad FROM Ogrenci WHERE no IN (SELECT ogrenci_no FROM DersKaydi WHERE ders IN (SELECT ders_adi FROM Ders WHERE kredi = 4)); 11
SQL Sorgu Dili [11] VTYS111 dersini alan öğrencilerin adlarını bulunuz. SELECT O.ad FROM Ogrenci O WHERE EXISTS (SELECT * FROM DersKaydi DK WHERE DK.ders = VTYS111 AND DK.ogrenci_no = O.no); 12
SQL Sorgu Dili [12] Ortalaması Necla isimli öğrenciden yüksek olan öğrencilerin adlarını bulunuz. SELECT O.ad FROM Ogrenci O WHERE O.ortalama > ANY (SELECT O2.ortalama FROM Ogrenci O2 WHERE O2.ad = Necla ) Ortalaması tüm öğrencilerden yüksek olan öğrencilerin adlarını bulunuz. SELECT O.ad FROM Ogrenci O IN ile =ANY, NOT IN ile <>ALL denktir. WHERE O.ortalama > ALL (SELECT O2.ortalama FROM Ogrenci O2); 13
SQL Sorgu Dili [13] Tüm dersleri alan öğrencilerin adlarını bulunuz. SELECT O.ad FROM Ogrenci O WHERE NOT EXISTS ((SELECT D.ders_adi FROM Ders D) EXCEPT (SELECT DK.ders 1. Alternatif FROM DersKaydi DK WHERE DK.ogrenci_no = O.no)); 14
SQL Sorgu Dili [14] Tüm dersleri alan öğrencilerin adlarını bulunuz. SELECT O.ad FROM Ogrenci O 2. Alternatif WHERE NOT EXISTS (SELECT D.ders_adi FROM Ders D WHERE NOT EXISTS (SELECT DK.ders FROM DersKaydi DK WHERE DK.ogrenci_no = O.no AND DK.ders = D.ders_adi)); 15
SQL Sorgu Dili [15] Gruplama Gerektiren Sorgular COUNT([DISTINCT] A): A kolonundaki (benzersiz) değerlerin sayısı. SUM ([DISTINCT] A): A kolonundaki (benzersiz) değerlerin toplamı. AVG([DISTINCT] A): A kolonundaki (benzersiz) değerlerin ortalaması. MAX(A): A kolonundaki değerlerin en büyüğü. MIN(A): A kolonundaki değerlerin en küçüğü. 16
SQL Sorgu Dili [16] Öğrencilerin ortalama yaşını bulunuz. SELECT AVG(yas) FROM Ogrenci; Ortalaması 3 ün üstünde olan öğrencilerin yaş ortalamasını bulunuz. SELECT AVG(yas) FROM Ogrenci WHERE ortalama > 3; 17
SQL Sorgu Dili [17] Toplam öğrenci sayısını bulunuz. SELECT COUNT(*) FROM Ogrenci; Birbirinden farklı öğrenci isimlerinin sayısını bulunuz. SELECT COUNT(DISTINCT ad) FROM Ogrenci; 18
SQL Sorgu Dili [18] En genç öğrencinin adını ve yaşını bulunuz. SELECT ad, yas FROM Ogrenci WHERE yas = (SELECT MIN(yas) FROM Ogrenci); 19
SQL Sorgu Dili [19] SELECT [DISTINCT] select-listesi FROM from-listesi WHERE koşul GROUP BY grup-listesi HAVING grup-koşulu 20
SQL Sorgu Dili [20] Her yaş seviyesindeki (grubundaki) en yüksek ortalamayı bulunuz. SELECT FROM GROUP BY yas max 18 2,9 20 2,1 19 3,3 O.yas, MAX(O.ortalama) Ogrenci O O.yas; SELECT ten sonra gelen ifadelerden grup fonksiyonları dışındakilerin GROUP BY ifadesinde de bulunmaları gerekir. 21
SQL Sorgu Dili [21] Her ders için bu dersi alan öğrencilerin sayısını bulunuz. SELECT FROM GROUP BY ders, COUNT(ogrenci_no) DersKaydi ders; 4 kredili her ders için bu dersi alan öğrencilerin sayısını bulunuz. SELECT FROM DK.ders, COUNT(DK.ogrenci_no) DersKaydi DK, Ders D WHERE DK.ders = D.ders_adi AND D.kredi = 4 GROUP BY DK.ders; 22
SQL Sorgu Dili [22] 18 den büyük yaşta en az 2 öğrenci bulunan her yaş grubu için en düşük ortalamayı bulunuz. SELECT FROM O.yas, MIN(O.ortalama) Ogrenci O WHERE O.yas > 18 GROUP BY O.yas HAVING COUNT(*) > 1; HAVING ifadesinde sadece GROUP BY ifadesindeki kolonlar veya grup fonksiyonları bulabilir. 23
SQL Sorgu Dili [23] En az 2 öğrenci bulunan her yaş grubundaki 18 den büyük yaştaki öğrenciler için en düşük ortalamayı bulunuz. SELECT O.yas, MIN(O.ortalama) FROM Ogrenci O WHERE O.yas > 18 GROUP BY O.yas HAVING 1 < (SELECT COUNT(*) FROM Ogrenci O2 WHERE O.yas = O2.yas); 24
SQL Sorgu Dili [24] OUTER JOIN Join işlemi sırasında eşleşmeyen kayıtlar için de sonuç dönmesi için kullanılır. SELECT O.no, DK.ders FROM Ogrenci O NATURAL LEFT OUTER JOIN DersKaydi DK; SELECT O.no, DK.ders FROM Ogrenci O NATURAL RIGHT OUTER JOIN DersKaydi DK; SELECT O.no, DK.ders FROM Ogrenci O NATURAL FULL OUTER JOIN DersKaydi DK; 25
SQL Sorgu Dili [25] NULL Değerler >, <, = gibi işlemlerin argümanlarından en az biri NULL ise sonuç da bilinmeyendir. Bu işlemler sonucunda yanlış (false) olan kayıtlar dışında bilinmeyen sonucunu çıkaran kayıtlar da atılır. Aritmetik işlemler argümanlarından en az biri NULL ise NULL değer dönerler. Grup fonksiyonlarından sadece COUNT(*) NULL alanları da sayar. Diğerlerinin tümü (COUNT, SUM, MAX) NULL değerleri göz ardı eder. Eğer COUNT dışındakiler sadece NULL değerler üzerinde çalışıyorsa sonuç yine NULL dur. 26
SQL Sorgu Dili [26] Tablo Kısıtlaması [1] CREATE TABLE Ogrenci ( no INTEGER, ad CHAR(30), soyad CHAR(30), yas INTEGER, ortalama REAL, CHECK (ortalama >= 0 AND ortalama <= 4.0)); 27
SQL Sorgu Dili [27] Tablo Kısıtlaması [2] CREATE TABLE DersKaydi (ogrenci_no INTEGER, ders_adi CHAR(20), harf_notu CHAR(1), PRIMARY KEY (ogrenci_no, ders), FOREIGN KEY (ogrenci_no) REFERENCES Ogrenci ON DELETE CASCADE ON UPDATE NO ACTION CHECK (18 < (SELECT O.yas FROM Ogrenci O WHERE O.no = DersKaydi.ogrenci_no))); 28
SQL Sorgu Dili [28] ALAN KISITLAMALARI VE YENİ TÜRLER CREATE DOMAIN ortalamadegeri INTEGER DEFAULT 1 (CHECK VALUE >= 0 AND VALUE <= 4.0) (CREATE TABLE ortalama ORTALAMADEGERI, ) CREATE TYPE ortalamaturu AS INTEGER 29
SQL Sorgu Dili [29] KOŞULLAR (ASSERTIONS) CREATE TABLE Ogrenci (no INTEGER, ad CHAR(30), soyad CHAR(30), yas INTEGER, ortalama REAL, CHECK (ortalama >= 0 AND ortalama <= 4.0) CHECK ((SELECT COUNT(no) FROM Ogrenci) + (SELECT COUNT(ders_adi) FROM Ders) < 100)); * Tablo kısıtlamaları tanımlandıkları tablo boş değilken kontrol edilirler. * Ogrenci tablosu boşken Ders tablosuna 100 den fazla kayıt eklenebilir. CREATE ASSERTION kucukokul CHECK ((SELECT COUNT(no) FROM Ogrenci) + (SELECT COUNT(ders_adi) FROM Ders) < 100) 30
Kaynak: Ramakrishnan, R. ve Gehrke, J., Database Management Systems, 2003, McGraw-Hill, 3. baskı. Teşekkürler 31