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
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