SQL deyimlerini öğrenmeye kaldığımız yerden devam edeceğiz. Bir önceki yazdı SELECT deyimini bitirmiştik. Şimdi SELECT deyimini daha gelişmiş olarak kullanmamızı sağlayan bir kaç yeni ifade ekleyeceğiz. Hemen başlayalım:
Şimdiye kadar SELECT ifadesi ile istediğimiz sütunu nasıl çekeceğimizi gördük. Ancak bu sütunun tamamına ait içeriği çekebildik. Yani belirlediğimiz bir satırı yada aklımızdaki koşula uyan bir satırı nasıl çekeceğimizi bilmiyoruz. Bunu gerçekleştirebilmek için WHERE ifadesini kullanmamız gerekmektedir.
WHERE İfadesi
WHERE ifadesinin de SELECT deyimine eklenmesi ile sorgu aşağıdaki şeklini alacaktır:
SELECT *|{[DISTINCT] sütunadi|ifadeler [takmaisim],...}
FROM tabloadi
[WHERE sart(lar)];
Yukarıdan anlayacağınız üzere [] (köşeli parantez) içerisindeki SQL ksımı opsiyoneldir. Yani isteğe bağlı olarak kullanılır. Şimdi countries tablosundaki tüm ülke isimlerini listelemek istersek aşağıdaki SQL cümlesini kullanıyorduk.
SELECT country_name
FROM countrıes;
Bu sorguyu aşağıdaki gibi değiştirirsek neler olur?
SELECT country_name
FROM countrıes
WHERE regıon_ıd=1;
Tahmin edeceğiniz üzere bölge 1'de bulunan ülkeler listelenecektir. Hemen sonucu görelim:
COUNTRY_NAME
----------------------------------------
Belgium
Switzerland
Germany
Denmark
France
Italy
Netherlands
United Kingdom
8 rows selected
WHERE ifadesi ile şart eklemeden önce ise bu sonuç 25'di. Yani anlıyoruz ki 25 ülkeden sadece 8 tanesi bölge 1'de bulunmakta.
Peki şimdi bu WHERE ifadesi kısmında ne tip veriler ve ne tip operatörler kullanabiliriz?
- Karakter dizgeleri (string ifadeler): Tek tırnak içerisinde verilerek kullanılabilirler.
- Tarih verileri: Yine tek tırnakla belirtilirler ve GG-AY-YY formatında (varsayılan olarak) kullanılırlar.
- Eşitsizlik ifadeleri: <, >, >=, <= ifadeleri programlama dillerinde kullandığımızdan farksızdır. Sadece "eşit değildir" ifadesi olan <> farklı gösterime sahiptir.
- Diğerleri:
- BETWEEN ... AND ... ile iki değer arasını belirtebilirsiniz.
- IN ile bir değeri birden fazla değer ile karşılaştırmanız mümkün olur.
- IS NULL bir değerin NULL olup olmadığı ile ilgili bilgi almak için kullanılır.
- LIKE karakter karşılaştırmaları için kullanılır.
- Birden fazla şart kullandığımız durumlarda bu şartları birbirine bağlamak için OR(iki şarttan biri doğruysa TRUE), AND(iki şartın ikisi de doğruysa TRUE) ve NOT(şart FALSE ise TRUE) operatörlerini kullanabiliriz.
Şimdi; bu öğrendiklerimizi HR Şemasında birkaç örnekle uygulayalım.
Örneğin soy ismi 'Walsh' olup maaşı 2000'den büyük olan çalışanları görmek istersek aşağıdaki sorgu bize yardımcı olacaktır:
SELECT first_name || ' ' || last_name AS isim, salary AS maas
FROM employees
WHERE last_name='Walsh' AND salary > 2000;
ISIM MAAS
---------------------------------------------- -----------------
Alana Walsh 3100
1 rows selected
Şimdi de '19/03/2005' tarihinde işe alınan yada ismi 'John' olan çalışanları bulalım. Yalnız tarih formatına dikkat edin. Veritabanında HR şemasında bu format kullanılmıştır. Bu formatı yanlış kullanırsak sorgu hata döndürür.
SELECT first_name || ' ' || last_name as ISIM
FROM employees
WHERE hire_date = '19/03/2005' OR first_name = 'John';
ISIM
----------------------------------------------
John Chen
John Seo
John Russell
Alyssa Hutton
4 rows selected
Burada sadece Alyssa Hutton belirtilen tarihte işe alınmıştır. Diğer sonuçlar da OR operatörünün sonucu olarak eklenmiştir.
Şimdi de aynı tablodan, maaşları 2000 ile 3000 arasında olan ve yöneticilerinin ID'si 121, 122, 123 olan tüm işçileri görmek isteyelim:
SELECT first_name || ' ' || last_name as ISIM , salary as maas
FROM employees
WHERE salary BETWEEN 2000 AND 3000 AND manager_ıd IN (121, 122, 123);
ISIM MAAS
---------------------------------------------- -----------------
Mozhe Atkinson 2800
James Marlow 2500
TJ Olson 2100
Anthony Cabrio 3000
Michael Rogers 2900
...
12 rows selected
Yukarıdaki IN operatörünün NOT IN olarak da kullanılabileceğini yeri gelmişken belirtelim. Biraz da LIKE operatörünün kullanımına bakalım:
Yukarıda de belirttiğimiz gibi bu operatörle kayıtlar üzerinde harfe dayalı aramalar yapmamız mümkün olur. İlk harfi J olan ifadeleri bulmak için WHERE ifadesi şöyle yazılır:
...WHERE first_name LIKE 'S%';
İkinci harfi B olan ifadeler için:
...WHERE first_name LIKE '_B%';
Buradaki %'de işareti ile takip eden ifadelerin sayısının 0 yada daha fazla olacağını bildirirsiniz. _ ise sadece bir karekteri bildirmek için kullanılır.
IS NULL ifadesini kullanırken de aşağıdaki yazımı kullanırız:
...WHERE last_name IS NULL;
Böylelikle eğer satır NULL değer içeriyorsa, sonuçta görüntülenecektir.
Şimdi job_id değerinde MAN ifadesi geçen ve manager_id'si NULL olmayan çalışanların isimlerini bulalım:
SELECT first_name, job_id, salary
FROM employees
WHERE job_id LIKE '%MAN%' AND manager_ıd IS NOT NULL ;
FIRST_NAME JOB_ID SALARY
-------------------- ---------- ----------------------
Michael MK_MAN 13000
Den PU_MAN 11000
Matthew ST_MAN 8000
...
12 rows selected
Böylece NOT operatörünün kullanımına da bakmış olduk. NOT operatörü NOT LIKE, NOT IN, IS NOT NULL gibi diğer operatörlerle kullanılır.
Operatörlerin Öncelik Sıralaması:
Önemli bir konu olarak karşımıza çıkar. Eğer önceliklerinizi parantezler () kullanarak ifade etmediyseniz varsayılan olarak nasıl bir sıralama izlenir? Hemen maddeler halinde bakalım:
- Aritmetik işlemler (*, /, +, -)
- Eşitsizlik operatörleri
- IS NULL, LIKE, IN, IS NOT NULL, NOT IN
- BETWEEN ve NOT BETWEEN
- <>
- NOT
- AND
- OR
Şimdi aşağıdaki iki sorgu sonuçları arasındaki farkı göz önünde bulundurarak sıralamanın ne kadar önem arz ettiğini görelim:
FROM employees
WHERE job_id = 'SA_REP'
OR job_id = 'AD_PRES'
AND salary > 15000;
LAST_NAME JOB_ID SALARY
------------------------- ---------- ----------------------
King AD_PRES 24000
Tucker SA_REP 10000
Bernstein SA_REP 9500
Hall SA_REP 9000
...
31 rows selected
SELECT last_name, job_id, salary
FROM employees
WHERE (job_id = 'SA_REP'
OR job_id = 'AD_PRES')
AND salary > 15000;
FROM employees
WHERE (job_id = 'SA_REP'
OR job_id = 'AD_PRES')
AND salary > 15000;
LAST_NAME JOB_ID SALARY
------------------------- ---------- ----------------------
King AD_PRES 24000
1 rows selected
Görüldüğü gibi ilk sorguda maaş kısmı 15000 değerinden küçük olan çalışanlar da sonuç olarak getirilmiştir. Çünkü öncelikle şartın "job_id ='AD_PRES' AND salary > 15000" kısmı değerlendirilmiş ve job_id'si 'AD_PRES' olup maaşı da aynı zamanda 15000'den büyük olan çalışanlar getirilmiştir. job_id'si SA_REP olanların ise maaşının 15000'den büyük yada küçük olmasına bakılmamıştır. Bazen mantığı zorlayan bu tarz sorgular istenebilmektedir. Dolayısıyla bu kısımlara dikkat etmek çok önemlidir. Yani yukarıdaki birinci sorgunun sözel ifadesi şu olabilirdi:
job_id'si 'AD_PRES' olup maaşı 15000 den büyük olanlar veya job_id'si SA_REP olan çalışanlar. Alttaki sorgunun ise:
job_id'si 'SA_REP' veya 'AD_PRES' olan çalışanlardan maaşı 15000'den büyük olan çalışanlar. O yüzden bu şarta uyan tek çalışan olduğu için sonuç olarak o getirilmiştir.
Sonuçları Sıralama
Getirilen karmaşık sonuçları biçimlendirmek ve okunabilirliğini artırmak sizin elinizdedir. Buna sütun isimlerinin sonuçta değişik başlıklarla görünmesini nasıl sağlarız ile giriş yapmış olduk(AS ifadesini hatırlayın). Şimdi de "çekilen verileri nasıl artan veya azalan sıralama ile gösteririz?" sorusuna cevap arayalım.
Bunun için SELECT deyimine yeni bir ifade yani ORDER BY ifadesini ekliyoruz. Bu ifade ile ASC seçeneği kullanılırsa sonuçlar artan sıralama ile, DESC seçeneği ile kullanılırsa da azalan sıralama ile gösterilirler.Varsayılan olarak yani hiçbir seçenek belirtmezsek de artan sıralama ile sonuçlar getirilir. Hangi sütuna sıralama işlemi yapılacaksa ORDER BY dan sonra bu sütun ismi verilir. Bu şekilde tarih verilerini, sözel verileri ve sayısal verileri sıralamanız mümkündür. Kullanım şekli aşağıdaki gibidir ve daima SELECT deyiminin en sonunda durur:
...ORDER BY sütunisim(leri) [ASC|DESC];
Örnekleri inceleyelim:
SELECT country_name
FROM countrıes
ORDER BY country_name;
COUNTRY_NAME
----------------------------------------
Argentina
Australia
Belgium
Brazil
Canada
...
25 rows selected
Ayrıca ORDER BY ile takma isimleri de kullanabiliriz. Örneğin yukarıdaki işlemi aşağıdaki gibi azalan sıralama ile yapalım:
SELECT country_name AS "Ülke Adı"
FROM countrıes
ORDER BY "Ülke Adı" DESC;
Ülke Adı
----------------------------------------
Zimbabwe
Zambia
United States of America
United Kingdom
...
25 rows selected
Birden fazla sütun sıralanırken ORDER BY ifadesindeki sıralama takip edilir.
SELECT last_name, department_id, salary
FROM employees
ORDER BY department_id ASC, salary DESC;
Sorgusunu ele alırsak; önce veriler department_id'ye göre artan olarak sıralanır. Ancak salary sütunu sıralamada department_id'yi takip etmek zorundadır. Yani aynı nolu bölümlere ait maaşlar kendi içinde azalan olarak sıralanmalıdır. Bu sütunda genel olarak sürekli bir azalma yerine department_id'ye göre bir azalma söz konusu olacaktır. Sonuç aşağıdaki gibidir:
LAST_NAME DEPARTMENT_ID SALARY
------------------------- ---------------------- ----------------
Whalen 10 4400
Hartstein 20 13000
Fay 20 6000
Raphaely 30 11000
Khoo 30 3100
...
107 rows selected
Dışarıdan Değer Girme İşlemi:
Bazı durumlarda bilgilerin kullanıcı tarafından girilmesi istenebilmektedir. Bu gibi durumlarda & ve && operatörleri ile bir değişken oluşturulup dışarıdan alınan değerler bu değişkenlerde saklanarak işlem yapılır. Bu gibi durumlar store procedure'lerde ve fonksiyonlarda sıkça kullanılmaktadır. Bu değişkenleri kullanabileceğimiz yerler kısıtlıdır. Şöyle sıralayabiliriz: sütun ifadeleri, tablo isimleri, SELECT, WHERE ve ORDER BY'da kullanılırlar.Tek ampersand (&) ile kullanımda sorgunun her çalıştırılmasında ilgili değerler kullanıcıdan istenir. Ama çift ampersandlı (&&) kullanımda her defasında bu değerler istenmez. Yani aynı sorguda aynı isimli değişken birden çok yerde kullanılıyorsa, sadece birinci rastlama anında bu değişkenin değeri dışarıdan alınacaktır.
Sayısal ifadelerde &isim, sözel ifadelerde '&isim' şeklinde kullanılırlar.
SELECT first_name, last_name, salary
FROM employees
WHERE last_name = '&soyisim' OR salary > &maas;
Sorgu çalıştırıldığında SQL Developer'da aşağıdaki pencereleri görürsünüz:
FIRST_NAME LAST_NAME SALARY
-------------------- ------------------------- ------------------
Steven King 24000
Neena Kochhar 17000
Lex De Haan 17000
John Seo 2700
4 rows selected
Bu gibi kullanımlarla sorguyu kullanıcı ile interaktif olarak tasarlayabilirsiniz. Yukarıda belirtildiği gibi tablo ve sütun isimleri de kullanıcı tarafından girilebilmektedir. Örneğin;
"...WHERE &sart..." diyerek tüm şartın kullanıcı tarafından girilmesi de sağlanabilir. Çift ampersandlı kullanıım ise şöyle bir örnekle pekiştirilebilir:
SELECT first_name, &&sutun, salary
FROM employees
WHERE &sutun = 'Seo' OR salary > &maas;
İlk pencerede sutun ismi sorulacaktır ve buraya last_name değeri girilirse ikinci kez bu değer dışarıdan istenmeyecektir.
Değişken Tanımlama: Konu uzadıkça uzuyor ancak yukarıdaki konuyla bağlantılı olduğu için bu konuyu da eklemek durumunda kaldım. DEFINE sözcüğü ile bir değişken tanımlanır ve ona ilk değer ataması yapılır. Mesela bir SQL cümlesine başlamadan önce cümle içinde kullanmak isteyebileceğiniz değişkenleri en üstte tanımlayabilirsiniz:
DEFINE degisken_ismi = 2
Artık bu değişkeni SQL cümlesinde istediğiniz yerde kullanabilirsiniz. Ancak SQL cümlesi bitince yani noktalı virgül (;) den hemen sonra aşağıdaki komut ile bu değişken silinir:
UNDEFINE degisken_ismi
Son olarak SET VERIFY ON komutu bir SQL cümlesinden önce kullanılırsa SQL Developer dışarıdan girilen kullanıcı değerini sorgudaki değişken ismini kaldırarak onun yerine koyar. Çok da zaruri bir bilgi olmasa da bakarsınız karşınıza çıkıverir.
Şimdilik bu kadar. Bir sonraki yazıda görüşmek üzere hoşçakalın!
Hiç yorum yok:
Yorum Gönder