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

SQL'de UNIQUE Kullanımı

  • SQL'de oluşturmuş olduğumuz tablolar içinde yer alan her bir kolonda eşsiz şekilde, yani benzersiz birbirinden farklı veriler bulunmasını isteyebiliriz.
  • Bunun için bu tür alanlar tanımlanırken Unique Key Contsraint tanımı yapılır.
  • Unique Key Contsraint tanımının Primary Key den farkı Unique Key'in bir tabloda birden fazla olmasıdır,  Primary Key ise tabloda sadece 1 adet olabilir. NULL veriler de içerebilir. 
  • Ayrıca tablolarımızı oluştururken UNIQUE kısıtlaması yapabildiğimiz gibi, daha sonradan var olan tablolar üzerinde de UNIQUE kısıtlaması yapabiliriz.  
  • Bir tabloda birden çok UNIQUE sınırlaması getirilebilinir fakat sadece bir tane PRIMARY KEY sınırlaması getirilebilinir.
NOT: Primary Key alanı tanımlandığında otomatik olarak UNIQUE olarak oluşur. 

Yeni bir tablo oluşturulmasında Unique Key Contsraint Kullanımı:
CREATE TABLE Yazarlar
(
No int NOT NULL UNIQUE,
Soyad varchar(255) NOT NULL,
Ad varchar(255),
Yayinevi varchar(255)
)

Yeni bir tablo oluşturulmasında birden fazla alanda Unique Key Contsraint Kullanımı:
CREATE TABLE Yazarlar
(
id int NOT NULL,
adi_soyadi varchar(20) NOT NULL ,
Yayinevi varchar(20),
CONSTRAINT id_no UNIQUE (id,adi_soyadi)
)

Var olan tabloda sonradan ekleme yaparken Unique ve ALTER Kullanımı:
ALTER TABLE Yazarlar
ADD UNIQUE (No)

Birden fazla alanda ekleme yaparken Unique ve ALTER Kullanımı:
ALTER TABLE Yazarlar
ADD CONSTRAINT  id_no UNIQUE (id,adi_soyadi)

UNIQUE alanı normale çevirmek istersek DROP ifadesini kullanmamız gerekir:
ALTER TABLE Yazarlar
DROP  CONSTRAINT id_no

Birden fazla alanda UNIQUE işlemi yaptıysak, CONSTRAINT ifadesinden sonra tablomuzdaki alan adı değil, oluşturduğumuz index adı yazılmalıdır. Eğer tek bir alanda oluşturduysak CONSTRAINT  ifadesinden sonra sadece alana adını yazabiliriz.

SQL'de SELECT INTO Kullanımı

  • SQL'de bir tablodan çektiğimiz verileri, yeni bir tablo olusturup, bu tabloya yazabiliriz. 
  • SELECT INTO ile veritabanı üzerindeki verilerle kopya veritabanları oluşturabiliriz.
  • SELECT INTO genelde geçici çalışma tabloları oluşturmak için tercih edilir.
SELECT INTO Kullanımı:

SELECT kolon_ad(ları) INTO [yeni_veritabanı.dbo]yeni_tablo_adı FROM kaynak 

Örnek Sorgu: SELECT * INTO KITAPLAR.dbo.Bilimkurgu_Yedek FROM KITAPLAR.dbo.Bilimkurgu


SQL'de BREAK ve CONTINUE Kullanımları

  • Koşulumuz yerine getirildiğinde döngüden çıkmak için BREAK komutu kullanılır. 
  • BREAK komutu gereksiz yeri elimizdeki bütün verilerin kontrolünü engeller. 
  • İstenilen veriye ulaştığımız zaman diğerlerini atlayarak döngüden veya listeden çıkmamızı sağlar.

CONTINUE komutunu bir döngüde işlemler devam ederken bazı durumlarda işlem yapılmasın istiyorsak kullanabiliriz.


SQL'de WHILE Döngüsünün Kullanımı

  • İfadelerin belli bir koşul gerçekleşinceye kadar çalışmasını sağlar. 
  • Şart ifadesi false oluncaya kadar ifadeler yinelenir. 
  • Şart gerçekleştiği sürece BEGIN…END arasındaki kod çalışır.
WHILE Döngüsü Kullanımı:
WHILE şart
BEGIN
     Döngüye girmesi istenen kodlar
END

Örnek Sorgu: Örneğimizde WHILE Döngüsü içerisinde @sayac değişkeninin o an ki değerini ve karesini Print ile yazdırdık. Döngü içerisinde @sayac değişkenini sürekli 1 artırdık ve @sayac değişkeninin değeri 5’e eşit oluncaya kadar döngüye girmesini sağladık.

SQL'de CASE…WHEN Yapısının Kullanımı

  • Bu yapı SQL'de sorgu sonucu dönen bir kolonun değerine göre farklı işlemler yapabilmemize olanak saglar. İstediğimiz bir kolonun değerini belirli şartları kontrol ederek yeni bir değerle değiştirmek için kullanabiliriz. 
  • SELECT yada UPDATE ifadeleri ile birlikte kullanılır. 
  • CASE ifadesi IF gibi tek başına kullanılamaz. Çünkü komut değil bir işlevdir. 
NOT : Örnek sorgulamalarda Northwind Database'i kullanacağım. bk: Nortwind Database Kurulumu 
CASE…WHEN Kullanımı:
CASE koşula girecek değer
     WHEN değer THEN işlem
     WHEN değer THEN işlem
ELSE işlem
END

Örnek Sorgu:

SQL'de IF…ELSE Yapısının Kullanımı

Merhabalar, 
Bu makalemde SQL'de  IF…ELSE yapısının kullanımını anlatmaya çalışacağım.
  • Programlama dillerinde olduğu gibi SQL'de de kontroller kullanılır.
  • Kontroller BEGIN deyimi ile başlayıp END deyimi ile biten kod blokları arasında yazılır.
NOT : Örnek sorgulamalarda Northwind Database'i kullanacağım. bk: Nortwind Database Kurulumu 
IF…ELSE Karar Yapısı:
Bizim belirlediğimiz şartları kontrol eder. Bu şartların doğru olması halinde farklı işlemler, yanlış olması halinde farklı işlemler yapılmasını sağlar.

IF…ELSE Kullanımı: 
IF(Şart1)
BEGIN
    İşlemlerimiz
END

ELSE IF(Şart2)
BEGIN
    İşlemlerimiz
END

ELSE
BEGIN
    İşlemlerimiz
END

Örnek Sorgu:
DECLARE @urunsay INT
SET @urunsay=(SELECT Products.UnitsInStock
FROM Products
WHERE Products.ProductID=4)
IF(@urunsay<20)
BEGIN
PRINT 'ProductID 2 olan ürünün stoğu kritik seviyede'
END
ELSE
BEGIN
PRINT 'Ürün için yeterli miktarda stok mevcut'
END


SQL'de String Fonksiyonları

  • SQL'de karakter değerleri üzerinde işlem yapmak için String (karakter) fonksiyonları kullanılır.

SQL'de Tarih ve Zaman Fonksiyonları

  • Tarih ve zaman fonksiyonları, MSSQL kurulumunda hazır olarak gelen, tarih ve zaman ifadeleri üzerinde işlem yapabilmemizi sağlayan fonksiyonlardır.
GETDATE() Fonksiyonu: Sistemin anlık tarih ve saat değerini döndürür.



DATEADD() Fonksiyonu: Başa yazılan parametre cinsinden zamanı belirtilen ölçüde arttırır.

NOT: Bu fonksiyonda dd(gün) mm(ay) yy(yıl) anlamına gelmektedir.

Örneğimiz de  DATEADD Fonksiyonu ile 2014.08.23 tarihine 2 gün eklemekteyiz.

DATEDIFF() Fonksiyonu: Başa yazılan parametre (Hafta için 'wk' Gün için 'dd' Saat için 'hh' Dakika için 'mi' Saniye için 'ss') cinsinden iki tarih arasındaki farkı döndürür.



DATEPART() Fonksiyonu: Verilen tarih-saat parametresini parçalarına ayırıp istenilen parçayı almaya yarar.


ISDATE() Fonksiyonu: Girilen string değeri tarih formatına uygunsa 1, değilse 0 döner.



SYSDATETIME() ve SYSDATETIMEOFFSET() Fonksiyonları: 
SYSDATETIME Timestamp değerini bölgesel saat farklılıklarını göstermeden döner.
SYSDATETIMEOFFSET Tarih ve saati bölgesel saat farklılıklarıyla beraber döner.




SQL'de PRINT Kullanımı

  • Değişkenlerin değerlerini, hataları ve diğer ihtiyaç duyulan durumlarda PRINT komutu kullanılır. DEBUG işlemi için ihtiyaç duyulan bir komuttur.
PRINT Kullanımı : PRINT @<Değişken_Adı>

Örnek Sorgu: soyad değişkeninin içeriği PRINT ile gösterilmiş olacaktır.

DECLARE @soyad VARCHAR(15) SELECT @soyad=’Bayraktar’ PRINT @soyad

SQL'de DECLARE & SET Kullanımı

  • SQL'de değişken tanımlamalarında DECLARE komutu kullanılır.    
  • Tanımladığımız değişken için değer atama işlemlerinde SET komutu kullanılır. 

DECLARE & SET Kullanımı : DECLARE @<Değişken_Adı> <Değişken_tipi>

NOT : Örnek sorgulamalarda Northwind Database'i kullanacağım. bk: Nortwind Database Kurulumu


Örnek Sorgu: Products tablomuzdaki en yüksek birim fiyata sahip ürünü DECLARE komutu ile değişken tanımlayıp SET ile atamasını yapalım ve MAX fonksiyonu ile en büyük değeri bulup listeleyelim.

DECLARE @enyüksek_birimfiyat MONEY
SET @enyüksek_birimfiyat=(select max(UnitPrice) from Products)
SELECT @enyüksek_birimfiyat AS 'Birim fiyatı en yüksek ürün'


SQL'de USE, ALTER ve DROP Kullanımları

USE Kullanımı
  • USE kullanımı hangi database üzerinde işlem yapacağımızı belirtir.
  • New Query (Ctrl+N) ile yeni sorgu penceremizi açtığımızda default olarak gelen database Available Databases kutucuğunda görünmektedir.
 USE Kullanımı: USE <veritabanı adı>


ALTER ve DROP Kullanımları

Bir tablo kullanılmaya başlandıktan sonra kullanıcılar tablolarda mevcut bulunan verilere ilişkin ek bilgiler depolama ihtiyacı hissederler.

ALTER Kullanımı: ALTER <Nesne_Adı>  <Değişim_Cümlesi>

Örnek Sorgu 1: SQL'de CREATE Kullanımı başlıklı yazımda oluşturduğumuz Kitaplar veritabanında mevcut Bilimkurgu tablomuza yeni bir sütun ekleyip değerinin ise NULL olabilir şekilde ayarlayalım.

ALTER TABLE Bilimkurgu ADD Sayfa INT NULL


Örnek Sorgu 2: Bilimkurgu tablomuzda önceden kaydettiğimiz bir sütunun özelliğini değiştirelim. Yazar alanı 25 karakter değer alabilirken biz bu değeri 30 karakter ile değiştirelim.

ALTER TABLE Bilimkurgu ALTER COLUMN Yazar VARCHAR(30)

Tablo Silmek (DROP TABLE)

Veritabanların yapısı zamanla değişir ve büyür. Yeni değerleri temsil eden yeni tablolar oluşturulur ve bazen eski tablolara gereksinim duyulmaz. Gereksinim duyulmayan bir tabloyu veritabanından silmek için DROP TABLE ifadesini kullanırız.

DROP TABLE Bilimkurgu

Veritabanımızdan Bilimkurgu tablomuzu siler.

NOT: DROP TABLE ifadesi veritabanından bir tablo sildiğinde tablonun tanımı ve tüm içeriği kaybolur.

SQL'de CREATE Kullanımı

  • CREATE TABLE ifadesi veritabanında yeni bir tablo oluşturmamızı sağlar.
  • CREATE DATABASE ifadesi yeni bir veritabanı oluşturmamızı sağlar.
Örnek Sorgu :  CREATE DATABASE ifadesi ile veritabanı yaratalım…ve bu veritabanında tablolar oluşturalım.

CREATE DATABASE KITAPLAR
CREATE TABLE Bilimkurgu(BlkrgId INT,Name VARCHAR(25) )



SQL'de DELETE Kullanımı

  • DELETE ifadesi tablodaki satırları silmek için kullanılır.
  • DELETE ifadesi içerisinde WHERE isteğe bağlıdır
  • Koşul belirtilmez ise bütün kayıtları tablomuzdan siler.
  • DELETE ifadesi ile kayıtlar silinse dahi tablo  ve sütünların tanımı  veritabanında saklanır.
  • Potansiyel riskler nedeniyle DELETE ifadesi kullanılırken her zaman bir arama koşulu tanımlanmalıdır.
DELETE Kullanımı: DELETE FROM <tablo adı> WHERE <sütun adı>=<aranan değer>

NOT : Örnek sorgulamalarda Northwind Database'i kullanacağım. bk: Nortwind Database Kurulumu 

Örnek Sorgu : Employees (Çalışanlar) tablumuzda EmployeeID'si 5 olan kaydı silelim.

DELETE FROM Employees WHERE EmployeeID=5 SELECT * FROM Employees

SQL'de UPDATE Kullanımı

  • UPDATE ifadesi tek bir tablonun seçili satırlarını yada daha fazla sütundaki değerleri günceller.
  • Güncellenecek hedef tablo, ifadede adlandırılır ve tabloyu güncellenecek olan ayrı sütunların herbirini değiştirmek için gerekli izne sahip olunması gereklidir.
  • Kullanılacak WHERE ifadesi tablonun güncellenecek olan satırlarını belirler.
  • SET  cümleciği ise hangi sütunların güncelleneceğini belirler ve bunların güncel değerini hesaplar.
UPDATE Kullanımı: UPDATE <tablo adı> SET <sütun adı> = <yeni değer> WHERE <sütun adı> = <eski değer> 

NOT : Örnek sorgulamalarda Northwind Database'i kullanacağım. bk: Nortwind Database Kurulumu 

Örnek Sorgu : Müşteri kodu (CustomerID) "BERGS" olan kayıtların Görüşülecek Kişi (ContactName) ve City alanlarını güncelleyelim. Koşul kısmında belirttiğimiz alan Birincil Alan olduğundan sadece tekbir satır güncellenecektir. Sorgunun sonucunu basit bir SELECT sorgusu ile kontrol edebilirsiniz.

UPDATE Customers SET ContactName='Bayraktar',City='Berlin' WHERE CustomerID='BERGS'

SQL'de INSERT INTO…VALUES Kullanımı

  • INSERT kullanımından farklı olarak istenilen sütunlara kayıt işlemi yapmamızı sağlar.
  • 2 farklı kullanım şekli vardır.
INSERT INTO…VALUES Kullanımı 1 : INSERT INTO tablo_adı VALUES (değer1, değer2,....)
INSERT INTO…VALUES Kullanımı 2 : INSERT INTO tablo_adı (sütun1, sütun2,…) VALUES (değer1, değer2,....)
 
NOT : Örnek sorgulamalarda Northwind Database'i kullanacağım. bk: Nortwind Database Kurulumu 
 
Örnek Sorgu : Customers tablosuna sadece müşteri kodu (CustomerID) ve Firma adı (CompanyName) verilerinin girildiği bir kayıt ekleyelim.
 

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