24 Haziran 2014 Salı

SQL'de SUBQUERIES (Alt Sorgular)

    • Bir Alt Sorgu başka bir SELECT, INSERT, UPDATE veya DELETE ifadesi içerisine yuvalanmış bir SELECT ifadesidir. 
    • Çoğu durumda alt sorguları JOIN ifadelerine dönüştürebilirsiniz. 
    • Alt sorgular, karmaşık sorguları biraz daha anlaşılabilir mantıksal bölümlere ayırmak için veya birbaşka sorgunun sonuç kümesine dayalı bir sorguyu çalıştırmak için kullanılır. 
    • JOIN bağlantıları Alt Sorgulardan daha hızlı işlenirler.
    • Kural olarak ise Alt Sorguları parantez içinde yazmalıyız.
    NOT : Örnek sorgulamalarda Northwind Database'i kullanacağım. bk: Nortwind Database Kurulumu 

    Sonuç Kümesinin Tablo Olarak Kullanımı : Sorguda FROM ifadesinde kullanılan tablonun yerine bir başka sorguyu kullanabilirsiniz. Sonuç Kümesine herhangi bir tabloya yapabildiğimiz gibi bir geçici takma ad verilebilir.


    SELECT T.ORDERID, T.CUSTOMERID
    FROM (SELECT ORDERID, CUSTOMERID FROM orders) AS T
     

    Sonuç Kümesinin Bir Deyim Olarak Kullanılması : SQL de bir sorguyu herhangi bir deyimin yerine kullanabilirsiniz. Bu amaç için kullanılacak bir sorgu tek bir sayısal değer veya tek bir sütun değer listesi döndürmelidir. Bir değerler listesi geri döndüren sorgular IN anahtar kelimesi içeren WHERE yantümcesi yerine kullanılabilir.
     
    Ortalamayı bulup satılan ürünlerimiz için ayrıntılı birim fiyatlarını ve bu birim fiyatlarının ortalama ürün fiyatına oranla durumunu gösterelim.
     
    SELECT ProductName AS 'ÜRÜN ADI',UnitPrice AS 'BİRİM FİYATI', UnitsInStock AS 'STOK',
    (SELECT AVG(UnitPrice) FROM Products) AS ORTALAMA,
    UnitPrice-(SELECT AVG(UnitPrice) FROM Products) AS FARK FROM Products  


    İlişkili Alt Sorgu :  İç sorgu ile dış sorgu bir alan üzerinden doğrudan bağlantılıdır.
     
    30 nolu üründen 30 dan fazla sipariş veren müşterileri listeleyelim.

    SELECT OrderID, CustomerID FROM orders AS or1
    WHERE 30<(SELECT quantity FROM [order details] AS od
    WHERE or1.OrderID=od.OrderID AND od.ProductID=30)


    Alt Sorgu-JOIN Dönüşümü :  İlişkili alt sorguları bir JOIN ifadesi yerine kullanabiliriz.
     
    İki farklı sorgu aynı sonucu vermektedir. Birinci örnekte Alt Sorgu kullanılmış, ikinci sorguda aynı sonuca JOIN ile ulaşılmıştır. 

    SELECT  DISTINCT E1.TitleOfCourtesy FROM Employees AS E1
    WHERE E1.City IN
    (SELECT E2.City FROM Employees AS E2 WHERE E1.TitleOfCourtesy<>E2.TitleOfCourtesy)


    SELECT DISTINCT E1.TitleOfCourtesy FROM Employees AS E1
    INNER JOIN Employees AS E2 WITH (NOLOCK) ON E1.City=E2.City
    WHERE E1.TitleOfCourtesy<>E2.TitleOfCourtesy
     
     
    Alt Sorgu-HAVING Dönüşümü : İlişkili bir alt sorgunun ürettiği sonuç kümesini HAVING ile de elde edebiliriz.
     
    SELECT ProductName,CategoryID,UnitPrice FROM Products AS p1
    WHERE p1.UnitPrice>(SELECT AVG(UnitPrice) FROM Products AS p2
    WHERE p1.CategoryId=p2.CAtegoryId) ORDER BY CategoryId  


    SELECT p1.ProductName,p1.CategoryID,p1.UnitPrice FROM Products AS p1
    INNER JOIN Products AS p2 WITH (NOLOCK) ON p1.CategoryID=p2.CategoryID
    GROUP BY p1.ProductName,p1.CategoryID,p1.UnitPrice
    HAVING p1.UnitPrice>AVG(p2.UnitPrice) ORDER BY p1.CategoryId
     
     
    EXISTS ve NOT EXISTS İşlevleri : Bazı durumlarda Alt Sorguların ürettikleri değerler ile değil, sorgunun sonucunun var olup olmadığıyla ilgileniriz. EXIST ve NOT EXIST işlevleri, bu sorgulamayı yapmak için kullanılır ve DOĞRU (TRUE) veya YANLIŞ (FALSE) değeri döndürür.

    Birinci sorguda ‘3/05/1998’ ve '4/05/1998' tarihleri arasında sipariş almış olan çalışanlar EXIST işlevi ile listeliyoruz. Aynı sonuca JOIN ile birleştirerekte ulaşabiliriz.
     
    SELECT EmployeeId,LastName,FirstName
    FROM Employees AS e WHERE EXISTS
    (SELECT * FROM Orders AS o
    WHERE e.EmployeeId=o.EmployeeId
    AND o.OrderDate BETWEEN '3/5/1998' AND '4/5/1998')   


    SELECT DISTINCT FirstName,LastName, e.EmployeeID
    FROM Orders AS o
    INNER JOIN Employees AS e
    ON o.EmployeeID =e.EmployeeID
    WHERE o.OrderDate BETWEEN '3/5/1998' AND '4/5/1998'

    SQL'de UNION Kullanımı

    • UNION iki veya daha fazla SELECT sorgusunun sonuçlarını tekbir sonuç kümesinde birleştirir.  
    • Görüntülenecek olan tablolar aynı veri türünde aynı sayıda ve aynı düzendeki sütunlardan oluşmalıdır.
    NOT : Örnek sorgulamalarda Northwind Database'i kullanacağım. bk: Nortwind Database Kurulumu 
    Örnek Sorgu : Müşteriler (Customers) tablosu ve Çalışanlar (Employees) tablosu verilerini birleştirelim.

    SELECT (firstname+' '+lastname) AS ADI,city AS 'ŞEHİR', postalcode AS 'POSTA KODU'
    FROM employees UNION SELECT companyname, city, postalcode FROM customers

    8 Haziran 2014 Pazar

    SQL'de SELF-JOINS Kullanımı


    SELF-JOINS Bir tablonun kendisiyle birleştirilme  işlemidir.
    (Bir tablodaki aynı değerleri içeren farklı satırları listelemek amacıyla kullanılır.)

    Örnek Sorgu : Görevi (Job Title) aynı olan çalışanları listeleyelim. WHERE ifadesi ile belirtilen koşul kendisiyle eşleşen kayıtların görüntülenmesi engeller.

    SELECT a.EmployeeID AS 'ÇALIŞAN ID',LEFT(a.lastname,10) 
    AS 'İSİM',LEFT(a.title,10) AS 'GÖREVİ',b.EmployeeID AS 'ÇALIŞAN ID', LEFT(b.lastname,10) 
    AS 'İSİM',LEFT(b.title,10) AS 'GÖREVİ'
    FROM employees AS a INNER JOIN employees AS b ON a.title=b.title
    WHERE a.EmployeeID < b.EmployeeID ORDER BY a.EmployeeID


    SQL'de INNER JOIN ile 3 ve Daha Fazla Tabloyu Birleştirme


    Bazen çok tablo üzerinde sorgu yapma ihtiyacı duyabiliriz. JOIN işlemiyle birleştirilen tablolar bir başka tabloya aradaki ortak sütunlar üzerinden bağlanabilir.

    NOT : Örnek sorgulamalarda Northwind Database'i kullanacağım. bk: Nortwind Database Kurulumu 
    Örnek Sorgu : Sipariş Detayları(Order Details) tablosunu ara tablo şeklinde kullanarak, Siparişler (Orders) ve Ürünler(Products) tablosundan gerekli bilgiler görüntülenmiştir.

    SELECT OrderDate,ProductName FROM Orders AS O
    INNER JOIN [Order Details] AS OD ON O.OrderID=OD.OrderID
    INNER JOIN Products AS P ON OD.ProductID=P.ProductID
    WHERE OrderDate='7/8/96' ORDER BY ProductName
     

    SQL'de OUTER LEFT/RIGHT/CROSS JOIN Kullanımları

    OUTER JOIN-LEFT JOIN Kullanımı
    • INNER JOIN'den farklıdır. 
    • Soldaki tablo baz alınarak sorgu çalıştırılmasıdır. 
    • Soldaki tablodan tüm kayıtlar çekilir ve sağdaki tabloda eşleşen kayıtlar aynen yazılır. 
    • Eşleşmeyen kayıtlar için NULL değer verilir.
    NOT : Örnek sorgulamalarda Northwind Database'i kullanacağım. bk: Nortwind Database Kurulumu 
     
    LEFT JOIN Kullanımı : SELECT <sütun_ad(lar)ı> FROM <ilk_tablo> LEFT JOIN <ikinci_tablo> ON <ilk_tablo>.<anahtar_alan> = <ikinci_tablo>.<anahtar_alan>  

    Örnek Sorgu : Sorgumuz SELECT kısmında iki sütun tekbir sütun adı altında birleştirilmiştir. Çalıştırıldığında çalışanın tam adı ve müşterilerden aldığı siparişler ve tarihleri listelenecektir.

    SELECT Employees.FirstName+' '+Employees.LastName AS Name,OrderID,OrderDate
    FROM Employees LEFT JOIN Orders ON Employees.EmployeeID=Orders.EmployeeID
     
     
    OUTER JOIN-RIGHT JOIN Kullanımı 
    • LEFT OUTER JOIN işleminin tersini yapar.
    • Sağdaki tablonun baz alınarak sorgu çalıştırılmasıdır. 
    • Sağdaki tablodan tüm kayıtlar çekilir ve soldaki tabloda eşleşen kayıtlar aynen yazılır.
    • Eşleşmeyen kayıtlar için NULL değer verilir.
    RIGHT JOIN Kullanımı : SELECT <sütun ad(lar)ı> FROM <ilk_tablo> RIGHT JOIN <ikinci_tablo> ON <birinci_tablo>.<anahtar alan> = <ikinci_tablo>.<anahtar_alan>

    Örnek Sorgu : Sorgumuzda tüm müşteriler ve verdikleri siparişlerin tarihleri listelenecektir.

    SELECT companyname, customers.CustomerID, orderdate
    FROM customers RIGHT OUTER JOIN orders ON customers.CustomerID = orders.CustomerID
     
     
     OUTER JOIN-CROSS JOIN Kullanımı
    • İlişkili tablolar arasındaki tüm eşleşmeleri listeler.
    • Ortak bir alan belirtilmesine gerek yoktur.
    • CROSS JOIN kullanılırken ON ifadesi kullanılmaz.

    Örnek Sorgu : Üreticilerin çalışabilecekleri tüm olası gemi şirketleri listelenir.

    SELECT suppliers.companyname, shippers.companyname
    FROM suppliers CROSS JOIN shippers
     

    Copyright 2013-2017 | İbrahim BAYRAKTAR /dev/null Web Günlüğü