SQL, İngilizce adıyla “Structured Query Language” (Yapılandırılmış Sorgulama Dili) bir veri tabanı sorgulama dilidir. SQL ile veri tabanına yeni tablolar, kayıtlar ekleyip silebilir, mevcut veriler üzerinde düzenlemeler ve sorgular yapılabilir. SQL ile ORACLE, db2, Sybase, Informix, MS SQL Server, MS Access gibi veri tabanı yönetim sistemlerinde çalışılabilir. SQL, standart bir veri tabanı sorgu dilidir, bütün gelişmiş veri tabanı uygulamalarında kullanılır.
SQL, düzeltilmesi veya değiştirilnesi istenen bilgileri açıkça belirtmeye izin veren ve yerine getirilebilecek başlıca işlemleri tanımlamamızı sağlayan bir komut takımıdır. Bu komutların oluşturduğu yapıya T-SQL dili denir. T-SQL ile veri ve sorgulara erişebilir, güncelleyebilir ve ilişkisel veri tabanı sistemi yönetilebilir. T-SQL komutları kullanım amaçlarına göre üç genel kategoriye ayrılır.
SQL Veri İşleme Dili (Data Manipulation Language – DML)
SQL veri işleme dili veri girmek, değiştirmek, silmek ve verileri almak için kullanılan DML komutlarının tümüdür. En sık kullanılan DML komutları ve kullanım amaçları aşağıdaki gibidir:
SELECT:Veri seçmek
DELETE:Veri silmek
UPDATE:Veri güncellemek
INSERT:Veri girmek
SQL Veri Tanımlama Dili (Data Definition Language – DDL)
SQL Veri tanımlama dili verilerin tutulduğu nesneler olan tabloların yaratılmasını, silinmesini ve bazı temel özelliklerinin düzenlenmesini sağlar. En sık kullanılan bazı DDL komutları ve kullanım amaçları aşağıdaki gibidir:
CREATE TABLE:Yeni bir tablo yaratmak
ALTER TABLE:Tabloda değişiklik yapmak
DROP TABLE:Tabloyu silmek
CREATE INDEX:Tabloda dizin oluşturmak
SQL Veri Kontrol Dili (Data Control Language – DCL)
SQL veri kontrol dili bir veri tabanı kulalnıcısı veya rolü ile ilgili izinlerin düzenlenmesini sağlar. DCL komuları ve fonksiyonları şöyledir:
GRANT:Kullanıcıya yetki verir.
DENY:Kullanıcı, grup veya rolü herhangi bir eylem için eneller.
REVOKE:Daha önce atanmış olan yetki veya engeli kaldırır.
Select ifadesi bir tablodan verileri seçmek için kullanılır. Elde edilen veriler sonuç kümesi olarak adlandırılır ve yine bir tablo görüntüsü şeklinde görüntülenir.
Sentax (Söz dizimi):
SELECT <sütun adı> FROM <tablo adı>
Belirli Sütunların Görüntülenmesi
Çoğu durumda tablomuzda sakladığımız tüm veriyi görmektense, o an için gerekli kısmını görüntülemek isteriz. Dunun için Select ifadesinin ardında, kullanılacak sütun adları belirtilir.
Örnek: Northwind veri tabanındaki Employees tablosunda çalışanlar ile ilgili bilgiler saklanır. Bize personelimizin sadece telefon numaraları gerekli olduğunda aşağıdaki alanları görüntülememiz yeterlidir.
Sorgu:
USE Northwind
SELECT firstname, lastname, homephone FROM employees
Tüm Sütunları Görüntülemek
Bir tablodaki tüm alanları görüntülemek için ise tek tek bütun sütun adlarını belirtmekten daha kolay bir yol vardır. Select ifadesinden sonra asterix (*) işaretini yazdığımızda SQL bunu “tablodaki tüm sütunlar” olarak yorumlayacaktır.
Sorgu:
USE northwind
SELECT * from shippers
WHERE yancümlesi görüntülenmek istenen verilerin belirli bir kritere göre seçilmesini sağlar. Örneğin günlük satış bilgilerinin tutulduğu, yüzbin kayıttan oluşan satışlar tablosundaki sadece son 3 gün içindeki satışların görüntülenmesini sağlar.
WHERE yancümlesinin kullanımı zorunlu değildir. Fakat bir koşula bağlı verileri seçmek istediğimizde FROM yancümlesinden sonra eklenebilir.
Sentax:
SELECT <sütun adı> FROM <tablo adı> WHERE <koşul(lar)>
Operatörler(İşleçler)
Aşağıdaki operatörleri WHERE ifadesi ile birlikte sınanmasını istediğiniz koşulları oluştururken kullanabilirsiniz.
Operatör
|
İfade
|
=
|
Eşittir
|
<>
|
Eşit değildir, farklı
|
>
|
Büyük
|
<
|
Küçük
|
>=
|
Büyük veya eşit
|
<=
|
Küçük veya eşit
|
BETWEEN
|
Arasında
|
LIKE
|
Metin arama
|
!=
|
Bazı SQL sürümlerinde <> ile aynı anlamdadır.
|
Örnek: Northwind veri tabanında Customers tablosundan, Kanada’daki müşterileri görüntülemek istediğimizde Country alanında bir koşul belirtmemiz gerekir.
Sorgu:
USE northwind
SELECT CustomerID, CompanyName, Country
FROM customers WHERE Country=’Canada’
Örnek: Birim fiyatı 20$’dan büyük olan ürünleri listelemek için Products tablosunda UnitPrice alanı için bir koşul belirtmemiz gerekir.
Sorgu:
USE Northwind
SELECT ProductID, ProductName, UnitPrice
FROM products WHERE UnitPrice>20
Örnek: 01.01.1998 tarihinden itibaren verilmiş olan siparişleri görüntüleyin.
Sorgu:
USE Northwind
SELECT OrderID, CustomerID, OrderData FROM Orders WHERE OrderDate>’1/1/1998’
LIKE İfadesi
LIKE kelimesi sütundaki değerlerin, joker karakter kullanılarak oluşturduğumuz bir arama koşulu ile karşılaştırılmasını sağlar.
Sentax:
SELECT <sütun adı> FROM <tablo adı>
WHERE <aranacak sütun> LIKE <kriter>
Joker Karakter
|
Anlamı
|
% (SQL Server)
|
Herhangi uzunlukta karakter
|
* (MS Access)
|
Herhangi uzunlukta karakter
|
_
|
Herhangi tek karakter
|
? (MS Access)
|
Herhangi bir karakter
|
[]
|
Belirtilen aralıkta herhangi bir karakter
|
[^]
|
Belirtilen aralıkta olmayan herhangi bir karakter
|
Örnek: Müşterilerimiz içerisinden ilk harfi K olanları listeleyin.
Sorgu:
USE northwind
SELECT * FROM Customers WHERE CustomerID LIKE ‘K%’
Örnek Arama Koşulları:
LIKE ‘BR%’İlk iki harfi BR olan tüm kayıtlar
LIKE ‘Br%’İlk iki harfi BR olan tüm kayıtlar
LIKE ‘%een’Son 3 harfi een olan tüm kayıtlar
LIKE ‘%en%’İçinde en ifadesi geçen tüm kayıtlar
LIKE‘_en’Son iki harfi en olan 3 harften oluşan tüm kayıtlar
LIKE‘[CK]%’C veya K harfleriyle başlayan tüm kayıtlar
LIKE‘[S-V]ing’ing ile biten ve ilk harfi S ile V harfleri arasında olan 4 harfli herhangi kelime
LIKE‘M[^c]%’M ile başlayan 2. harfi c olmayan tüm kayıtlar.
Örnek: firma adı içinde “restaurant” kelimesi geçen müşteriler
Sorgu:
USE northwind
SELECT companyname FROM customers
WHERE companyname LIKE ‘%RESTAURANT%’
SQL AND, OR, NOT Mantıksal Operatörleri
AND ve OR mantıksal operatörlerini birden fazla koşulu birleştirmek için kullanırız. AND operatörü kullanılarak, birleştirişen koşulların tümüne uyan satırlar listelenir. OR operatörü kullanılarak, birleştirilen koşullardan en az birine uyan satırlar listelenir. NOT operatörü kendisinden sonra gelen koşulu sağlamayan kayıtları listeler.
Parantez kullanımı ikiden fazla koşul olması durumunda koşulların öncelik sırasını belirler. Parantez kullanılmaması durumunda SQL önce NOT, sonra AND ve en sonra da OR mantıksal operatörünü işler.
Sentax:
SELECT <sütun adı> FROM <tablo adı> WHERE <koşul> AND <koşul>[AND <koşul>...]
SELECT <sütun adı> FROM <tablo adı> WHERE <koşul> OR <koşul>[OR <koşul>...]
Örnek: Personel numarası 5 olan çalışanın 1997 yılından sonra aldığı siparişleri listelemek için kontrol edilmesi gereken iki koşul vardır.
Sorgu:
USE northwind
Select EmployeeID, CustomerID, OrderID, OrderDate
FROM Orders WHERE EmployeeID=5 AND OrderDate>’1/1/1997’
Örnek: Berlin’deki veya Amerika’daki üreticileri seçelim.
Sorgu:
USE northwind
SELECT SupplierID, CompanyName, City, Country FROM suppliers WHERE Country=’USA’ OR city=’Berlin’ ORDER BY city, country
Örnek: 1 veya 2 nolu üreticilerin 18$ dan pahalı ürünlerini listelemek istersek.
Sorgu:
USE northwind
SELECT ProductName, SupplierID, UnitPrice FROM Products WHERE (SupplierID=1 OR SupplierID=2) AND UnitPrice > 18
SQL BETWEEN ... AND
BETWEEN ... AND operatörü 2 değer ile belirtilen aralığı sınar. Bu değerler sayı, metin veya tarih olabilir.
Sentax:
SELECT <sütun adı> FROM <tablo adı>
WHERE <sütun adı> BETWEEN <değer 1> AND <değer 2>
Örnek: Alfabetik olarak müşteri kodu CACTU ve DUMON arasında yer alan tüm müşterileri görüntülemek için;
Sorgu:
USE northwind
SELECT * FROM Customers
WHERE CustomerID BETWEEN ‘CACTU’ AND ‘DUMON’
Örnek: Sadece 1996 yılı içerisinde, ilk harfi ‘V’ olan müşterilerin verdiği siparişleri görmek için;
Sorgu:
USE Northwind
SELECT OrderID, CustomerID, Freight FROM Orders
WHERE OrderDate BETWEEN ‘01/01/1996’ AND ‘31/12/1996’
AND CustomerID LIKE ‘v%’
Bir Listedeki Elemanların Aranması – IN
IN anahtar sözcüğü, bir listedeki elemanlardan herhangi biriyle eşleşen satırları görüntülemek için kullanırız.
NOT IN arama kriterini ise listede olmayan değerleri aramak için kullanırız.
NOT koşul bildirimi diğer arama koşullarına göre biraz daha yavaş çalışır. Performans açısından çok sık kullanılması tavsiye edilmez.
IN ile elde ettiğimiz sonuçları OR kullanarak da elde edebiliriz.
Örnek: Japonya ve İtalya’daki üreticileri görmek istediğimizde;
Sorgu:
USE Northwind
SELECT companyname, country FROM Suppliers
WHERE counrty IN (‘Japan’, ‘Italy’)
Boş Değerlerin Görüntülenmesi – NULL Değerler
Veri girişi sırasında alana herhangi bir değer girilmezse ve alan için herhangi bir varsayılan değer atanmamışsa, alanda boş(null) değer saklanır. NULL değeri boşluk (‘ ‘) veya sıfır (0) değerinden farklıdır. Belirli bir alanına hiçbir değer girilmemiş kayıtları listelemek için IS NULL arama kriteri kullanılır.
Bir tablodaki hangi alanların varsayılan değerleri olacağına veya alanın NULL değere izin verip vermediğine, tablo tasarımı sırasında karar verilir.
Boş olmayan satırları listelemek gerektiğinde IS NOT NULL arama kriteri kullanılır.
Örnek: Fax numarası girilmemiş firmaları listele.
Sorgu:
USE northwind
SELECT companyname, fax FROM suppliers
WHERE fax IS NULL
Örnek: ShipRegion bilgisi girilmemiş olan kayıtlar.
Sorgu:
USE Northwind
SELECT OrderID, CustomerID, Freight, ShipRegion
FROM Orders WHERE ShipRegion IS NOT NULL
DISTINCT anahtar sözcüğü bir sütundaki benzersiz kayıtları listeler. Bir sütunda belirli bir kelime iki veya daha fazla sayıda tekrarlanıyor olabilir. Distinct ile her tekrarlanan kelime sadece bir kez listelenir.
Sentax:
SELECT DISTINCT <sütun adı>
FROM <tablo adı> [WHERE <koşul>]
Örnek: Hangi ülkelerdeki üreticilerle çalıştığımızı görmek için,
Sorgu:
USE northwind
SELECT DISTINCT country
FROM suppliers ORDER BY country
ORDER BY yancümlesi, satırları belirtilen sütun(lar)a göre sıralamak için kullanılır.
ORDER BY ile hangi sütuna göre sıralayacağımızı ve sıralamanın artan veya azalan şekilde yapılacağını belirleri. Sıralama yönü belirtilmez ise SQL veriyi artan şekilde sıralar.
Sıralama yapılacak alanlar SELECT ifadesinde yer almak zotunda değildir.
Sentax:
SELECT <sütun ad(lar)ı> FROM <tablo adı>
ORDER BY <sütun adı><sıralama yönü>,
<sütun adı><sıralama yönü>, ...
Örnek: Aşağıdaki sorguda Sonuç kümesi CategoryID alanına göre azalan, atnı kategorideki ürünleri ise UnitPrice alanına göre artan şekilde sıralandı.
Sorgu:
USE northwind
SELECT productid, productname, categoryid, unitprice
FROM products ORDER BY categoryid DESC, unitprice ASC
Matematiksel & Metinsel İfadeler
Tablolardaki alanları kullanarak, matematiksel veya metinsel operatörler yardımıyla oluşturduğumuz ifadeler ile sorguların gücünü arttırabiliriz.
Operatör
|
Görev
|
+
|
Toplama
|
-
|
Çıkarma
|
*
|
Çarpma
|
/
|
Bölme
|
%
|
Mod
|
Örnek: Aşağıdaki örnekte birim fiyat (UnitPrice) alanı Miktar(Quantity) alanı ile çarpılarak toplam fiyat hesaplanmış ve “TotalCost” adı ile yeni bir alan olarak görüntülenmiştir.
Sorgu:
USE Northwind
SELECT OrderID, ProductID, (UnitPrice * Quantity) AS TotalCost
FROM [Order Details] WHERE (UnitPrice * Quantity) > 10000
Dikkat edersniz, Order Details isimli tablo çağırılırken köşeli parantezler kullanılmış. SQL’de tablo isimlerinde boşluk karakteri kullanılmışsa, sorgu içerisinde köşeli parantezler içinde çağırılır.
SQL Count Fonksiyonları
SQL, veri tabanındaki kayıtları sayabilmek için yerleşik (built-in) COUNT fonksiyonu kullanır.
Sentax:
SELECT COUNT (<sütun adı>) FROM <tablo adı>
COUNT(*)
COUNT fonksiyonu (*) ile kullanıldığında FROM ile belirtilen tablodaki toplam satır sayısını verir.
Örnek: Aşağıdaki örnekte Siparişler (Orders) tablosundaki kayıt sayısı listelenmiştir.
Sorgu:
USE northwind
SELECT COUNT(*) AS [Kayıt Sayısı] FROM Orders
Örnek: Aşağıda, yaşı 20’den büyük olan çalışanlar listelenir.
Sorgu:
USE Northwind
SELECT COUNT (*) AS [Yirmi Yaşından Büyükler]
FROM Employees WHERE getdate() – BirthDate > 20
COUNT(<sütun adı>)
COUNT fonksiyonu bir sütun adı ile birlikte kullanıldığında, o sütundaki boş (NULL) olmayan kayıtların sayısını verir.
Örnek: Orders tablosundan ShipRegion alanını saydıralım.
Sorgu:
USE Northwind
SELECT COUNT(ShipRegion) FROM Orders
COUNT DISTINCT
DISTINCT anahtar sözcüğü COUNT ile kullanıldığında, belirtilen sütundaki benzersiz kayıtların sayısını verir.
Sentax:
SELECT COUNT(DISTINCT <sütun adı>) FROM <tablo adı>
Örnek: Siparişlerin kaç farklı müşteriden alındığını öğrenelim.
Sorgu:
USE Northwind
SELECT COUNT (DISTINCT CustomerID) FROM Orders
SÜTUNLARIN VE TABLOLARIN YENİDEN ADLANDIRILMASI – AS ANAHTAR SÖZCÜĞÜ
Sonuç kümelerindeki sütun adları varsayılan olarak tablodaki alan adlarıdır. AS yardımcı kelimesini kullanarak sütunları farklı adlarla görüntüleyebiliriz.
Aynı şekilde uzun tablo isimlerini de kullanımı daha kolay olacak şekilde değiştirebiliriz.
Sentax:
SELECT <sütun adı> AS <yeni ad> FROM <tablo adı> AS <yeni tablo adı>
SQL TOPLAM FONKSİYONLARI (AGGREGATE FUNCTIONS)
AVG (<sütun adı>) Fonksiyonu
AVG fonksiyonu belirtilen sütundaki ortalama değeri verir. Bu hesaplama sırasında boş (NULL) değerler işleme katılmaz.
Örnek: Aşağıda Ürünler (Products) tablosundaki ortalama ürün birim fiyatı (UnitPrice) hesaplanmıştır.
Sorgu:
USE Northwind
SELECT AVG(UnitPrice) AS ‘Avarage Price’ FROM Products
MAX(<sütun adı>) Fonksiyonu
MAX fonksiyonu, bir sütundaki en yüksek değeri verir. Boş (NULL) değerler işleme katılmaz. MAX fonksiyonu alfabetik sıralamadaki ilk metinsel ifadeyi de bulmamızı sağlar.
MIN(<sütun adı>) Fonksiyonu
MIN fonksiyonu, bir sütundaki kayıtlardan en küçük olanının değerini verir. Boş (NULL) değerler işe katılmaz. MIN fonksiyonu alfabetik sıralamadaki son metinsel ifadeyi de bulmamızı sağlar.
SUM(<sütun adı>) Fonksiyonu
SUM fonksiyonu, belirtilen sütundaki sayısal değerlerin bir toplamını geri döndürür.
İlk n Kaydın Görüntülenmesi – TOP n
Bazı durumlarda bir tablo veya sorgudaki tüm kayıtları görmek istemeyebiliriz. Bir sonuç kümesindeki ilk n satırı veya tüm kayıtların belirli bir yüzdesini görüntüleyebilmek için TOP n anahtar sözcüğü kullanılır.
TOP n veya TOP n PERCENT anahtar sözcükleri ORDER BY yan cümlesi ile birlikte kullanılmalıdır. Aksi halde listelenen verilerde WHERE ifadesi ile belirtilen koşula uyan kayıtlar rastgele dizileceğinden, istediğimiz sonucu elde edemeyebiliriz.
WITH TIES
WITH TIES yan cümlesi, ORDER BY ile sıralanan sonuç kümesinde son kayıt ile aynı değerde olan kayıtların da listelenmesini sağlar. Bu durumda sonuç kümemi belirttiğimiz n sayısından daha fazla olabilir.
WITH TIES yan cümlesi, sadece ORDER BY yan cümlesi ile kullanılabilir.
Örnek: Aşağıda sipariş detayları tablosundan (order details) en yüksek siparişi verilen 5 ürün listelenmek istenmiştir.
Sorgu:
USE Northwind
SELECT TOP 5 orderid, productid, quantity
FROM [order details] ORDER BY quantity DESC
Örnek: Yukarıdaki sorguyu WITH TIES ile birlikte çalıştırırsak sonuç kümesinin bu kez 10 satırdan oluştuğunu görürüz. Bu durumda miktarı son kayıttaki değere eşit olan kayıtlar da listelenmiştir. İki örneği de karşılaştırın.
Sorgu:
USE Northwind
SELECT TOP 5 WITH TIES orderid, productid, quantity
FROM [order details] ORDER BY quantity DESC
DISTINCT anahtar sözcüğü sadece benzersiz satırları listelemek için kullanılırken, GROUP BY yan cümlesi belirtilen sütun yada sütunlardaki aynı değere sahip satırları tek bir satırda birleştirmeyi sağlar. GROUP BY genellikle toplam fonksiyonlarıyla (aggregate function) kullanılır. GROUP BY sorgularında kullanılan en yaygın toplama fonksiyonları MIN, MAX, SUM ve COUNT’dır.
GROUP BY ile belirtilen sütunlar SELECT ifadesinde de yer almalıdır.
Örnek: Aşağıda Sipariş Detayları(Order Details) tablosu productid alanına göre gruplandırılmış ve her grubun toplam sipariş miktarı hesaplanmıştır.
Sorgu:
USE Northwind
SELECT productid, SUM(quantity) AS ‘Total’
FROM [Order Details] GROUP BY productid ORDER BY productid
Örnek: Aşağıdaki örnekte sadece ürünkodu 2 olan kayıdın toplam miktarı hesaplanmıştır.
Sorgu:
USE Northwind
SELECT productid, SUM(quantity) AS ‘Total’
FROM [Order Details] WHERE productid=2
GROUP BY productid ORDER BY productid
HAVING YAN CÜMLESİ
Toplam fonksiyonlarını kullanırken kısıt getirimesi gerektiğinde WHERE yan cümlesini kullanamayız. HAVING yan cümlesi, GROUP BY ile elde edilecek satırları kısıtlamak için kullanılır. İşlev olarak WHERE yan cümlesi gibi çalışır fakat WHERE yan cümlesi gruplama işlemlerinden önce, HAVING yan cümlesi ise GROUP BY’dan sonra uygulanır.
Örnek: Bu sorguda toplam sipariş miktarı 1200 adetten fazla olan ürün kodları listelenmiştir.
Sorgu:
USE Northwind
SELECT productid, SUM(quantity) AS total_quantity
FROM [order details]
GROUP BY productid HAVING SUM(quantity) > 1200
Örnek: Siparişler (Orders) tablosunu EmployeeID alanına göre gruplandırılmış ve CustomerID alanı her grup için sayılmıştır. Bu şekilde her çalışanın toplam kaç sipariş aldığı görülür. Burada saydırılacak olan CustomerID’den farklı bir alan da olabilirdi.
Sorgu:
USE Northwind
SELECT EmployeeID, COUNT(CustomerID) FROM orders
GROUP BY EmployeeID HAVING COUNT(CustomerID)>120
ORDER BY EmployeeID
GROUP BY – ÖZET BİLGİ
GROUP BY ile bir toplama fonksiyonu kullandığımızda her farklı değer için sadece sonuç satırı görüntülenir. Gruplandırdığımız değerlerin detaylarını farklı yan cümleler kullanarak görüntüleyebiliriz.
ROLLUP
Grup değerlerini özetlemek için kullanılır.
Örnek:
Sorgu:
USE Northwind
SELECT orderid, productid, SUM(quantity) AS total_quantity
FROM [order details]
WHERE orderid < 10250 GROUP BY orderid, productid
WITH ROLLUP ORDER BY orderid, productid
CUBE
GROUP BY ile belirtilen sütunların tüm olası eşleşmelerini özetler.
Örnek: Aşağıdaki örnekte sipariş kodu 10250’den küçük olan kayıtların ve ürünlerin detaylı toplamları listelenmiştir.
Sorgu:
SELECT orderid, productid, SUM(quantity) AS total_quantity
FROM [order details] WHERE OrderID < 12500
GROUP BY OrderID, productid
WITH CUBE ORDER BY OrderID, productid
GROUPING FONKSİYONU
ROLLUP ve CUBE ile elde edilen sonuç kümesini görsel olarak daha kolay yorumlanabilmesini sağlar. GROUPING ile belirtilen her sütun için yeni bir sütun oluşturulur. Bu sütunlarda özet bilgiler için 1, detay bilgiler için 0 değeri görüntülenir.
Örnek: Yukarıdaki alıştırmalardan farklı olarak fazladan eklenmiş sütunlara dikkat edin. OrderID alanı NULL olarak görülen kayıtlar tüm siparişlerdeki ürünlerin toplamlarını göstermektedir.
Sorgu:
USE Northwind
SELECT orderid, GROUPING(orderid), productid, GROUPING(productid), SUM(quantity) AS total_quantity
FROM [order details] WHERE orderid < 10250 GROUP BY orderid, productid WITH CUBE ORDER BY orderid, productid
COMPUTE ifadesi tüm sonuç kümesini listeler ve bu listenin altında tek bir detay satırı görüntülenir. COMPUTE ile kullandığınız sütun SELECT listesinde de yer almalıdır.
COMPUTE BY kullanarak daha detaylı gruplandırma da yapılabilir.
Örnek: Aşağıdaki sorgu Sipariş detayları (Order Details) tablosundaki tüm satırları listeler ve kayıt kümesinin sonuna tüm ürünlerin genel toplamını verir.
Sorgu:
USE Northwind
SELECT productid, orderid, quantity FROM [Order Details]
ORDER BY productid, orderid COMPUTE SUM(quantity)
Örnek: Aşağıdaki sorgu Sipariş Detayları tablosundaki tüm satırları listeleyecek ve her sipariş altına sipariş genel toplamını verecektir. Son olarak ise tüm siparişlerdeki genel toplam görüntülenecektir.
Sorgu:
USE Northwind
SELECT productid, orderid, quantity FROM [order details]
WHERE orderid < 10250 ORDER BY orderid, productid
COMPUTE SUM(quantity) BY orderid COMPUTE SUM(quantity)
Şimdiye kadar aynı anda sadece tek bir tablodan veriler ile çalışıldı. Bazı durumlarda sonuç kümemizin daha anlamlı olabilmesi için iki farklı tablodan verilere ihtiyacımız olabilir. Bunun için sorgumuzda iki anahtar kelime daha kullanırız;
JOIN ifadesi ile hangi tabloları ve nasıl birleştireceğimizi
ON ifadesi ile tabloların hangi alanlar üzerinden birleşeceğini belirtiriz.
Tablolar genelde Primary Key(birincil anahtar) ve Foreign Key(yabancı anahtar) alanları üzerinden birleştirilseler de, gerektiğinde diğer herhangi bir alan da bunun için kullanılabilir. Fakat bu alanların aynı tür veri içerdiğinden emin olmalısınız.
Primary key, her kayıt için benzersiz bir değer taşıyan alandır. Örneğin, öğrenci kayıtlarının tutulduğu bir tabloda, öğrenci numarasının saklandığı alan birincil anahtar olarak seçilebilir. Öğrenci ile ilgili tüm bilgiler gerçekte öğrenci numarası ile kodlanmıştır ve her öğrencinin numarası birbirinden farklıdır.
INNER JOIN
SQL’de varsayılan (default) bağlantı türüdür. İlişkili tablolarda sadece JOIN koşulunu sağlayan kayıtlar listelenir.
Örnek:
Sorgu:
USE Northwind
SELECT productname, companyname
FROM products INNER JOIN suppliers
ON products.supplierid = suppliers.supplierid
Örnek: Aşağıdaki örnekte 01.01.1998 tarihinden sonra sipariş vermiş olan müşterilerin isimleri listelenmiştir. Bu iki bilgi farklı tablolarda olduğundan iki tablo arasında, her iki tabloda da olan CustomerID alanı üzerinden bir bağlantı sağlanmıştır.
Sorgu:
USE Northwind
SELECT DISTINCT companyname, orderdate FROM orders
INNER JOIN customers
ON orders.customerid = customers.customerid
WHERE orderdate > ‘1/1/98’
OUTER JOIN
LEFT veya RIGHT OUTER JOIN ifadeleri ilişkili alanda birbiriyle eşleşenlerin yanında eşleşmeyen kayıtları da listeler. JOIN koşuluna uymayan satırlar NULL(boş) değer olarak görüntülenirler.
LEFT JOIN
LEFT OUTER JOIN ile yazımdaki ilk tablonun tüm satırları listelenir ve diğer tablo ile eşleşmeyen alanlar NULL(boş) değer ile gösterilir. Eğer tabloların sorgudaki sırası değişirse aynı sonucu elde edebilmek için RIGHT OUTER JOIN kullanılır.
Sentax:
SELECT <sütun ad(lar)ı>
FROM <ilk tablo> LEFT JOIN <ikinci tablo>
ON <ilk tablo>.<anahtar alan> = <ikinci tablo>.<anahtar alan>
Örnek: Aşağıdaki sorgunun SELECT kısmında iki sütn tek bir sütın adı altında birleştirilmiştir. Çalıştırıldığında çalışanın tam adı ve müşterilerden aldığı siparişler ve tarihleri listelenecektir.
Sorgu:
USE Northwind
SELECT Employees.FirstName + ‘ ’ + Employees.LastName
AS Name, OrderID, OrderDate
FROM Employees LEFT JOIN Orders
ON Employees.EmployeeID = Orders.EmployeeID
RIGHT JOIN
İkinci tablodaki tüm kayıtları listelemek istendiğinde RIGHT JOIN kullanılır. Bu durumda ise birinci tablodaki eşleşmeyen kayıtlar NULL olarak görüntülenir. Eğer tabloların yazım önceliğini değiştirirseniz, sorgu LEFT OUTER JOIN ile aynı sonucu verecektir.
Sentax:
SELECT <sütun ad(lar)ı> FROM <ilk tablo>
RIGHT JOIN <ikinci tablo> ON
<birinci tablo>.<anahtar alan> = <ikinci tablo>.<anahtar alan>
Örnek: Aşağıdaki örnekte tüm müşteriler ve verdikleri siparişlerin tarihleri listelenmiştir. Hiç siparişi olmayan müşterilerin tarih alanı NULL olarak görüntülendiğine dikkat edin.
Sorgu:
USE Northwind
SELECT companyname, customers.customerid, orderdate
FROM customers LEFT OUTER JOIN orders
ON customers.customerid = orders.customerid
CROSS JOIN
İlişkili tablolar arasında olası tüm eşleşmeleri listeler. Belirli ortak bir alan belirtilmesine gerek yoktur.
Örnek: Aşağıdaki örnek üreticilerin çalışabilecekleri tüm olası gemi şirketlerini görmemizi sağlar. Shippers tablosu 3 kayıt ve Suppliers tablosunda 29 kayıt olduğundan, sonuç kümesinde 87 satır görüntülenecektir.
Sorgu:
USE Northwind
SELECT suppliers.companyname, shippers.companyname
FROM suppliers CROSS JOIN shippers
İkiden Fazla Tablonun Birleştirilmesi
Gerektiğinde ikiden fazla tabloyu birleştirmek de mümkündür. Bir JOIN işlemiyle birleştirilen tablolar bir başka tabloya aralarındaki ortak bir sütun üzerinden bağlanabilir.
Örnek: Aşağıdaki örnekte Order Details tablosunu ara tablo şeklinde kullanarak, Orders ve Products tablosundan gerekli bilgiler görüntülenmiştir. Bir sipariş birden fazla ürünü içerebilir ve bir ürün birden fazla siparişte yer alabilir. Sonuç kümemizde Order Details tablosundan hiçbir alan görüntülemesekte sorguda kullanmalıyız.
Sorgu:
SELECT orderdate, productname FROM orders AS O
INNER JOIN [order details] AS OD ON O.orderid = OD.orderid
INNER JOIN products AS P ON OD.productid = P.productid
WHERE orderdate = ‘7/8/96’ ORDER BY productname
SELF-JOINS
Bir tablodaki aynı değerleri içeren farklı satırları listelemek istendiğinde o tablo kendisi ile birleştirilir.
Örnek: Aşağıdaki örnek job title aynı olan çalışanları listeler. WHERE ifadesi ile belirtilen koşul kendisiyle eşleşen kayıtların görüntülenmesini engeller.
Sorgu:
SELECT a.employeeid, LEFT(a.lastname, 10) AS NAME,
LEFT(a.title, 10) AS Title, b.employeeid,
LEFT(b.lastname, 10) AS NAME, LEFT(b.title, 10) AS Title
FROM Employees AS a INNER JOIN employees AS b
ON a.title = b.title WHERE a.employeeid < b.employeeid
ORDER BY a.employeeid
UNION fonksiyonu, iki veya daha fazla SELECT sorgusunun sonuçlarını tekbir sonuç kümesinde birleştirir. Görüntülenecek olan tablolar aynı veri türünde aynı sayıda ve aynı düzendeki sütunlardan oluşmalıdır.
Örnek: Aşağıdaki örnekte Customers tablosu ve Employees tablosu verileri birleştirilmiştir. Birinci sorgunun SELECT ifadesindeki takma adın görüntülendiğine dikkat ediniz.
Sorgu:
SELECT (firstname + ‘ ’ + lastname) AS Name, city, postalcode
FROM employees
UNION
SELECT companyname, city, postalcode FROM customers
ALT SORGULAR (SUBQUERIES)
Bir alt sorgu, başka bir SELECT, INSERT, UPDATE veya DELETE ifadesi içine yuvalanmış bir SELECT ifadesidir. Çoğu kez alt sorgular, JOIN ifadelerine dönüştürülebilir. Alt sorgular, karmaşık sorguları biraz daha anlaşılabilir mantıksak bölümlere ayıtmak için veya bir başka sorgunun sonuç kümesine dayalı bir sorguyu çalıştırmak için kullanılır. JOIN bağlantıları alt sorgulardan daha hızlı işlenirler.
Sonuç Kümesinin Tablo Olarak Kullanımı
Bir sorgunun FROM ifadesinde kullanılan tablonun yerine bir başka sorguyu kullanabilirsiniz. Sonuç kümesine herhangi bir tabloya yapabildiğimiz gibi bir geçici takma ad verilebilir.
Örnek: İç sorgu ile üretilen sonuç kümesi dış sorguda kullanılmıştır.
Sorgu:
SELECT T.orderid, T.customerid
FROM (SELECT orderid, customerid FROM orders) AS T
Sonuç Kümesinin Bir Deyim Olarak Kullanılması
T-SQL de bir sorgu herhangi bir deyimin yerine kullanılabilir. Bu amaç için kullanılacak bir sorgu tek bir sayısal değer veya tek bir sütun değer listesi döndürmelidir. Bir değerler listesi geri döndüren sorgular IN anahtar sözcüğü içeren WHERE yan cümlesi yerine kullanılabilir.
Örnek: Aşağıdaki sorgu çok satan bir bilgisayar kitabının fiyatını, bütün kitapların ortalama fiyatlarını ve bilgisayar kitabı ile ortalama fiyat arasındaki farkı geri döndürür.
Sorgu:
USE pubs
SELECT title, price,
(SELECT AVG(price) FROM titles) AS Average,
price-(SELECT AVG(price) FROM titles) AS Difference
FROM titles WHERE type=’popular_comp’
İlişkili Alt Sorgu
İç sorgu ile dış sorgu bir alan üzerinden doğrudan ilişkilidir.
Örnek: Aşağıdaki örnekte 23 nolu üründen 20’den fazla sipariş veren müşterileri listeler.
Sorgu:
USE northwind
SELECT orderid, customerid FROM orders AS or1
WHERE 20 < (SELECT quantity FROM [order details] AS od
WHERE or1.orderid = od.orderid AND od.productid = 23)
Örnek: Aşağıdaki sorgu ürünlerin bir listesini ve ürünün o ana kadarki verilmiş en yüksek sipariş miktasını gösterir.
Sorgu:
USE Northwind
SELECT DISTINCT productid, quantity
FROM [order details] AS ord1
WHERE quantity = (SELECT MAX(quantity) FROM [order details]
AS ord2 WHERE ord1.productid = ord2.productid)
ALT SORGU – JOIN DÖNÜŞÜMÜ
İlişkili alt sorguları bir JOIN ifadesi yerine kullanabiliriz.
Örnek: Aşağıdaki iki farklı sorgu aynı sonucu üretir. Birincisi alt sorgu, ikincisi ise JOIN kullanır.
Sorgu 1:
USE pubs
SELECT DISTINCT t1.type FROM titles AS t1
WHERE t1.type IN (SELECT t2.type FROM titles AS t2
WHERE t1.pub_id<>t2.pub_id)
Sorgu 2:
USE pubs
SELECT DISTINCT t1.type FROM titles AS t1 INNER JOIN titles
AS t2 ON t1.type = t2.type WHERE t1.pub_id<>t2.pub_id
ALT SORGU – HAVING DÖNÜŞÜMÜ
İlişkili bir alt sorgunun ürettiği sonuç kümesini HAVING yan cümlesi ile de elde edilebilir.
Örnek: Aşağıdaki iki örnekte kendi türünün ortalama fiyatından daha pahalı olan ürünleri listeler.
Sorgu 1:
USE pubs
SELECT t1.type, t1.title, t1.price FROM titles AS t1
WHERE t1.price > (SELECT AVG(t2.price) FROM titles AS t2
WHERE t1.type = t2.type)
Sorgu 2:
USE pubs
SELECT t1.type, t1.title, t1.price FROM titles AS t1
INNER JOIN titles AS t2 ON t1.type = t2.type
GROUP BY t1.type, t1.title, t1.price
HAVING t1.price > AVG(t2.price)
|