Veri Tabanı-I 9.Hafta SELECT komutu 1
SELECT YAPISI SELECT <kolon_listesi> FROM <tablo_listesi> [WHERE <koşul>] <kolon_listesi>, veritabanından değerleri alınacak olan kolonların listesidir. kolon_listesi yerine * yazılırsa bütün kolonlar anlamına gelir <tablo_listesi>, verilerin okunacağı tablo veya ilişkilerin listesidir. <koşul>, sorgu sonucu getirilecek satırların hangileri olacağını belirleyen ifadedir. SELECT ve FROM zorunludur SELECT * FROM stok -- stok tablosundaki bütün kayıtların bütün alanlarını (*) listele SELECT sno, stokadi, adet, fiyat FROM stok 2
SELECT YAPISI SELECT < * [kolonadi [AS takmakolonadi] [, ] ] > FROM tablo [takmatabloadi] [, ] [WHERE <koşul>] [GROUP BY <kolon_listesi>] [HAVING <koşul>] [ORDER BY <kolon_listesi> [ASC DESC] ] GROUP BY <kolon_listesi> içindeki kolonların değerleri aynı olan satırlar gruplanır. HAVING GROUP BY ile oluşan gruplardan <koşul> ile uygun olanlar seçilir. ORDER BY <kolon_listesi> içindeki kolonlara göre satırlar artan veya azalan biçimde sıralanır. 3
SELECT YAPISI create table stok ( sno int primary key, stokadi varchar(20), adet int, fiyat real, sonkultar DateTime ) SELECT sno, stokadi, adet, fiyat, (adet*fiyat) AS [tutar] FROM stok SELECT sno, stokadi, adet, fiyat, tutar= (adet*fiyat) FROM stok sno stokadi adet fiyat Tutar 101 Kalem 100 2 200 102 Defter 120 5 600 103 Silgi 200 1.5 300 4
SELECT TOP N ve SELECT TOP N PERCENT SELECT TOP N <sütun listesi> FROM <tablolar> TOP N N adet kaydı listele SELECT TOP 2 * FROM stok -- stok tablosundan 2 kaydı listele SELECT TOP N PERCENT <sütun listesi> FROM <tablolar> TOP N PECENT % N adet kaydı listele SELECT TOP 40 PERCENT * FROM stok -- stok tablosundaki kayıtların %40 ını listele 5
SELECT DISTINCT SELECT DISTINCT <sütun listesi> FROM <tablolar> DISTINCT listelen kayıtlardan tekrarlayan kayıtlardan birini göster SELECT ad FROM musteri SELECT DISTINCT ad FROM musteri Ad Cemal Aynur Arda Aynur Ad Cemal Aynur Arda 6
SELECT kümeleme fonksiyonları Sayısal ve alfasayısal alanlar(özellikler) için COUNT Belirtilen kolondaki değerlerin sayısı MIN Belirtilen kolondaki en küçük değer MAX Belirtilen kolondaki en büyük değer Sayısal alanlar(özellikler) için SUM Belirtilen kolondaki değerlerin toplamı AVG Belirtilen kolondaki değerlerin ortalaması NOT: Bunlar fonksiyonlar SELECT ile FROM arasına yazılmalıdır. SELECT Count(*) AS Sayısı, Min(fiyat) As *En düşük fiyat+, Max(fiyat) AS *En yüksek Fiyat+, SUM(fiyat) AS *Fiyatlar Toplamı+, AVG(fiyat) AS *Fiyat Ortalaması+ FROM stok 7
ORDER BY ASC(ascending- artan) DESC(descending -azalan) SELECT <sütun listesi> FROM <tablolar> ORDER BY <alan adı> ACS DESC SELECT ad, soy FROM musteri ORDER BY ad ASC SELECT ad, soy FROM musteri ORDER BY ad SELECT ad, soy FROM musteri ORDER BY ad ASC, soy DESC Ad Soy Ad Soy Ad Soy Kara Kara Yakut Cemal Mahsun Can Kara Kemal Gök Yakut Can Can Cemal Mahsun Cemal Mahsun Kemal Koşan Gamze Mir Gamze Mir Gamze Yakut Mir Kemal Kemal Gök Koşan Kemal Kemal Koşan Gök 8
ORDER BY ASC(ascending- artan) DESC(descending -azalan) Soru : stok tablosunda en pahalı malın bilgilerini veren SQL komutu nasıl olmalıdır? SELECT TOP 1 * FROM stok ORDER BY fiyat DESC Soru : stokta en az hangi maldan kalmıştır? SELECT TOP 1 * FROM stok ORDER BY adet ASC Soru : stokta ortalama fiyattan pahalı olan malların listesi? SELECT * FROM stok WHERE fiyat > ( AVG(fiyat) ) -- YANLIŞ SELECT * FROM stok WHERE fiyat > ( select AVG(fiyat) from stok ) 9
WHERE koşul SELECT <sütun listesi> FROM <tablolar> WHERE <koşullar> KOŞUL Açıklama = Eşitlik > Büyük >= Büyük veya eşit < Küçük <= Küçük veya eşit <> Farklı, eşit değil Diğer BETWEEN IN LIKE IS NULL IS NOT NULL Açıklama Aralık İçerenler Benzeyenler null olanlar null olmayanlar BAĞLAÇ AND OR NOT Açıklama Ve Veya Değil 10
LIKE WildCard ( Joker) SELECT * FROM <tablolar> WHERE <alan> LIKE wildcard Wildcard (Joker) Açıklama % Sıfır veya daha çok herhangi bir karakter _ (Alt Tire) [karakterlistesi] Örn:[ACDMRK] Herhangi 1 karakter Listedeki bir karakter [karakterlistesiaralığı] Örn: [A-D] [^karakterlistesi] veya [! karakterlistesi] Liste aralığındaki herhangi bir karakter Listede olmayan bir karakter SELECT * FROM musteri WHERE adres LIKE %BURDUR% --Adres alanının herhangi bir yerinde BURDUR kelimesi geçen kayıtları listeler SELECT * FROM musteri WHERE ad LIKE *AKR+ --ad alanının ilk karakteri A veya K olan ve toplam 5 karakter olan kayıtları listeler SELECT * FROM musteri WHERE ad LIKE *^MCS+ % --ad alanının ilk karakteri M veya C veya S ile başlamayan kayıtları listeler 11
KOŞULLU SORGULAR SELECT * FROM stok WHERE fiyat >=10 AND fiyat <=50 SELECT * FROM stok WHERE fiyat BETWEEN 10 AND 50 --fiyatı 10 ile 50 arasında olanları listeler SELECT * FROM stok WHERE sno=3 OR sno=7 OR sno= 9 SELECT * FROM stok WHERE sno IN (3,7,9) --sno 3 veya 7 veya 9 olanları listeler SELECT * FROM stok WHERE stokadi IS NULL --stok adi girilmeyenleri listeler SELECT * FROM stok WHERE stokadi IS NOT NULL 12 --stok adi girilenleri listeler
ÖRNEK Soru : stok tablosunun kalan malları içerecek bir kopyasını oluşturunuz? SELECT * into stok_kopya FROM stok WHERE adet>=1 Soru : satışı yapılan malların listesi? SELECT * FROM stok WHERE sno NOT IN( select DISTINCT sno from satis) Soru : son kullanma tarihine 20 gün veya daha az kalmış malların listesi? SELECT * FROM stok WHERE sonkultar <= ( DateAdd(day,20,GetDate() ) ) 13
DATEADD ( tarihe Ekleme Yapmak) DATEADD(datepart, number, date) datepart year quarter month dayofyear day week weekday hour minute second millisecond microsecond nanosecond Eklenecek Değer yy, yyyy qq, q mm, m dy, y dd, d wk, ww dw, w hh mi, n ss, s ms mcs ns SELECT ( DateAdd(day,20,GetDate() ) ) DECLARE @DateNow DATETIME SET @DateNow='2011-06-04' SELECT DATEADD(Year, 3, @DateNow) AS NewDate Return Value = 2014-06-04 00:00:00.000 SELECT DATEADD(quarter, 3, @DateNow) AS NewDate Return Value = 2012-03-04 00:00:00.000 SELECT DATEADD(Month, 3, @DateNow) AS NewDate Return Value = 2011-09-04 00:00:00.000 SELECT DATEADD(dayofyear,3, @DateNow) AS NewDate Return Value = 2011-06-07 00:00:00.000 SELECT DATEADD(Day, 3, @DateNow) AS NewDate Return Value = 2011-06-07 00:00:00.000 14
DATEADD ( tarihe Ekleme Yapmak) SELECT DATEADD(Week, 3, @DateNow) AS NewDate Return Value = 2011-06-25 00:00:00.000 SELECT DATEADD(Hour, 3, @DateNow) AS NewDate Return Value = 2011-06-04 03:00:00.000 SELECT DATEADD(minute, 3, @DateNow) AS NewDate Return Value = 2011-06-04 00:03:00.000 SELECT DATEADD(second, 3, @DateNow) AS NewDate Return Value = 2011-06-04 00:00:03.000 SELECT DATEADD(millisecond, 3, @DateNow) AS NewDate Return Value = 2011-06-04 00:00:00.003 15
Soru ve Önerileriniz? 16