Skip to main content

Northwind Sorguları

use Northwind
/*
T-SQL (Transactional – Structure Query Language), üç dil yapısının birleşiminden oluşur.

1. DDL : Data Definition Language
— CREATE <NesneTipi><NesneAdi> (Oluşturucu)
— ALTER <NesneTipi><NesneAdi> (Değiştirir)
— DROP <NesneTipi><NesneAdi> (Siler)

2. DML : Data Manipulation Language
— INSERT (Kayıt Ekler)
— UPDATE (Varolan Kaydı Günceller)
— DELETE (Varolan Kaydı Siler)
— SELECT (Belirtilen Kritere Uygun Kayıtları Getirir.)

*/
— INSERT
— INSERT into <TabloAdi>(<KolonAdi1>,<KolonAdi2>,<KolonAdiN>)
values(<Deger1>,<deger2>,<degerN>)

 

INSERT into Products (ProductName,UnitPrice,UnitsInStock,Discontinued)
values (‘Kuru Fasülye’,5,1000,0)

 

— UPDATE <tabloAdi> SET <KolonAdi1>=<Deger1>,
—                       <KolonAdi2>=<Deger2>,
—                       <KolonAdi3>=<Deger3>
–WHERE <kriter>

 

UPDATE Products SET ProductName=’Taze Fasülye’
WHERE ProductID=78

 

— DELETE FROM <TabloAdi> WHERE <Kriter>
DELETE FROM Products WHERE ProductID=78

 

INSERT into Products (ProductName,UnitPrice,UnitsInStock,Discontinued)
values (‘Kuru Fasülye’,5,1000,0)

 

— SELECT <KolonAdi1>,<KolonAdi2> FROM <TabloAdi> WHERE <VARSA kriter>
— SELECT * FROM <TabloAdi> WHERE <VARSA kriter> (Tüm Kolonları Getirir..)

 

SELECT * FROM Employees


SELECT FirstName, LastName FROM Employees

— SELECT <TabloAdi>.<KolonAdi1>, FROM <TabloAdi>.<KolonAdi2> WHERE <VARSA kriter>
— Uzunca..


SELECT Products.ProductName, Products.UnitPrice FROM Products
WHERE UnitPrice>100
— 100 $ dan büyük ürünler..


— UnitsInStock (stok) değeri 10’un altında olan ürünlerin adı, fiyatı ve stok bilgileri
SELECT Products.ProductName, Products.UnitPrice, Products.UnitsInStock FROM Products
WHERE UnitsInStock<10

 


/*
1. Hangi tablo(lar) ile çalışacağına karar ver.
2. Bu tablo(lar) daki hangi kolon(lar)ı görmek istediğine karar ver
3. Eğer varsa kriterini yaz.
*/

 

— Brazil’de bulunan müşterilerin Şirket Adı, TemsilciAdi, Adres, Şehir, Ülke bilgileri

SELECT CompanyName, ContactName, Address, City, Country FROM Customers
where Country=’Brazil’

 


— Brezilya’da olmayan müşteriler

SELECT CompanyName,ContactName,Address,City,Country FROM Customers
where Country != ‘Brazil’

 

— Londra’da ya da Paris’de bulunan müşterilerim:
SELECT CustomerID,CompanyName,Address, City FROM Customers
WHERE City= ‘London’ OR City= ‘Paris’

 

— Hem Mexico D.F’da ikamet eden HEM DE ContactTitle bilgisi ‘owner’ olan müşteriler:
SELECT CustomerID,CompanyName,ContactTitle,City FROM Customers
WHERE City=’México D.F.’ AND ContactTitle=’owner’

 

— C ile başlayan ürünlerimin isimleri ve fiyatları

SELECT ProductName,UnitPrice FROM Products
WHERE ProductName LIKE ‘C%’

— Satışı yapılmayan ürün listesi
–(İpucu: Discontinued=1 olacak)
SELECT ProductName,UnitPrice FROM Products
WHERE Discontinued=1

 

— Adı (FirstName) ‘A’ harfiyle başlayan çalışanların (Employees); Ad, Soyad ve Doğum Tarihlerini görmek istiyorsak:
SELECT FirstName,LastName,BirthDate FROM Employees
WHERE FirstName LIKE ‘A%’

 

— İsminde ‘RESTAURANT’ geçen müşterilerimin şirket adları:
SELECT CompanyName FROM Customers
WHERE CompanyName LIKE ‘%RESTAURANT%’

 

— 50$ ile 100$ arasında bulunan tüm ürünlerin adları ve fiyatları
SELECT ProductName,UnitPrice FROM Products
WHERE UnitPrice BETWEEN 50 AND 100

 

— 1 temmuz 1996 ile 31 Aralık 1996 tarihleri arasındaki siparişlerin (Orders), SiparişID (OrderID) ve SiparişTarihi (OrderDate) bilgileri
SELECT OrderID,OrderDate FROM Orders
WHERE OrderDate BETWEEN ’01/07/1996′ AND ’31/12/1996′

 

— Ülkesi (Country) YA Spain, Ya France, Ya da Germany olan müşteriler
SELECT CompanyName,Country FROM Customers
WHERE Country=’Spain’ OR Country=’France’ OR Country=’Germany’

 

— Eğer OR çok fazla kullanmışsak, aşağıdaki gibi de yazabiliriz.
SELECT CompanyName,Country FROM Customers
WHERE Country IN (‘Spain’,’France’,’Germany’)

 

–Olumsuzu (NOT IN)
SELECT CompanyName,Country FROM Customers
WHERE Country NOT IN (‘Spain’,’France’,’Germany’)

 

–Faks numarasını bilmediğim müşteriler
SELECT CustomerID, CompanyName, Fax FROM Customers
where Fax is null

 

— ResultSet Sıralama:

Müşterilerimi ülkeye göre sıralıyorum:

SELECT CompanyName,Country FROM Customers
ORDER BY Country ASC
— asc: ascendence (küçükten büyüğe)
— desc: descendence (büyükten küçüğe)
–Ürünlerimi en pahalıdan en ucuza doğru sıralama, sonuç olarak ürün adı ve fiyatını istiyoruz:
SELECT ProductName,UnitPrice FROM Products
ORDER BY UnitPrice DESC


–Ürünlerimi en pahalıdan en ucuza doğru sıralasın, ama stoklarını küçükten-büyüğe doğru göstersin sonuç olarak ürün adı ve fiyatını istiyoruz:
SELECT ProductName,UnitPrice,UnitsInStock FROM Products
–WHERE ProductName LIKE ‘C%’ de yazabiliriz..
ORDER BY UnitPrice DESC, UnitsInStock ASC

 

— AGGREGATE FUNCTIONS (Değer döndüren fonksiyonlar. Tabloda kaç sütün var gibi..)

SELECT COUNT(*) FROM Customers
— 91 Tane Müşterim varmış..


SELECT CategoryID,CategoryName FROM Categories


SELECT ProductName,CategoryID FROM Products

— 1 Numaralı kategoride kaç ürün vardır..?
SELECT COUNT(*) FROM Products
WHERE CategoryID=1

 

–COUNT(<KolonAdi>) : Belirtilen kolonun, ResultSet içinde kaç adet geçtiğini verir.


— Kaç farklı ülkeye ihracat yapıyorum..?
SELECT COUNT(DISTINCT Country) FROM Customers


— DISTINCT – Tekrar edeniş verme.. 3 kez Almanya geçiyorsa 1 kez göster..


— Bu ülkeler hangileri..?
SELECT DISTINCT Country FROM Customers


— DISTINCT: ResultSet (Uyarı: ResultSet ram üzerindedir.) içinde tekrar eden verilerden YALNIZCA BİRİNİ alarak, bir nevi veriyi süzer.


–Veri Süzme: TOP x
SELECT TOP 3 CompanyName FROM Customers


— En Pahalı 5 ürün dersem
SELECT TOP 5 ProductName, UnitPrice FROM Products
ORDER BY UnitPrice Desc

 

–ALFKI CustomerID’sine sahip müşterimin sipariş sayısı..?
–(Orders)
SELECT COUNT(*) FROM Orders
WHERE CustomerID=’ALFKI’

 

— Sütun’a isim vermek için:
SELECT COUNT(*) AS ToplamSiparis FROM Orders
WHERE CustomerID=’ALFKI’

 

SUM(<KolonAdi>): Belirtilen Kolonun resultset içindeki toplamını verir. Yalnızca sayısal kolonlarda kullanılabilir.

 

–Ürünlerimin toplam maliyeti:
SELECT SUM(UnitPrice) ToplamFiyat FROM Products


–Şirketim, şimdiye kadar ne kadar ciro yapmış..?
–Kaynak: Order Details tablosu
–1-Discount (İskontoları düşeriz..
SELECT SUM(UnitPrice*Quantity*(1-Discount)) ToplamCiro FROM [Order Details]

 

–AVG(<KolonAdi>): ResultSet içinde belirtilen kolonun ortalamasını alır:
–Ortalama Ürün Fiyatım:
SELECT AVG(UnitPrice) Ortalama FROM Products

 

SELECT FirstName + ‘ ‘ + LastName as AdSoyad FROM Employees
— MAX ve MIN


SELECT MAX(UnitPrice) FROM Products


SELECT MIN(UnitPrice) FROM Products


— En Pahalı Ürünün Adı
SELECT ProductName FROM Products
WHERE UnitPrice= (SELECT MAX(UnitPrice) FROM Products)

 

–En az kazandıran sipariş (Kaynak: Order Details)
SELECT MIN(UnitPrice * Quantity) FROM [Order Details]


Üssünü Alma:
SELECT POWER (3,2)
SELECT SQRT(81)
SELECT LEN(‘DENEME’)


— Müşterilerimin içinde en uzun isimli müşteri (harf sayısı)
SELECT MAX(LEN(CompanyName)) FROM Customers
SELECT GETDATE()
SELECT YEAR (GETDATE())
SELECT DAY (GETDATE())
SELECT MONTH (GETDATE())

 

–Çalışanlarımın Ad, Soyad ve Yaşları
SELECT FirstName,LastName, YEAR(GETDATE())-YEAR(BirthDate) as Yas FROM Employees

 

SELECT photo FROM Employees

 

— GROUP BY (Gruplama)
— Hangi üründen toplam kaç adet alınmış..?
SELECT ProductID, SUM(Quantity ) FROM [Order Details]
GROUP BY ProductID


— Eğer bir sorguda Aggregate Function ve normal bir kolon kullanıyorsanız; o sorguda GROUP BY olmak zorundadır. GROUP BY ile bağlanacak kolon ise, Aggregate Funtion dışındaki tüm kolonlardır.
SELECT ProductID, SUM(Quantity ) as ToplamAdet FROM [Order Details]
GROUP BY ProductID
ORDER BY ToplamAdet DESC


— Hangi siparişte toplam ne kadar kazanmışım..?
— Kaynak tablo: Order Details
— İstenen kolonlar: OrderID ve Kazanç (adet*fiyat)
— SUM var: GROUP BY kullanmak zorundayım..
SELECT OrderID, SUM(Quantity * UnitPrice) FROM [Order Details]
GROUP BY OrderID


— Hangi Kategoride toplam kaç adet ürün bulunuyor..?
SELECT CategoryID, COUNT(ProductID) FROM Products
GROUP BY CategoryID


–MAX ve MIN tek değer döndürdüğü için GROUP BY kullanılmaz..!
SELECT CategoryID, COUNT(ProductID) as Adet FROM Products
GROUP BY CategoryID
ORDER BY Adet

 

— HAVING:
— 1000 Adetten fazla satılan ürünler:
SELECT ProductID,SUM(Quantity) As SatisAdeti FROM [Order Details]
GROUP BY ProductID
HAVING SUM(Quantity)>1000


— Bir resultset’e uygulayacağınız kriter eğer tabloda bir kolona bağlıysa; WHERE kullanırsınız. Ancak ram’de hesaplanmış bir değere kriter uygulayacaksanız HAVING Kullanılır..

 

— SUB-QUERY (Alt sorgular iç içe sorgular)

 

— Ortalamanın altında bir fiyata sahip ürünlerimin adı ve fiyatı:
— 1. Önce ortalamasını bulmak için bir sorgu:
SELECT AVG(UnitPrice) FROM Products


— 2. Bu sonucu kriter olarak kullanacak sorgu:
SELECT ProductName,UnitPrice FROM Products
WHERE UnitPrice < (SELECT AVG(UnitPrice) FROM Products)

 

 SELECT COUNT(*) FROM Customers
SELECT COUNT(DISTINCT CustomerID) FROM Orders

 

— Hangi Müşterilerim hiç sipariş vermemiş..? (91 Müşteriden 89’u sipariş vermişti..)
SELECT CompanyName,Address,City,Country FROM Customers
WHERE CustomerID NOT IN (SELECT DISTINCT CustomerID FROM Orders)

 


— Aşağıdaki örneğin amacı, sub-query’nin yalnızca WHERE kriterinden sonra kullanılacağı gibi bir yanılgıyı önlemektir:
SELECT c.CategoryName + ‘ (‘ + CAST((SELECT COUNT(ProductID) FROM Products
WHERE CategoryID=c.CategoryID) as NVARCHAR(5) ) +’)’ FROM Categories as c

 

— INNER JOIN
— Birbiriyle ilişkili tablolardan Sadece ürünü olan (EŞLEŞEN (PRIMARY KEY ile FOREIGN KEY karşılığı olan)) kayıtlardan resultset oluşturan sorgu tipi:

 

SELECT Products.ProductName, Categories.CategoryName FROM Products
INNER JOIN Categories
ON Products.CategoryID=Categories.CategoryID
— Hangi ürün hangi kategoride..

 

INSERT into Categories(CategoryName,Description)
values (‘Tatlılar’, ‘Sütlü Tatlılar’)
SELECT * FROM Categories

 

— Hangi tedarikçi (Suppliers.CompanyName), Hangi Ürünü (Products.ProductName) Sağlıyor..? 

SELECT sp.CompanyName,p.ProductName FROM Suppliers as sp
INNER JOIN Products as p
ON sp.SupplierID=p.SupplierID
— p.ProductName=Products.ProductName (Kısalttık..)

 

— Hangi sipariş (Orders.OrderID) hangi kargo şirketi ile (Shippers.CompanyName) ne zaman (Orders.OrderDate) gönderilmiş..?

 SELECT Orders.OrderID,Shippers.CompanyName,Orders.OrderDate FROM Shippers
INNER JOIN Orders
ON Shippers.ShipperID=Orders.ShipVia


— 25.11.2009. Çarşamba
— hangi siparişi hangi müşteri verir..?
SELECT Customers.CompanyName,Orders.OrderID,Orders.OrderDate FROM Customers
INNER JOIN Orders
— PRIMARY KEY             — FOREIGN KEY
ON Customers.CustomerID = Orders.CustomerID

 

— Hangi çalışan, TOPLAM kaç sipariş almış..?
— Employees, Orders
SELECT FirstName,LastName, COUNT(OrderID)  FROM Orders
INNER JOIN Employees
ON Orders.EmployeeID=Employees.EmployeeID
GROUP BY FirstName,LastName
— COUNT Kullandığımız için GROUP BY Kullandık..

 

— En fazla siparişi kim almış..
SELECT FirstName,LastName, COUNT(OrderID) AS ToplamSiparisSayisi  FROM Orders
INNER JOIN Employees
ON Orders.EmployeeID=Employees.EmployeeID
GROUP BY FirstName,LastName
ORDER BY ToplamSiparisSayisi DESC

 

–BIRDEN FAZLA TABLO ILISKILERI
— Hangi siparişi
— Hangi çalışan,
— Hangi müşteri vermiştir..?
SELECT Orders.OrderID,Employees.FirstName,Employees.LastName,Customers.CompanyName FROM Employees
INNER JOIN Orders
ON Employees.EmployeeID=Orders.EmployeeID
INNER JOIN Customers
ON Customers.CustomerID=Orders.CustomerID

 


— Hangi ürün
— hangi kategoride bulunmaktadır..?
— Bu ürünü kim tedarik etmektedir..?
SELECT Products.ProductName,Categories.CategoryName,Suppliers.CompanyName FROM Products
INNER JOIN Suppliers
ON Products.SupplierID=Suppliers.SupplierID
INNER JOIN Categories
ON Products.CategoryID=Categories.CategoryID

 

— Hangi siparişi
— hangi müşteri vermiş,
— hangi çalışan almış,
— hangi tarihte,
— hangi kargo şirketi tarafından gönderilmiş
— hangi üründen kaç adet alınmış,
— hangi fiyattan alınmış
— ürün hangi kategorideymiş
— bu ürünü hangi tedarikçi sağlamış

SELECT
Orders.OrderID,
Customers.companyName,
Employees.FirstName+ ‘ ‘ + Employees.LastName as Calisan,
Orders.OrderDate,
Shippers.CompanyName as Kargo,
Products.ProductName,
[Order Details].Quantity,
[Order Details].UnitPrice * (1-[Order Details].Discount) as indirimliFiyat,
Categories.CategoryName,
Suppliers.CompanyName as Tedarikci

 FROM Employees
INNER JOIN Orders
ON Orders.EmployeeID=Employees.EmployeeID
INNER JOIN Customers
ON Customers.CustomerID=Orders.CustomerID
INNER JOIN Shippers
ON Shippers.ShipperID=Orders.ShipVia
INNER JOIN [Order Details]
ON Orders.OrderID=[Order Details].OrderID
INNER JOIN Products
ON Products.ProductID=[Order Details].ProductID
INNER JOIN Categories
ON Categories.CategoryID=Products.CategoryID
INNER JOIN Suppliers
ON Suppliers.SupplierID=Products.SupplierID

 

— OUTER JOIN


SELECT * FROM Categories
INSERT into Categories(CategoryName,Description) values
(‘Tatlılar’, ‘Hede Hödö’)

 

— Altında ürün bulunmayan kategoriler
SELECT Categories.CategoryName,Products.ProductName FROM Products
RIGHT JOIN Categories
ON Products.CategoryID=Categories.CategoryID
WHERE ProductName is null

 

— 91 müşterim var. Sadece 89’u sipariş vermiş. Sipariş vermeyen 2 kişiyi bulun:

SELECT CompanyName,Address,OrderID FROM Customers
LEFT JOIN Orders
ON Customers.CustomerID=Orders.CustomerID
WHERE OrderID is null


— LEFT veya RIGHT kelimesi tamamını getirmek istediğiniz tablonun Join kelimesinin neresine yazıldığı ile ilgilidir.
— JOIN kelimesinin solundaki tablonun tüm kayıtlarını getirmek için LEFT,
— Sağındakini getirmek için ise RIGHT kelimesini kullanırım.

 


— Daha önce aşağıdaki şekilde bulmuştuk..
— Hangi Müşterilerim hiç sipariş vermemiş..? (91 Müşteriden 89’u sipariş vermişti..)
— SELECT CompanyName,Address,City,Country FROM Customers
— WHERE CustomerID NOT IN (SELECT DISTINCT CustomerID FROM Orders)

 

— HANGİ ÇALIŞAN ŞİMDİYE KADAR TOPLAM KAÇ SİPARİŞ ALMIŞ..?
— iki farklı (bağımsız) sorgu var..

SET STATISTICS TIME ON

SELECT EmployeeID,FirstName,LastName,
(SELECT COUNT(orderID) FROM Orders WHERE EmployeeID= x.EmployeeID)
FROM Employees as x


— UNION (2 farklı resultset’i birleştirir.)
— iki ya da daha fazla tabloyu birleştirir..
— Kural: iki resultset içindeki kolonlar aynı sayıda ve sırasıyla aynı tipte olmalıdır. (int-string alt alta olmaz..)

SELECT CompanyName,Address,City,Country, ‘ Müşteri’ FROM Customers
UNION
SELECT CompanyName,Address,City,Country, ‘ Tedarikçi’ FROM Suppliers
ORDER BY Country

— 01.12.2009.SALI

SET STATISTICS TIME ON
SELECT Products.ProductName, Products.UnitPrice, Categories.CategoryName,Categories.Description FROM Products
CROSS JOIN Categories


— CROSS JOIN Tüm ilişkili-ilişkisiz (LEFT JOIN, RIGHT JOIN, INNER JOIN, OUTER JOIN)Tabloları Görmemizi sağlar. Sadece süre olarak ne kadar sürede sorgu çekildiğini hesaplamamıza yardımcı olur.

 

CHECK ve DEFAULT Constraintler
use Normalizasyon

ALTER TABLE Urunler
ADD CONSTRAINT DF_AktifMi
DEFAULT 1 for AktifMi
— Products için yapsaydık DF_Discontinued – for Discontinued olacaktı…

 

— CHECK
ALTER TABLE Urunler
ADD CONSTRAINT CK_Fiyat
CHECK (Fiyati > -1)
— Artık ürünler tablosuna eksi bir değer giremeyeceğiz..

 

— INDEX —

 

use Northwind
GO
SELECT ProductName,UnitPrice FROM Products
WHERE ProductID = 1

 

SELECT * FROM Customers
WHERE Country=’Germany’
— Almanya’da bulunan müşterim
— Hangi kolonu indexlemem lazım.. Burada Ülke’yi index’lersek “Germany” ‘yi sadece ülkelerde arayacak..

 

CREATE Nonclustered INDEX ix_Ulke
ON Customers(Country)

 

— Sorgular, boşluklardan sonra yavaşlar. 3-6 aylık bakımlarda index temizlemek gerekebilir…
— DBCC INDEXDEFRAG
— DROP INDEX deyip yeni INDEX Olusturmak

 

SELECT * FROM Northwind.dbo.Products

 

— FQN: FULLY QUALIFIED NAME: UZUN KÜNYE (Sunucudan Kolon Adına Kadar Tüm Nesneleri Nokta İle Birleştiren Object Adı):
–Örnek: <sunucuAdi>.<veritabaniAdi>.<semaAdi>.<tabloAdi>.<kolonAdi>

 

— FQN Master ile Sunucuma bağlı (ya da tanımlı) diğer sunucularıma sorgu çekebilmemi sağlar..
— Sunucu adı yerine IP Numarası da yazabiliriz…

 

CREATE VIEW UrunlereGoreTedarikciler
AS
SELECT ProductName,companyName,Address,City,Country FROM Products
INNER JOIN Suppliers
ON
Products.SupplierID=Suppliers.SupplierID
— View yaratmadan önce sorgunun çalışıp-çalışmadığı mutlaka kontrol edilmelidir..

 

SELECT * FROM UrunlereGoreTedarikciler
— Sonuçta tablo olduğuna göre WHERE kriteri de kullanabiliriz..
WHERE CompanyName LIKE ‘E%’
order by Country

 

SELECT * FROM tumSiparisDetaylari
WHERE OrderID=10248
ORDER BY ProductName

 


— Hangi durumlarda view içine INSERT Yapılamaz:
— 1. Eğer, View, INNER JOIN içeriyorsa (Arkada bisürü tablo var, hangisini yapacağını bilemiyor)
— 2. View sonucunda oluşacak resultset’deki tüm kolonlar boş geçileez ise
— 3. CHECK OPTION seçeneği ile view oluşmuşsa

 

CREATE VIEW AlmanMusteriler
AS
SELECT CustomerID,CompanyName,Address,City,Country FROM Customers
WHERE Country=’Germany’
— INNER JOIN içermiyor, boş geçilemez (not null) alan da var o zaman view a uyuyor. (ilk iki koşulu sağladı)
WITH CHECK OPTION
— Insert sırasında gelen kaydı kontrol et, eğer uyuyorsa kabul et..

 

SELECT * FROM AlmanMusteriler

 

INSERT into AlmanMusteriler(CustomerID,CompanyName,Address, City,Country)
values
(‘ACTHU’,’ACHTUNG Co.’,’Hede’,’Berlin’,’Germany’)
— Burada Türkiye yazmış olsaydık insert into yapamazdık. Çünkü where kriteri Germany olarak aldık. Eğer where kriteri koymamış olsaydık bu sefer de CHECK OPTION a gerek kalmazdı..

 


— WITH CHECK OPTION: Bir view nesnesine, INSERT ya da UPDATE sorgusu çalıştığında, yeni gelen datanın view kurallarına uymasını istiyorsak; CHECK OPTION seçeneğini kullanabiliriz.

 

–Şifrelemek istiyorsak; with encryption kullanırız.. Şifreledikten sonra biz bile göremiyoruz..
CREATE VIEW UrunBilgisi
with Encryption
AS
SELECT ProductName,UnitPrice FROM Products

 

— INJECTION
SELECT * FROM Users WHERE KullaniciAdi=” AND Sifre=”
— Normalde Şifre mantığı yukarıdaki gibidir.. o halde aşağıdaki şifreyi kırar..
SELECT * FROM Employees WHERE FirstName=” OR ‘A’=’A’ AND LastName=” OR ‘A’=’A’

‘ or ‘A’=’A

 

— SCHEMABINDING

 

— SCRIPT ve BATCH
— Değişkenler

 

 DECLARE @Sayi int
— Değişkenin değerini ben veriyorsam:
SET @Sayi=5
Print(@Sayi)

 

DECLARE @CalisaninAdi nvarchar(20)
— Değişkenin değerini bir sorgu aracılığı ile gelecekse:
SELECT @CalisaninAdi=FirstName FROM Employees
WHERE EmployeeID=1
Print(@CalisaninAdi)

 

DECLARE @x int
SET @x=8
Print(‘Sayı = ‘+
CAST(@x as nchar(2))
)
— x’i al 2 karakterli nchar’a çevir..

 

DECLARE @x int
SET @x=8
Print(‘Sayı = ‘+
CONVERT(nchar(2),@x)
)
— x’i al 2 karakterli nchar’a çevir.. (Yukarıdaki ile tamamen aynı)

 

— Bir sipariş girdiğim anda, oluşan SON ORDERID bilgisini nasıl elde ederim..?
SELECT TOP 1 OrderID FROM Orders
ORDER BY OrderID DESC

 

— Bunu Değişken atmak istersem;
DECLARE @ID int
SELECT TOP 1 @ID=OrderID FROM Orders
ORDER BY OrderID DESC
Print(@ID)

 

INSERT into Orders(CustomerID,EmployeeID,OrderDate,ShipVia)
values (‘ALFKI’,’1′,GETDATE(),1)
SELECT @@IDENTITY
— Global Değişken @@
— Herhangi bir user, global sql değişkeni TANIMLAYAMAZ

 

INSERT into Orders(CustomerID,EmployeeID,OrderDate,ShipVia)
values (‘ALFKI’,’1′,GETDATE(),1)
SELECT @@IDENTITY
select SCOPE_IDENTITY()

 

— WHEN / CASE:

SELECT CompanyName,Region =
CASE
WHEN Region=’BC’ THEN ‘Washington’
WHEN Region=’SP’ THEN ‘Pensilvanya’
WHEN Region=’OR’ THEN ‘Orlando’
END

FROM Customers
WHERE Region is not null

 

SELECT ProductName,Discontinued=
CASE
WHEN Discontinued=’0′ THEN ‘Satış Durduruldu’
WHEN Discontinued=’1′ THEN ‘Satış Devam Ediyor’
END

FROM Products

 

—    TRY – CATCH    —
BEGIN TRY
SELECT 1/0
END TRY
BEGIN CATCH
SELECT ERROR_Message()
END CATCH

 

— STORED PROCEDURE (SAKLI YORDAM) —

CREATE PROC KategoriGetir
AS
SELECT * FROM Categories
KategoriGetir

 


CREATE PROC IDyeGoreUrun
@id int
AS
SELECT ProductName,UnitPrice,UnitsInStock FROM Products
WHERE
ProductID=@id


IDyeGoreUrun 77
— ID si 77 olan ürünün bilgisini getiriyor..

 

— Normalde Ürün eklerken şu şekilde işlem yaparız..
INSERT INTO Categories (CategoryName,Description)
values (@KategoriAdi,@Aciklama)


— Stored Procedure Yapalım..

CREATE PROC KategoriEkle
@KategoriAdi nvarchar(15),
@Aciklama ntext
AS
INSERT INTO Categories (CategoryName,Description)
values (@KategoriAdi,@Aciklama)
KategoriEkle ‘Unlu Mamüller’, ‘Türk Usulü Unlu Börek Çörek’

— ÖDÜLLÜ ÖDEV: Yapan Herkese Çikolata…
— ID’si verilen müşterinin toplam ne kadarlık alışveriş yaptığını (fiyat olarak) bulan procedure

 


SELECT SUM([Order Details].UnitPrice*Quantity*(1-Discount))
FROM [Order Details]
INNER JOIN Orders
ON Orders.OrderID=[Order Details].OrderID
INNER JOIN Customers
ON Customers.CustomerID=Orders.CustomerID
WHERE Customers.CustomerID=’ALFKI’

 

— Önce burası çalışıyor mu kontrol edelim ve
—  Şimdi Procedure ı oluşturalım

 


CREATE PROC MusterininAlisVerisi
@ID char(5)
AS
SELECT SUM([Order Details].UnitPrice*Quantity*(1-Discount))
FROM [Order Details]
INNER JOIN Orders
ON Orders.OrderID=[Order Details].OrderID
INNER JOIN Customers
ON Customers.CustomerID=Orders.CustomerID
WHERE Customers.CustomerID=’ALFKI’

MusterininAlisVerisi ‘OCEAN’

 

SELECT CustomerID from Customers


— Çeşitlendirmek mümkün…
CREATE PROC MusterininAlisVerisi2
@ID char(5)
AS
SELECT SUM([Order Details].UnitPrice*Quantity*(1-Discount)) AS Toplam
FROM [Order Details]
INNER JOIN Orders
ON Orders.OrderID=[Order Details].OrderID
INNER JOIN Customers
ON Customers.CustomerID=Orders.CustomerID
WHERE
Customers.CustomerID=@ID
GROUP BY Customers.CustomerID,CompanyName
ORDER BY Toplam DESC

MusterininAlisVerisi2 ‘QUICK’


SELECT CustomerID from Customers

— iki tarih aralığında bulunan siparişler:

SELECT OrderID,OrderDate,ShipAddress FROM Orders
WHERE OrderDate BETWEEN ’31/12/1996′ AND ’15/07/1997′


— Şimdi procedure oluşturalım..

CREATE PROC TariheGoreSiparis
@Tarih1 smalldatetime,
@Tarih2 smalldatetime
AS
SELECT OrderID,OrderDate,ShipAddress FROM Orders
WHERE OrderDate BETWEEN @Tarih1 AND @Tarih2

TariheGoreSiparis ’01/01/1997′, ’06/06/1997′

 

— Yıla Göre Ciro
CREATE PROC YilaGoreCiro
@Yil int
AS
SELECT SUM(Quantity * UnitPrice * (1-Discount)) FROM [Order Details]
INNER JOIN Orders
ON Orders.OrderID=[Order Details].OrderID
WHERE YEAR (Orders.OrderDate)=@Yil

YilaGoreCiro 1997

 

— ID si verilen müşteri, en son hangi ürünü almış..?
— ID si verilen çalışan, en çok kime ürün satmış..?
— ID  si verilen müşteriyle ne kadar süredir çalışıyoruz..?
— ID si verilen kategorinin içinde en çok satan 5 ürün..?
— ID si verilen tedarikçi bana hangi ürünleri sağlıyor..?


CREATE PROC HangiUrun
@ID char(5)
AS
SELECT TOP 1 Customers.CompanyName,Products.ProductName,[Order Details].Quantity,Orders.OrderDate FROM Customers
INNER JOIN Orders
ON Customers.CustomerID=Orders.CustomerID
INNER JOIN [Order Details]
ON Orders.OrderID=[Order Details].OrderID
JOIN Products
ON [Order Details].ProductID=Products.ProductID
WHERE
Customers.CustomerID=@ID
ORDER BY Orders.OrderDate DESC

 

HangiUrun ‘QUICK’
— Tabloda ilişkili olanlara baktık..

 

— Flash Disk Alanlar..

SELECT FROM


— 1. Sadece o ürünün bulunduğu siparişler:
CREATE PROC BunuAlanBunudaAldi
@productID int
AS
SELECT TOP 5 ProductName, SUM(Quantity) as toplam FROM Products
INNER JOIN [Order Details]
ON Products.ProductID=[Order Details].ProductID
WHERE
[Order Details].OrderID
IN
(
SELECT OrderID FROM [Order Details]
WHERE
ProductID=@productID
)
AND [Order Details].ProductID
!=@productID
GROUP BY ProductName
ORDER BY toplam DESC

BunuAlanBunudaAldi 9

 


—– FONKSİYONLAR —–

— ÜRÜNLER TABLOSUNDAKİ TÜM FİYATLARIN KDV’SİNİ HESAPLASIN
— PROCEDURE
— HERHANGİ BİR DEĞERİN KDV’SİNİ HESAPLASIN dersek, FONKSİYON OLUR.. Herhangi bir tabloya bağlı kalmadan..

 

CREATE FUNCTION KDVHesaplayici
(
@Para money
)
RETURNS money
AS
BEGIN
DECLARE @Deger money
SET @Deger= @Para * 1.18
RETURN @Deger
END

SELECT ProductName,UnitPrice, dbo.KDVHesaplayici(UnitPrice) AS KDVDahil


— Fonksiyon, her zaman şemaya bağlı çalışır
FROM Products

 

— Parametre olarak girilen int bir sayının karesini alalım..

CREATE FUNCTION KaresiniAl
(
@Sayi int
)
RETURNS int
AS
BEGIN
DECLARE @Sonuc int
SET @Sonuc= @Sayi * @Sayi
RETURN @Sonuc
END

SELECT  dbo.KaresiniAl(9)

 

— VEYA

 

CREATE FUNCTION KaresiniAlalim
(
@x int
)
RETURNS int
AS
BEGIN

  RETURN @x*@x
END

SELECT  dbo.KaresiniAlalim(9)

 


— A.AKYILDIRIM
SELECT UPPER(‘türkay’)
SELECT LOWER (‘ABDULLAH’)
SELECT LEN(‘Dilara’)
SELECT SUBSTRING(‘BilgeAdam’,1,5)

 

CREATE FUNCTION ParafOlusturucu
(
@Ad nvarchar(50),
@Soyad nvarchar(50)
)
RETURNS nvarchar(100)
AS
BEGIN
DECLARE @donenDeger nvarchar(100)
SELECT @donenDeger = UPPER(SUBSTRING(@Ad,1,1))+’.’+
UPPER(SUBSTRING(@Soyad,1,1)) +
LOWER(SUBSTRING(@Soyad,2,LEN(@Soyad)))
RETURN @donenDeger
END

SELECT dbo.ParafOlusturucu(‘Ali’,’Akyıldırım’)

 

SELECT TitleOfCourtesy + ‘ ‘ + dbo.ParafOlusturucu(FirstName,LastName)
FROM Employees

 

— İKİ TÜRLÜ FUNCTION VARDIR; IN-LINE FUNCTION ve MULTI-LINE FUNCTION.
ADINDAN ANLASILDIGI GIBI, IN-LINE FUNCTION ICINDE YALNIZCA TEK SATIR VARDIR. BU DURUMDA BEGIN/END YAPISINI KULLANMAK ZORUNDA DEĞİLSİNİZ. ANCAK MULTI-LINE (COK SATIRLI) BİR FUNCTION BEGIN İLE BASLAYIP END ILE BITMEK ZORUNDADIR.

 

CREATE FUNCTION ResultSetOlustur
()
RETURNS TABLE
AS
RETURN SELECT CompanyName, Country FROM Customers

SELECT * FROM dbo.ResultSetOlustur()

 

— TRANSACTION

 

BEGIN TRY
END TRY
BEGIN CATCH
END CATCH
— KALIP BU..

 

BEGIN TRY
Begin Tran
— Insert, Update ya da Delete sorgusu transaction içinde kullanılabilir
commit tran
END TRY
BEGIN CATCH
END CATCH


— Adım Adım Nasıl yazıldığına bakalım..

 

BEGIN TRY
Begin Tran T1
— Insert, Update ya da Delete sorgusu transaction içinde kullanılabilir
Begin Tran T2
— Bir sorgu daha (Önce T1 çalışır sonra T2)
commit tran
commit tran
END TRY
BEGIN CATCH
— Hata oluşursa, tüm transaction’ı geri al:
ROLLBACK TRAN T1
END CATCH

 


BEGIN TRY
BEGIN TRAN KategoriEkle
insert into Categories(CategoryName,Description)
values (‘Ayakkabı’,’Kışlık/Yazlık Bay/Bayan’)
Begin Tran UrunSil
DELETE FROM Products WHERE ProductID=1
commit tran
commit Tran
END TRY
BEGIN CATCH
ROLLBACK TRAN KategoriEkle
END CATCH

 


— Veri güvenliği açısından, eğer execute edilecek sorgulama mantığı birbiriyle ardışık olması gerekiyorsa:
— (Örnek: Önce Sipariş Ekle, Sonra sipariş detaylarına gidip adet ekle sonra ürünler tablosundan stok düş)
— Mutlaka transaction bloğu kullanın!

–* DIPNOT: Transaction bloğunu kullanmak için en elverişli ortam stored procedure’lerdir.

— TRIGGER (INSERT, UPDATE, DELETE Sorgusundan Sonra Tetikler)—

— SİPARİŞ ALINDIĞINDA ÜRÜNDEN STOK DÜŞEN TRİGGER’I YAZALIM..

 

CREATE TRIGGER tr_OtomatikStok
ON [Order Details]
for INSERT
— INSERT SORGUSUYLA ÇALIŞ , INSERT SORGUSUYLA BİRLİKTE TETİKLEN
AS
— Amaç: Order Details Tablosuna kayıt girildiğinde, ilgili ürünün stok bilgisini Products Tablosundan bulup, adet kadar azaltsın.
DECLARE @UrunID int
— Bir değişken tanımladık
DECLARE @Adet int
— Adet kadar azaltacağı için Adet adlı bir değişkenimiz olmalı..
— Her Tabloya bağlı iki adet geçici tablo vardır. Bu tablolara Trigger dışından ulaşılamaz. inserted ve deleted ismindedirler.
— INSERTED; INSERT Sorgusundan sonra oluşacak satır, önce INSERTED geçici tablosunda bekletilir.
— DELETED; Silinmeye çalışılan satır, silinmeden önce DELETED geçici tablosunda bekletilir.


SELECT @UrunID=ProductID, @Adet=Quantity
FROM INSERTED
UPDATE Products SET
UnitsInStock=UnitsInStock-@Adet
WHERE
ProductID=@UrunID


— Trigger ı oluşturduktan sonra aşağıdaki sorguları yaptığımda otomatik olarak güncellenecektir.


INSERT into [Order Details](OrderID, ProductID, Quantity)
values (10323, 1, 2)


SELECT ProductName,UnitsInStock FROM Products
WHERE ProductID=1                         

— ihtiyaç: Products tablosundan ürün silinmeye çalışıldığında bu ürünün Discontinued kolonunu 1 yapsın (Yani Silmesin, Update etsin):

 

CREATE TRIGGER tr_SatisiDurdur
ON Products
INSTEAD OF delete
— Delete ‘in çalışmasına izin vermeden trigger çalışsın
AS
— INSTEAD OF ‘ların tamamı BEGIN – END içinde yazılır…
— Silmeye çalıştığım ürünün Discontinued ‘ını 1 yapacağım:
BEGIN
DECLARE @UrunID int
SELECT @UrunID=ProductID FROM deleted
UPDATE Products SET Discontinued=1
WHERE
ProductID=@UrunID
END

 

SELECT * FROM Products WHERE ProductID=1
DELETE FROM Products WHERE ProductID=1


— INSTEAD OF TRIGGER ‘lar tetikleyici sorgunun YERİNE çalışırlar. Ayırdedici tek özellikleri ise BEGIN END satırları arasına yazılıyor olmasıdır..

 

— ÖRNEK VERİTABANI – TRIGGER İÇİN —


CREATE TABLE Ogrenciler
(
OgrenciNo int,
Ad nvarchar(50),
Soyad nvarchar(50),
DersNotu tinyint
)
GO
— GO: BİR SONRAKİ ADIMA GİT DEMEKTİR
–CREATE TABLE Gecenler
–(
–OgrenciNo int,
–Ad nvarchar(50),
–Soyad nvarchar(50),
–DersNotu tinyint
–)
–GO
–CREATE TABLE Kalanlar
–(
–OgrenciNo int,
–Ad nvarchar(50),
–Soyad nvarchar(50),
–DersNotu tinyint
–)


—- Ders Notu 50 den küçükse kalanlara kaydet, 50 den büyükse Geçenlere kaydet.. Kendisi karar versin..

 

–CREATE TRIGGER tr_KararVer
–ON Ogrenciler
–FOR INSERT
–AS
–DECLARE @No int
–DECLARE @Ad nvarchar(50)
–DECLARE @Soyad nvarchar(50)
–DECLARE @DersNotu tinyint
–SELECT @No=OgrenciNo, @Ad=Ad, @Soyad=Soyad, @DersNotu=DersNotu
–FROM INSERTED
—- INSERTED Geçici tablusunda sadece 1 satır var..
–IF @DersNotu <50
—   INSERT into Kalanlar values (@No,@Ad,@Soyad,@DersNotu)
–ELSE
—   INSERT into Gecenler values (@No,@Ad,@Soyad,@DersNotu)

–INSERT into Ogrenciler values (1, ‘Mustafa’, ‘Mutlu’, 80)

–SELECT * FROM Ogrenciler
–SELECT * FROM Gecenler

 

–INSERT into Ogrenciler values (1, ‘Türkay’, ‘Ürkmez’, 40)
–SELECT * FROM Ogrenciler
–SELECT * FROM Kalanlar

 


— GÜVENLİK ve PERFORMANS..
— DBCC KOMUTLARI
DBCC ShowContig (‘Customers’)

 

— Veritabanında kullanılan tabloların performans detaylarını getiren güzel bir komuttur..

 

— 08.12.2009.Salı —

— Yedek Alma Kodu
— ALTER DATABASE Northwind
— SET RECOVERY FULL

 

 — Yedek aldığım yer çoğu zaman aynı ise, bu yeri SQL’e kaydedebilirim. Şart değildir. Kullanım kolaylığıdır.


— system procedure (sp)


— SQL Kendi kendine yedek alırken klasör oluşturamaz. Bu nedenle C’de Yedek isimli bir klasör oluştur ve ardından backup işlemini yap..

 

sp_addumpdevice ‘DISK’, MyDevice , ‘C:\Yedek\NWFull.bak’

 

SELECT * FROM sys.backup_devices

 

BACKUP DATABASE Northwind TO MyDevice

 

— Device’sız yedek alma ise;
BACKUP DATABASE Northwind TO DISK = ‘C:\Yedek\NWManuel.bak’

 

— Back up ı periyodik olarak almak gerekir. Peki, pzt aldığım yedeği salı günü tekrar almak yerine aradaki farkı backup almak istersem, Differencial Backup kullanmam gerekir.

 

INSERT into Northwind.dbo.Products (ProductName,UnitPrice)
values (‘Dondurma’,5)

 

BACKUP DATABASE Northwind TO DISK = ‘C:\Yedek\NWFark.bak’
WITH DIFFERENTIAL

 

— Transaction Log neden temizlenmeli..? INSERT, UPDATE, DELETE sorgularının
çalışmaları durumunda, hangi sorgunun ne zaman çalıştığı ve nasıl işlem
yaptığı .ldf uzantılı db dosyasında tutulur. Biz bu sorguları
her çalıştırdığımızda log dosyasına işlenecektir. Bir süre sonra
log dosyaları aşırı şişme göstereceğinden, bu tarz sorguların çalışma
hızı düşecektir. Bu hızı tekrar yükseltmek için tek yapmak gereken LOG BACKUP almaktır.

 

— LOG Dosyasını Backup Yapalım..
UPDATE Northwind.dbo.Products SET UnitPrice=10
WHERE ProductID=81

 

BACKUP LOG Northwind TO DISK = ‘C:\Yedek\LogDosyasi.bak’

 

— Her GÜZEL ŞEYİN BİR SONU VARDIR: 😉
DROP DATABASE Northwind

 

— ama bazı şeyler geri alınabilir:

 

RESTORE DATABASE Northwind FROM DISK= ‘C:\Yedek\NWFull.bak’ WITH NORECOVERY


RESTORE DATABASE Northwind FROM DISK= ‘C:\Yedek\NWFark.bak’ WITH NORECOVERY


RESTORE LOG Northwind FROM DISK= ‘C:\Yedek\LogDosyasi.bak’ WITH RECOVERY

 

— WITH NORECOVERY ve WITH RECOVERY Farkı;
— Yedeklemenin belirli bir sırası var. Hepsini birden çalıştıracağız ancak Full ve Differential olanları beklet en son LOG la beraber RECOVERY yap..

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir