Northwind Sorguları

Hazırlık

Aşağıdaki indirme adresinden instnwnd.sql dosyasını kullanarak Northwind Örnek Veritabanını kurunuz ve aşağıdaki görevleri yerine getirecek SQL sorgularını yazınız.

İndirme Linki:

https://github.com/Microsoft/sql-server-samples/tree/master/samples/databases/northwind-pubs

Görevler

  1. Employees tablosundan, çalışanlara ait ad, soyad, görev ve doğum tarihi bilgilerini listeleyiniz.
  2. Employees tablosundaki çalışanlara ait bilgileri listelerken ünvan (TitleOfCourtesy), ad (FirstName) ve soyad (LastName) aynı sütunda olacak şekilde listeleyiniz.
  3. Categories tablosuna CategoryName Pideler, Description 'İnce Pide Üzerinde Çeşitli Malzemelerle Pişirilerek Hazırlanmış Yemek Türü' olacak şekilde bir kayıt ekleyiniz.
  4. Shippers tablosuna MNG Kargo, 4440606 ve Yurt içi Kargo, 4449999 kayıtlarını ekleyiniz.
  5. Girdiğiniz Yurt içi Kargo kaydını Yurtiçi Kargo olarak güncelleyiniz.
  6. Customers (Müşteriler) tablosuna kendi bilgilerinizi içeren bir kayıt giriniz.
  7. Çalışanlardan (employees) ünvanı Mr. ve Dr. olanları listeleyiniz.
  8. Çalışanlar tablosundaki çalışan sayısını getiriniz.
  9. Çalışanlar tablosunda kaç farklı çeşit şehirden (city) kişi bulunmaktadır.
  10. Çalışanlar tablosundaki kişileri yaşlarıyla birlikte listeleyiniz.
  11. Çalışanlar tablosundaki kişilerin yaş ortalamasını hesaplayınız.
  12. Çalışanları önce şehir, sonra ad, sonra soyada göre sıralayınız.
  13. Çalışanların ad, soyad alanlarını listeleyiniz. Ve üçüncü bir alan olarak da ülkelerini USA olanları "The United States of America" ve UK olanları United Kingdom olarak yazarak gösteriniz. Diğerleri için ülkeyi aynen bırakınız.
  14. Customers ve Orders tabloları arasında CustomerID alanları üzerinde ilişki bulunmaktadır. Tüm müşterilerin ID ve İletişim isimleriyle birlikte kaçar adet siparişte bulunduklarını listeleyiniz.
  15. Amerika bölgesine gönderilen siparişleri listeleyiniz.
  16. 30 no'lu üründen 30'dan fazla sipariş veren müşterileri listeleyiniz.
  17. Soyisimleri D ile başlayan çalışanların isimlerini listeleyiniz.
  18. Sipariş detayları tablosundaki Tofu adlı ürünle ilişkili indirim uygulanmamış tüm kayıtları getiriniz.
  19. Alfreds Futterkiste isimli şirketten elde edilen toplam ciroyu gösteriniz.
  20. Amerika lokasyonlu müşterilerin vermiş olduğu siparişleri listeleyiniz.
  21. Amerika lokasyonlu çalışanların ilgilendiği siparişleri listeleyiniz.
  22. Ürünlerin isimlerini ve birim başına miktarlarını gösteren sorguyu yazınız.
  23. Devam etmekte olan (discontinued=false) ürünleri (product id ve name) listeleyiniz.
  24. Devam etmeyen (discontinued=true) ürünleri (product id ve name) listeleyiniz.
  25. Ürünleri en pahalıdan en ucuza doğru sıralayan sorguyu yazınız.
  26. Devam etmekte olan ürünlerden fiyatı 20 dolardan aşağı olanları listeleyiniz.
  27. Birim fiyatı 15 ve 25 arasında olan devam etmekte olan ürünleri birim fiyatına göre azalan şekilde sıralayınız.
  28. Fiyatı ortalama fiyatın üzerinde olan ürünleri listeleyiniz.
  29. En pahalı 10 ürünü fiyatına göre artan (ucuzdan pahalıya) sıralayan sorguyu yazınız.
  30. Toplamda en çok sayıda sipariş verilmiş 10 ürünü sipariş verilme sayılarıyla birlikte listeleyiniz.
  31. Ürünlerin sipariş verilme sayılarını kategori bazlı olarak listeleyiniz. Ve her kategori için en çok sipariş verilen ürünün adını da aynı satırında gösteriniz.
-- 1. Employees tablosundan, çalışanlara ait ad, soyad, görev ve doğum tarihi bilgilerini listeleyiniz.
SELECT FirstName, LastName, Title, BirthDate FROM Employees;

-- 2. Employees tablosundaki çalışanlara ait bilgileri listelerken ünvan (TitleOfCourtesy), ad (FirstName) ve soyad (LastName) aynı sütunda olacak şekilde listeleyiniz.
SELECT CONCAT(TitleOfCourtesy, N' ', FirstName, N' ', LastName) [Çalışan] FROM Employees;

-- 3. Categories tablosuna CategoryName Pideler, Description 'İnce Pide Üzerinde Çeşitli Malzemelerle Pişirilerek Hazırlanmış Yemek Türü' olacak şekilde bir kayıt ekleyiniz.
INSERT INTO Categories(CategoryName, Description) VALUES(N'Pideler', N'İnce Pide Üzerinde Çeşitli Malzemelerle Pişirilerek Hazırlanmış Yemek Türü');

-- 4. Shippers tablosuna MNG Kargo, 4440606 ve Yurt içi Kargo, 4449999 kayıtlarını ekleyiniz.
INSERT INTO Shippers(CompanyName, Phone) VALUES (N'MNG Kargo', N'4440606'), (N'Yurt içi Kargo', N'4449999');

-- 5. Girdiğiniz Yurt içi Kargo kaydını Yurtiçi Kargo olarak güncelleyiniz.
UPDATE Shippers SET CompanyName = N'Yurtiçi Kargo' WHERE CompanyName = N'Yurt içi Kargo';

-- 6. Customers (Müşteriler) tablosuna kendi bilgilerinizi içeren bir kayıt giriniz.
INSERT INTO Customers (CustomerID, CompanyName, ContactName, ContactTitle, Address, City, Region, PostalCode, Country, Phone, Fax) 
VALUES(N'AYLMZ', N'Yılmaz Holding', N'Ali Yılmaz', N'Owner', N'İzmit', N'Kocaeli', N'Marmara', N'41100', N'Türkiye', N'+902621112233', NULL); 

-- 7. Çalışanlardan (employees) ünvanı Mr. ve Dr. olanları listeleyiniz.
SELECT * FROM Employees WHERE TitleOfCourtesy IN (N'Mr.', N'Dr.');

-- 8. Çalışanlar tablosundaki çalışan sayısını getiriniz.
SELECT COUNT(EmployeeID) FROM Employees;

-- 9. Çalışanlar tablosunda kaç farklı çeşit şehirden (city) kişi bulunmaktadır.
SELECT COUNT(DISTINCT City) FROM Employees;

-- 10. Çalışanlar tablosundaki kişileri yaşlarıyla birlikte listeleyiniz.
SELECT FirstName, LastName, DATEDIFF(YEAR, BirthDate, GETDATE()) AS Yaş FROM Employees;

-- 11. Çalışanlar tablosundaki kişilerin yaş ortalamasını hesaplayınız.
SELECT AVG(DATEDIFF(YEAR, BirthDate, GETDATE())) AS [Ortalama Yaş] FROM Employees;

-- 12. Çalışanları önce şehir, sonra ad, sonra soyada göre sıralayınız.
SELECT * FROM Employees ORDER BY City ASC, FirstName ASC, LastName ASC;

-- 13. Çalışanların ad, soyad alanlarını listeleyiniz. Ve üçüncü bir alan olarak da ülkelerini USA olanları "The United States of America" ve UK olanları United Kingdom olarak yazarak gösteriniz. Diğerleri için ülkeyi aynen bırakınız.
SELECT 
	FirstName, 
	LastName, 
	IIF(Country = N'USA', N'The United States of America', IIF(Country = N'UK', N'United Kingdom', Country)) Country 
FROM Employees;

SELECT 
	FirstName, 
	LastName, 
	CASE Country
		WHEN N'USA' THEN 'The United States of America'
		WHEN N'UK' THEN 'United Kingdom'
		ELSE Country 
	END Country
FROM Employees;

-- 14. Customers ve Orders tabloları arasında CustomerID alanları üzerinde ilişki bulunmaktadır. Tüm müşterilerin ID ve İletişim isimleriyle birlikte kaçar adet siparişte bulunduklarını listeleyiniz.
SELECT c.CustomerID, c.ContactName, COUNT(o.OrderId) [Sipariş Adedi]
FROM Customers c 
JOIN Orders o ON c.CustomerID = o.CustomerID
GROUP BY c.CustomerID, c.ContactName;

-- 15. Amerika bölgesine gönderilen siparişleri listeleyiniz.
SELECT * FROM Orders WHERE ShipCountry = N'USA';

-- 16. 30 no'lu üründen 30'dan fazla sipariş veren müşterileri listeleyiniz.
SELECT  c.CustomerId, c.CompanyName, SUM(od.Quantity) [Adet] FROM Orders o
JOIN [Order Details] od ON o.OrderID = od.OrderID
JOIN Customers c ON o.CustomerID = c.CustomerID
WHERE od.ProductID = 30
GROUP BY c.CustomerId, c.CompanyName
HAVING SUM(od.Quantity) > 30;

-- 17. Soyisimleri D ile başlayan çalışanların isimlerini listeleyiniz.
SELECT * FROM Employees WHERE LastName LIKE N'D%';
SELECT * FROM Employees WHERE SUBSTRING(LastName, 1, 1) = N'D';
SELECT * FROM Employees WHERE LEFT(LastName, 1) = N'D';

-- 18. Sipariş detayları tablosundaki Tofu adlı ürünle ilişkili indirim uygulanmamış tüm kayıtları getiriniz.
SELECT * FROM [Order Details]
WHERE ProductId = (SELECT ProductId FROM Products WHERE ProductName = N'Tofu') AND Discount = 0;

SELECT od.* FROM [Order Details] od
JOIN Products p ON od.ProductID = p.ProductID
WHERE od.Discount = 0 AND p.ProductName = N'Tofu';

-- 19. Alfreds Futterkiste isimli şirketten elde edilen toplam ciroyu gösteriniz.
SELECT 
CAST(SUM(od.UnitPrice * od.Quantity * (1 - od.Discount)) AS DECIMAL(18,2)) [Ciro] 
FROM Customers c
LEFT OUTER JOIN Orders o ON c.CustomerID = o.CustomerID
LEFT OUTER JOIN [Order Details] od ON o.OrderID = od.OrderID
WHERE c.CompanyName = N'Alfreds Futterkiste';

SELECT CAST(SUM(od.UnitPrice * od.Quantity * (1 - od.Discount)) AS DECIMAL(18,2)) [Ciro] FROM Orders o
LEFT OUTER JOIN [Order Details] od ON o.OrderID = od.OrderID
WHERE CustomerId = (SELECT CustomerId FROM Customers WHERE CompanyName = N'Alfreds Futterkiste');

-- 20. Amerika lokasyonlu müşterilerin vermiş olduğu siparişleri listeleyiniz.
SELECT o.* FROM Orders o
JOIN Customers c ON o.CustomerID = c.CustomerID
WHERE c.Country = N'USA';

-- 29. En pahalı 10 ürünü fiyatına göre artan (ucuzdan pahalıya) sıralayan sorguyu yazınız.
SELECT * 
FROM (SELECT TOP 10 * FROM Products ORDER BY UnitPrice DESC) t
ORDER BY t.UnitPrice;

-- 31. Ürünlerin sipariş verilme sayılarını kategori bazlı olarak listeleyiniz. 
-- Ve her kategori için en çok sipariş verilen ürünün adını da aynı satırında gösteriniz.
SELECT c.CategoryName [Kategori], SUM(od.Quantity) [Adet],
(
	SELECT TOP 1 p2.ProductName FROM Products p2 
	LEFT OUTER JOIN [Order Details] od2 ON p2.ProductID = od2.ProductID
	WHERE p2.CategoryID = c.CategoryID
	GROUP BY p2.ProductName
	ORDER BY SUM(od2.Quantity) DESC
) [Çok Satan]
FROM Categories c
LEFT OUTER JOIN Products p ON c.CategoryID = p.CategoryID
LEFT OUTER JOIN [Order Details] od ON p.ProductID = od.ProductID
GROUP BY c.CategoryID, c.CategoryName;