Alt Sorgular SQL Serverda sorgu içinde sorgu da oluşturulabilir. Sorgu içinde sorgu, içteki sorgunun dışta olan sorguya değer üretmesidir. Bu, bir değer veya birden fazla değer olabilir. IN ve NOT IN Tablodaki alan içeriklerine ulaşmak için IN deyimi kullanılır. Bir sınıftaki 16 ve 17 yaşındaki öğrencileri listelemek istediğinizi düşünün. IN deyimiyle sorgunun yazımı şu şekildedir: SELECT Ad,Soyad,Yas FROM Sinif WHERE Yas IN(16,17) Sorguyu çalıştırıp sonuçlarını Results ekranından görebilirsiniz. Sınıftaki öğrencilerden 16 yaşında olmayan öğrencileri listelemek istediğinizde, SELECT Ad,Soyad,Yas FROM Sinif WHERE Yas NOT IN(16) şeklinde bir sorgu yazmalısınız. İç İçe SELECT Hazırladığınız sorguyu karmaşıklıktan kurtarabilmeniz veya sorgunun işlevselliğini test edebilmeniz açısından parçalara ayırmanız gerekebilir. Bunun için iç içe SELECT kullanmanız gerekir. İç içe yazılan her SELECT sorgusu parantez içinde yazılmalıdır. Yazdığınız SELECT ifadesi geriye sadece bir değer döndürüyorsa buna tekil alt sorgu denir. T- SQL de kullanılan matematiksel fonksiyonlar (MIN, MAX, SUM vb.) veya WHERE ifadesiyle yazılan bir şart ile geriye tek bir değer döndürebilirsiniz. Yaşı 18 olan öğrenciyi bulmak istediğinizde, SELECT Ad,Soyad,Yas FROM Sinif WHERE Yas= ( SELECT Yas FROM Sinif WHERE Yas=18 ) şeklinde iç içe SELECT yazabilirsiniz. Sorguyu çalıştırıp sonuçlarını Results ekranından görebilirsiniz.
WHERE den sonra sorguları bağlamak için kullanılan = operatörü yerine diğer karşılaştırma operatörleri de kullanılabilir. Eğer, sorgunuzda geriye birden fazla değer döndürülüyorsa SQL Server hata verir. Hazırlanan alt sorgu asıl SELECT ifadesinin içinde de kullanılabilir. Öğrencilerin ad, soyad ve ortalama yaşlarını veren bir sorgu yazılacağını varsayınız. Sorgunun nasıl yazıldığına dikkat ederek sorguyu Query Editor e yazınız. Sorguyu çalıştırıp sonuçlarını Results penceresinde görebilirsiniz. Yazdığınız sorgu birden fazla değer döndürüyorsa sorguları IN deyimiyle birbirine bağlamanız gerekir. Yaşı 18 den küçük olan öğrencileri listeleyeceğinizi varsayınız. Yine sonucu Results penceresinden görebilirsiniz. Türetilmiş Tablolar Türetilmiş tablo, alt sorgularla çalışmanın özel bir hâlidir. İç içe sorgu yaparken elde edilen değerler hep bir sütun hâlinde gösterilmiştir. İç içe sorgular, bir sorgu sonucunun tabloymuş gibi tekrar sorgulanmasını da sağlar.
Türetilmiş tablo, FROM ifadesinden sonraki SELECT ifadesinin parantez içine yazılıp bir takma isim verilmesiyle oluşturulur. Yazılışı SELECT ifade FROM (SELECT ifade) AS takmaad Yaşı 16 dan büyük olan öğrencilerin cinsiyetleriyle beraber listeleneceğini varsayınız. Sorguyu aşağıdaki gibi yazınız. Sorguda, Sayi için türetilmiş tablo denir. Results penceresindeki sütun adlarının başlıkları da Sayi (Yasi,Cinsi) satırıyla verilmiş olur. Sorguyu çalıştırdığınızda Results penceresinin görünümü Uygulama 1: İç içe sorgulama yöntemiyle İlçe sayısı 20 den fazla olan Şehir Adlarını listeleyen T-SQL komutu aşağıdaki gibidir. SELECT Sehir.SehirAdi FROM Sehir WHERE Sehir.IDSehir IN(SELECT Ilce.IDSehir FROM Ilce GROUP BY Ilce.IDSehir HAVING COUNT(*)>=20)
Uygulama 2: Hiç alınmamış Ürün Adlarını İç İçe sorgulama yöntemiyle gösteren T-SQL komutu aşağıdaki gibidir. SELECT Urun.UrunAdi FROM Urun WHERE Urun.IDUrun NOT IN( SELECT SiparisDetay.IDUrun FROM SiparisDetay) Uygulama 3: Satılan Ürünlerin Adı, Birim Fiyatları ve bunların Ortalama Fiyatlarını İç İçe sorgulama yöntemiyle gösteren T-SQL komutu aşağıdaki gibidir. SELECT Urun.UrunAdi,Urun.Birimfiyati,ORT=( SELECT AVG(SiparisDetay.BirimFiyati) FROM SiparisDetay ) FROM Urun INNER JOIN SiparisDetay ON Urun.IDUrun=SiparisDetay.IDUrun Uygulama 4: 01.01.1980 tarihinden sonra doğmuş çalışanları Adı Soyadı ve Doğum Tarihi değerlerini Türetilmiş Tablo yöntemiyle gösteren T-SQL komutu aşağıdaki gibidir. SELECT YASLAR.* FROM ( SELECT Calisan.AdiSoyadi, Calisan.DogumTarihi ) YASLAR(ADSOYAD, DOGUM) WHERE YASLAR.DOGUM>'01.01.1980'
COMPUTE ve COMPUTE BY Deyimleri Toplama fonksiyonunu kullanarak sonuç olarak bir toplam değeri üretir. COMPUTE deyimi her SELECT ifadesiyle kullanılır. COMPUTE BY ise ORDER BY deyimine gerek duyar. Öğrenci notları tablosundaki öğrenci numarasına göre ortalama sütunundaki değerleri toplayarak bir sonuç üreten T-SQL kodlarıdır. SELECT ogrno, ort FROM Ogr_Notlar ORDER BY ogrno COMPUTE SUM(ort) Tarih ve Zaman Fonksiyonları Tarih ve zaman üzerinde işlem yapmayı sağlayan fonksiyonlardır. GETDATE () Fonksiyonu Şimdiki tarih ve saat değerini gösterir. SELECT GETDATE() DATEADD () Fonksiyonu Verilen bir tarihe istenilen sayıda bir tarih bilgisi eklemek için kullanılır. DATEADD fonksiyonunda dd gün mm ay yy yıl anlamındadır. Belirtilen tarih bilgisine 90 gün, 2 ay ve 2 yıl ekleyen T-SQL kodları sırasıyla... SELECT DATEADD(dd, 90, '02.10.2007') SELECT DATEADD(mm, 2, '02.10.2007')
SELECT DATEADD(yy, 2, '02.10.2007') DATEDIFF () Fonksiyonu Belirtilen iki tarih arasındaki gün sayısını göstermektedir. SELECT DATEDIFF(dd, '04.04.1974', '02.10.2007') Ayrıca hafta için wk, saat için hh, dakika için mi, saniye için ss kullanılabilir. DATEPART () Fonksiyonu Tarihle ilgili sayısal bilgilerin alınmasını sağlar. SELECT DATEPART(dd, '01.04.1974') SELECT DATEPART(mm, '01.04.1974') SELECT DATEPART(yy, '01.04.1974') YEAR() MONTH() DAY() Fonksiyonları SELECT YEAR('10.02.2010') Tarihin Yıl değerini döndürür 2010 SELECT MONTH('10.02.2010') Tarihin Ay değerini döndürür 02 SELECT DAY('10.02.2010') Tarihin Gün değerini döndürür 10 Uygulama 5: Çalışanların Adı Soyadı ve Yaşlarını gösteren T-SQL komutu aşağıdaki gibidir. SELECT Calisan.AdiSoyadi, DATEDIFF(YY,Calisan.DogumTarihi,GETDATE()) AS YAS
Uygulama 6: Çalışanların Adı Soyadı ve Yaşlarına göre Yaş Durumlarını gösteren T-SQL komutu aşağıdaki gibidir. SELECT Calisan.AdiSoyadi, CASE WHEN DATEDIFF(YY,Calisan.DogumTarihi,GETDATE())<=35 THEN 'GENÇ' WHEN DATEDIFF(YY,Calisan.DogumTarihi,GETDATE())<=45 THEN 'İKİNCİ BAHAR' WHEN DATEDIFF(YY,Calisan.DogumTarihi,GETDATE())>45 THEN 'YAŞLI' END AS YASDURUM Uygulama 7: Çalışanların Adı Soyadı ve 30 Yaşındaki Yıllarını gösteren T-SQL komutu aşağıdaki gibidir. SELECT Calisan.AdiSoyadi, DATEPART(YY,DATEADD(YY,30,Calisan.DogumTarihi)) AS YAS_30 Karakter Fonksiyonları Karakter alanlarla ilgili işlem yapmak için bu fonksiyonlar kullanılır. CHAR () ASCII kodu verilen karakteri görüntüler. ASCII() Verilen karakterin Ascii kodunu döndürür
SELECT CHAR(65) A harfini verir. SELECT ASCII(A) 65 rakamını verir. Değer int tipindedir. CHARINDEX() Bir metin içerisindeki metin parçasını istenilen konumdan itibaren arar. SELECT CHARINDEX ('bu',@soyad,1) LEFT () Metnin baş taraftan itibaren istenilen sayıdaki karakterleri alır. RIGHT () Metnin sonundan istenilen sayıdaki karakteri almak için kullanılır. ler: LTRIM () Metnin başında bulunan boşlukları siler. RTRIM () Metnin sonundaki boşlukları siler. ler:
LOWER () Metni küçük harfe çevirir. UPPER () Metnin tümünü büyük harfe çevirir. ler: LEN () Metnin uzunluğunu veren fonksiyondur. REVERSE () Metni ters çevirir.
SUBSTRING () Bir metinde belirtilen karakterden itibaren belirli sayıda karakter almak için kullanılır. Uygulama 8: Çalışanların Adı Soyadı ve Adı soyadının 3. Karakterinden itibaren 6 karakterlik Kod isimlerini gösteren T-SQL komutu aşağıdaki gibidir. SELECT Calisan.AdiSoyadi, SUBSTRING(Calisan.AdiSoyadi,3,6) AS KOD Uygulama 9: Çalışanları Adı Soyadı ve BÜYÜK küçük tersten va Karakter sayılarını gösteren T- SQL komutu aşağıdaki gibidir. SELECT Calisan.AdiSoyadi, UPPER(Calisan.AdiSoyadi) AS BUYUK, LOWER(Calisan.AdiSoyadi) AS KUCUK, REVERSE(Calisan.AdiSoyadi) AS TERSTEN, LEN(Calisan.AdiSoyadi) AS KAR_SAYISI
Uygulama 10: Çalışanların Adı Soyadının ilk ve son harflerinin ASCII kodlarını gösteren T-SQL komutu aşağıdaki gibidir. SELECT ASCII(SUBSTRING(Calisan.AdiSoyadi,1,1)) AS ILKHARF, ASCII(SUBSTRING(Calisan.AdiSoyadi,LEN(Calisan.AdiSoyadi),1)) AS SONHARF