29 Mayıs 2012 Salı

37. SUBQUERIES-İlişkili Alt Sorgular

  • Aslında iç sorgular ve dış sorgular belirli bir alan yani sütun üzerinden ilişkili ve birbirlerine bağlıdır. 
  • Bunu genelde WHERE koşulu üzerinden sağlarız.
Örnek: Aşağıdaki örneğimizde her bir ürün için verilmiş en yüksek sipariş miktarını listelemekteyiz.

Sorgu: 
SELECT DISTINCT ProductId,Quantity
FROM [order details] AS ord1
WHERE Quantity=( SELECT MAX(Quantity)FROM [order details] AS ord2
                  WHERE ord1.productid=ord2.productid )
ORDER BY ProductId

Ders 38'e geçebilirsiniz.

26 Mayıs 2012 Cumartesi

36. SUBQUERIES-Sonuç Listesinin Deyim Olarak Kullanılması

  • Sorgularımızda başka bir sorguyu deyim yani yeni bir parametre olarak kullanabiliriz. 
  • Bu amaç için kullanacağımız sorgu ya tek satır sonuç döndürmeli yada tek bir sütun değer listesi döndürmeli.
  • Bir değerler listesi geri döndüren sorgular IN anahtar kelimesi içeren WHERE yantümcesi yerine kullanılabilir. 
Örnek: Sorgumuzda ortalamayı bulup satılan ürünlerimiz ayrıntılı birim fiyatlarını ve bu birim fiyatlarının genel ürün potansiyelinde ortalama ürün fiyatına oranla durumunu göstermekte. Burda alt sorguları kullanarak daha anlaşılabilir sorgu yazabiliriz.

Sorgu: 
SELECT ProductName,UnitPrice,UnitsinStock,
(SELECT AVG(UnitPrice) FROM Products) AS Average,
UnitPrice-(SELECT AVG(UnitPrice) FROM Products) AS Difference
FROM Products 



Ders 37' geçebilirsiniz.

25 Mayıs 2012 Cuma

35. SUBQUERIES-Sonuç Listesinin Tablo Olarak Kullanılması

  • Sorgularımızda FROM dan sonra tanımladığımız tablo bağlanıtısı yerine tablo değilse sorgu yazabiliriz. 
  • Sonucunda da ilerde bahsedeceğim TEMP TABLE kullanmış oluruz. 
  • Dönen sonuç listesi temp tablo gibi kullanılıp AS ile ad verilip sütunlarını istediğimiz gibi kullanabiliriz.
Örnek: Sorgumuzda Çalışan tablomuzdan bize lazım olanları alıyoruz. Daha anlaşılabilir hale getirip temp tablomuzu kullanarak yeni bir sorguya bağlıyoruz.

Sorgu: 
SELECT Calisan.Kimlik, Calisan.Isim, Calisan.Soyad FROM
(SELECT EmployeeID AS Kimlik,LastName AS Soyad,FirstName AS Isim FROM Employees)
 AS Calisan


Ders 36'ya geçebilirsiniz.

34. SUBQUERIES (ALT SORGULAR)

  • Kısaca Alt Sorgu bir sorgu içine gömülmüş SELECT sorgularıdır. 
  • Çoğu durumlarda  Alt Sorguyu JOIN ifadelerine dönüştürebiliriz. 
  • Genelde Büyük sorgulardaki karmaşıklığı azaltmak, anlaşılabilirliği arttırmak için kullanılırlar. 
  • Mantık olarak burda yaptığımız bir sorgu sonucu gelen sonuç listesine dayalı yeni sorgular çalıştırmak için kullanırız. 
  • Bilmeniz gereken Alt Sorgularda JOIN işlemi daha hızlı işlemektedir. 
  • Ayrıca daha karmaşık SP'ler yazmaya başladığınızda bunu daha iyi anlayacaksınız. 
  • Scriptlerin anlaşılabilirliği, yazılımcıdan bağımısızlığı ne kadar iyi sağlanırsa yazdığınız sorgular o kadar uzun ömürlü ve kullanılabilir olur. 
  • Kural olarak ise Alt Sorguları parantez içinde yazmalıyız.

İlgili Konular;

35. SUBQUERIES-Sonuç Listesinin Tablo Olarak Kullanılması 
36. SUBQUERIES-Sonuç Listesinin Deyim Olarak Kullanılması 
37. SUBQUERIES-İlişkili Alt Sorgular 
38. ALT SORGULAR - JOIN Dönüşümü
39. SUBQUERIES-HAVING Dönüşümü 
40.SUBQUERİES- EXISTS ve NOT EXISTS Kullanımı

33. UNION Kullanımı

  • Bazen sonuç kümesinin tek olmasını isteriz. 
  • Yani birden fazla yazdıgımız SELECT sorgularından dönen sonuç listeleri sorgu sayısı kadardır. 
  • Bunu tek bir sonuç listesinde döndürmek için UNION kullanırız. 
  • Görüntülenecek olan tablolar aynı veritüründe aynı sayıda ve aynı düzendeki sütunlardan oluşmalıdır.

Örnek: Aşağıdaki örnekte Çalışanlar (Employees) tablosu ve Yön(Region) tablosu verileri birleştirilmiştir. Birinci sorgunun SELECT ifadesindeki takma adın görüntülendiğine dikkat edin.

Sorgu: 
SELECT EmployeeID,City FROM Employees UNION
SELECT RegionID,RegionDescription FROM Region



Ders 34 'e geçebilirsiniz.

22 Mayıs 2012 Salı

32. SELF-JOINS Kullanımı

  • Bir tablonun kendisiyle JOIN işlemine tutulmasına SELF-JOIN işlemi denir. 
  • Tablodaki aynı değerleri içeren farklı kayıtlar mevcutsa bunları listeleyebilmek için kendisiyle birleştiririz.  
  • Bir tablo içinde bulunan satırlar arasında referans ilişkisi varsa, o tablo için farklı takma adlar (alias) kullanılarak JOIN sorguları gerçekleştirilebilir. 
  • Çok kullanılan bir yöntem değildir.
 Örnek: Aşağıdaki sorgumuzda aynı tabloyu kendisiyle birleştirdik. Daha çok SELF-JOIN işlemini aynı değerleri olan farklı kayıtlar üzerinde işlem yaparken kullanmalıyız. Örnekte basitce aynı tablo içi kıyaslama yaptık. SicilNo olarak her çalışanın altında olan çalışanları listeledik.

Sorgu: 
SELECT a.employeeid AS SicilNo,a.lastname,a.title
,b.employeeid AS AltSicilNo, b.lastname ,b.title
FROM employees AS a
INNER JOIN employees AS b
ON a.title=b.title
WHERE a.employeeid < b.employeeid
ORDER BY a.employeeid



Ders 33'e geçebilirsiniz.

20 Mayıs 2012 Pazar

31. İkiden Fazla Tablonun Birleştirilmesi

  • Büyük sorguların yazıldığı durumlarda ikiden fazla tablonun belirli kısıtlamalarla birleştirilmesi gerekebilir. 
  • JOIN işlemiyle birleştirilen tablolar bir başka tabloya aradaki ortak sütunlar üzerinden bağlanabilir.
Örnek: Aşağıdaki örnekte Sipariş Detayları(Order Details) tablosunu ara tablo şeklinde kullanarak, Siparişler (Orders) ve Ürünler(Products) tablosundan gerekli bilgileri görüntülenmiştir. Bir sipariş birden fazla ürünü içerebilir ve bir ürün birden fazla siparişte yer alabilir. Sonuç kümemizde Sipariş Detayları (Order Details) tablosundan hiçbir alan görüntülemesekte sorguda kullanmalıyız.

Sorgu:
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 BETWEEN '7/8/96' AND '7/9/96'
ORDER BY OrderDate

Ders 32'ye geçebilirsiniz.

30. OUTER JOIN- CROSS JOIN Kullanımı

  • CROSS JOIN işlemiyle bağladığımız bütün tablolar herhangi bir kısıtlamaya uğramadan olası tüm eşleşmeler sonuç listesinde gösterilir. 
  • Belirli bir ortak alan belirtmeye gerek yoktur.
Örnek: Sorgumuzda 8 tane kategori çeşidi bulunmaktadır. CROSS JOIN yaptığımızda Region tablosuna ait 4 kayıt herbir Çeşit kayıdına bağlanır. Yani 32 tane kayıt listelenir. Çünkü tablolar arası herhangi bir ortak eşleşme tanımlanmamıştır.

Sorgu: SELECT * FROM Categories CROSS JOIN Region


Ders 31'e geçebilirsiniz.

17 Mayıs 2012 Perşembe

29. OUTER JOIN-RIGHT JOIN Kullanımı

  • Birleştirdiğimiz ikinci tablodaki bütün kayıtları sonuç listesinde görmek istediğimiz zaman RIGHT JOIN... ON... işlemini kullanırız. 
  • Böyle bir durumda ise ilk tabloda eşleşmeyen kayıtlar NULL(boş) olarak döner. 
  • Ayrıca birleştirdiğimiz tabloların yazım sırasını değiştirirsek LEFT JOIN ... ON .... işlemiyle aynı sonucu elde etmiş oluruz.

Söz dizimi:
SELECT <sütun ad(lar)ı>
FROM <ilk_tablo>
RIGHT JOIN <ikinci_tablo>
ON <birinci_tablo>.<anahtar alan> = <ikinci_tablo>.<anahtar_alan>

Örnek: Aşağıdaki örnekte tüm müşteriler ve verdikleri siparişler listelenmiştir.Böylece hem müşteri üzerinden her bir müşterinin verdiği siparişleri ve ayrıntılı müşteri bilgilerine ulaşıyoruz.Ayrıca temel bilgi olarak sirapiş tablosuna müşteri tablosunu bağladığımızı siparişlere göre eşleşen müşteri bilgilerinin geldiğini görüyoruz.
Sorgu:
SELECT * FROM Orders AS O
RIGHT OUTER JOIN Customers AS C ON C.CustomerId=O.CustomerID


Ders 30 ' a geçebilirsiniz.



14 Mayıs 2012 Pazartesi

28. OUTER JOIN-LEFT JOIN Kullanımı

  • LEFT veya RIGHT OUTER JOIN ifadeleri ilişkili alanda birbiriyle eşleşenlerin yanında eşleşmeyen kayıtları da listeler. 
  • JOIN koşuluna uymayan satılar NULL(boş) değer olarak görüntülenirler. 

LEFT JOIN

  • LEFT OUTER JOIN ile yazımdaki ilk tablonun tüm satırları listelenir ve diğer tablo ile eşleşmeyen alanlar NULL(boş) değer ile gösterilir. 
  • Eğer tabloların sorgudaki sırası değişirse aynı sonucu elde edebilmek için RIGHT OUTER JOIN kullanılır.
Söz dizimi:     SELECT <sütun_ad(lar)ı> FROM <ilk_tablo>
LEFT JOIN <ikinci_tablo>
ON <ilk_tablo>.<anahtar_alan> = <ikinci_tablo>.<anahtar_alan>
ÖRNEK: Aşağıdaki sorgunun 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.
SORGU:
SELECT Employees.FirstName+' '+Employees.LastName AS Name,OrderID,OrderDate
FROM Employees
LEFT JOIN Orders ON Employees.EmployeeID=Orders.EmployeeID



Ders 29'a geçebilirsiniz.

13 Mayıs 2012 Pazar

27. INNER JOIN Kullanımı

  • SQL de varsayılan (default) olarak kullanılan tablolaları bağlama işlemidir. 
  • Bağlanan tablolarda sadece ilişkili kayıtlar listelenir.
Örnek: Sorgumuzda hangi firmadan hangi ürünü aldığımızı bulmak istiyoruz. Bunun için iki farklı tabloyu birleştirip istediklerimiz SELECT ediyoruz. SELECT * FROM... yaparak da listenen tüm verileri görebilir, istediklerimizi alabiliriz. Diğer bir konuda AS kullanma sebebim daha büyük sorgularla uğraştığımızda bilmeniz gereken bir spde (Stored Procedure) bir tabloya 2 veya daha fazla sorgu cekmeniz gerekebilir. Bunun için ayrı ayrı nesne gibi düşünüp (p,s) gibi üzerinde işlemler yapmak size daha anlaşılabilirlik ve kolaylık sağlayacaktır.

Sorgu:
SELECT ProductName,CompanyName
FROM
Products AS p
INNER JOIN
Suppliers  AS s ON s.Supplierid=p.Supplierid

Ders 28'e geçebilirsiniz.





12 Mayıs 2012 Cumartesi

26. SQL JOIN İşlemleri

  • Bundan önceki derslerimizde hep tek tablo üzerinde çalıştık. 
  • Bazı durumlarda daha anlamlı ve geniş sonuç kümeleri elde edebilmek için birden fazla tablonun verilerine ihtiyacımız olabilir. 
  • Bunun için sorgularımızda iki farklı anahtar kelime daha kullanırız. 
  • Bu anahtar kelimeler JOIN ve ON ifadeleridir. 
  • JOIN ifadesi ile hangi tabloları ve nasıl birleştireceğimizi belirtiriz. 
  • ON ifadesi ile de birleştireceğimiz tabloları hangi alanlar üzerinden bağlayacağımıza karar veririz.
  •  Genelde tablolar Birincil anahtar (Primary Key) ve Yabancı anahtar (Foreign key) üzerinden birleştirilsede diğer alanlar üzerindende birleştirilebilir. Sadece bu alanların aynı türden veri içerdiğinden emin olmanız yeterlidir. 
  • Birincil anahtar (Primary Key) her kayıt için benzersiz (unique) bir değer taşıyan alandır. Örneğin Kişi bilgilerinin tutulduğu bir tabloda TC Kimlik No herkesin farklı olduğu için Primary key olarak kullanılabilir. TC Kimlik No herkesin farklı olduğu için bütün bilgiler bu no üzerinden farklı tablolarda bilgiler tutulabilir.
Ders 27'ye geçebilirsiniz.

6 Mayıs 2012 Pazar

25. COMPUTE ve COMPUTE BY Kullanımı

  • COMPUTE ifadesi tüm sonuç listemizi bize gösterir. 
  • Farklı olarak tek sorguda 2 tane sonuç listesi bize döndürür. 2.liste detay listesidir. 
  • Dikkat etmemiz gereken COMPUTE ile kullandığımız sütun SELECT ifadesinde yer almalıdır. 
  • COMPUTE anahtar sözcüğü sorgumuzdaki sütunlara toplam fonksiyonları uygulamamıza izin verir.
  • COMPUTE BY ile detaylı gruplandırma yapılabilir.
Örnek: Sorgumuzda ürün idsi 3 den küçükleri listeliyoruz. Ayrıntı olarak 2. sonuç kümemizde ürün id si 1 ve 2 olan ürünlerimizin sipariş adetine bakıyoruz.
Sorgu:
SELECT ProductId, OrderId, Quantity
FROM [Order Details]
WHERE ProductId<3
ORDER BY ProductId, OrderId
COMPUTE SUM(Quantity)






Örnek:  Bu sorgumuzda COMPUTE BY nasıl kullanılır onu görüyoruz. Ara toplamlara girerek ayrıntılı sorgulama yapıyoruz. Bu sorgumuzda amacımız hangi ürün id den ne kadar sipariş edilmiş onu öğrenelim.
Sorgu:
SELECT ProductId, OrderId, Quantity
FROM [Order Details]
WHERE ProductId<3
ORDER BY ProductId, OrderId
COMPUTE SUM(Quantity) BY ProductId


Ders 26 'ya geçebilirsiniz.

24. GROUPING Fonksiyonu

  • GROUP BY ile kullanılan ROLLUP ve CUBE ile elde edilen sonuç listesini GROUPING fonksiyonu daha kolay değerlendirip yorumlamamızı sağlar. 
  • GROUPING fonksiyonu ile belirtilen her bir sütun için sonuç listesinde ayrı bir sütun oluşturulur. 
  • Sonuç listesinde oluşturulan bu sütunlarda özet bilgi için 1 , detaylı bilgi için 0 değeri görüntülenir.
Örnek: Sorgumuzda farklı sütunlara dikkat edelim. NULL olan değerler bütün toplamı göstermektedir.
Sorgu:
SELECT ProductId,CategoryId,GROUPING(CategoryId),SUM(UnitPrice )
FROM Products
WHERE UnitPrice BETWEEN 10 AND 11
GROUP BY ProductId,CategoryId,UnitPrice
WITH CUBE

Ders 25'e geçebilirsiniz.

5 Mayıs 2012 Cumartesi

23. WITH CUBE Kullanımı

  • GROUP BY ile belirtilen sütunların tüm olası eşleşmelerini özetler.
  • Ayrıntılı olarak bilmemiz gereken GROUP By ile grupladığımız listemizde CUBE ve ROLLUP komutlarıyla ara toplam işlemleri yapıyoruz.
  • CUBE komutunun ROLLUP dan farkı bütün sütünlarında null ile ara toplamlarını vermesidir.
  • Eğer ROLLUP kullanarak denerseniz Genel toplam dışında ProductName üzerinde ara toplamları vermeyecektir.
Örnek: Sorgumuzda her sütun için ayrıntılı ara toplam değerlerini  görmekteyiz.
Sorgu: 
SELECT ProductName,CategoryID, SUM(UnitsInStock) AS 'Miktar'
FROM Products
WHERE LEN(ProductName)<5
GROUP BY ProductName,CategoryId
WITH CUBE



NOT: Dikkat etmeniz gereken CUBE ile bütün sütunların değerlerine göre ve toplam olarak sonuç listesine yansıtıldığını görürsünüz. Stokta 74 birim ürün var. 1. kategoride 39 ve 7. kategoride 35 ürün var. Karmaşıklığı azaltmak için sonuç listesini kısalttım WHERE koşulunu kaldırarak diğer bütün kategori ve ürünleri görebilirsiniz.

Ders 24'e geçebilirsiniz.