MSSQL etiketine sahip kayıtlar gösteriliyor.
MSSQL etiketine sahip kayıtlar gösteriliyor.

SQL'de INSERT…SELECT Kullanımı

  • Sorgu sonucunu bir tabloya eklemek istediğimizde  INSERT…SELECT ifadesini kullanırız.
  • Verilerin yazılacağı tablo alanlarının boş (NULL) değere izin verip vermediğine veya alanın varsayılan (default) bir değeri olup olmadığına dikkat edilmelidir. 
  • Tablo alanlarında boş (NULL) değere izin verilmiyorsa, bu alanlar için mutlaka bir değer belirtilmelidir.
NOT : Örnek sorgulamalarda Northwind Database'i kullanacağım. bk: Nortwind Database Kurulumu 

Örnek Sorgu : Sorgumuzda Çalışanlar (Employees) tablosundaki verileri Müşteriler (Customers) tablosuna ekleyelim. Sorgu içerisinde substring() fonksiyonu ile FirstName ve LastName alanlarından sırasıyla 3 ve 2'şer harf alarak yeni bir alan oluşturalım. Bu alan verinin ekleneceği Müşteriler (Customers) tablosunun birincil alanı CustomerID’ ye yazılacaktır.


Sorgu sonucunda 92 adet olan Customers sayısı 101 olacaktır.


SQL'de INSERT ve VALUES Birlikte Kullanımı

  • INSERT ifadesini VALUES ile birlikte kullanarak tablolara yeni satırlar eklenebilir.
  • Eklenecek olan verilerde veri türü ve sutun sırası tablonunkilerle uyuşmalıdır.
NOT : Örnek sorgulamalarda Northwind Database'i kullanacağım. bk: Nortwind Database Kurulumu 
 
Örnek Sorgu :  INSERT ve VALUES ifadelerini birlikte kullanarakk "Bayraktar Tea Company" isimli firmayı Müşteriler (Customers) tablosuna ekleyelim.

INSERT customers(CustomerID,companyname,contactname,contacttitle,
Address,city,region,postalcode,country,phone,fax) VALUES ('BYRK','Bayraktar Tea Company','Ibrahim Bayraktar','Owner','Cumhuriyet Street','Yozgat','TR','66100','Turkei','(354) 000-0000','(354) 000-0000')


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

    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
     

    SQL Server .bak dosyası ile Restore İşlemi Nasıl Yapılır

     .bak dosyasını kullanarak bir veritabanı Yedeklemesi Nasıl Geri Yüklenir
    • Object Explorer - Database’e sağ tıklıyoruz.     
    • Restore Database seçeneğini seçiyoruz.     
    • Karşımıza çıkan pencerede “from device” seçeneğini işaretliyoruz     
    • Browse yaparak dosyamızın path’ini gösteriyoruz.     
    • OK tuşuna basıyoruz 
    • Database "…" restored successfully mesajı restore işleminin başarılı gerçekleştiğini belirtiyor.

    Başarı ile tamamlamış isek refresh yaparak Object Explorerda restore ettiğimiz .bak uzantılı database görünecektir.

    Not : .bak uzantılı dosyayı SQL Server'e RESTORE edilirken dikkat edilmesi gereken husus dosyanın ancak aynı sürüm veya daha yüksek sürümdeki bir SQL Server'e RESTORE edilebildiğidir.

    SQL'de INNER JOIN Kullanımı

    • INNER JOIN SQL de  varsayılan olarak kullanılan tablolaları bağlama işlemidir.
    • INNER JOIN birleştirilen tablolarda ilişkinin sağlandığı tüm kayıtları getirir.
    NOT : Örnek sorgulamalarda Northwind Database'i kullanacağım. bk: Nortwind Database Kurulumu 

    Örnek Sorgu : 
    SELECT productname AS 'Ürün Adı', companyname AS 'Şirket Adı' FROM products
    INNER JOIN suppliers ON products.SupplierID = suppliers.SupplierID
    (Hangi firmadan hangi ürünü aldığımızı iki farklı tablodan birleştirerek listeleyelim.) 


    SQL'de Tablo Birleştirme ve JOIN


    SQL'de bazı durumlarda birden fazla tablodan veri çekme ihtiyacı duyabiliriz. Bunun için tablolar arasında bir ilişki kurulması gerekmektedir. Bu ilişki JOIN ile sağlanır. JOIN ifadesi birden fazla tabloyu birbirine bağlayıp  bu tablolar üzerinde işlem yapmamıza olanak sağlar.

    JOIN ifadesi ile hangi tabloları ve nasıl birleştireceğimizi ON ifadesi ile tabloların hangi alanlar üzerinden birleşeceğini belirtiriz.

    Tablolar genelde Birincil Anahtar ve Yabancı Anahtar alanları üzerinden birleştirilselerde, gerektiğinde diğer herhangi bir alan da bunun için kullanılabilir. Fakat bu alanların aynı tür veri içerdiğinden emin olmalısınız.

    Birincil Anahtar (Primary key), her kayıt için benzersiz bir değer taşıyan alandır. 

    Örneğin, öğrenci kayıtlarının tutulduğu bir tabloda, öğrenci numarasının saklandığı alan birincil anahtar olarak seçilebilir. Zira öğrenciyle ilgili tüm bilgiler gerçekte onun numarası ile kodlanmıştır ve her öğrencinin numarası bir birinden farklıdır.

    Tablolar birleştirilirken Primary Key - Foreign Key ikilisi kullanılır. Tablolar arası ilişkiler aynı zamanda Unique Index kullanılarakta yapılabilir. Fakat yaygın olarak PK - FK kullanılır.

    Primary Key (Birincil Anahtar) : Her satırı tekil bir şekilde tanımlayan benzersiz anahtardır. Primary Key sayesinde tablolarda bulunan satırlar birbirlerinden farklı olur ve her satırın Primary Key değeri farklı atanır. Primary Key tek bir sütun olduğu gibi birden fazla sütundan da oluşabilir.

    • Primary Key olacak sütun asla boş değer almamalıdır.
    • Primary Key olacak sütun tekrarı olmayan kayıtlardan oluşmalıdır…
    • Primary Key sütunu olabildiğince küçük ve basit veri tipinde tanımlanmalıdır.

    Foreign Key (Yabancı Anahtar) : Bir tablodaki sütunun başka tablodaki anahtara olan referansını belirler. Primary Key'den farklı olarak bir tabloda birden fazla Foreign Key olabilir.

    Örnek Sorgularda kullandığım Northwind Veritabanı diyagramını inceleyerek PK - FK bağlantılarını görebilirsiniz (diyagram'ın ayrıntılı sürümünü indirmek için tıklayınız.)


    SQL'de COMPUTE ve COMPUTE BY Kullanımı

    • COMPUTE sorgumuzdaki kolonları Aggregate Fonksiyonlar ile kullanmamızı sağlar.
    • COMPUTE tüm sonuç kümesini listeler ve bu listenin altında tek bir detay satırı görüntüler. 
    • Farklı olarak tek sorguda 2 tane sonuç listesi bize döndürür. 2.liste detay listesidir. 
    • COMPUTE ile kullanılan sütun SELECT ifadesinde yer almalıdır.
    • COMPUTE BY kullanarak daha detaylı gruplandırma da yapılabilir.
    NOT : Örnek sorgulamalarda Northwind Database'i kullanacağım. bk: Nortwind Database Kurulumu 

    Örnek Sorgu 1:
    SELECT productid, orderid, quantity FROM [Order Details]
    ORDER BY productid, orderid COMPUTE SUM(quantity)

    (Sipariş detayları (Order Details) tablosundaki tüm satırları listeler ve kayıt kümesinin sonuna tüm ürünlerin genel toplamını verir.)

    Örnek Sorgu 2:
    SELECT productid, orderid, quantity FROM [order details]WHERE orderid<10250 ORDER BY orderid,productid COMPUTE SUM(quantity) BY orderid COMPUTE SUM(quantity)

    (Sipariş Detayları (Order Details) tablosundaki tüm satırları listeler ve her sipariş altına sipariş genel toplamını verir. Son olarak ise tüm siparişlerdeki genel toplam görüntülenir.)  

    NOT : SQL Server 2008 RS sonrası sürümlerde COMPUTE ve COMPUTE BY çalışmamaktadır. MSDN makalelerinde COMPUTE ve COMPUTE BY için SQL Server 2008 RS sonrası sürümlerde kaldırılacağı ve yerine ROLLUP kullanılması tavsiye edilmektedir. Detaylı bilgi için tıklayınız.

    GROUPING Fonksiyonu

    • SQL Server'da Fonksiyonlar, hesaplamalarda ve özellikle sistem hakkında bilgi almada yaygın olarak kullanılan araçlardır. Transact-SQL (T-SQL) programlama dilinde değişik kategorilerle adlandırılan fonksiyonlar vardır. Bunlardan en yaygını veriler üzerinde işlem yapan toplama ya da gruplama olarak adlandırabileceğimiz aggregate fonksiyonlarıdır. 
    • GROUPING Aggregate (Gruplama) Fonksiyonudur.
    • GROUP BY ile kullanılan ROLLUP ve CUBE ile elde edilen sonuç listesini GROUPING fonksiyonu daha kolay değerlendirip yorumlamamızı sağlar. 
    • Sütunlarda özet bilgiler için 1, detay bilgiler için 0 değeri görüntülenir.
    NOT : Örnek sorgulamalarda Northwind Database'i kullanacağım. bk: Nortwind Database Kurulumu 

    Örnek Sorgu :
    SELECT OrderID, GROUPING(OrderID), ProductID,GROUPING(ProductID), SUM(quantity) AS 'Toplam Sipariş'
    FROM [order details] WHERE OrderID < 10250
    GROUP BY OrderID, ProductID WITH CUBE ORDER BY OrderID, ProductID


    Sorgumuzda sütunlara dikkat edelim. OrderID alanı NULL olarak görünen kayıtlar tüm siparişlerdeki ürünlerin toplamlarını göstermektedir.