Sayfalar

14 Ocak 2013 Pazartesi

HR Şeması İle Uygulamalı SQL(WHERE)

Merhaba Arkadaşlar!

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:
  1. Aritmetik işlemler (*, /, +, -)
  2. Eşitsizlik operatörleri 
  3. IS NULL, LIKE, IN, IS NOT NULL, NOT IN
  4. BETWEEN ve NOT BETWEEN
  5. <>
  6. NOT
  7. AND
  8. 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:
SELECT last_name, job_id, salary
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;

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