SQL Where Komutu – Şartlı Veri Listeleme , yazım ile sql eğitim setime devam ediyorum. Bu dersimizde SQL Update Komutu dersinde gördüğümüz ama üzerinde durmadığımız kısım olan ve sql sorgularında hayati önem taşıyan komutumuza geldi sıra. SQL Where Komutu, bir sql sorgusunda sadece verdiğimiz şartlara uyan verileri listelememizi yada güncellememizi sağlar. Bu sebeple geniş çaplı sorgularda mutlaka tekrar tekrar kontrol edilmesi gerekir. Bir update sorgusu yanlış çalıştırıldığında, eğer yedek almadıysanız verileri eski haline geri döndüremezsiniz. Evet bu hayati önem taşıyan bilgiyi de verdikten sonra gelelim SQL Where Komutu – Şartlı Veri Listeleme dersimize…
SQL Where Komutu – Şartlı Veri Listeleme
Hem SQL Update Komutu dersimizde hemde yukarıda hayati önem taşıdığından bahsetmiştik o halde nasıl kullandığımıza ve püf noktalara değinelim.
Şimdiii, select, update, delete fark etmeksizin hepsinde aynı kurallar geçerlidir. Yani bir select sorgusunda kullandığınız where komutunu kopyalaıp update komutunda aynen kullanabilirsiniz. Örneğini aşağıda görebilirsiniz.
SQL Select Komutu ile bir örnek görelim. Önceki derslerimizde tanımladığım Personel_Tanımları tablomuzu biraz değiştirdim. Kolonlar ve sallama personel kayıtları ekledim.
AND ve OR Kullanımı
Muhasebe departmanında çalışan ve maaşı 3500 TL den az olan personelleri verecek olan sorgumuzu yazalım.
SELECT [per_Adi] ,[per_Soyadi] ,[per_Telefon] ,[per_DogumTarih] ,[per_Brut_Maas] ,[per_Avans] ,[per_Adres] ,[per_Gorev] ,[per_Departman] ,[per_Egitim] ,[per_Cinsiyet] ,[per_Medeni_Hal] ,[per_Cocuk_Adet] FROM [dbo].[PERSONEL_TANIMLARI] where [per_Departman] = 'Muhasebe' and per_Brut_Maas > 3500
Sorgumuz bu şekilde… İki şartımız var. Departmanı Muhasebe olacak ve Brüt maaşları 3500 den büyük olacak.
Görselde de gördüğünüz gibi 15 kayıttan 5 tanesi verdiğimiz her iki şarta da uyduğundan dolayı listelendi.
Buraya Dikkat!!!
Hem Departmanı Muhasebe hem de Brüt maaşları 3500 den büyük olmak zorunda yani her iki şartın da tutması gerekiyor. Biri tutmayan olursa o kayıt listelenmeyecek. Bunu sağlayan komut ise AND komutudur. AND komutunun haricinde OR komutu da vardır.
Şimdi aynı sorguyu kullanarak sadece AND komutunu OR yapıp sonuca bakalım.
Görselde AND komutu OR olarak değiştirdiğimizde aldığımız sonuç vardır. Görselde Yeşil renkle işaretlenen kayıtlar Departmanı Muhasebe olduğundan, Kırmızı işaretli kayıtlar ise Brüt Maaş’ın 3500’den büyük olduğundan dolayı listelendiler. Yani her iki şarta uyması beklenmiyor. Şartlardan en az birini sağlaması durumunda ilgili kayıt listelenecektir.
IN ve NOT IN Kullanımı
Yine aynı sorguyu kullanacağız. Bu yüzden sadece where şartı kısmını vereceğim.
NOT: In ve Not In komutlarında büyüktür, küçüktür vs operatörleri kullanamayız.
Bu seferki senaryomuz şöyle olsun.
1 – Brüt maaşı 5000 ve 4500 olanlar listelensin.
where per_Brut_Maas in ( 5000 , 4500 )
2 – Brüt maaşı 5000 ve 4500 olmayanlar listelensin.
where per_Brut_Maas not in ( 5000 , 4500 )
Şimdiii burada sağlam bir püf noktası vereyim sizlere dostlar. Bu komut ile beraber parantez içerisinde bir select sorgusu yazabilirsiniz. Hemen örnek vereyim.
Öncelikle Departmanlar adında bir tablo daha açtım. Departman adı ve aktif adlı iki kolonu var. Personeller tablosuna da 3 kayıt daha ekledim ve bu üç personeli de farklı departmanlara yazdım. Burada yapacağımız işlem şudur;
Select komutu ile Departmanlar tablosunda aktif olan departmanları alacağız. Sonra bu select sorgusunu where komutunda yazdığımız in komutunda kullanacağız.
Öncelikle tablomdaki kayıtları şöyle göstereyim.
Burada alt kısımda gördüğünüz departmanlardan Bilgi İşlem, Pazarlama ve Personel olanlar aktif. İn kısmına bu aktif departmanları alacağımız select sorgusunu yazacağız ve sonuca bakacağız.
Select sorgumuzu vereyim.
SELECT [per_Adi] ,[per_Soyadi] ,[per_Telefon] ,[per_DogumTarih] ,[per_Brut_Maas] ,[per_Avans] ,[per_Adres] ,[per_Gorev] ,[per_Departman] ,[per_Egitim] ,[per_Cinsiyet] ,[per_Medeni_Hal] ,[per_Cocuk_Adet] FROM [dbo].[PERSONEL_TANIMLARI] where per_Departman in ( (select dep_Adi from DEPARTMANLAR where dep_Aktif = 1) )
Elde ettiğimiz sonucu görelim.
Gördüğünüz gibi IN komutu ile birlikte bir select kullandık ve dikkat ettiyseniz select sorgusundan birden fazla kayıt döndü. Burada IN değilde ( = ) kullansaydık şu hatayı alırdık;
Msg 512, Level 16, State 1, Line 1 Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
Aynı şekilde NOT IN kullansaydık, select sorgumuzdan dönen departmanlar haricinde olanlar listelenecekti.
*** Where şartında kolonları birleştirerek yada hesaplama yaptırarak şartlar verebiliriz. bkz. SQL Select Komutu Kullanımı – Sanal Kolon Oluşturma
*** Where şartı içerisinde önceden hazırladığımız fonksiyonları da kullanabiliriz. Fonksiyonları daha sonra göreceğimizden o yazıma şuan link veremiyorum.
*** Where şartı içerisinde =, >, < gibi ifadeler kullanılabilir. Ayrıca Eşit Değildir anlamına gelen != ifadesini yada <> ifadesini kullanabilirsiniz.
***
(=) Eşit Olanlar
(<=) Küçük ve Eşit Olanlar
(<) Küçük Olanlar
(>=) Büyük ve Eşit Olanlar
(>) Büyük Olanlar
(!=) Eşit Olmayanlar
(<>) Eşit Olmayanlar
(+) Sayısal Değerleri Toplar, Metinsel Verileri Yan Yana Yazar
(-) Sayısal Verileri Çıkartır.(Diğer operatörler de kendi işlerini yaparlar)
***ÖZEL PÜF NOKTA***
Where şartı içerisinde iki tarih arasında yada iki değer arasında kalan verileri almak istediğinizde genelde BETWEEN komutu kullanılır ancak ben bunu kullanmanızı tavsiye etmiyorum. İki tarih arası veri alacaksınız diyelim o zaman where şartınızı şu şekilde yazın…
where per_Kayit_Tarihi >= '20180801' and per_Kayit_Tarihi <= '20180830'
Burada bana laf edenler olabilir. Deneyin ve aradı farkı görün. Tabii bunu 500 – 1000 gibi küçük kayıtların olduğu tablolarda yaparsanız fark görmeyebilirsiniz. Buradaki asıl farkı 400.000 – 500.000 ve daha fazla kayıt içeren tablolarda kullandığınızda farkı göreceksiniz.
NOT: İlk etapta hızlı çalışan bir sorgu 5, 10 yıl sonra kağnı gibi olabilir. Bu kadar ileriyi planlamıyorsanız kafanıza göre takılabilirsiniz. ERP gibi programlarda şahsen en az 10 yıl sonrasını düşünmeye çalışarak kodlarımı komutlarımı yazarım.
LIKE ve NOT LIKE Kullanımı
Like, benzer demektir. yani Like komutundan sonra yazdığımız veriye benzeyen verileri getir demektir. Anlatmaya kod üzerinden devam edelim.
Sorgumuz şu şekilde
SELECT [per_Adi] ,[per_Soyadi] ,[per_Telefon] ,[per_DogumTarih] ,[per_Brut_Maas] ,[per_Avans] ,[per_Adres] ,[per_Gorev] ,[per_Departman] ,[per_Egitim] ,[per_Cinsiyet] ,[per_Medeni_Hal] ,[per_Cocuk_Adet] FROM [dbo].[PERSONEL_TANIMLARI]
Şimdi Where şartımızı görelim.
where per_Departman like 'Muh'
Bu şekilde kullanımda sadece departmanı Muh olanlar gelecektir.
Yüzde işaretine dikkat!!
where per_Departman like 'Muh%'
Muh harfleri ile başlayanlar gelecektir.
where per_Departman like '%Muh%'
İçerisinde Muh harfleri geçenler gelecektir.
where per_Departman like '%Muh'
Muh harfleri ile bitenler gelecektir.
where per_Departman like 'M%e'
M harfi ile başlayıp e harfi ile bitenler gelecektir.
where per_Departman like 'M_______'
M ile başlayan ve 8 karakter olan kayıtlar gelecektir
where per_Departman like 'M__%'
M harfi ile başlayan en az 3 karakterli olan kayıtlar gelecektir.
where per_Departman like '___-___-___'
Kısacası AAA-AAA-AAA formatı ile yazılmış olan kayıtlar gelecektir. 3 karakter ( – ) 3 karakter ( – ) 3 karakter
Sizler de istediğiniz gibi şekillendirebilirsiniz.
NOT LIKE dediğimizde ise LIKE ‘ın tam tersi olacaktır. Anlatmaya gerek duymadım.
SQL Where Komutu – Şartlı Veri Listeleme , dersimizde bu kadar dostlar. Bana sorarsanız güzel ve kapsamlı bir ders oldu. SQL eğitim seti sayfasındaki tüm dersler bittiğinde deli manyak sorgular yazacağız. O sebeple mümkün mertebe hızlı bitirmeye çalışıyorum.
Microsoft SQL Server & T-SQL Eğitim Seti ders listesi için tıklayınız.
Sağlıcakla ve Takipte Kalın.
Merhabalar ben excelden sql servera veri çekebiliyorum ve bunu datagridde listeleyebiliyorum ancak bana gönderilen excel dosyasındaki sütun adları bazen türkçe bazen ingilizce geliyor bu yüzden program hata veriyor yani türkçe sütun adına göre ayarladığımda gelen excel verisi türkçe ise sıkıntı olmuyor benim yapmak istediğim ise alan adını sorgularken iki başlığa göre yapabilirmiyim örnek:
select [Delivery Date] or [İrsaliye Tarihi] from tablo_adi gibi yapabilirmiyim bu şekilde çalışmadı ama buna benzer bir çözüm önerisi olabilirmi
Kolon adlarının yer aldığı ilk satırı hiç okumamaya ne dersiniz?
Burada bahsettiğim şeyin nasıl yapılacağı görülmektedir. inceleyebilirsiniz.