Yazılım Notları
Bilgi Paylaştıkça Çoğalır...

SQL Temelleri

SELECT Cümlesi Nasıl Yazılır. SQL Anahtar Kelimeleri Nelerdir? Seçilen Kayıtlar nasıl süzülür. SQL Cümlelerinde Mantıksal Karşılaştırmalar.

SQL, “Structural Query Language” (Yapısal Sorgu Dili) kelimelerinin ilk harflerinden oluşan bir kısaltmadır. Tıpkı XML gibi yapılandırılmış ve ANSI ve ISO tarafından İlişkisel Veri tabanları için genel kabul görmüş ortak bir sorgulama dilidir. Temel anahtar kelimeleri bütün Veri Tabanı Yönetim Sistemlerinde aynıdır. Ancak bazı Veri Tabanı Yönetim Sistemleri kendilerine özgü fonksiyonlar oluşturmuşlardır. Örneğin, ORACLE’ da INSTR fonksiyonu vardır. Bu fonksiyon belirli bir karakterin bir metin içinde ilk kez kaçıncı sırada geçtiğini geri çevirir. Aynı fonksiyonun SQL Serverdaki karşılığı CHARINDEX tir. Bu küçük farklılıklara rağmen, iki veri tabanın yönetim sisteminin de kullandığı ortak dil SQL dir. Aşağıda, SQL dilinin temel parçaları üzerinde durulacaktır.

 

Anlatımın daha somut ve uygulanabilir olması için, örnek olarak İnsan Kaynakları Yönetim Sistemi veri tabanı ele alınacaktır. Veri tabanı Yönetim Sisteminin SQL Server olduğu kabul edilmiştir.

 

1.  SQL Cümlelerinin Ortak Özellikleri:

     a.  Büyük / Küçük harfe duyarlı değildirler.

     b.  Bir ya da daha fazla satırda yazılabilirler.

     c.  Anahtar kelimeler kısaltılamaz ya da ENTER tuşuyla bir alt satıra geçilip yazılmaya devam edilemez

     d.  Alt cümleler (WHERE, GROUP BY, ORDER BY gibi) genellikle, farklı satırlarda yazılır.

     e.  Okunabilirliği artırmak için satır girintileri kullanılır.

 

2.  Personel Tablosunun oluşturulması

      

CREATE TABLE PERSONEL
( 
  ID  INT   NOT NULL,
  TCKN  BIGINT   NOT NULL,
  ADI  Nvarchar(50) NOT NULL,
  SOYADI Nvarchar(25) NOT NULL,
  EMAIL  Nvarchar(150) NULL,
  MAAS  Decimal(10,2) NULL

)


 

Yukarıdaki Script SQL Server Management Studio üzerinde yeni bir sorgulama penceresinde çalıştırılırsa, seçmiş olduğumuz veri tabanı üzerinde PERSONEL adında bir tablo oluşturulacaktır.

 

Aslında yukarıdaki gibi bir CREATE TABLE cümlesi, konumuzun kapsamı dışındadır (DDL – Data Definition Language) ancak, burada sadece basit bir tablo oluşturma kısmı ele alınmıştır. Birincil Anahtar(Primary Key), İndeks(Index), Kısıt(Constraint) gibi özellikler bu aşamada tabloya eklenmedi çünkü odak noktamız, optimum bir tablo oluşturmak değil, SQL dilinin kullanımı.

 

Yukarıdaki CREATE TABLE cümlesini şu şekilde okuyabilirsiniz:

 

·  PERSONEL Adında bir tablo oluştur. Bu tablonun 5 tane kolonu olsun. Bu kolonlar:

·  ID kolonu (numerik),

·  TCKN kolonu (numerik),

·  ADI kolonu (50 karakter uzunluğuna kadar uzayabilen karakterlerden oluşan),

·  SOYADI kolonu (25 karakter uzunluğuna kadar uzayabilen karakterlerden oluşan),

·  EMAIL kolonu (150 karakter uzunluğuna kadar uzayabilen karakterlerden oluşan)

·  ID, TCKN, ADI, SOYADI alanları her kayıt için mutlaka dolu gelsin (NOT NULL)

·  EMAIL kolonu kayıt sırasında boş bırakılabilsin (NULL).

 

3.  Yine kapsam dışı bir iş daha yapmamız gerekmektedir. O da, biraz önce oluşturduğumuz PERSONEL Tablosuna birkaç kayıt eklemek. SQL dilindeki anahtar kelimelerin kullanımını deneyebilmemiz için PERSONEL tablosunda birkaç kayıta ihtiyacımız bulunmaktadır. Bu kayıtları eklemek için aşağıdaki Script i SSMS New Query ekranında çalıştıralım.

 

INSERT INTO PERSONEL (ID, TCKN, ADI, SOYADI, EMAIL, MAAS) VALUES

                (1,11111111110,'MEHMET'  ,'YILDIZLI'  ,'mhyildizli[at]hotmail.com',1850.28),

                (2,12111111111,'AHMET'  ,'XXXX'  ,'XXX[at]XXX.com',2250.45),

                (3,12211111112,'HAKAN'  ,'XXXX'  , NULL,1450.65),

                (4,12221111113,'Ayşe'  ,'yyyy'  ,'yyyyyy[at]zzzz.com',4500.00),

                (5,12222111114,'Murat'  ,'tttttt'  ,'zzzzz[at]tttt.com',1800.00);

 

4. SELECT Tablodan Veri Seçmek İçin SQL Dilinin Kullanılması (SELECT … FROM)

 

SELECT ID, TCKN, ADI, SOYADI, EMAIL, MAAS FROM PERSONEL

 

SELECT anahtar kelimesi, Veri Tabanı Yönetim sistemine hangi kolonları seçeceğini söyleyeceğimizi belirtir. Bu anahtar kelimeden sonra hangi kolonları seçmek istiyorsak o kolonların adlarını sıralarız. SELECT kısmında kolon adları hangi sırada yazılıyorsa sonuç tablosunda veriler o kolon sırasında gösterilir. Eğer önce TCKN sonra EMAIL yazılırsa (SELECT TCKN, EMAIL FROM PERSONEL) sorgu sonucumuzda önce TCKN kolonu sonra EMAIL kolonu gösterilecektir.

 

Bir tablonun bütün kolonlarını seçmek için ya bütün kolonlarının isimlerini teker teker (yukarıdaki gibi) yazmalıyız, ya da hiçbir kolon adı yazmadan sadece * (yıldız) işareti koymalıyız. Veri tabanı yönetim sistemi (SQL Server Database Engine) * gördüğünde, FROM anahtar kelimesinin belirttiği tablo ya da tablolardaki tüm alanları seçeceğini anlar. Aşağıdaki iki sorgu da aynı sonucu geri çevirir:

 

SELECT ID, TCKN, ADI, SOYADI, EMAIL, MAAS FROM PERSONEL;

SELECT * FROM PERSONEL;


 ID TCKN ADI SOYADI EMAIL  MAAS
1 11111111110 MEHMET YILDIZLI mhyildizli[at]hotmail.com 1850.28
2 12111111111 AHMET XXXX XXX[at]XXX.com 2250.45
3 12211111112 HAKAN XXXX
1450.65
4 12221111113 AHMET yyyy yyyyyy[at]zzzz.com 4500.00
5 12222111114 MEHMET tttttt zzzzz[at]tttt.com 1800.00



(5 row(s) affected)


5.  WHERE
Bir tablodan seçilen kayıtları süzmek için WHERE koşulunu kullanmalısınız. Başka bir değişle, bir tablodan, bir kolonun bazı mantıksal karşılaştırma koşulunu karşılayan kayıtları seçmek için WHERE koşulu kullanılmadır.
 
ADI kolonunun Değeri MEHMET olan kayıtları seçmek için:
SELECT * FROM PERSONEL WHERE ADI='MEHMET';
 
Bu Sorguyu SSMS üzerinde çalıştırdığınızda, aşağıdaki sonucu verir. Bu sorguyu şu şekilde okuyabiliriz:
·  PERSONEL tablosunda [ADI] kolonunun değeri MEHMET olan kayıtları tüm kolonlarıyla birlikte göster.
 
 ID TCKN ADI SOYADI EMAIL MAAS
1 11111111110 MEHMET YILDIZLI mhyildizli[at]hotmail.com 1850.28
5 12222111114 MEHMET tttttt zzzzz[at]tttt.com 1800.00

 
WHERE Koşulu her zaman FROM dan sonra gelir. Yukarıdaki sorguda, bir kolonun bir koşulu Eşit bit şekilde (=) karşılaması durumunu denemiş olduk.
 
ADI kolonunun değeri MEHMET ten farklı olan kayıtları seçmek için:
SELECT * FROM PERSONEL WHERE ADI<>'MEHMET';
 ID TCKN ADI SOYADI EMAIL MAAS
2 12111111111 AHMET XXXX XXX[at]XXX.com 2250.45
3 12211111112 HAKAN XXXX
1450.65
4 12221111113 AHMET yyyy yyyyyy[at]zzzz.com 4500.00

 
 
Burada dikkat edilirse, ADI kolon değerinin MEHMET ten farklı olması koşulunu [< >] işleciyle belirtmiş olduk.
 
2000 TL’den daha fazla maaş alanların listesi:
SELECT * FROM PERSONEL WHERE MAAS>2000;
 ID TCKN ADI SOYADI EMAIL MAAS
2 12111111111 AHMET XXXX XXX[at]XXX.com 2250.45
4 12221111113 AHMET yyyy yyyyyy[at]zzzz.com 4500.00

 
1800 TL ve üzerinde maaş alanların listesi:
SELECT * FROM PERSONEL WHERE MAAS>=1800;
 
 ID TCKN ADI SOYADI EMAIL MAAS
1 11111111110 MEHMET YILDIZLI mhyildizli[at]hotmail.com 1850.28
2 12111111111 AHMET XXXX XXX[at]XXX.com 2250.45
4 12221111113 AHMET yyyy yyyyyy[at]zzzz.com 4500.00
5 12222111114 MEHMET tttttt zzzzz[at]tttt.com 1800.00

 
1800 TL’den daha az maaş alanların listesi:
SELECT * FROM PERSONEL WHERE MAAS<1800;
 
 ID TCKN ADI SOYADI EMAIL MAAS
3 12211111112 HAKAN XXXX
1450.65

 
1800 TL ve daha az maaş alanların listesi:
SELECT * FROM PERSONEL WHERE MAAS<=1800;
 ID TCKN  ADI SOYADI EMAIL MAAS
3 12211111112 HAKAN XXXX
1450.65
5 12222111114 MEHMET Tttttt zzzzz[at]tttt.com 1800.00

 
1800 TL ile 2260 TL arasında maaş alanların listesi:
SELECT * FROM PERSONEL WHERE MAAS BETWEEN 1800 AND 2260 ;
 ID TCKN ADI SOYADI EMAIL MAAS
1 11111111110 MEHMET YILDIZLI mhyildizli[at]hotmail.com 1850.28
2 12111111111 AHMET XXXX XXX[at]XXX.com 2250.45
5 12222111114 MEHMET tttttt zzzzz[at]tttt.com 1800.00

 
Email Adresi Kaydı Olanların Listesi:
SELECT * FROM PERSONEL WHERE EMAIL IS NOT NULL;
 ID TCKN ADI SOYADI EMAIL MAAS
1 11111111110 MEHMET YILDIZLI mhyildizli[at]hotmail.com 1850.28
2 12111111111 AHMET XXXX XXX[at]XXX.com 2250.45
4 12221111113 AHMET yyyy yyyyyy[at]zzzz.com 4500.00
5 12222111114 MEHMET tttttt zzzzz[at]tttt.com 1800.00

 
Email Adresi Olmayanların Listesi:
SELECT * FROM PERSONEL WHERE EMAIL IS NULL;
 ID TCKN ADI SOYADI EMAIL MAAS
3 12211111112 HAKAN XXXX NULL 1450.65


WHERE koşulunda mantıksal karşılaştırmaya tabi tutulan kolonun SELECT kolonları içinde bulunmasına gerek yoktur.
 
6.  GROUP BY
Eğer ortak bir özelliğe sahip kayıtları (bir kolonun değerinin birden fazla kayıt için aynı olması) kendi içinde gruplandırmak isterseniz, WHERE Koşulundan sonra GROUP BY kullanmanız gerekir.
 
SELECT … FROM … WHERE (Eğer varsa)… GROUP BY [Ortak Özelliği Barındıran Kolon Adı]
 
Örneğin, aynı isimde olan kişi sayılarını bulmak için:
SELECT ADI, COUNT(*) AS SAYI FROM PERSONEL GROUP BY ADI;
 ADI SAYI
AHMET 2
HAKAN 1
MEHMET 2

 
Sorgu sonucuna göre PERSONEL Tablomuzda AHMET adında 2 kişi, HAKAN adında 2 kişi ve MEHMET adında 2 kişi kayıtlıdır.
 
Yukarıda GROUP BY ile kullanılan anahtar kelimelerden sadece COUNT olanını kullandık. Benzer şekilde, SUM(MAAS), AVG(MAAS), MAX(MAAS), MIN(MAAS), FIRST(ADI), LAST(ADI)  gibi AGGREGATE fonksiyonları da kullanılabilir.
 
Bu noktada aslında yeni bir kavramla da karşılaşmış olduk: “COUNT(*) AS SAYI
Burada SELECT içinde geçen bir kolon adına AS ile yeni bir kolon adı verebildiğimizi görüyoruz. Bu şekilde, bir kolonu yeniden adlandırmayla o kolona ALIAS vermiş oluyoruz.
 
 
7.  HAVING
Bazı durumlarda GROUP BY ile gruplandırarak yapılan sorgulamalarda aggregate fonksiyonla ulaşılan kolon değerinin mantıksal karşılaştırmaya tabi tutulması gerekebilir. Bu durumda, WHERE koşulu bize çözüm sağlamayacaktır. Bunun yerine GROUP BY ile elde edilen sorgu sonucunun en son olarak HAVING ile mantıksal karşılaştırmaya tabi tutulması gerekir. HAVING kullanımı aşağıda gösterilmiştir.
 
PERSONEL tablosunda aynı ismi taşıyan kişi sayısı 2 olan isimleri listelemek için:
 
SELECT   ADI, COUNT(*) AS SAYI
  FROM  PERSONEL
  GROUP BY  ADI
  HAVING  COUNT(*)=2;
 
 ADI SAYI
AHMET 2
MEHMET 2

 
HAVING cümleciğinde kullanılan alanın SELECT içinde mutlaka bulunması gerekir.
 
8.  ORDER BY
SELECT cümlesi sonucunda elde edilen sonucu sıralamak için ORDER BY cümleciği kullanılması gerekir.
ORDER BY dan sonra hangi kolona göre sıralama yapmak istiyorsak ya o kolonun adı yazılır (ORDER BY ADI gibi) ya da o kolonun SELECT kolonları içindeki indeks sırası yazılır. SELECT içinde geçen ilk kolonun indeksi 1 olarak alınmalıdır.
 
Aşağıdaki iki sorgu da aynı sonucu verir.
 
SELECT * FROM PERSONEL ORDER BY 3
SELECT * FROM PERSONEL ORDER BY ADI
  
 ID TCKN ADI SOYADI EMAIL MAAS
2 12111111111 AHMET XXXX XXX[at]XXX.com 2250.45
4 12221111113 AHMET yyyy yyyyyy[at]zzzz.com 4500.00
3 12211111112 HAKAN XXXX NULL 1450.65
5 12222111114 MEHMET tttttt zzzzz[at]tttt.com 1800.00
1 11111111110 MEHMET YILDIZLI mhyildizli[at]hotmail.com 1850.28

 
Sorgu sonucundan da görüleceği gibi, ORDER BY cümleciğinde sıralama yönü belirtilmezse varsayılan olarak ARTAN (ASCENDING) şekilde sıralama yapar.
 
Eğer AZALAN (DESCENDING) şekilde sıralama yapmak istiyorsanız, ORDER BY [Kolon Adı] DESC yazılması gerekir.
 
SELECT * FROM PERSONEL ORDER BY 3 DESC
SELECT * FROM PERSONEL ORDER BY ADI DESC
 
Eğer sırasıyla birden fazla kolona göre sıralama yapmak isteniyorsa, ORDER BY cümleciği bu doğrultuda aşağıdaki gibi geliştirilebilir:
SELECT * FROM PERSONEL ORDER BY ADI ASC, MAAS DESC;
 
Bu SQL cümlesi çalıştırıldığında, sorgu sonucu önde ADI alanına göre artan, sonra da MAAS alanına göre azalan şekilde sıralanacaktır.
 
SQL Cümlesinde ORDER BY da kullanılacak Kolon Adının SELECT cümleciğinde olmasına gerek yoktur.





 

Banka Hesap Numaralarınızı, IBAN Numaralarınızı bir kere telefonunuza kaydedin. İhtiyaç duyduğunuzda elinizin altında olsun.

Banka Hesaplarım

En Güzel Sözler Uygulaması İçin


En Çok Rating Alanlar
Ana Sayfa       Arama       Valid CSS!