Açılımı “Structured Query Language” yani “Yapısal Sorgulama Dili” olan SQL, veritabanı işlemleri ile ilgili komutlardan oluşan bir programlama dilidir. Burada veri tabanı işlemleri denilenler veritabanının kendisini oluşturmaktan, tablo, indeks, kullanıcı oluşturmak gibi veri tanımlama dili komutlarına ve kayıt ekleme, silme, düzeltme gibi veri işleme dili komutlarına kadar uzanır. Buradaki yapısal sözcüğü Pascal, C ve benzeri dillerdeki fonsiyon ve prosedür oluşturarak bir program yazmaktan biraz farklıdır. Yani kullanıcı SQL kullanırken fonksiyon ve prosedür yazmaz. SQL tarafından tanımlı komutları gerekli parametreleri vererek bir komut modu uygulamasındaymış gibi çalışır. Yine SQL kullanımında şartlı ifadeler ve dallanmalar yoktur. Yani kullanıcı Pascal, C vb. dillerdeki İf, Case gibi ifadeler kullanmaz. SQL’in akış kontrolü yapabilen bir modeli ISO/IEC tarafından kabul edilmiştir, fakat yaygın olarak kullanılmamaktadır. Oracle’ın geliştirdiği PL/SQL(Programming Language/SQL) işte bu prosedür, fonksiyon ve if,case,for..next gibi programlama için gereken işlemleri kullanmayı olanaklı kılar. Fakat PL/SQL sadece içerisinde SQL komutları kullanılabilen bir dildir. Yani SQL’in yapısını değiştirmemiştir. Komut modunda yazdığınız bir SQL cümlesini alıp PL/SQL blokları arasına yazabilirsiniz. Oracle sirketi geliştirdiği tüm uygulamalarda SQL kullanmayı esas alır. Kullanıcının Oracle ürünlerini kullanarak yaptığı tüm işlemlerin arkasında SQL komutları çalıştırılır. SQL’in veritabanı işlemleri için kullanılan komutları 5 kategoride toplanabilir:
- Veri sorgulama komutları
- Tabloya veri ekleme,değiştirme ve silme komutları
- Veritabanı nesneleri oluşturma,değiştirme ve silme komutları
- Veritabanına ve veritabanı nesnelerine erişimi kontrol etme komutları
- Veritabanının tutarlılığını ve bütünlüğünü koruma komutları
SQL’in Tarihi :
Dr. E.F. Codd ‘un “Communications of The ACM(Association of Computer Machinery)” adlı dergide 1970 Haziranında yayınladığı “A Reletional Model of Data for Large Shared Data Banks”(Büyük ve Paylaşımlı Veri Bankaları İçin İlişkisel Model) adlı makale bugün ilişkisel veri tabanı yönetim sistemleri(RDBMS) için kabul edilen model olmuştur. IBM şirketi Dr.Codd ‘un bu modelini kullanarak “Structured English Query Language (“SEQUEL”)” denilen bir dil geliştirmiştir. 1979 yılında o zamanki adı “Relational Software” olan Oracle şirketi ticari olarak ilk defa SQL kullanmaya başlamıştır. Bugün SQL, ilişkisel veritabanı yönetim sistemlerinin standart dili olarak kabul edilmektedir.
Oracle’da Kullanılan Veri Tipleri:
CHAR(sayı): Sabit uzunluktaki alfasayısal verilerin tutulabildiği alanlar için kullanılır. Oracle 7 ve daha önceki sürümler için bu alanın uzunluğu en fazla 255 karakter olabilir. Oracle 8 ve sonrasında 2000 karakter uzunluğundadır. Eğer, sayı ile ifade edilen numaradan daha kısa uzunlukta veriler girilirse Oracle kaydın sonuna boşluk ekleyerek sabit uzunluğa kadar getirir. Örnek char(20).
VARCHAR2(sayı): Değişken uzunluklu alfasayısal verilerin tutulduğu alanlar için kullanılır. Oracle 7 ve önceki sürümlerinde 2000 karakter, Oracle 8 ve sonraki sürümlerinde 4000 karakter uzunluğunda bilgi girilebilir. Örnek varchar2(30).
NUMBER(n,p): Tamsayı ve Gerçel sayılar için kullanılan sayısal veri tipidir.Tam kısım en fazla 38 basamak olabilir. Ondalık kısmın basamak sayısı da –84 ile 127 arasında değişmektedir. Number veri tipinden türetilmiş int[eger], dec[imal], smallint ve real veri tipleri de kullanılabilmektedir.
DATE: Tarih tutan alanlar için kullanılır. Bu tip alanlarda, tarih bilgileri ve saat bilgileri tutulabilir. Tarih formatları Oracle yüklerken seçtiğiniz dile göre değişir. Amerikan standartı için ‘DD-MON-YY’ dir. Yani bir tarih ’03-MAY-01’ şeklinde görünür. NLS_DATE_FORMAT parametresi ile tarih formatı değiştirilebilir. Tarihsel alanlar üzerinde aritmetiksel işlemler yapılabilir. Sistem tarihi SYSDATE fonksiyonu kullanılarak öğrenilebilir. Sayısal veya karakter olarak tanımlı bir alandaki veriler TO_DATE fonksiyonu ile tarih tipine çevrilebilir.
LONG: 2 GB ‘a kadar bilgi tutabilen karakter alanlar için kullanılır. Bir tabloda bu tipten ancak bir adet alan tanımlanabilir. Long veri tipine sahip alanlar için index oluşturulamaz.
Not: Oracle’da boolean veri tipi yoktur. Bunun için char(1) ya da number(1) şeklinde tanımlama yapılıp kullanılabilir.
Not: Bir tablonun alanları kendi veri tipine uygun değerler alabildiği gibi bir de NULL değer alabilirler. NULL değeri sayısal olarak 0’dan ve karakter olarak ta boş karakterden(‘ ‘) faklıdır.
SQL bölümünün bundan sonraki kısmında SQL komutları örnek tablolar üzerinde anlatılacaktır. Oracle veritabanı ilk yüklendiğinde bir “SCOTT” adlı kullanıcı oluşturulur ve bu kullanıcıya ait demo tablolar da oluşturulur. Bu kullanıcı ve tabloları tamamen deneme amaçlıdır. Biz de raporumuzda bu kullanıcının tablolarını Türkçe’ye çevirip kullanacağız. Rapora ek olarak verilen disketteki demobld.sql dosyası bu tabloları oluşturmak için gereken komutları içermektedir. Disketteki bu dosya SQL*Plus komut satırından çalıştırılmalıdır. Tabi ki bu işlemleri yapabilmek için Oracle 8i veritabanı önceden yüklenmiş olmalıdır. Aşağıda kullandığımız komutları bu tablolar üzerinde deneyebilirsiniz.
Bu amaçla öncelikle tablolarımız hakkında bilgiler verelim. Oluşturduğumuz tablolar bir iş yerindeki işçi kayıtlarını, bolum adlarını tutmak için kullanılan tablolardır. Birinci tablo “isci” tablosudur. Bu tablo iscino:number(4), isciadi:varchar2(10), isi:varchar2(9), muduru:number(4), isbastar:date, ucret:number(7,2), bolum:number(2) alanlarından oluşmaktadır. Tablo da isçilerin numarası, adı, görevi, işe başlama tarihi, aldığı ücret ve işçinin müdür kodu yer almaktadır.
İkinci tablo “bolum” tablosudur. “Bölüm” tablosu bolumno:number(2), bolumadi: varchar2(14), yer: varchar2(13) alanlarından oluşmaktadır. Bu tabloda işçilerin çalıştıkları bölüm kodları,bölüm adları ve bölümün bulunduğu il adı yer almaktadır.
Üçüncü tablo “ucretoran” tablosudur. Bu tabloda derece:number(5), endusuc:number(5), enyukuc:number(5) alanları yer almaktadır. Tablo işçilerin alabilecekleri kıdem numaralarını ve bu numara için en düşük ve en yüksek ücret miktarlarını göstermektedir.
Sorgular
Veri tabanı içerisindeki tablolardan veri seçip listeleme ,kayıt ekleme, silme, değiştirme ile ilgili komutları bu başlık altında anlatacağız. Burada SQL ile ilgili olarak en çok kullanılan komut şekilleri anlatılmaya çalışılacaktır.
Bir tablonun yapısını görmek için DESC[IRIBE] komutu kullanılır.
Bir tablodan istenilen özellikteki verileri veri seçip listeleme için “SELECT” komutu kullanılır. Komutun yapısı:
1 |
SELECT [ DISTINCT | ALL ] <sütun(lar)> FROM <tablo adı> |
2 |
3 |
[ WHERE <şart> ] |
4 |
5 |
[ GROUP BY <sütunlar>] |
6 |
7 |
[ HAVING < grup kısıtlaması>] |
8 |
9 |
[ ORDER BY <sütun(lar) [ ASC | DESC ]> ] |
İşi ‘tezgahtar’ olan ve aldığı maaş 900’den büyük olan işçi kayıtların listesi.
İşçi tablosunda adı ‘m’ ile başlayan kayıtların listesi.
Burada “_” alt tire işareti tek bir karaktere ve ‘%’ işareti birden fazla karaktere karşılık gelir. Birinci sorguda iki alt tire işareti kullanıldığında 3 adet kayıt listelenmiş, ikinci sorguda alt tire işareti üçe çıkarıldığında iki kayıt listelenmiştir. Çünkü ikinci sorguda istenen kayıtların isciadi alanının uzunluğu en az 5 karaktere çıkarılmış oluyor.
İşçi tablosundan numarası ‘79’ ile başlayan kayıtların isciadi alanına göre tersten sıralanmış listesi. Burada to_char fonksiyonu iscino sayısal alanını karaktere çevirmek ve substr fonksiyonu da soldan ilk iki karakterini alıp karşılaştırma yapabilmek için kullanılmıştır.
Eğer tablodan listelenecek kaydın bir alanının içeriği tam olarak bilinmiyorsa ilgili kelimenin yakın telaffuzu yazılarak “soundex” fonksiyonu ile listeleme yapılabilir.
Months_between(tarih1,tarih2) fonksiyonu iki tarih arasındaki farkı ay olarak verir. Aşağıdaki sorgu komutu bunu gerçekleştirmektedir. Burada işleme sokarak elde ettiğimiz bir alana isim verme(bu örnekte FARK) işlemi de görülmektedir. Bu isim verme işlemi her alan için virgülden önce yapılabilir.
COUNT(* | [ DISTINCT | ALL ] açıklama) fonksiyonu sorgu sonucu dönen kayıt miktarını göstermektedir. Eğer parametre olarak “*” girilirse tablodaki tüm kayıt sayısını verir. Parametre olarak bir sütun adı verilirse, o sütundaki içeriği NULL olmayan tüm kayıt sayısını verir.
“GROUP BY” yardımcı sözcüğü bir alana göre kayıtları guruplamak için kullanılır. Aşağıdaki örnekte isci tablosu içerisinde bir bölümde çalışan toplam kişi sayısı bulunuyor ve listelemede bolum alanı içerisindeki grup sayısı kadar kayıt yer alıyor. Yani bizim isci tablosunda 10,20,30 olmak üzere üç farklı bölüm numarası olduğundan 3 kayıt listeleniyor. Bölüm adı ve kodlarını tutan bölüm tablosunda toplam 4 adet kayıt olduğu, halde 40 nolu bölüm koduna sahip hiç bir işçi için “isci” tablosuna kayıt yapılmamış olduğu buradan anlaşılabilir.
“HAVING” yardımcı sözcüğü “GROUP BY” yardımcı sözcüğü ile gruplanan kayıtlar üzerinde kısıtlama yapma işine yarar. Aşağıdaki örnekte isci tablosunda ikiden fazla kişi tarafından yapılan işlerin listesini veren komut gösterilmiştir.
Bir işçinin adının ve çalıştığı yerin isminin(kodunun değil) listelenmesini istiyorsak, o işçinin çalıştığı yer kodunun adını bolum tablosundan getirmeliyiz. Bu tip işlemler “tablo birleştirme” işlemleri olarak adlandırılır. Verdiğimiz bu örneğe “eşit birleştirme” denir. Eşit birleştirme işlemlerinde bir tablodaki değere, diğer tabloda da mutlaka bir değer karşılık gelir ve “=” operatörü eşit birleştirme işlemlerinde kullanılır.
Bu örnek her bir bölümde belli bir işi yapanların ortalama maaş miktarlarının listesini verir. Örneğin satış bölümünde satış görevlisi olanların aldıkları maaşların ortalaması. Buna göre satış bölümünde 3 kişi varmış ve bunların maaşlarının ortalaması 1450.
Birleştirme işlemlerinde “eşit olmayan birleştirme” de vardır. Buna göre bir tabloda ki bir değer diğer tablodaki iki değer arasında yer almaktadır. Örneğin aşağıdaki örnek isci tablosundaki işçilerin ücretlerini ucretoran tablosundaki en düşük ve en yüksek ücret alanları ile karşılaştırılıp, bu işçilerin kıdemlerini bulmayı sağlıyor. Dikkat edilirse “from” sözcüğünden sonra yazılan tablo adları için bir boşluk bıraktıktan sonra kısa bir isim verilebiliyor. Böylece uzun tablo adını sürekli yazmaktansa o tablo adı için “alias” olarak adlandırılan kısa isim kullanılabiliyor.
Birleştirme işlemleri yapılırken karşımıza şöyle bir problem çıkmaktadır. Birleştirme yapılan tablolardan ikinci tabloda birinci tablodaki her kaydın karşılığı olmazsa, karşılığı olmayan kayıtlar sorgu sonucunda sadece olmayan kayıtlar değil bilakis hiç kayıt gelmez. Bunun için “dış birleştirme” kullanılır. Dış birleştirme işlemi, kayıtları eksik olan tablonun şart tarafına “(+)” işareti konularak yapılır. Örneğin isci tablomuzda çalıştığı bölüm kodu 40 olan hiçbir kayıt yoktu, fakat bolum tablosunda 40 kodlu bir bölüm vardı. Bu tablolardan tüm bölümlerde çalışan işçilerin listesini veren komutun şöyle yazıldığını düşünelim:
Dikkat edilirse 40 nolu bölümden işçi tablosunda hiç kimse olmadığı için böyle bir bölümün var olduğu bu sorgudan anlaşılamıyor. Bu komut şöyle yazılsaydı daha doğru olacaktı:
Bazen bir tablonun içindeki alanlar birbirleri ile ilişkili olabilir. Örneğin isci tablosunda bir işçinin müdürünün kodu tutulmakta ve bu müdürün kaydı da ayrı bir kayıt olarak yine isci tablosunda yer almakta. Burada “kendine birleştirme”(self-join) kullanılır. Aşağıda bununla ilgili bir örnek verilmiştir.
Birkaç tablo üzerinde yapılan sorgular üzerinde birleştirme ya da fark alma işlemleri yapılabilir. Bunun için UNION, INTERSECTION ve MINUS operatörleri kullanılır. Aşağıdaki örnekte isci tablosundan yapılan iki sorgu UNION operatörü ile birleştirilmiştir.
SQL/19
Aşağıdaki sorgu ile çalıştığı bölüm kodu 30 olan ve müdür olmayan işçiler listelenmiştir.
Aşağıdaki sorgu ile işi “satış gör” olan ve müdür kodu 7698 olan kayıtlar listelenmiştir.
SQL*Plus kullanırken kullanıcıdan alınan bir bilgiye uyacak şekilde sorgulamalar yapılabilir.Örneğin aşağıda kullanıcının girdiği işçi numarasına ait bilgileri listeleyen bir sorgu yer almaktadır:
SQL’de bir sorgunun çıktısı diğer bir sorgu için girdi olarak kullanılabilir. Bunu göstermek için isci tablosu içerisinde maaşı, tüm kayıtların ortalama maaşından az olan kayıtların, listesini veren bir sorgu gösterilmiştir.
SQL’de bir tabloya yeni bir kayıt eklemek için “INSERT INTO” komutu kullanılır. Aşağıda isci tablosuna yeni bir kayıt ekleme komutu gösterilmiştir.
1 |
INSERT INTO tablo-adı (sütun1,sütun2,.......) VALUES (değer1,değer2,....) |
SQL’de bir tablodan kayıt silmek için ‘DELETE FROM’ komutu kullanılır.
DELETE FROM tablo-adı WHERE şart
SQL’de bir tablodaki bir kayıtta değişiklik yapma komutu ‘UPDATE’ tir. UPDATE tablo-adı SET sütun-adı=değer WHERE şart