Yazdır
Kategori: C #
Gösterim: 357

SELECT SORGUSU

Select sorguları bir veya daha fazla tablodan istenilen bilgileri alarak görüntülemek için kullanılır. Select sorguları sadece listeleme işi yapar, tablo(ların) orjinal hallerinde bir değişiklik yaratmazlar.

Select komutundan sonra görüntülenecek alanların ismi yazılır.

From komutu ile bu alanların yer aldığı tablonun ismi belirtilir.

Eğer kayıtlara sınırlama getirilecek ise Where komutu ile birlikte koşul belirtilir.

Kayıtların artan ya da azalan şekilde sıralanarak listelenmesi isteniyorsa Order By komutu kullanılır.

Aşağıda örnek bir tablo oluşturulup bu tablo için örnek sorgular yazılmıştır.

Tablo Adı: Personel

kimlik

adi

soyadi

diplomanotu

cinsiyeti

sehir

1

Ahmet

Öztürk

38

E

İstanbul

2

Veysel

Göktürk

47

E

Ankara

3

Şükran

Şentürk

74

K

Sakarya

4

Ahmet

Ali

84

E

Çanakkale

5

Salih

Yılmaz

 

E

İstanbul

 

 

 

 

 

 

 

 

 

 

 

 

SELECT adi, soyadi FROM personel

Personel tablosundaki adi ve soyadi alanlarındaki tüm kayıtları listeler.

SELECT * FROM personel

Personel tablosundaki tüm alanlardaki kayıtları listeler.

Where Kullanımı

Where komutu listelenecek kayıtların filtrelenmesini sağlar. Where kullanmadığımızda tablodaki tüm kayıtların belirtilen alanları listelenecektir. Where komutundan sonra bir veya birden fazla şart belirtirsek, sadece bu şart(lara) uyan kayıtlar listelenecektir.

SELECT * FROM personel WHERE cinsiyeti=”E”

Personel tablosunda cinsiyeti "E" olan kayıtların tüm alanlarını listeler.

SELECT adi, soyadi FROM personel WHERE diplomanotu>=70 AND cinsiyeti=”E”

Personel tablosunda diploma notu 70'ten büyük olan ve cinsiyeti "E" olan kayıtların adi ve soyadi alanlarını listeler. İki şartın arasına And operatörü yazıldığı için bu şartların ikisinin de tutması gerekir.

SELECT adi, soyadi FROM personel WHERE diplomanotu>=70 AND diplomanotu<=100

Personel tablosunda diploma notu 70'ten büyük ve diploma notu 100'den küçük olan kayıtların adi ve soyadi alanlarını listeler.

SELECT adi, soyadi FROM personel WHERE diplomanotu BETWEEN 70 AND 100

Bir üstteki sorgu ile aynı işi yapar. Personel tablosunda diploma notu 70 ile 100 arasında olan kayıtların adi ve soyadi alanlarını listeler.

SELECT adi + “ “ +soyadi FROM personel

Personel tablosundaki tüm kayıtların, adi ve soyadi alanlarını, aralarında bir boşluk olacak şekilde birleştirerek listeler. + operatörü kullanılarak metin türündeki alanların birleştirilmesi, sayı türündeki alanların ise toplanması sağlanabilir.

Sayı türündeki alanlar ile diğer matematiksel işlemler de gerçekleştirilebilir.

SELECT adi, soyadi, maasi / 100 FROM personel

Yukarıdaki örnekte adi, soyadi alanları ve maasi alanının 100'e bölünmüş hali listelenecektir.

As Komutu Kullanımı

Kayıtlar listelendiğinde sütun başlıkları veritabanındaki başlık ile aynı görünecektir. Listeleme sırasında görünecek başlıkları değiştirmek istersek As komutu kullanabiliriz. Bu kullanım tablodaki sütun başlığını değiştirmez, sadece listelerken farklı görünmesini sağlar.

SELECT adi AS Adı, soyadi AS Soyadı FROM personel

Personel tablosundaki tüm kayıtların, adi alanlarını başlığı "Adı" olacak şekilde, soyadi alanlarını ise başlığı "Soyadı" olacak şekilde listeler.

SELECT adi & “ “ & soyadi AS AdSoyad FROM personel

Metin türündeki alanları birleştirmek için & operatörü de kullanılabilir. Örnekte iki alan birleştirilirken As komutu kullanılarak sütun başlığı AdSoyad yapılmıştır.

Like Komutu İle Arama

Metin türündeki alanlarda bir ifadeyi aramak için kullanılır. Aranan ifadenin önüne ya da sonuna * % gibi özel ifadeler yazılarak arama özelleştirilebilir.

* ifadesi Access için geçerliyken, Sql Server'da % işareti kullanmak gerekir. Yine Access programında çift tırnak kullanılırken, Sql Server'da tek tırnak kullanılarak sabit metinler belirtilir.

SELECT * FROM personel WHERE adi LIKE “A*” OR diplomanotu<45
SELECT * FROM personel WHERE adi LIKE ‘A%’ OR diplomanotu<45  (Sql Server için)

Personel tablosunda adi alanı "A" ile başlayan (devamı ne olursa olsun) veya diplomanotu alanı 45'ten küçük olan kayıtların tüm alanlarını listeler.

SELECT * FROM personel WHERE adi NOT LIKE “A*” OR diplomanotu<45

Personel tablosunda adi alanı "A" ile başlamayan veya diplomanotu alanı 45'ten küçük olan kayıtların tüm alanlarını listeler.

Sql dilindeki diğer joker karakterler:

_ (Alt tire): Tek bir karakter gelebilir.

[bsz] belirtilen karakterlerden biri gelebilir (bsz)

[a-d] a ile d harfleri arasındaki tüm harflerden biri gelebilir (a, b, c, d)

[!abc] belirtilen karakterler hariç herhangi bir karakter gelebilir.

SELECT * FROM personel
WHERE adi LIKE ‘A[bds]%[a-g]’ 

Yukarıdaki örnekte adi alanının belirtilen şarta uyması için ilk harfi A olmalı, ikinci harfi b veya d olmalı, sonrasında istenen uzunlukta metin gelebilir, son harfi ise a ile g arasında olmalı. Mesela Asiye..

In Komutu Kullanımı

Tablodaki bir alanın birden fazla değer eşit olabilme ihtimali varsa, bu şartları Or kullanarak ayrı ayrı yazmak yerine, In komutu ile belirtebiliriz. Belirtilen alan In parantezine yazılan değerlerden birine eşitse o kayıt listelenecektir.

SELECT * FROM personel WHERE sehir IN("İstanbul","Ankara") AND soyadi IN("Öztürk","Ali","Göksu","Yılmaz" ) 

Personel tablosunda sehir alanı "İstanbul" veya "Ankara olan ve soyadi alanı "Öztürk, Ali, Gösu, Yılmaz" değerlerinden biri olan kayıtların tüm alanlarını listeler. In komutu sayesinde parantez içerisinde verilen değerlerden birisi olacak şekilde kısıtlama getirebiliriz.

Is Null Kullanımı

Belirtilen alanın boş olduğu kayıtları seçmek için is null, boş olmayanları seçmek içinse is not null şeklinde kullanabiliriz.

SELECT * FROM personel WHERE diplomanotu Is Null

Personel tablosunda diplomanotu alanı boş olan kayıtların tüm alanlarını listeler.

SELECT * FROM personel WHERE diplomanotu Is Not Null

Personel tablosunda diplomanotu alanı boş olmayan kayıtların tüm alanlarını listeler.

Order By Kullanımı

Kayıtların listelenirken belli bir alandaki veriye göre, artan (küçükten büyüğe - ASC) veya azalan (büyükten küçüğer - DESC) şekilde sıralanmasını sağlar. Asc veya desc belirtilmezse, varsayılan olarak Asc kabul edilir ve artan sıralama yapılır.

SELECT * FROM personel ORDER BY diplomanotu DESC

Personel tablosundaki tüm kayıt ve alanları, diplomanotu alanına göre azalan şekilde sıralayarak listeler.

SELECT adi, soyadi FROM personel ORDER BY diplomanotu

Personel tablosundaki tüm kayıtların adi ve soyadi alanlarını, diplomanotu alanına göre artan şekilde sıralayarak listeler.

SELECT adi, soyadi FROM personel WHERE cinsiyeti=”E” ORDER BY diplomanotu DESC

Personel tablosunda cinsiyeti alanı "E" olan kayıtların adi ve soyadi alanlarını, diplomanotu alanına göre azalan şekilde sıralayarak listeler.

SELECT * FROM personel ORDER BY diplomanotu DESC, adi ASC, soyadi DESC, kimlik

Personel tablosundaki tüm kayıt ve alanları;
öncelikle diplomanotu alanına göre azalan,
diplomanotu eşit ise adi alanına göre artan,
adi alanı da eşit ise soyadi alanına göre azalan,
soyadi alanı da eşit ise kimlik alanına göre artan şekilde sıralayarak listeler.

Top Komutu

Listelenen kayıtların tamamını değil de belli bir miktarını almak için kullanılır. Örneğin sınav notuna göre ilk 3 öğrenciyi listelemek gibi..

SELECT TOP 5 adi, soyadi FROM matematik ORDER BY sinav1 DESC

Kayıtların belli bir yüzdesi de elde edilebilir. Örneğin maaşlarına göre sıralanan çalışanların yüzde 25 kadarını listelemek için:

SELECT TOP 25 PERCENT adi, soyadi FROM personel ORDER BY maas DESC

Distinct Kullanımı

Bazen kullanılan tabloda aynı kayıtlar birden fazla defa geçebilir. Böyle durumlarda aynı değerlerin yalnızca bir defa listelenmesini istersek Distinct komutunu kullanabiliriz.

Örneğin en üstteki tabloda İstanbul iki defa geçmektedir. Aşağıdaki sorgu çalıştırıldığında İstanbul bir defa listelenecektir.

SELECT DISTINCT sehir FROM personel

 

*** SQL Server için bu sorgular yazılacak ise çift tırnakların yerine tek tırnak konmalıdır.

 

Join Komutları ile Tabloları Birleştirme

İki farklı tablodan, belirtilen alanları eşleştirerek listeleme yapmamızı sağlar.

Örnek olarak aşağıda iki tablo verilmiştir. Matematik tablosunda öğrencilerin isimleri gereksiz yere yazılmamış, numaraları kullanılarak belirtilmişlerdir.

ogrenciBilgileri Tablosu:
numarasi adi soyadi tcNo cinsiyet
112 Ayşe Keser 12345678910 k
134 Hasan Tahsin 11345678910 e
234 Ahmet Yılmaz 11145678910 e
243 Hayriye Çınar 11115678910 k
156 Aylin Keskin 12541254125 k

 

Matematik tablosu:
numarasi sinav1 sinav2 sinav3
95 10 20 45
112 55 44 66
134 33 55 77
234 22 55 88
243 11 55 99

Öğrencilerin matematik notları listelendiğinde, bu tabloda öğrenci adları bulunmadığı için hangi öğrencinin kaç aldığı kolay anlaşılmayacaktır. Bunun için iki tablo birleştirilmeli, matematik tablosundaki her numara için diğer tabloya bakılarak o öğrencinin ad ve soyadı bulunmalıdır. 

İşte gerekli eşleşmeyi sağlayarak tabloları birleştirmek için Inner Join komutları kullanılır.

 

Select ogrenciBilgileri.adi, ogrenciBilgileri.soyadi, Matematik.sinav1
From Matematik Inner Join ogrenciBilgileri
on ( Matematik.numarasi=ogrenciBilgileri.numarasi )

Yukarıdaki sorguyu inceleyiniz. İki tablodaki verilerin, numarasi alanlarına göre eşleştirme yapılarak listelenmesi sağlanmıştır.

Inner Join komutu ile birleştirilecek tablolar belirtilmiş, on komutu ile de farklı tablolardaki kayıtların nasıl eşleştirileceği belirtilmiştir.

Birden fazla tablo bulunduğu için alan isimlerinden önce tablo adları da belirtilmelidir.

Join komutu 4 farklı şekilde kullanılabilir.

 

1. Inner Join

Eşleşmenin yapılmasını istediğimiz alanlarda boş olan kayıtları eleyerek sonuca dahil etmez.

Aşağıdaki örneğe göre düşünürsek, tablolardan birinde yer almayan numaralar listelenmeyecektir. Yani 1. tablodaki 156 numaralı kayıt, diğer tablo ile eşleşmeyeceği için sonuca dahil edilmeyecektir. Aynı şekilde 2. tablodaki 95 numaralı öğrenci de listelenmeyecektir.

 

Select ogrenciBilgileri.adi, ogrenciBilgileri.soyadi, Matematik.sinav1
From Matematik Inner Join ogrenciBilgileri
on ( Matematik.numarasi=ogrenciBilgileri.numarasi ) 

2. Left Join (Left Outer Join)

Birinci tablonun yani Left Join komutunun soluna yazılan tabloda var olan tüm numaralar, diğer tabloda olmasalar bile listelemeye dahil edilir.

Bu örnekte ilk tabloda bulunup diğer tabloda bulunmayan 156 numaralı öğrenci de listelenecektir.

 

Select ogrenciBilgileri.adi, ogrenciBilgileri.soyadi, Matematik.sinav1
From ogrenciBilgileri Left Join matematik
on ( Matematik.numarasi=ogrenciBilgileri.numarasi )

3. Right Join (Right Outer Join)

Left join komutunun tersi gibi düşünülebilir. Bu sefer sağ tarafa yazılan tablodaki tüm kayıtlar listelemeye dahil edilecektir.

Aşağıdaki sorgu çalıştığında 2. tablodaki 95 numaralı öğrenci, ilk tabloda olmasa da listelemeye dahil edilecektir. Tabi adı ve soyadı boş kalacaktır çünkü ilk tabloda onunla eşleşen bir bilgi olmayacaktır.

 

Select ogrenciBilgileri.adi, ogrenciBilgileri.soyadi, Matematik.sinav1
From ogrenciBilgileri Right Join matematik
on ( Matematik.numarasi=ogrenciBilgileri.numarasi )

4. Full Join (Full Outer Join)

Her iki tablodan da diğerinde olmayan kayıtlar listelemeye dahil edilir.

 

Select ogrenciBilgileri.adi, ogrenciBilgileri.soyadi, Matematik.sinav1
From Matematik Full Join ogrenciBilgileri
on ( Matematik.numarasi=ogrenciBilgileri.numarasi )

 

Sql - Insert Sorgusu ile Tabloya Kayıt Ekleme

Insert sorgusunun yapısı şu şekildedir:

INSERT INTO tabloAdi

VALUES (alan1, alan2, alan3,....)

Insert Into deyiminden sonra ekleme işleminin yapılacağı tablonun adı yazılır. Values deyiminin ardından ise tablodaki alanların sırasına göre bu alanlara eklenecek veriler aralarına virgül konarak yazılır. 

Örnek:

INSERT INTO ogrenciler VALUES ('Ali', 'Yılmaz', 324, '11E')

Not: Metin ve tarih türündeki veriler tırnak içerisine yazılır. (Access programında çift tırnak kullanılır.)

Şayet tüm alanlara veri yazılmayacak ise hangi alanlara veri yazılacağı tablo adından sonra belirtilir.

Örnek: 

INSERT INTO ogrenciler (adi, soyadi)
VALUES ('Ali', 'Yılmaz')

Insert Sorgusu İçerisinde Fonksiyon Kullanma

Insert sorguları içinde sql fonksiyonları kullanılabilir. Örneğin bir alana o anki tarih ve saat bilgisini yazmak istiyorsak şu şekilde bir sorgu kullanılabilir.

INSERT INTO ogrenciler (adi, soyadi, kayitTarihi) 
VALUES ( 'Ali', 'Yılmaz', getDate( ) )

Bir Tablodan Başka Bir Tabloya Satır Kopyalama

Bir tablodaki istenen kayıtları başka bir tabloya eklemek için insert ve select sorguları birlikte kullanılabilir. Bu durumda insert sorgusuna ait values deyimi kullanılmaz.

Örnek:

INSERT INTO urunlerYedek
SELECT * FROM urunler WHERE kategori=1

Sürekli çalıştığımız bir tablonun şismesini istemediğimiz ama verileri silmek de istemediğimiz durumlarda bu yöntem işimize yarayabilir. Kayıtları başka bir tabloya kopyaladıktan sonra ilk tablodan silebiliriz.

Bir Tablodaki Kayıtları Yeni Bir Tabloya Kopyalama

SELECT INTO deyimi kullanılarak bir tablodaki istenen kayıtlar, yeni oluşturulan bir tabloya kopyalanabilir. 

SELECT kopyalanacakAlanlar
INTO yeniTabloAdi IN veritabaniAdi
FROM kaynakTabloAdi; 

Yeni tablo aynı veritabanına oluşturulacak ise In kısmı kullanılmayabilir.

 
 
SELECT *
INTO musterilerYedek
FROM musteriler;
 
SELECT *
INTO matematikYedek IN 'verilerYedek.mdb'
FROM matematik;
 
SELECT adi, soyadi, adres
INTO adresler
FROM personel;
 
SELECT adi, soyadi, telefon
INTO iletisim
FROM personel
WHERE unvani = 'Memur';
 
SELECT matematik.sinav1, ogrenciler.adi
INTO yeniTablo
FROM matematik
LEFT JOIN ogrenciler
ON matematik.numarasi = ogrenciler.numarasi;
Kopyalama yapmadan sadece aynı yapıda boş bir tablo da oluşturabiliriz.
SELECT *
INTO yeniTablo
FROM varOlanTablo
WHERE 1=0;
 

Bu örnekte şart 1=0 tutmayacağı için hiçbir kayıt kopyalanmayacak, ancak tablo oluşturulacaktır.

Kayıtları Var Olan Bir Tabloya Kopyalama

Bir tablodaki istenen kayıtları başka bir tabloya eklemek için insert ve select sorguları birlikte kullanılabilir. Bu durumda insert sorgusuna ait values deyimi kullanılmaz.

Örnek:

INSERT INTO urunlerYedek
SELECT * FROM urunler WHERE kategori=1

Sürekli çalıştığımız bir tablonun şismesini istemediğimiz ama verileri silmek de istemediğimiz durumlarda bu yöntem işimize yarayabilir. Kayıtları başka bir tabloya kopyaladıktan sonra ilk tablodan silebiliriz.

 

Alındır.

Kaynak: http://www.btdersleri.com