Daha önceki yazımızda Veri Tabanı Nedir? Nerelerde Kullanılır? konulu bir yazı yazmıştık. Bu yazıda veritabanı kavramı ile ilgili pek çok bilgiye yer yermiştik. Şimdi veritabanında sorgulama bu yazıda ise veri tabanında sorgulama yapmak için kullanabileceğiniz SQL Select ifadesi hakkında bilgiler bulacaksınız.
Pekala, biraz SQL’e geçelim !! Öğreneceğimiz ilk komut, veri getiren herhangi bir SQL ifadesi için ihtiyacınız olan ilk talimat olduğu için SELECT olacaktır. INSERT ve CREATE gibi başka başlatma komutları da vardır, ancak veritabanları ile etkileşimlerin çoğu SELECTing data’dır.
En basit sorguyla başlayalım ve geriye doğru bir değer seçelim. Her hangi bir SQL programı indirerek SQL’i çalıştırmayı deneyebilirsiniz Ben burada SQL Server Management Studio (SSMS) kullanacağım. SQL’inizi çalıştırmayı denemeniz için orada.
1 2 3 | SELECT 38; |
Bu ifadeyi her hangi bir SQL IDE’sinde çalıştırdığınızda sayısal olarak 38 değerinin döndüğünü göreceksiniz.
Harika, az önce bir sayı döndürdü. Karakterlerin yanı sıra farklı türde değerleri de getirebiliyoruz. Aşağıdaki örnekte “Merhaba Dünya” değerini içeren bir dizeyi döndüreceğiz.
1 2 3 | SELECT 'Merhaba Dünya!'; |
Her sorgunun noktalı virgülle bitmesi gerektiğini unutmayın. Veritabanının talimat vermeyi bitirdiğinizi tam olarak anlaması budur.
String (Dizge) türündeki değerleri tek tırnaklar içinde verdiğimiz dikkatinizi çekmiştir. Sizde doğrudan metin olarak çıktı alacağınız değerleri tek tırnaklar içine yazmalısınız.
Matematik İşlemleri
Sayılarla oynarken, SQL’in bir veritabanına bir sonuç üzerinde biraz matematik yapma talimatı verebileceğini de belirtebiliriz.
Aşağıdakilere benzer bazı sorgular deneyin:
1 2 3 | SELECT 2 + 3; |
1 2 3 | SELECT 2 * 3; |
1 2 3 | SELECT 2 / 3; |
Ayrıca dizeleri birleştirebilir
1 2 3 | SELECT 'Merhaba' + 'Dünya'; |
Ve daha sonra DATE ve TIME sorgularına daha fazla değineceğiz, ancak burada, sayılar ve dizelerin yanı sıraSQL’deki başka bir yaygın veri türü kategorisi olan bir tarih seçmenin hızlı bir örneği var.
1 2 3 | SELECT FORMAT(getdate(), '2020/02/22') |
Burada kendimize yazdığımız verileri seçtik. Açıkçası, tüm yaptığı buysa SQL oldukça işe yaramazdı, ancak bundan sonra verileri nereden SEÇECEĞİNİZİ ele alacağız!
FROM Kullanımı
Artık verilerin nasıl seçileceğini biliyorsunuz, ancak bu verileri nereden alacağınızı henüz nasıl seçeceğinizi bilmiyorsunuz. Şimdi gerçek şeylere geçelim ve belirli bir tablodan verileri seçin.
Örnek veritabanımızda, bazı öğrenci bilgieri ve kitap listeleri mevcut tablonun şeması şu şekilde olacaktır.
Siz de veritabanını indirip kurabilirsiniz.
Bu tablodaki verileri almak için hangi sütunları SEÇMEK istediğimizi ve nereden seçmek istediğimizi belirtmemiz gerekir. Öyleyse sakladığımız tüm öğrenci adlarını almaya çalışalım. SELECT FROM şablonu şu şekilde olacaktır.
1 2 3 | SELECT [sutunadi] FROM [tabloadi]; |
Basit bir tanesiyle başlayalım ve öğrenci adlarını sorgulayalım.
1 2 3 | SELECT ograd,ogrsoyad FROM ogrenci; |
Şu verilere bir bak! Tablonun alt kısmına, tüm sayfayı kaplamaması için sınırlandırma yapmalıyız ama bu sonraki konu. Öğrenci tablosunda tüm ad ve soyadlar getirildi.
Ama tabii istemiyorsak tüm sütunları sorgulamak zorunda değiliz. Sadece tüm öğrenci bilgilerini umursamadık.
* Sembolü Kullanımı
Bazen getirmek istediğiniz tüm sütunları listelemek can sıkıcıdır. Sadece tüm sütunların mevcut olmasını istiyorsanız, SQL * kısayoluna sahiptir. * İşareti “splat” olarak adlandırılır ve tüm sütunları almak için kullanışlı, sık kullanılan bir kısayoldur.
1 2 3 | SELECT * FROM ogrenci; |
Örnek veritabanımızda öğrenciler ve kitaplar gibi birçok başka TABLO var. Bu tablolardan bazılarını keşfetmek için SELECT * FROM [tabloadi]
yapısını kullanabiliriz.
Şimdi biraz daha derinleştirelim. Aldığımız verileri sıralama yapmadan olduğu gibi listelediğimizi görüyorsunuz. Bu sonuçları nasıl filtreleyeceğimizi, gruplayacağımızı, işleyeceğimizi ve sınırlayacağımızı öğrenmemiz gerekiyor.
ORDER BY Kullanımı
Varsayılan olarak sonuçlar, veritabanında saklandıkları sırayla döndürülür. Ancak bazen onları farklı şekilde sıralamak isteyeceksiniz. Bunu SQL şablonumuzun genişletilmiş sürümünde gösterildiği gibi sorgularınızın sonundaki “ORDER BY” komutu ile yapabilirsiniz.
1 2 3 | SELECT [sutunlar] FROM [tabloadi] ORDER BY [sutunadi]; |
Örneğin, aşağıdaki sorgu ograd ile sıralanan tüm alanları gösterir. Diğer sütunlara göre sıralamayı deneyin. Soyadlara göre sıralanacak şekilde değiştirebilir misiniz?
1 2 3 | SELECT * FROM ogrenci ORDER BY ograd; |
ORDER BY ile birden fazla alana göre sıralama yapabilirsiniz. Çok sayıda yinelenen satırınız varsa aynı satırları da farklı sütunlara göre tekrar sıralama yapabilirsiniz. Aşağıdaki örnekte önce ad alanına, ad alanları aynı olanları dasoyad alanına göre sıralamaktadır.
1 2 3 | SELECT * FROM ogrenci ORDER BY ograd,ogrsoyad; |
Artan(ASCending) ve Azalan (DESCending) Sıralama Yönü
Artık artan şekilde sıralamayı öğrendik. Şimdi azalan şekilde sıralamayı deneyelim. Bu işlem için bir ifadeye daha ihtiyacımız var.
Başlıktan anlaşılacağı gibi artan için ASC , azalan için DESC ifadelerini kullanıyoruz.
Aşağıdaki SQL kodunda öğrenci adlarını Z’den A’ya doğru sıralıyoruz.
1 2 3 | SELECT * FROM ogrenci ORDER BY ograd DESC; |
WHERE Komutu
Sonuçları sınırlandırmak için WHERE komutunu kullanabilirsiniz. WHERE komutundan sonra sınırlandırma parametrelerini girerek sorgu üzerinde filtreleme yapabilirsiniz.
1 2 3 | SELECT * FROM tabloadi WHERE [Filtre Koşullar]; |
Koşullar
Koşullar, basitçe doğru veya yanlış olan ifadelerdir. Veritabanı bu ifadeleri alır ve tablolarınızı tararken tüm satırlarda değerlendirir ve yalnızca doğru olan sonuçları döndürür.
Örneğin ogrno’su 85 olan öğrencinin adını görmek istediğimizi varsayalım. Koşul ogrno= 85
olacaktır. Aşağıdaki sorguyu çalıştırarak koşulu deneyin:
1 2 3 | SELECT * FROM ogrenci WHERE ogrno=85; |
Sorgu, veritabanına öğrenciler tablosunu taramasını ve koşulun ogrno = 85 olantüm satırları getirmesini istedik.
Benzer sorguyu metinsel ifadeler için de kullanabiliriz. ‘Deniz’ adındaki öğrencileri aramak için aşağıdaki sorguyu yazarak tüm ‘Deniz’ adındaki öğrencileri listeleyelim.
1 2 3 | SELECT * FROM ogrenci WHERE ograd = 'Deniz'; |
Çoklu Karşılaştırma
Yukarıdaki örneklerde bir alana göre filtreliyorduk. Ancak bu her zaman böyle değildir. Çoğunlukla birden fazla durum söz konusu olmaktadır. Farklı koşulları bir birine bağlamak için AND, OR yada NOT komutlarını kullanabiliriz.
AND Komutu Kullanımı
Sınıfı 10A olan kız (K) öğrencileri listeleyelim. Bu örnekte iki şartında sağlandığı bir durum söz konusu olduğu için iki şartı birleştirmek için AND operatörünü kullanıyoruz.
Örneği inceleyelim.
1 2 3 | SELECT * FROM ogrenci WHERE sinif = '10A' AND cinsiyet = 'K'; |
OR Komutu Kullanımı
Yukarıdaki örnekte AND komutunun nasıl kullanıldığını gördünüz. Sıradaki örnekte VEYA karşılaştırması yapmak için OR operatörünü kullnacağız.
Örnek: 10A ve 10B sınıfındaki öğrencileri listelemek için OR komutunu kullanabiliriz. Aşağıdaki örnek iki ayrı sınıftaki öğrencileri listelemektedir.
1 2 3 | SELECT * FROM ogrenci WHERE sinif = '10A' OR sinif = '10B'; |
NOT Komutu Kullanımı
NOT işlecini önüne koyarak bir koşulu tersine çevirebilirsiniz. Örneğin, 10A sınıfı dışındaki tüm öğrencileri veri tabanından sorgulayalım.
1 2 3 | SELECT * FROM ogrenci WHERE NOT sinif = '10A'; |
SELECT komutu ile ORDER BY, WHERE komutlarının yanı sıra GROUP BY, JOIN ve HAVING gibi komutları bir arada kullanabilirsiniz. Aşağıdaki örnekler bu konularda sizlere yardımcı olacaktır.
SQL Select Sorgu Örnekleri
Örnek 1: Öğrenci tablosundaki Adı ‘A’ harfi ile başlayan öğrencileri listeleyiniz.
1 2 3 | select * from ogrenci where ograd like 'A%' |
Örnek 2: kitap tablosundaki sayfa sayısı 50 ile 200 arasında olan kitapların adını ve sayfa sayısını listeleyiniz.
1 2 3 | select * from kitap where sayfasayisi between 50 and 200 |
Örnek 3: Öğrenci tablosundaki öğrencilerden adı A, D ve K ile başlayan öğrencileri listeleyiniz.
1 2 3 | select * from ogrenci where ograd like '[ADK]%' |
Örnek 4: Öğrenci tablosundaki sınıfı 9A olan Erkekleri veya sınıfı 9B olan kızların adını, soyadını, sınıfını ve cinsiyetini listeleyiniz.
1 2 3 4 | select ograd,ogrsoyad,sinif,cinsiyet from ogrenci where (sinif='9A' and cinsiyet='E') or (sinif='9B' and cinsiyet='K') |
Örnek 5: Öğrenci tablosunda doğum yılı 1989 olan öğrencileri listeleyiniz.(Not: veritabanında tarihler ay/gün/yıl şeklinde sorgulanır)
1 2 3 4 | select * from ogrenci where dtarih between '01/01/1989' and '12/31/1989' |
Örnek 6: Öğrencileri adına, adı aynı olanlarıda soyadlarına göre sıralayınız.
1 2 3 | select * from ogrenci order by ograd,ogrsoyad |
Örnek 7: Sayfa sayısı en fazla olan kitabı listeleyiniz.
1 2 3 | select top 1 * from kitap order by sayfasayisi desc |
Örnek 8: Öğrenciler tablosundaki en genç öğrenciyi listeleyiniz.
1 2 3 | select top 1 ograd,ogrsoyad,dtarih from ogrenci order by dtarih desc |
Örnek 9: 10A sınıfındaki en yaşlı öğrenciyi listeyin.
1 2 3 4 | select top 1 ograd,ogrsoyad,dtarih from ogrenci where sinif='10A' order by dtarih |
Örnek 10: Rastgele bir öğrenci seçin
1 2 3 | select top 1 * from ogrenci order by newid() |
Örnek 11: 10A sınıfından rastgele bir öğrencinin adını, soyadını, numarasını ve sınıfını getirin.
1 2 3 4 5 | select top 1 ogrno,ograd,ogrsoyad,sinif from ogrenci where sinif= '10A' order by newid() |
Örnek 12: Öğrenci tablosundaki rastgele bir öğrenciyi yazarlar tablosuna yazar olarak ekleyiniz.
1 2 3 4 5 | insert into yazar(yazarad, yazarsoyad) select top 1 ograd,ogrsoyad from ogrenci order by newid() |
Örnek 13: 9A sınıfındaki tüm öğrencileri 10A sınıfına aktarın
1 2 3 | update ogrenci set sinif='10A' where sinif='9A' |
Örnek 14: Öğrencinin adını, soyadını ve kitap aldığı tarihleri listeleyin.
1 2 3 4 | select ograd,ogrsoyad,islem.atarih from ogrenci join islem on islem.ogrno=ogrenci.ogrno |
Örnek 15: 10B veya 10C sınıfındaki öğrencilerin numarasını, adını, soyadını ve okuduğu kitapları, öğrenci adına göre listeleyin.
1 2 3 4 5 6 7 8 | select ogrenci.ogrno,ograd,ogrsoyad,sinif,kitapadi from ogrenci join islem on ogrenci.ogrno=islem.ogrno join kitap on islem.kitapno=kitap.kitapno where sinif='10B' or sinif='10C' order by ogrenci.ograd |
Örnek 16: Kitap almayan öğrencileri listeleyin.
1 2 3 4 5 | select ograd,ogrsoyad,islem.atarih from ogrenci left join islem on islem.ogrno=ogrenci.ogrno where islem.atarih is null |
Örnek 17: Alınan kitapların kitap numarasını, adını ve kaç defa alındığını kitap numaralarına göre artan sırada listeleyiniz.
1 2 3 4 5 6 7 | select kitap.kitapno, kitap.kitapadi,count(*) from islem left join kitap on kitap.kitapno=islem.kitapno group by kitap.kitapadi,kitap.kitapno order by kitap.kitapno |
Örnek 18: Her öğrencinin adı, soyadı, kitabın adı, yazarın adı soyad ve kitabın türünü ve kitabın alındığı tarihi listeleyiniz. Kitap almayan öğrenciler de listede görünsün.
1 2 3 4 5 6 7 | Select ograd,ogrsoyad yazarad,yazarsoyad,kitapadi,turadi from kitap join tur on tur.turno=kitap.turno join yazar on kitap.turno=yazar.yazarno join islem on kitap.kitapno=islem.kitapno right join ogrenci on ogrenci.ogrno=islem.ogrno |
Örnek 19: 10A veya 10B sınıfındaki öğrencilerin adı soyadı ve okuduğu kitap sayısını getirin.
1 2 3 4 5 6 7 | select sinif, ograd,ogrsoyad,count(islemno) from ogrenci left join islem on islem.ogrno=ogrenci.ogrno where sinif in ('10A','10B') group by sinif,ograd,ogrsoyad order by count(*) |
Örnek 20: Sayfa sayısı ortalama sayfa sayısından fazla olan kitapları listeleyiniz.
1 2 3 | select * from kitap where sayfasayisi >(select avg(sayfasayisi) from kitap) |
Örnek 21: Mayıs ayında okunmayan kitapları listeleyin.
1 2 3 | select * from kitap where kitap.kitapno not in (select distinct islem.kitapno from islem where MONTH(islem.atarih)=5) |
Örnek 22: Sayfa sayısı ortalama sayfanın üzerindeki kitapları listeleyin.
1 2 3 4 | select kitapadi,sayfasayisi from kitap where sayfasayisi>(select avg(sayfasayisi) from kitap) |
Örnek 23: Öğrenci tablosunda kaç farklı isimde öğrenci olduğunu listeleyiniz.
1 2 3 | select count(distinct ograd) from ogrenci |
Örnek 24: En fazla sayfası olan kitabın adını ve sayfa sayısını listeleyiniz.
1 2 3 4 | select kitapadi,sayfasayisi from kitap where sayfasayisi= (select max(sayfasayisi) from kitap) |
Örnek 25: En az sayfası olan kitabın adını ve sayfa sayısını listeleyiniz.
1 2 3 4 | select kitapadi,sayfasayisi from kitap where sayfasayisi= (select min(sayfasayisi) from kitap) |
Örnek 26: numarası 15 olan öğrencinin okuduğu toplam sayfa sayısını bulunuz.
1 2 3 4 5 6 | select sum(sayfasayisi) from ogrenci,islem,kitap where ogrenci.ogrno=islem.ogrno and islem.kitapno=kitap.kitapno and ogrenci.ogrno=15 |
Cok sevdigim ornekleri. Tesekkurler