USE
Kullanılacak VeriTabanını Belirleme
USE "Database"
USE Northwind
-----------------------------------------------------*--------------------------------------------------------------------
SELECT
Belirli Propertiesleri yada Tüm Propertiesi Listeleme
SELECT Column1, Column2 FROM "DataBase
SELECT MusteriID, MusteriAdi FROM Musteriler
SELECT * FROM "DataBase"
SELECT * FROM Musteriler
-----------------------------------------------------*--------------------------------------------------------------------
WHERE
Filtreleme yapar.
SELECT * FROM "DataBase" WHERE (filter)
SELECT * FROM Musteriler WHERE Age>20
Fonkisyonu filtre olarak kullanma
Select * From Employees Where YEAR( Employees.HireDate)>=1994 and Month(HireDate)>3
-----------------------------------------------------*-----------------------------------------------------------------
INSERT
Yeni kayıt Ekler.
INSERT (Column1, Column2, Column3) SET ('Value1, Value2, Value3)
INSERT Employees( LastName,FirstName,Title) VALUES('Habil','Gür','Manager')
* Null alanlar için mutlaka null değer yollanmalıdır.
* Kolonun veri tipinde ve uzunluğunda veri gönderilmelidir.
* Idendity kolonlarına değer gönderilemez.
-----------------------------------------------------*--------------------------------------------------------------------
ORDER BY
Kayıtları sıralar...
SELECT * FROM "DataBase" ORDER BY (Column1, Column2) ASC | DESC
SELECT * FROM Employees WHERE City IS NOT NULL ORDER BY City,PostalCode ASC
-----------------------------------------------------*--------------------------------------------------------------------
UPDATE *** WHERE yazmadan kullanılmaz!! Aksi Halde Tüm Kayıtlar Updatelenir!!!
Kayıtlara yeni alanlar ekler....
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
UPDATE Employees
SET TitleOfCourtesy='Mr', BirthDate='1978/08/28',HireDate='2012/07/02',City='İstanbul'
WHERE EmployeeID=10
-----------------------------------------------------*--------------------------------------------------------------------
DELETE *** WHERE yazmadan kullanılmaz!! Aksi Halde Tüm Kayıtlar Updatelenir!!!
Kayıtlara yeni alanlar ekler....
DELETE FROM table_name
WHERE condition;
DELETE FROM Employees
WHERE EmployeeID=10
-----------------------------------------------------*--------------------------------------------------------------------
SELECT TOP
Bir Tabloda ki en üst kayıtları sıralar...
SELECT TOP number|percent column_name(s)
FROM table_nameWHERE condition;
SELECT TOP 3 * FROM Employees
SELECT TOP 50 PERCENT * FROM Employees
-----------------------------------------------------*--------------------------------------------------------------------
AVG, MIN, MAX, COUNT
SELECT COUNT - SUM - AVG - MIN - MAX (column_name)
FROM table_name
SELECT
AVG(o.ProfitLoss) AvgPL,
SUM(o.ProfitLoss) SumPL,
MIN(o.ProfitLoss) MınPL,
MAX(o.ProfitLoss) MaxPL,
Count(o.ProfitLoss) ClosedORder
FROM [Order] o
-----------------------------------------------------*--------------------------------------------------------------------
LIKE
SELECT column1, column2, ...
FROM table_name
WHERE columnN LIKE pattern;
LIKE Operator | Description |
---|---|
WHERE CustomerName LIKE 'a%' | Finds any values that start with "a" |
WHERE CustomerName LIKE '%a' | Finds any values that end with "a" |
WHERE CustomerName LIKE '%or%' | Finds any values that have "or" in any position |
WHERE CustomerName LIKE '_r%' | Finds any values that have "r" in the second position |
WHERE CustomerName LIKE 'a__%' | Finds any values that start with "a" and are at least 3 characters in length |
WHERE ContactName LIKE 'a%o' | Finds any values that start with "a" and ends with "o" |
-----------------------------------------------------*--------------------------------------------------------------------
IN
Where içerisinde birden fazla parametre kullanılmasını sağlar
SELECT column1, column2, ...
FROM table_name
WHERE columnName IN (column1, cloumn2)
SELECT * FROM IsGucu
WHERE Ad IN ('Mehmet','Habil','Günay')
ORDER BY Ad ASC
-----------------------------------------------------*--------------------------------------------------------------------
BETWEEN
Belirli bir aralıkta seçilen değerleri verir. Numara, text yada tarih olabilir. Belirtilen değerleride sonuca dahil eder.
SELECT column_name(s)
FROM table_name
WHERE column_name BETWEEN value1 AND value2;
--BOYLARI 1.60 VE 1.70 ARASINDA OLAN ÇALIŞANLAR
SELECT * FROM IsGucu
WHERE Boy BETWEEN 165 AND 170
--BOYLARI 170 VE 171 HARİCİNDE Kİ TÜM ÇALIŞANLAR
SELECT * FROM ISGUCU
WHERE BOY NOT BETWEEN 170 AND 171
--BOYLARI 170 VE 180 ARASINDA OLAN VE BEDENİ 42, 43 OLMAYAN ÇALIŞANLAR
SELECT * FROM ISGUCU
WHERE BOY BETWEEN 170 AND 180
AND NOT BEDEN IN(42,44)
-- DOĞUM TARİHİ 78 VE 80 ARASINDA OLMAYAN ÇALIŞANLAR
SELECT * FROM ISGUCU
WHERE DogumTarihi NOT BETWEEN '1978-01-01' AND '1980-01-01'
-----------------------------------------------------*--------------------------------------------------------------------
GROUP BY
Genellikle select kısmında bir kolon ve bir Aggregate fonksiyonu var ise kullanılır. Aynı türden verilerin gruplanmasına yarar.
SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)ORDER BY column_name(s);
-- Kategorilere göre Ürünlerin Toplam Stok Düzeyi
SELECT U.KategoriID, SUM(U.HedefStokDuzeyi) FROM Urunler U
GROUP BY U.KategoriID
-----------------------------------------------------*--------------------------------------------------------------------
HAVING
The HAVING clause was added to SQL because the WHERE keyword could not be used with aggregate functions.
SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)HAVING conditionORDER BY column_name(s);
SELECT COUNT(CustomerID), Country
FROM Customers
GROUP BY Country
HAVING COUNT(CustomerID) > 5;
-----------------------------------------------------*--------------------------------------------------------------------
INNER JOIN
İki yada daha fazla tablonun ilişkili kolonu üzerinden kesişimi, ortak kümesini verir.
Üç tablo birleştirirken önce ilişkisel olan iki tablo birleştirilir, oluşan bu tablo ile de üçüncü tablo birleştirilir. Sonrasında bu tablo üzerinden Where GroupBy, Having ve OrderBy komutları ile filtreleme uygulanır.
SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;
INNER JOIN table2
ON table1.column_name = table2.column_name;
-- Nancy adlı personelin 1997 yılından sonraki satış yaptığı Müşteri Listesi
SELECT P.Adi,S.SatisID,S.SatisTarihi,M.MusteriAdi FROM Personeller P
INNER JOIN Satislar S ON P.PersonelID=S.PersonelID
INNER JOIN Musteriler M ON M.MusteriID= S.MusteriID
WHERE P.Adi='NANCY' AND YEAR(S.SatisTarihi)>=1997
Alternatif olarak inner Joın yapısını kullanmdan tabloların kesişim noktasını aşağıdaki gibi alabiliriz.
SELECT P.Adi,P.SoyAdi, SUM(SD.BirimFiyati*SD.Miktar) Total FROM Personeller P
JOIN Satislar S ON S.PersonelID= P.PersonelID
JOIN [Satis Detaylari] SD ON SD.SatisID= S.SatisID
GROUP BY P.Adi,P.SoyAdi
SELECT P.Adi,SUM(SD.BirimFiyati*SD.Miktar) FROM Personeller P, [Satis Detaylari] SD, Satislar S
WHERE P.PersonelID=S.PersonelID AND SD.SatisID=S.SatisID
GROUP BY P.Adi
-----------------------------------------------------*--------------------------------------------------------------------
LEFT JOIN
İfadenin solunda kalan tablonun tüm elemanlarını getirir ve ifadenin sağındaki tablodan da eşleşenleri getirirken, eşleşmeyen satırlarda ise 'null' döndürür.
SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name = table2.column_name;
-----------------------------------------------------*--------------------------------------------------------------------
RIGHT JOIN
İfadenin sağında kalan tablonun tüm elemanlarını getirir ve ifadenin solundaki tablodan da eşleşenleri getirirken , eşleşmeyen satırlarda ise 'null' döndürür.
SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name = table2.column_name;
-----------------------------------------------------*--------------------------------------------------------------------
UNION
UNION operator bir yada daha fazla Select sorgusunun sonuçlarını alt alta getirmek için kullanılır.
Union sadece tekrar etmeyen değerleri döndürür.
Joınler tabloları yanyan UNIONLAR alt alta getirir.
- Her bir select tablosunun KOLON sayıları aynı olmalı
- Kolonlar aynı data tipine sahip olmalıdır.
- Select ifadelerindeki kolonların sıralaması aynı olmalıdır.
UNION
SELECT column_name(s) FROM table2
UNION ALL ise tekrarlayan kayıtlarıda döndürür.
SELECT column_name(s) FROM table1
UNION ALL
SELECT column_name(s) FROM table2
-----------------------------------------------------*--------------------------------------------------------------------
EXISTS
EXIST, bir sorgudan sonucun dönüp dönmediğini belirten bir sql cümleciğidir. "EXIST" kullanımı "IN" kullanımı ile aynı sonucu verir. Ancak "EXIST" kullanımı performans açısından çok hızlıdır. EXIST cümleciğinin geri dönüş tipi True veya False şeklindedir. İçerisine aldığı subquery'den herhangi bir sonuç geriye dönüyorsa TRUE hiç bir kayıt geri dönüşü yoksa False döndürür. Yani karşılaştırma yaparken True sonucunu aldığı anda döngüden çıkar. IN ise, ana sorgudan gelen her kaydı kontrol etmek için IN içerisinde bulunan alt sorgudaki tüm kayıtları kontrol eder.
SELECT column_name(s)
FROM table_name
WHERE EXISTS
(SELECT column_name FROM table_name WHERE condition);
SELECT * FROM Tedarikciler T
WHERE EXISTS( SELECT * FROM Urunler U WHERE T.TedarikciID=U.TedarikciID AND BirimFiyati<20)
-----------------------------------------------------*--------------------------------------------------------------------
ANY
ANY ve ALL operatörleri genellikle WHERE yada HAVING ile kullanılırlar.
ANY operatörü herhangi bir SubQuery değeri şart ile uyumlu ise true döner
ALL operatörü eğer tüm SubQuery değerleri şart ile uyumlu ise true döner
SELECT column_name(s)
FROM table_name
WHERE column_name operator ANY / ALL
(SELECT column_name FROM table_name WHERE condition);
SELECT U.UrunAdi
FROM Urunler U
WHERE U.UrunID = ANY (SELECT SD.UrunID FROM [Satis Detaylari] SD WHERE SD.Miktar = 10);
-----------------------------------------------------*--------------------------------------------------------------------
SELECT INTO
Select Into ile bir tabloyu yeni bir tabloya tüyle aktarabiliriz..
Fakat bu yöntem ile aktarılan verilerde bir Primary Key kolonu yoksa , ayrıca bir Primary key oluşturulmaz
SELECT *
INTO newtable
FROM oldtableWHERE condition;
SELECT * INTO CustomersBackUpTable
FROM Customers
Yada sadece belirli alanları aktarabilriz...
SELECT C.Id, C.Name, C.Surname INTO CustomersBackUpTable
FROM Customers C
Birden fazla tablodan dönen sonuçları aktarabiliriz.
SELECT Customers.CustomerName, Orders.OrderID
INTO CustomersOrderBackup2017
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID;
-----------------------------------------------------*--------------------------------------------------------------------
CASE WHEN THEN END
Kolon çekilirken belirlenen filtre yada şarta göre kolon düzenlenir.
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
WHEN conditionN THEN resultN
ELSE result
END;
SELECT P.Adi,P.SoyAdi,
CASE
WHEN P.UnvanEki= 'Mr.' THEN 'Bay'
WHEN P.UnvanEki= 'Mrs.' OR P.UnvanEki= 'Ms.' THEN 'Bayan'
ELSE P.UnvanEki
END AS Unvan
FROM Personeller P
-----------------------------------------------------*--------------------------------------------------------------------
WITH
Karmaşık sorguları çekerken with komutu ile sorguyu bir değişkene atayıp sorgudan gelen ve lazım olan kolonları tanımlamak süreti ile yeni bir tablo gibi kullanmaya yarar.
(?) Bu özelliğin çalışması için The Importance of Database Compatibility Level in SQL Server set to 90 olması gerek 2017 'de çalışmıyor.
-----------------------------------------------------*--------------------------------------------------------------------
IF
Eğer sorguda aranan true dönerse etkilenen row'lar olacağı için etkilenen row sayısını kontrol edip IF döngülerini buna göre kurgulayabiliriz.
-- TABLODA HABİL GUR İSİMLİ BİR KAYIT VAR MI KONTROL ET . YOK İSE VT'NA KAYDET..
DECLARE @ISIM nvarchar(max) = 'HABIL'
DECLARE @SOYISIM nvarchar(max) = 'GUR'
SELECT P.Adi FROM PERSONELLER P WHERE P.Adi=@ISIM AND P.SoyAdi=@SOYISIM
IF(@@ROWCOUNT>0) *(etkilenen satır var mı bak)
PRINT 'VAR'
ELSE
BEGIN
PRINT 'YOK'
INSERT Personeller (Adi,SoyAdi) VALUES(@ISIM,@SOYISIM)
END