Sayfalar

13 Ocak 2013 Pazar

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

Merhaba Arkadaşlar!

Kısaca SQL'in ne olduğuna bakalım:
Bilindiği üzere ilişkisel veritabanı yönetim sistemleri ilk olarak 1970 yılında Dr. E. F. Codd tarafından ortaya çıkarılmıştır. Codd'un ifade ettiği ilişkisel veritabanı modeli için SQL ilk defa IBM firması tarafından geliştirilmiştir. 1979'da ise günümüzdeki Oracle firması (o zamanlar Relational Software'di) SQL'i ilk ticari uygulama olarak piyasaya sürmüştür. Böylece SQL artık ilişkisel veritabanı yönetim sistemleri için bir standart haline gelmiştir ve tüm yönetim sistemlerinde SQL dil desteği olmak durumundadır. (SQL ile ilgili diğer temel bilgiler için buradan ulaşabilirsiniz.)

SQL ilk çıkarıldığı zamanlar SEQUEL yani Structred English Query Language olarak bilinirken artık Structred Query Language olarak isimlendirilmektedir. SQL deyimleri büyük-küçük harf duyarlı olmayıp SQL cümlesinin sonuna noktalı virgül (;) konur. SQL yazarken dikkat edilecek hususlar aşağıdaki gibidir:

  • SQL cümleleri birden fazla satırı kapsayabilir
  • Okunulabilirlik açısından satırlar girintilerle belirlenir.
  • SQL Developer kullanıyorsanız (;) kullanmanıza gerek olmayabilir ancak SQL*Plus'ta (;) kullanmanız gerekmektedir. 
  • SQL'deki temel kelimeler satırlara bölünemez yada kısaltılamaz.

SQL Developer gibi arayüz kullanıcıları SQL ile haşır neşir olmayabilir ancak arka planda çalışan kodlar SQL kodlarıdır. Bu yüzden veritabanına erişim için mutlaka SQL kullanmak durumundasınız. SQL; veritabanındaki bilgileri sorgulamak, üzerlerinde işlem yapmak ve yeni veritabanı nesneleri oluşturmak gibi pek çok görev için geliştirilmiş yapısal sorgulama dilidir. Girişi çok uzatmadan hemen deyimleri uygulamak için kullanacağımız örnek HR şemasından bahsedelim.

Örnek HR Şeması:
Önceki yazımızda da bahsettiğimiz gibi bu kullanıcı şeması HR kullanıcısı ile birlikte üzerinde uygulama yapabilmemiz için hazır halde gelmektedir. Bu kullanıcıyı nasıl aktif edip bu tablolara nasıl erişeceğimizi bir önceki yazımızda açıklamıştık. Şimdi kullanıcının sahibi olduğu tabloların genel yapısına bir göz atalım:
Tablolar ve ilişkileri yukarıda açıkça görülmektedir. İnsan Kaynakları-Human Resources (HR) şemamızda 7 adet tablo mevcuttur. Bu tablolar hakkında bilgi edinmek istiyorsanız DESCRIBE komutunu aşağıdaki gibi kullanabilirsiniz: 
describe JOBS;
Name                           Null     Type
------------------------------ -------- -------------------------
JOB_ID                         NOT NULL VARCHAR2(10)
JOB_TITLE                      NOT NULL VARCHAR2(35)
MIN_SALARY                              NUMBER(6)
MAX_SALARY                              NUMBER(6)

4 rows selected

Bu komutla tablodaki sütunların ismine, NULL kısıtının olup olmadığına, veri tiplerinin ne olduğuna ulaşabilirsiniz. Yine tablolar hakkında bilgi edinmek için SQL Developer'dan HR şemasını inceleyebilirsiniz. Bu açıdan burada şu tablo şunu tutar, bu tablo şununla ilişkilidir şeklinde açıklama yapmanın yersiz olduğunu düşünüyorum. Çünkü amacımız sorguları ve ne yaptıklarını anlamak. İlk deyimimizle başlayalım:

SELECT Deyimi
SELECT deyimi en çok kullanılan deyim olup temel olarak veritabanı tablolarından veri çekme işlemini yapmamızı sağlar. Sorgunun genel yapısı aşağıdaki gibidir:

SELECT *|{[DISTINCT] sütunadlari|expression [takmaismi],...}
FROM    tabloismi;

Biraz açıklayacak olursak; | ifadesinin "veya" anlamında kullanıldığını hatırlatalım. Yani SELECT deyiminden hemen sonra ya * kullanılır ya da sütun isimleri belirlenir.Eğer * kullanılırsa tablonun tüm sütunları sonuç olarak getirilir. Bu istenmiyorsa, ilgilenilen sütunlarun isim isim belirlenmesi gerekir. 


SELECT * FROM COUNTRIES;
COUNTRY_ID COUNTRY_NAME                             REGION_ID
---------- ---------------------------------------- -------------
AR         Argentina                                2
AU         Australia                                3
BE         Belgium                                  1
BR         Brazil                                   2
CA         Canada                                   2
CH         Switzerland                              1
...
25 rows selected

Şeklinde çıktı alınır. (Çıktının tamamını belirtmedim)

SELECT country_name, regıon_ıd FROM COUNTRIES;
COUNTRY_NAME                             REGION_ID              
---------------------------------------- ---------------------- 
Argentina                                2                      
Australia                                3                      
Belgium                                  1                      
Brazil                                   2                      
Canada                                   2                      
Switzerland                              1                      
China                                    3                      
Germany                                  1                  
...
25 rows selected

Her iki kullanıma da bu şekilde örnek verebiliriz. Aynı sorguyu aşağıdaki gibi de çalıştırabilirsiniz ki bu çalıştırma şekli birden fazla tablo ile çalışıldığı durumlarda tercih edilir. Böylelikle aynı isimde sütunlar barındırabilen tablolarla birbirlerine karıştırmadan aynı anda işlem yapabilirsiniz:

SELECT countries.country_name, countries.regıon_ıd FROM COUNTRIES;

SQL'de Aritmetik İfadeler: Sütun isimlerinin belirtildiği SELECT kısmında aritmetik operatörler (*, /, -, +) ile işlemler yapmanız ve bu işlemlerin sonuçlarını sorgu sonuçlarınızda görmeniz mümkündür. Örnek kullanım olarak employees tablosundaki tüm işçilerin maaşlarına 500 zam yapıldığındaki durumu görmek istersek şu sorguyu yazmak gerekecektir:

SELECT first_name, salary, salary + 500
FROM   employees;
Çıktı da aşağıdaki gibi olacaktır:
FIRST_NAME           SALARY                 SALARY+500             
-------------------- ---------------------- ---------------------
Donald               2600                   3100                   
Douglas              2600                   3100                   
Jennifer             4400                   4900                   
Michael              13000                  13500                  
Pat                  6000                   6500                   
Susan                6500                   7000                   
Hermann              10000                  10500                  
Shelley              12008                  12508                  
William              8300                   8800  
...
107 rows selected

Bu şekilde sütunlarla istediğiniz karmaşıklıkta aritmetik işlem yaptırabilirsiniz. Tabii her yerde olduğu gibi burada da işlem önceliklerine dikkat etmek durumundasınız. Parantezler kullanarak bu öncelikleri istediğiniz biçimde yönetebilirsiniz. 

Getirilen sonuca dikkat ederseniz aritmetik hesaplama yaptırdığımız hayali sütunun ismi SALARY+500 olarak belirlenmiş. Bu okunabilirliği kötü yönde etkileyen bir faktördür. Bunu nasıl düzelteceğimizi ve istediğimiz ismi nasıl vereceğimizi öğreneceğiz. Örneğin aynı sorguyu aşağıdaki gibi yazsaydık ne olurdu?

SELECT first_name, salary, salary + 500 as "Zamlı Maaş"
FROM   employees;

Bu kullanıma takma isim verilmesi deniyor. Böylelikle daha okunabilir sonuçlar elde edebilirsiniz. Eğer takma isminiz birden fazla kelimeden oluşuyorsa yada büyük-küçük harf duyarlıysa yukarıdaki gibi çift tırnak "" içerisinde ifade etmelisiniz. Yukarı kullanıldığı gibi AS ifadesini kullanmak zorunda değilsiniz ancak bu yazdığınız SQL deyimini standart hale gitirir. Aksi halde tırnaklara ihtiyacınız yok demektir. Yukarıdaki sorgunun sonucu aşağıdaki gibi görünür:

FIRST_NAME           SALARY                 Zamlı Maaş             
-------------------- ---------------------- ---------------------
Donald               2600                   3100                   
Douglas              2600                   3100                   
Jennifer             4400                   4900                   
Michael              13000                  13500   
...
107 rows selected

NULL Değerler: Var olmayan, bilinmeyen, atanmamış ve uygulanamayan değerler olarak ifade edilirler. NULL değerler boşluk karakteri yada 0 değildir! Eğer NULL değer içeren bir sütunda aritmetik işlem yaparsanız NULL olan satırların işlem sonucu yine NULL olur. SELECT deyiminde eğer çekilen satırlar NULL ise; boş olarak görünürler. Bu anlatılanlara örnek olarak aşağıdaki sorgu verilebilir:

SELECT last_name, 12*salary*commission_pct as komisyon
FROM   employees;
LAST_NAME                 KOMISYON
------------------------- ------------------------ 
OConnell                                           
Grant                                              
Whalen                   
...                      
Russell                   67200                    
Partners                  48600                    
Errazuriz                 43200                    
Cambrault                 39600                    
Zlotkey                   25200                
...
107 rows selected

komisyon olarak yazılan takma ismin KOMISYON olarak görüntülenmesinin sebebi çift tırnak kullanmamamızdır. Yukarıdaki sonuçta hesaplanmayan satırların NULL olduklarını anlıyoruz.

Sütunları Birleştirme: Sonuçları ihtiyacınız doğrultusunda şekillendirmenize yarayan bir başka kolaylık da sonuçta çekilen sütunları birleştirerek görüntüleme opsiyonudur. İki dikey çubuğu || birleştirilecek olan sütunların arasına yerleştirmeniz yeterlidir. Örneğin çalışanların isim ve soy isimlerini birleştirip ad sütunu olarak göstermek istersek şu sorgu işimizi görür:

SELECT last_name || first_name AS isim
FROM   employees;
ISIM                                          
--------------------------------------------- 
AbelEllen                                     
AndeSundar                                    
AtkinsonMozhe                                 
AustinDavid                                   
BaerHermann                                   
BaidaShelli                                   
BandaAmit                                     
BatesElizabeth      
...
107 rows selected

Burada isim ve soy isimlerin arasında boşluk olmadığı için okunabilirlik biraz düşüyor. Bununda bir çözümü var. Sorguyu aşağıdaki gibi değiştirirsek durum düzelecektir.

SELECT last_name || ' ' || first_name AS isim
FROM   employees;
ISIM                                           
---------------------------------------------- 
Abel Ellen                                     
Ande Sundar                                    
Atkinson Mozhe       
...
107 rows selected

Peki sonucu "Abel'in soy ismi  Ellen" şeklinde görmek istersek nasıl bir sorgu yazmalıyız? Bu kez devreye q'[]' operatörünün kullanımı giriyor. Sorguyu aşağıdaki gibi değiştirirsek istenen sonuca ulaşılır:

SELECT last_name || q'['in soy ismi ]' || first_name AS isim
FROM   employees;
ISIM                                                       
---------------------------------------------------------- 
Abel'in soy ismi Ellen                                     
Ande'in soy ismi Sundar                                    
Atkinson'in soy ismi Mozhe                                 
Austin'in soy ismi David      
...
107 rows selected

Böylelikle çıktınızı formatlayarak okunabilirliğe artı yönde etkide bulunabilirsiniz. 

SELECT deyimi ile ilgili son mevzu ise DISTINCT anahtar sözcüğüdür. Diyelim ki tablonuzda bir bölümün ismi birden fazla kez zikredildi ve sorgunuzda da bu bölümle ilgili gereksiz yere birden çok kez sonuç getirildi. Bunu nasıl elimine edersiniz? İfadenin kullanım tarzı aşağıdaki gibidir:

SELECT DISTINCT department_name
FROM departments;

Bu tabloda bölüm isimleri tekrarı söz konusu olmasa da sorgunun nasıl kullanılacağını göstermiş olduk :)

SELECT deyimi bundan ibaret. Daha karmaşık sorgulara geçmeden önce öğrenmemiz gereken bir kaç konu daha var. Umarım faydalı olmuştur. Yeni sorgularda görüşmek üzere hoşçakalın!

Hiç yorum yok:

Yorum Gönder