Sayfalar

26 Haziran 2012 Salı

SQL ve İlgili Terimlere Bir Bakış...

Merhaba Arkadaşlar,

Bu yazımda biraz SQL'i ele almak istiyorum. Biliyorum ki pek çok blogda SQL üzerine yazılar mevcut ama neredeyse bunlar birbirlerinin kopyası biçiminde. SQL komutlarını anlatarak işin içinden çıkılan yazılar pek çoğu. Ben biraz daha bilinmeyen yönlerine değinerek ele almak istiyorum. Yani SELECT, DISTINCT, ORDER BY gibi kavramları açıklamadan önce bilmemiz gereken bir takım genel bilgiler olduğunu düşünüyorum.

Biliyoruz ki SQL veritabanlarını yönetmek için beş adet ilişkisel operatörün kullanımının gereğiyle doğmuş ve büyüyerek gelişmiş ve günümüzdeki PL/SQL gibi çok gelişmiş şekillerde ortaya çıkmıştır. Hemen bu 5 adet operatörü hatırlayalım:





1.) SELECTION: Bazı ölçütler kullanarak ilgili tablodaki istenen satırları çekmek için kullanılır.
2.) PROJECTION: Bir tablodaki sütunlardan sadece istenen kısımlara erişilir ve eğer tekrar eden sonuçlar varsa bunlar kullanıcıya yansıtılmaz.
3.) UNION: İki tablonun birleşimidir. 30 ve 20 satırlı iki tablo bu işleme tabi tutulursa en fazla 50 satırlı bir tablo oluşur. Çünkü yine tekrar eden sonuçlar çıkartılır.
4.) DIFFERENCE: Bir tablodan diğer tabloyu aritmetik işlem yapar gibi çıkarmaktır.
5.) JOIN: İki tablonun kayıtlarını birleştirme. 5 ve 20 satırlı iki tablonun JOIN'lenmesi sonucu 100 satırlı bir tablo oluşur. Yine 5 ve 10 sütunlu iki tabloda bu işlem uygulanırsa 15 sütunlu yeni tablo elde edilir.

Şunu da eklemek gerekirse SQL'de aynı sonucu veren birden çok SQL sorgusu olabilir. Zaten bu yüzden Query Optimizer aracı diye bir araç var. Bu araç sayesinde verilen SQL sorgsunun eş değer sonuçtaki SQL sorgusu Oracle tarafından tespit edilir. Fakat hala tam bir optimize aşamaya gelinememiştir. Bu araç Oracle ile sürekli güncellenerek gelmektedir. Yani işletilen algoritma henüz istenen şekilde değildir. Çünkü aynı sorgu için bulunan optimize sorgu ikinci denemede farklı çıkabilmektedir. Fakat sonuç her zaman aynıdır. Bu aracın tek amacı en verimli şekilde sorguyu çalıştırmak ve ortamı en az şekilde meşgul etmektir.

Tüm veritabanı aktiviteleri SQL ile sağlanmaktadır. Bu yüzden veritabanı ile ilgilenecek herkes SQL'i bilmek durumundadır. Bu görevler arasında veritabanı bakımı ve kullanıcı yönetimi gibi en alt düzeyden en üst düzeye kadar yapılacak her türlü işlem mevcuttur. SQL'e hakim olmanın diğer bir gereği veritabanı mantığındaki bir takım eksikliklerdir. Örneğin veri tekrarına izin verilmesi bazen büyük sıkıntılar oluşturur. Aynı şekilde boş değer alabilen veriler de... Mesela tek basit bir SQL sorgusuyla tüm veritabanını kilitlemek mümkündür! Eğer DBA; SQL'e hakim olamazsa bu işin içinden asla çıkamaz. Yani bunu bilmek bir lüks değil, zorunluluktur.

SQL'i geniş manada sınıflarsak iki şekilde inceleyebiliriz. Tabi geniş manada... Bunlar DML ve DDL'dir. DML veriler üzerinde işlem yapmak için, DDL ise veritabanındaki nesneleri oluşturmak ve modifiye etmek için kullanılır.

Data Definition Language yani DDL; temelde CREATE, ALTER ve DROP işlemlerini gerçekleştirir. Veritabanındaki farklı tipteki nesneleri oluşturma, silme, değiştirme işlemlerini sağlar.

Data Manipulation Language yani DML; SELECT, INSERT, UPDATE, MERGE gibi işlemleri sağlar. Elbette ekleme, silme, güncelleme işlemlerini bu yazıyı okumak için açtıysanız biliyor olmalısınız. Ama MERGE gerçekten bilmediğimiz ve çok kullanışlı bir komut. Kısaca ne yaptığına bakalım:

MERGE: INSERT, UPDATE ve DELETE özelliklerini bünyesinde toplayan çok güçlü bir komuttur. Yani eğer bir kayıt veritabanında yoksa INSERT etmek, varsa da UPDATE etmek ya da DELETE etmek gerekebilir. Bu üç komutu ayrı ayrı yazmak yerine tek bir MERGE içinde yazabiliriz. Belki ileride daha ayrıntılı inceleyerek örnekleyebiliriz.

SQL Gömme: Ve bir diğer önemli mevzu. SQL bizim bildiğimiz gibi sürekli veritabanı üzerinde işlem yaparken komut ekranından şunu getir bunu götür diyerek çalıştırılmaz. Daha çok kullanıcı uygulamalarının içine gömülerek sunulur. Yani kullanıcı uygulamaları doğal olarak veritabanı ile haberleşmek için içerisinde gömülü bulunan SQL sorgularını kullanır. Bu haberleşme için ise bazı kısıtlar konulabilir. Yine haberleşme sağlanırken kod içerisinde kullanıcı adı ve şifresi ile veritabanına bağlanılır.

Peki işin veritabanı kısmıyla ilgilenenler de mi bunu yapmak zorunda? Hayır. Bunun için farklı ve kullanışlı bir araç olan SQL*PLUS devreye girer. Kodlara bulaşmadan veritabanıyla bağlantı sağlanır. Bunun dışında önceden tanımlanan sorguları vaktinde çalıştırma gibi görevler yüklenebilir. Ayrıca çeşitli şekillerde raporlama almak mümkündür.

Son olarak SQL'in bilinen üç adet eksikliğine değinmek istiyorum:

  • Boş değer alabilen veriler: Verinin değerinin bilinmediği halde veriyi saklamanın gerektiği durumlarda kullanılır. Bu gibi bir durumda tablodan veri çekerken NULL içerikli kısımlar problem oluşturur.
  • Kayıt tekrarı: SQL bir tabloda aynı kaydı birden çok yerde tutmaya izin verir ve Projection ve Union işlemleri bunları ayırt edemez.
  • Sorgu Kalitesi: Bu durum hala içinden çıkılamaz boyuttadır. Bir sorgu için birden fazla yol mevcuttur. Query Optimizer bir sorgu için hazırladığı çalıştırma planı her zaman aynı çıkamayabilir. 
PL/SQL: Oracle, içerisinde bir takım programlar saklamaya izin verir ve bu programlar tahmin edeceğiniz gibi Oracle tarafından geliştirilen PL/SQL ile yazılır. PL/SQL yani Procedural Language/Structured Query Language; isminden de anlaşıldığı gibi SQL ile prosedürel dillerin özelliklerinin birleştirilmesiyle oluşur. Bu özelliklerden kasıt döngüler, sorgu yapıları, alt programlardır. Fakat yine veritabanı ile bağlantısı SQL ile sağlanır. Mesela TRIGGER da bir PL/SQL özelliğidir. Tetikleyicilerle veritabanına doğru veri girişi yapılmasını zorla sağlayabiliriz! Her ne zaman veri girişi yapılacak olursa aktive olup devreye girerler. Yine verilere kimin eriştiği ve üzerinde ne tür değişiklikler yaptığının kaydı tutulabilir. Bu da güvenliği artırır. 

Evet arkadaşlar burada noktalıyorum. Zira temel bilgileri az-çok vermiş olduk. Takdir edersiniz ki SQL ve PL/SQL başlı başına birer dünya. Bunları 3 paragraf yazıyla öğrenmek mümkün değil. Fakat haklarında fikir sahibi olmak mümkün. 

Teşekkür eder, iyi çalışmalar dilerim...







Hiç yorum yok:

Yorum Gönder