Subqueries Nedir ve Ne İşe Yarar?
Subqueries için örneklere geçmeden önce subquery nedir ve ne işe yarar onu anlatalım. Daha önceki yazımızda Power Bi iş zekası yazılımında yer işaretlerini anlatmıştık.
SQL’de alt sorgular (subqueries), bir sorgu içinde yer alan başka bir sorgudur ve ana sorguya ara sonuçlar sağlamak için kullanılır. Alt sorgular, veritabanı sorgularını daha esnek ve güçlü hale getirir.
Alt Sorguların Kullanım Alanları :
- Filtreleme: Alt sorgular, ana sorgunun veri kümesini belirli bir kritere göre filtreler. Örneğin, belirli bir değerden büyük olan verileri çekmek için kullanılır.
- Toplamlar ve Ortalamalar: Belirli bir küme için toplam veya ortalama hesaplamaları yaparak ana sorguya dahil edilebilir.
- Veri Dönüşümü: Veri kümelerini farklı forma dönüştürmek için kullanılır. Örneğin, belirli bir tarih aralığındaki siparişleri listelemek.
- İç İçe Sorgular: Daha karmaşık analizler yapmak için iç içe alt sorgular kullanılabilir. Örneğin, en yüksek maaşı alan çalışanları bulmak.
- Bağımlı ve Bağımsız Alt Sorgular: Bağımsız alt sorgular, ana sorgudan bağımsız çalışırken, bağımlı alt sorgular ana sorgudaki değerlere bağlı olarak çalışır.
- Alt Sorguların Avantajları
- Karmaşıklığı Yönetme: Karmaşık sorguları daha küçük ve yönetilebilir parçalara böler.
- Modülerlik: Yeniden kullanılabilir sorgu parçaları oluşturarak sorguların esnekliğini artırır.
- Veri Gizleme: Gereksiz veriyi gizleyerek performansı artırır ve veri güvenliğini sağlar.
İşte Subquery Örneklerimiz : Bu örnekler Nortwind database ile hazırlanmıştır. Aşağıdaki linkten Northwind database indirebilirsiniz.
https://github.com/cjlee/northwind
1-Birim fiyatı en yüksek olan ürünün kategori adını listeleyiniz
select top 1 c.CategoryName,
(select max(p.UnitPrice) from products p where p.CategoryID=c.CategoryID)
from categories c
Çıktı:
2- Kategorisi Beverages olan ürünlerin fiyatlarını listele
select p.ProductName,p.UnitPrice from products p
where p.CategoryID = (
select c.CategoryID from Categories c where c.CategoryName='Beverages'
)
Çıktı:
3- Siparişi olmayan müşterileri listeleyiniz
select*from Customers c where CustomerID not in (
select distinct CustomerID from orders)
Çıktı :
4-1996 da siparişi olmayan müşterileri listeleyiniz
select c.CompanyName from Customers c where not EXISTS (
select distinct o.CustomerID from orders o where DATEPART(YEAR,o.OrderDate)=1996 and o.CustomerID=c.CustomerID)
Çıktı :
5- CategoryName='Beverages' türünde olan ve ortalama birim fiyatından yüksek olan ürünler
select*from products p
where p.CategoryID = (
select c.CategoryID from Categories c where c.CategoryName='Beverages'
)
and p.UnitPrice >(
select avg(p1.UnitPrice) from Products p1
)
Çıktı :
6- Müşterilerin isimleri ile birlikte Toplam sipariş tutarları ve miktarlarını sipariş tablolarından hesaplayarak getir
SELECT
c.CustomerID,
c.CompanyName,
(SELECT SUM(od.Quantity)
FROM Orders o
LEFT JOIN [Order Details] od ON od.OrderID = o.OrderID
WHERE o.CustomerID = c.CustomerID) AS Amount_of_Orders,
(SELECT SUM(od.Quantity * od.UnitPrice)
FROM Orders o
LEFT JOIN [Order Details] od ON od.OrderID = o.OrderID
WHERE o.CustomerID = c.CustomerID) AS Total_of_Orders
FROM Customers c;
Çıktı:
7- Her çalışanın aldığı sipariş sayısını ve bu siparişlerin toplam tutarları listele
SELECT
e.EmployeeID,
e.FirstName,
e.LastName,
(SELECT COUNT(*)
FROM Orders o
WHERE o.EmployeeID = e.EmployeeID) AS Order_Count,
(SELECT SUM(od.Quantity * od.UnitPrice)
FROM Orders o
LEFT JOIN [Order Details] od ON od.OrderID = o.OrderID
WHERE o.EmployeeID = e.EmployeeID) AS Total_Order_Amount
FROM Employees e;
Çıktı:
8- En çok sipariş veren Müşteriyi bulunuz
SELECT
c.CustomerID,
c.CompanyName,
(SELECT COUNT(*) FROM Orders o WHERE o.CustomerID = c.CustomerID) AS Total_Orders FROM Customers c WHERE c.CustomerID = ( SELECT TOP 1 CustomerID FROM Orders GROUP BY CustomerID ORDER BY COUNT(*) DESC
);
Çıktı:
9- En çok sipariş edilen ürünü bulunuz
SELECT
p.ProductID,
p.ProductName,
(SELECT SUM(od.Quantity)
FROM [Order Details] od
WHERE od.ProductID = p.ProductID) AS Total_Quantity
FROM Products p
WHERE p.ProductID = (
SELECT TOP 1 od.ProductID
FROM [Order Details] od
GROUP BY od.ProductID
ORDER BY SUM(od.Quantity) DESC
);
Çıktı:
10- Her kategorideki ürünlerin ortalama fiyatı ve toplam stok miktarlarını listeleyiniz
SELECT
c.CategoryID,
c.CategoryName,
(SELECT AVG(p.UnitPrice)
FROM Products p
WHERE p.CategoryID = c.CategoryID) AS Average_Price,
(SELECT SUM(p.UnitsInStock)
FROM Products p
WHERE p.CategoryID = c.CategoryID) AS Total_Stock
FROM Categories c;
Çıktı:
AHMET GÜNOĞLU
ERP Consultant and Business Intelligence Expert