Nortwind Veri Tabanı

SQL e başlayan arkadaşlar muhtemelen ilk kez Northwind veritabanıyla karşılaşırlar.

Nortwind Veri Tabanı

SQL Management Studio'ya Northwind Veritabanını Ekleme

Northwind Veritabanını SQL Management Studio finaline yükleyin ve ekleyin

Bu yazıda , SQL Management Studio'muzda NorthWind Veritabanını nasıl indirip kurabiliriz göstereceğim .

Northwind Veritabanını SQL Management Studio adımlarında kurun ve ekleyin:

 
 
 
 
 
 
 
Aşama 1 :

Bu bağlantıyı kullanarak Northwind veritabanı MDF dosyasını indirin .

Resmi mircosoft web sitesinden de edinebilirsiniz .

Doğrudan komut dosyası veya BAK dosyasını istiyorsanız,

  1. Northwind veritabanı komut dosyasını indirin.
  2. Northwind veritabanı BAK dosyası

 

 

 

 

 

 

 

 

 

 

Adım 2 : 

 

SQL Management Studio'nuzu açın ve bağlı sunucunun menüsünden Add Database seçeneğini seçin.

Northwind Veritabanını SQL Management Studio sql attach'a Kurun ve Ekleyin

Ekleme Seçeneği Açılır. Pencerede , NorthWind veritabanı dosyalarınızın .mdf dosyasını klasörlerden seçin (Northwind veritabanı için MDF dosyasını indirdiğiniz konumu seçin):

C: SQL Server 2000 Örnek Veritabanları

Northwind Veritabanını SQL Management Studio sql select'e Kurun ve Ekleyin

Ve Tamam'ı tıklayın.

Seçili SQL Management Studio sql'de Northwind Veritabanını Kurun ve Ekleyin

NorthWind Veritabanı, SQL Sunucunuza eklenecek ve geri yüklenecektir. SQL Management Studio Server düğümünüzdeki Veritabanları düğümünü genişletin:

Northwind Veritabanını SQL Management Studio finaline yükleyin ve ekleyin

 

Northwind'e Göre Örnek SQL Sorguları

-- * yerine kolon adı konulursa NULL olmayanları hesaplar
SELECT COUNT(*) FROM Employees
 
--Ürünleri listele
SELECT * FROM Products
 
--Ürünleri ad sırasına göre (A-Z) listele
SELECT * FROM Products ORDER BY ProductName
 
--Ürünleri ad sırasına göre tersten listele (Z-A)
SELECT * FROM Products ORDER BY ProductName DESC
 
--CategoryID si 3 olan ürünleri listele
SELECT * FROM Products WHERE CategoryID = 3
 
--CategoryID si 3 olan ürünleri ada göre listele (A-Z)
SELECT * FROM Products WHERE CategoryID = 3 ORDER BY ProductName
 
--Fiyatı 30 dan büyük kaç ürün var? ( COUNT(*) )
SELECT COUNT(*) Adet FROM Products WHERE UnitPrice > 30
 
--Ürünlerin adını tamamen küçültüp fiyat sırasına göre tersten listele
SELECT LOWER(ProductName), UnitPrice FROM Products ORDER BY UnitPrice DESC
 
 
--İsmi ‘a’ harfi ile başlayan ürünlerin sadece adını ekrana yaz
SELECT ProductName FROM Products WHERE ProductName LIKE 'a%'
 
--İsmi a harfi ile başlayan VE fiyatı 20 den büyük eşit ürünleri isme göre listele
SELECT * FROM Products WHERE ProductName LIKE 'a%' AND UnitPrice >= 20 ORDER BY ProductName
 
--Çalışanların ad ve soyadlarını yanyana gelecek şekilde yazdır  ( Employee)
SELECT FirstName + ' ' + LastName FULLName FROM Employees

SELECT * FROM (SELECT FirstName + ' ' + LastName AS FULLName FROM Employees) AS YeniTablo WHERE FULLName LIKE '%n'
 
--Ürünün sadece KDV li fiyatını ekrana yazdır(tek kolon)
 SELECT UnitPrice * 0.18 FROM Products
 SELECT UnitPrice, (UnitPrice * 0.18) AS Kdv, UnitPrice * 1.18 AS Kdvli FROM Products
 
--Region alanı NULL olan kaç tedarikçim var? ( Supplier ) ( İnternetten bakılmalı )
SELECT COUNT(*) FROM Suppliers WHERE Region IS NULL

--Null olmayanlar
SELECT COUNT(*) FROM Suppliers WHERE Region IS NOT NULL
 
--Sağlaması
SELECT
        (SELECT COUNT(*) FROM Suppliers WHERE Region IS NULL) AS Bos,
        (SELECT COUNT(*) FROM Suppliers WHERE Region IS NOT NULL) AS Dolu,
        (SELECT COUNT(*) FROM Suppliers) AS Tamami
 
--İlk 5 tedarikçimi getir  
SELECT top 5 * FROM Suppliers
 
--İlk 5 tedarikçimi getir. Sadece ID ve CompanyName yazsın
SELECT top 5 SupplierID,CompanyName FROM Suppliers
 
 
--CompanyName e göre ilk 5 tedarikçimi getir ve ekrana sadece isimlerini yaz
SELECT top 5 CompanyName FROM Suppliers ORDER BY CompanyName
 
--en ucuz 5 ürünü getir
SELECT top 5 * FROM Products ORDER BY UnitPrice
 
--En ucuz 5 ürünün ortalama fiyatı nedir?
SELECT top 5 AVG(UnitPrice) FROM Products GROUP BY UnitPrice ORDER BY UnitPrice
 
 
--Ürün adlarının hepsinin soluna TR koy ve büyültüp olarak ekrana yazdır.
SELECT 'TR ' + UPPER(ProductName) FROM Products
 
--Ürünleri ada göre sırala
SELECT * FROM Products ORDER BY ProductName
 
--Ürünleri ada göre tersten sırala
SELECT * FROM Products ORDER BY ProductName DESC
 
--Ürün adı, fiyatı ve kdv ekrana yazdır
SELECT ProductName,UnitPrice, UnitPrice * 0.18 KDV FROM Products
 
--Fiyatı 20den küçük ürünlerin adının başına TR ekle
SELECT 'TR-' + ProductName [Ürün Ad] FROM Products WHERE UnitPrice < 20
 
--Ürünün adı içerisinde a harfi geçenler
SELECT * FROM Products WHERE ProductName LIKE '%a%'
 
--Ürün adı a ile başlayanlar
SELECT * FROM Products WHERE ProductName LIKE 'a%'
 
--Ürün adı a ile bitenler
SELECT * FROM Products WHERE ProductName LIKE '%a'
 
SELECT UPPER('çağatay')
 
--mevcut metni büyültür
SELECT UPPER(ProductName) [ürün adı] FROM Products
 
--mevcut metni küçültür
SELECT LOWER(ProductName) [ürün adı]  FROM Products
 
SELECT SUM(UnitPrice) FROM Products
 
SELECT AVG(UnitPrice) FROM Products

 

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’ --Country <> 'Brazil'


— Londra’da ya da Paris’de bulunan müşteriler
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ünlerin 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 Tarihleri listesi
SELECT FirstName,LastName,BirthDate FROM Employees WHERE FirstName LIKE ‘A%’

 
— Şirket isminde ‘RESTAURANT’ geçen müşterilerin şirket adları
SELECT * 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 '1996-07-01' AND '1996-12-31'

— Ü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ış..

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


— Kaç farklı ülkeye ihracat yapıyorum..?
SELECT DISTINCT Country FROM Customers
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

 

— 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

 
MAX ve MIN
SELECT MAX(UnitPrice) FROM Products
SELECT MIN(UnitPrice) FROM Products
SELECT MAX(UnitPrice) EnYuksek, MIN(UnitPrice) EnDusuk FROM Products

— En Pahalı Ürünün Adı
SELECT ProductName FROM Products WHERE UnitPrice=(SELECT MAX(UnitPrice) FROM Products)
SELECT TOP 1 * FROM Products ORDER BY UnitPrice DESC
 

–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


GROUP BY (Gruplama)
------------------------------------


— Hangi üründen toplam kaç adet alınmış..?
SELECT ProductID, SUM(Quantity) AdetToplami 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.

--ProductID ye göre adet toplamlarına göre ters sıralama
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=ORTHEN ‘Orlando’
END

FROM Customers
WHERE Region IS NOT NULL

 

SELECT ProductName,Discontinued=
CASE
WHEN Discontinued=0THEN ‘Satış Durduruldu’
WHEN Discontinued=1THEN ‘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 BETWEEN31/12/1996AND15/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
DELETEIN çalışmasına izin vermeden TRIGGER çalışsın
AS
— INSTEAD OF ‘ların tamamı BEGINEND 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:YedekNWFull.bak’

 

SELECT * FROM sys.backup_devices

 

BACKUP DATABASE Northwind TO MyDevice

 

— Device’sız yedek alma ise;
BACKUP DATABASE Northwind TO DISK = ‘C:YedekNWManuel.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:YedekNWFark.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:YedekLogDosyasi.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:YedekNWFull.bak’ WITH NORECOVERY


RESTORE DATABASE Northwind FROM DISK= ‘C:YedekNWFark.bak’ WITH NORECOVERY


RESTORE LOG Northwind FROM DISK= ‘C:YedekLogDosyasi.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..

 

 

1-)Tüm cirom ne kadar?

SELECT SUM((UnitPrice*Quantity)-(UnitPrice*Quantity*Discount))

ROM[ORDER Details]

2-)Bugün doğumgünü olan çalışanlarım kimler?

SELECT *

FROM employees

WHERE MONTH(BirthDate)=MONTH(getdate()) AND DAY(BirthDate)=DAY(getdate())

3-)Hangi çalışanım hangi çalışanıma bağlı? (İsim - İsim)

SELECT e.FirstName +e.LastName,em.FirstName +em.LastName

FROM Employees e

INNER JOIN Employees em

ON e.EmployeeID=em.EmployeeID

4-)Çalışanlarım ne kadarlık satış yapmışlar? (Gelir bazında)

SELECT e.FirstName + ' ' + e.LastName, SUM(Quantity*UnitPrice)

FROM Employees e

INNER JOIN Orders o

ON e.EmployeeID=o.EmployeeID

INNER JOIN [ORDER Details] od

ON o.OrderID=od.OrderID

GROUP BY e.FirstName,e.LastName

5-)Hangi ülkelere ihracat yapıyorum?

SELECT DISTINCT country

FROM customers

6-)Ürünlere göre satışım nasıl? (Ürün-Adet-Gelir)

SELECT p.ProductName,SUM(od.Quantity) AS Adet,SUM(od.Quantity*od.UnitPrice*(1-od.Discount)) AS Gelir

FROM Products p

INNER JOIN [ORDER Details] od

ON p.ProductID=od.ProductID

GROUP BY p.ProductName

ORDER BY 3 DESC

7-)Ürün kategorilerine göre satışlarım nasıl? (Gelir bazında)

SELECT c.CategoryName,SUM(od.Quantity*od.UnitPrice) AS Gelir

FROM Categories c

INNER JOIN Products p

ON c.CategoryID=p.CategoryID

INNER JOIN [ORDER Details] od

ON p.ProductID =od.ProductID

GROUP BY c.CategoryName

ORDER BY 2 DESC

8-)Ürün kategorilerine göre satışlarım nasıl? (Adet bazında)

SELECT c.CategoryName,SUM(od.Quantity) AS Adet

FROM Categories c

INNER JOIN Products p

ON c.CategoryID=p.CategoryID

INNER JOIN [ORDER Details] od

ON p.ProductID =od.ProductID

GROUP BY c.CategoryName

ORDER BY 2 DESC

9-)Çalışanlarım ürün bazında ne kadarlık satış yapmışlar? (Çalışan  –  Ürün – Adet – Gelir)

SELECT (e.FirstName + e.LastName) AS Çalisan, p.ProductName, SUM(od.Quantity), SUM(od.Quantity*od.UnitPrice)

FROM Products p

INNER JOIN [ORDER Details] od

ON p.ProductID=od.ProductID

INNER JOIN Orders o

ON od.OrderID=o.OrderID

INNER JOIN Employees e

ON o.EmployeeID=e.EmployeeID

GROUP BY e.FirstName + e.LastName,p.ProductName

ORDER BY 4 DESC

10-)Hangi kargo şirketine toplam ne kadar ödeme yapmışım?

SELECT s.CompanyName,SUM(o.Freight) AS [Ödenen Ücret]

FROM Shippers s

INNER JOIN Orders o

ON s.ShipperID=o.ShipVia

GROUP BY s.CompanyName

11-)Tost yapmayı seven çalışanım hangisi? (Basit bir LIKE sorgusu J)

SELECT FirstName + ' ' +LastName

FROM Employees

WHERE Notes LIKE'%Toast%'

12-)Hangi tedarkçiden aldığım ürünlerden ne kadar satmışım? (Satış bilgisi ORDER details tablosundan alınacak) (Gelir ve adet bazında)

SELECT s.CompanyName,p.ProductName, SUM(od.Quantity) AS adet,SUM(od.Quantity*od.UnitPrice) AS gelir

FROM Suppliers s

INNER JOIN Products p

ON s.SupplierID=p.SupplierID

INNER JOIN [ORDER Details] od

ON p.ProductID=od.ProductID

GROUP BY  s.CompanyName , p.ProductName

ORDER BY 3 DESC

13-)En değerli müşterim hangisi? (en fazla satış yaptığım müşteri) (Gelir ve adet bazında)

SELECT top 1 c.CompanyName,SUM(od.Quantity) AS adet,SUM(OD.Quantity*od.UnitPrice) AS gelir

FROM Customers c

INNER JOIN orders o

ON c.CustomerID=o.CustomerID

INNER JOIN [ORDER Details] od

ON o.OrderID=od.OrderID

GROUP BY c.CompanyName

ORDER BY 3 DESC

14-)Hangi ülkelere ne kadarlık satış yapmışım?

SELECT c.Country,SUM(od.Quantity*od.UnitPrice)

FROM Customers c

INNER JOIN Orders o

ON c.CustomerID=o.CustomerID

INNER JOIN [ORDER Details] od

ON o.OrderID=od.OrderID

GROUP BY c.Country

ORDER BY 2 DESC

15-)Zamanında teslim edemediğim siparişlerim ID’leri  nelerdir ve kaç gün geç göndermişim?

SELECT OrderID,datediff(DAY,ShippedDate,RequiredDate) AS dt

FROM Orders

WHERE datediff(DAY,ShippedDate,RequiredDate)>0

16-)Ortalama satış miktarının üzerine çıkan satışlarım hangisi?(subquerry kullandık, querrynin içinde querry tanımladık)

SELECT *

FROM [ORDER Details] od

WHERE Quantity>(SELECT AVG(Quantity) FROM [ORDER Details])

ORDER BY od.Quantity DESC

17-)Satışlarımı kaç günde teslim etmişim?

SELECT OrderID,datediff(DAY,OrderDate,ShippedDate)

FROM Orders

WHERE ShippedDate NOT LIKE 'NULL'

ORDER BY 2 DESC

 

Kaynaklar

 

Yorumunuzu Ekleyin


Yükleniyor...
Yükleniyor...