SQL Komutları ve Northwind Veritabanı

İş Tem 17, 2018 No Comments

Screen Shot 2018-07-17 at 12.18.54 AM

Northwind veritabanını kullanarak örneklendirdiğim bazı güzel ve özel SQL komutlarını açıklamalı bir şekilde yazının devamında bulabilirsiniz. Bilgisayarınızda SQL Server Management Studio varmış gibi davranıyorum ve Northwind veritabanını indirip kurma adımlarına geçiyorum.

 

Öncelikle tam olarak şu linkten örnek veritabanımızı indiriyoruz. Ardından indirdiğimiz “SQL2000SampleDb.msi” dosyasını çift tıklayarak çalıştırıyoruz. Next diyerek ilerliyoruz ve kurulum sonrası “C:\SQL Server 2000 Sample Databases” dizini altına gelen “instnwnd.sql” dosyasını SQL Server Management Studio ile açıyoruz.

 

Karşımıza bir sql dosyası çıkıyor. Veritabanımızı bu sql komutlarını çalıştırarak oluşturacağız ancak doğru bir şekilde kurulması için açılan dosyada bazı satırları değiştirmemiz gerekiyor.

exec sp_dboption 'Northwind','trunc. log on chkpt.','true'
exec sp_dboption 'Northwind','select into/bulkcopy','true'
GO

satırlarını yorum satırı haline getirip hemen altına şu satırları ekliyoruz.

ALTER DATABASE Northwind
SET RECOVERY SIMPLE;
GO

sqlfile

Ekledikten sonra “Execute” butonu veya F5 tuşu ile query’yi çalıştırıyoruz.

“Commands completed successfully.” mesajı geldiyse veritabanımız başarılı bir şekilde eklenmiştir. Sol taraftaki ağaçta Databases klasörüne sağ tık > Refresh diyerek yeni eklenen veritabanımızı orada da görebiliriz.

databaseadded

 

Veritabanımız hazır olduğuna göre artık SQL sorgularımıza geçebiliriz. Bu yazımda tüm SQL sorgularını en baştan en sona ayrıntılı bir şekilde anlatmayacağım. Önemli olan ve kullanılması pratiklik sağlayan birkaç komuttan bahsedeceğim. Bunlar; WHERE IN, UNION – UNION ALL, INNER JOIN, LEFT JOIN – RIGHT JOIN – FULL OUTER JOIN, HAVING, BETWEEN ve GROUP BY komutları.

 

WHERE IN

WHERE IN komutu ile başlayalım. Bu komut, daha doğrusu IN komutu, WHERE içerisine çoklu şart koymamıza yarar.

Bir örnekle anlatacak olursak;

Suppliers tablosundaki Country’lerin hangilerine sipariş gönderilmiş bilgisini görmek istiyorum. Eğer IN komutunu kullanmazsak Suppliers’taki ülkeleri bulmam, ve bu ülkeleri “or” ile bağlayarak Orders tablosunda SELECT sorgusu çalıştırmam gerekir. Üşenmedim ve bunu yaptım.

SELECT OrderID, CustomerID, OrderDate, ShipCountry  FROM Orders
WHERE ShipCountry = 'Brazil' or ShipCountry = 'Canada' or ShipCountry = 'Denmark' or ShipCountry = 'Finland' or ShipCountry = 'France' or ShipCountry = 'Germany' or ShipCountry = 'Italy' or ShipCountry = 'Norway' or ShipCountry = 'Spain' or ShipCountry = 'Sweden' or ShipCountry = 'UK' or ShipCountry = ‘USA';

Eğer IN komutunu kullanırsak bu sorgu şu hale geliyor;

SELECT OrderID, CustomerID, OrderDate, ShipCountry  FROM Orders
WHERE ShipCountry IN (‘Brazil' , 'Canada' , 'Denmark' , 'Finland' , 'France' , 'Germany' , 'Italy' , 'Norway' , 'Spain' , 'Sweden' , 'UK' , 'USA');

Yani bizi tekrar tekrar “or” yazma zahmetinden kurtarıyor. Eğer yok ben gidip Suppliers’tan teker teker ülkeleri mi arayacağım, onu da kendisi bulsun derseniz komut biranda şu hale geliyor;

SELECT OrderID, CustomerID, OrderDate, ShipCountry  FROM Orders
WHERE ShipCountry IN (SELECT Country FROM Suppliers);

Gördüğünüz gibi en başta yazdığımız upuzun sorgu ne hale geldi. Bu üç sorgunun da bize getirdiği veri ise tamamen aynı.

WHEREIN1 WHEREIN2 WHEREIN3

 

UNION – UNION ALL

UNION ve UNION ALL komutları aynı sütunlara sahip iki tabloyu alt alta ekleme işlemi için kullanılır. Tek farkı UNION iki tabloda aynı olan kayıtları tek gösterir, UNION ALL ise tekrarlı bir biçimde getirir.

Örnek vermek gerekirse;

SELECT City, Country FROM Customers
WHERE Country='Germany'
UNION
SELECT City, Country FROM Suppliers
WHERE Country='Germany'
ORDER BY City;

UNION ALL ile yazacak olursak;

SELECT City, Country FROM Customers
WHERE Country='Germany'
UNION ALL
SELECT City, Country FROM Suppliers
WHERE Country='Germany'
ORDER BY City;

Sonuçların ekran görüntüleri ise şöyle;

UNION_2
UNION ile çektiğimiz verilerde sadece 1 satır Berlin kaydı varken,

UNIONALL_1

UNION ALL ile çektiğimiz verilerde 2 satır Berlin kaydı görünüyor. Yani her iki tabloda da bulunan Berlin kayıtlarını birleştirmeden, ayrı birer kayıtmış gibi bize getiriyor.

Bir UNION örneği daha vermek istiyorum. Sevdiğim kaynaklardan www.w3schools.com’dan alıntıladığım hoşuma giden bir örnek.

SELECT 'Customer' As Type, ContactName, City, Country
FROM Customers
UNION
SELECT 'Supplier', ContactName, City, Country
FROM Suppliers

UNION1

Bu örnekte Customers ve Suppliers tablolarından çektiği kişi bilgilerine yeni bir kolon açarak hangi tip, customer mı yoksa supplier mı, olduklarına göre isimlendirmiş.

 

INNER JOIN

Gelelim JOIN sorgularına. INNER JOIN veya kısaca JOIN komutu iki tablo arasında eşleşen verileri getiren, başka bir deyiş ile iki tablonun kesişim kümesini getiren sorgudur.

SELECT Orders.OrderID, Customers.ContactName, Orders.OrderDate
FROM Orders INNER JOIN Customers ON Orders.CustomerID=Customers.CustomerID;

Bu sorgu Orders ve Customers tablolarında CustomerID’leri eşleşen kayıtları görmemizi sağlıyor. Böylece iki tabloyu bağlayarak hangi müşteri hangi siparişi vermiş bilgisine ulaşabiliyoruz.

INNERJOIN1

SELECT Orders.OrderID, Customers.ContactName, Shippers.CompanyName
FROM (
(Orders INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID)
INNER JOIN Shippers ON Orders.ShipVia = Shippers.ShipperID);

Bu sorgu ile ise üç tabloyu INNER JOIN komutu ile birbiriyle bağlamış oluyoruz. Çektiğimiz veri ise tüm siparişlerin hangi müşteriden geldiği ve hangi nakliyeci ile gönderileceği bilgilerini içeriyor.

INNERJOIN2

 

LEFT JOIN – RIGHT JOIN – FULL OUTER JOIN

Bu JOIN komutlarında ise komuta göre soldaki, sağdaki veya iki tablonun tüm verileri alınır, kesişen veriler ilgili yerlere gelir, kesişmeyen verilerin ise kesişmeyen kolonları NULL değeri döndürür.

Bir örnek ile daha iyi açıklayabileceğimi düşünüyorum çünkü bu sorguları bir cümle ile anlatmak gerçekten karmaşık olabiliyor.

SELECT c.ContactName, e.FirstName + ' ' + e.LastName AS EmployeeName
FROM Customers AS c
LEFT JOIN Employees AS e ON c.Country = e.Country
ORDER BY c.ContactName;

LEFTJOIN1

Burada soldaki tablonun yani Customers tablosunun tüm kayıtları geliyor, aynı ülkede yaşayan Employee varsa yanına da o yazılıyor. Eğer aynı ülkede yaşayan Employee yoksa NULL değeri dönüyor. RIGHT JOIN demiş olsaydık bu sefer Employees tablosunun tüm kayıtları gelecek, Customer’lardan ise sadece Employee ile aynı ülkede yaşayanlar gelecek ve ilgili Employee’nin yanına yazılacaktı. Employees.Country = Customers.Country şartını sağlamayan bir kayıt var ise Employee’nin yanına NULL değeri yazılacaktı.

FULL OUTER JOIN sorgusunda ise her iki tablonun da tüm satırları geliyor, kesişenler yanyana yazılıyor, kesişmeyenlerin ise yanlarına yine NULL değerleri geliyor.

SELECT c.ContactName, e.FirstName + ' ' + e.LastName AS EmployeeName
FROM Customers AS c
FULL OUTER JOIN Employees AS e ON c.City = e.City
ORDER BY c.ContactName;

FULLOUTERJOIN1

 

HAVING

SELECT COUNT(CustomerID), Country FROM Customers
GROUP BY Country HAVING COUNT(CustomerID) > 5;

Bu komutu direk bir örnek üzerinden açıklayacak olursak, yukarıda yazılmış olan sorgu tüm ülkelerden 5ten fazla müşterisi olanları listeleyen bir sorgudur. Döndürdüğü veri tablosu ise şöyledir;

HAVING1

Eğer “HAVING COUNT(CustomerID) > 5” yazmasaydık müşteri sayısı 5 ve 5’ten küçük olan ülkeleri de bize gösterecekti.

Yine HAVING sorgusunu kullanarak biraz daha karmaşık bir sorgu yazacak olursak;

SELECT Employees.LastName, COUNT(Orders.OrderID) AS NumberOfOrders FROM Orders
INNER JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID
WHERE LastName = 'Davolio' OR LastName = 'Fuller' GROUP BY LastName
HAVING COUNT(Orders.OrderID) > 25;

Bu sorgu ise soyadı “Davolio” veya “Fuller” olan ve 25’ten fazla sipariş veren kişileri gruplayarak(birleştirerek) döndürüyor.

HAVING2

 

BETWEEN

BETWEEN sorgusunda verilen başlangıç ve bitiş değerleri istenen veriye dahildir.

SELECT * FROM Orders
WHERE OrderDate BETWEEN '07/04/1996' AND ’07/09/1996';

BETWEEN1

 

GROUP BY

GROUP BY genellikle COUNT, MAX, MIN, SUM, AVG gibi fonksiyonlar ile beraber kullanılır ve gruplama yaparak tekrar eden verileri tek satırda gösterir.

SELECT Count(OrderID) AS HowMany, ShipCountry FROM dbo.Orders GROUP BY ShipCountry

Bu sorguda istenen hangi ülkeye kaç sipariş gittiği bilgisidir. Normalde Orders tablosunda örneğin 1’den fazla Finland siparişi varken burada tek bir satırda, toplam kaç tane Finland siparişi olduğunu bize gösterebilir.

GROUPBY1

SELECT Count(SupplierID) AS HowMany, Country  FROM dbo.Suppliers GROUP BY Country

Yine bu sorguda da hangi ülkeden kaçar tane tedarikçi olduğu bilgisine ulaşabiliriz.

GROUPBY2

SELECT Shippers.CompanyName, COUNT(Orders.OrderID) AS NumberOfOrders FROM Orders LEFT JOIN Shippers ON Orders.ShipVia = Shippers.ShipperID
GROUP BY CompanyName;

GROUPBY3

Bu sorgu ile de nakliyecilerin kaçar adet sipariş ulaştırmış olduğu bilgisini görüyoruz.

 

Sıkça kullanılan ve kullanılınca çok işe yarayan, hatta takla attıran SQL komutlarından bazıları işte bu şekilde. Notlara eklendi.

 

İrem.

irem

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir