SQL

Yazan : Şadi Evren ŞEKER

Yapısal sorgulama dili (SQL) ilişkisel veritabanı yönetim sistemlerinde (relational database management system) kullanılan ve sistem üzerinde programcının istediği veriyi organize etmesi, sorgulaması, ekleme veya değiştirme yapması kısacası veriyi yönetmesi amacına yöneliktir.

SQL kullanımı ve yapısı itibari ile bir komut satır dili olarak da düşünülebilir. Yani kullanıcılar bir komut satırında komutları çalıştırır gibi SQL cümlelerini (statements) girmekte ve sonuçları satır satır görmektedirler.

Günümüzde pekçok sistemin kullandığı SQL standartlarını ISO (International Standards organisation, uluslar arası standartlar enstitüsü) belirlemektedir. Güncel olarak bulunabilecek standartlardan en eskisi 1999 yılında yayınlanmıştır. Bu yıldan önceki standartları destekleyen ortamlar artık yok denecek kadar azdır.

1999 yılından sonra sırasıyla 2003, 2005 ve son olarak 2008 yıllarında standartlarda değişiklikler olmuştur kısaca bu yıllardaki değişikliklerin getirdikleri aşağıdaki şekilde anlatılabilir:

1999 yılında: Regular expression, özyineli sorgular (recursive queries), tetikler (triggers), fonksiyonel programlama (procedural programming) ve çok ilkel anlamda nesne yönelimli programlama özellikleri kazandırılmıştır

2003 yılındaki en önemli katkı XML desteğidir. özellikle nesne yönelimli programlama yapılan ortamlar için büyük bir avantaj sağlamıştır.

2005 yılında XML’in kullanımının artmasıyla birlikte XQuery ismi de verilen ve tamamen veritabanını bir XML kaynağı (örneğin bir dosya gibi) görmeye yarayan sorgulama dili standartlaşmıştır. Veriler arasında klasik veritabanı bağı kurulmasının yanında XML bağlarının kurulması da mümkün hale gelmiştir.

2008 yılında ise ilk defa 2003 yılında kazandırılan pencere fonksiyonları (window functions) netleştirilmiş ve olukça esnek bir yapıya kavuşturulmuştur. (pencere fonksiyonlarını bilmeyenler için kısaca veri öbekleri üzerinde çalışan fonksiyonlar olduğunu söyleyebiliriz. Örneğin hareketli ortalama alma gibi)

SQL dili yapısal olarak 3 ana grupta incelenebilir:

  • DML: Data Manuplation Language , Veriyi işlemeye yarayan komutlar topluluğudur (örneğin select komutu)
  • DCL: Data Control Language, Veri üzerinde kontrol yapmaya yarayan komutlar topluluğudur. (örneğin grant revoke)
  • DDL: Data Definition Language, veriyi tanımlayama yarayan komutlar topluluğudur. (örneğin create, drop, truncate gibi)

Örnek DML (Zeynep Hn. Talebi üzerine)

MS SQL için belirli tarih aralığında bir tabloyu filitrelemek isteyelim. Yani tablodaki sadece belirli tarihe uygun olanlar gelecek. Örnek olarak aşağıdaki tabloyu ele alalım:

KullanıcıID KonusmaTarihi Süresi
1 2008-11-08 00:00:00.000 5
2 2009-07-01 11:22:00.000 3
3 2009-07-02 13:00:00.000 11
4 2001-11-08 00:00:00.000 2

Yukarıdaki tablo temsili olarak verilmiştir. Konuşmaya başlangıç tarih / saat ve sürelerinin tutulduğunu düşünelim. Buradaki konusmaTarihi kolonunun DATETIME tipinde olduğunu kabul ediyoruz. (farklı tiplerde sorun yaşayabilirsiniz bu durumda çevirim yapmanız gerekebilir).

Örnek sorgumuz (query) aşağıdaki şekilde olsun:

SELECT * FROM yukaridakiTablo WHERE 
KonusmaTarihi >= '2009-07-01'AND 
KonusmaTarihi <'2009-07-21'

Yukarıdaki sorguda tarih aralığı sorgulanmıştır. Buna göre Temmuz ayının 1 ile 21 (21 dahil değil 1 dahil) günleri arasındaki değerler istenir ve sonuç aşağıdaki şekilde olur:

KullanıcıID KonusmaTarihi Süresi
2 2009-07-01 11:22:00.000 3
3 2009-07-02 13:00:00.000 11

Yukarıdaki tabloda kriteri sağlamayan satırlar elenmiş ve istediğimiz sonuç görüntülenmiştir. Ayrıca çok sık yapıldığı için aşağıdaki HATALI sql satırlarını da anlatmak istiyorum:

SELECT * FROM yukaridakiTablo WHERE 
KonusmaTarihi = '2009-07-01'

Yukarıdaki bu sorguda hiç bir sonuç dönemz. Bunun sebebi saat kısmı verilmeden sadece tarih ile sorgulanmasıdır. Yani tam olarak tarihin eşit olması için saat ksımının 00:00:00.000 olması gerekir ve bu durumu sağlayan kayıt yoktur.

Benzer şekilde:

SELECT * FROM yukaridakiTablo WHERE 
KonusmaTarihi = '2008-11-08'

Sorgusu verilseydi sadece 1. satır sonuç olarak dönecektir.

Bu tip tarih eşitliği kontrollerinde ogünden büyük eşit ve ertesi günden küçük tarihleri kontrol etmeniz daha doğru olur.

SELECT * FROM yukaridakiTablo WHERE 
KonusmaTarihi >= '2009-07-01'AND 
KonusmaTarihi <'2009-07-02'

Şeklinde kontrol edilebilir.

Diğer bir bilinçsiz kullanım da BETWEEN kelimesidir. BETWEEN kelimesi her iki tarihi de dahil eder:

SELECT * FROM yukaridakiTablo WHERE 
KonusmaTarihi BETWEEN '2009-07-01'AND '2009-07-02'

şeklinde girilen bir sorgu için hem 01 temmuz hem de 02 temmuzdaki bütün konuşmalar görüntülenecektir.

Yorumlar

  1. Zeynep Kaya

    Merhabalar
    SQL serverda bir kolondaki tarih sütunun belirli tarih aralıgında baska bir sütundan bilgi almak istiyorum.Ornegin bir sirkette bir kullanıcının haziran ayındaki telefonda konusma süresinin ortalamasını almak istiyorum.Burda konusmayaBaslamaTarih kolonu,kullanıcıID kolonu ve konusmaSüresi kolonları var.Ben tarih srgusunu nasıl yazıcamı bilmiyorum.Ne yazsam hata veriyor.Acilen yardım ederseniz cok memnun olurum.İyi günler

  2. Şadi Evren ŞEKER Article Author

    Elbette yardım ederiz.

    SQL server için yukarıdaki yazıya ilave bir alt başlık ekliyorum bu başlıkta tarih ile ilgili isteğinizin cevabını ve sık yapılan hataları anlatmaya çalışacağım. Umarım yardımcı olur.

    Başarılar

  3. Zeynep Kaya

    İyi günler.Benim size bi sorum daha olacak.(Baska bi yerde bulamıyorum.)
    Kullanıcıdan alınan degere gore arama yapıyorum.Örnegin klavyeden ID girilecek ve ID si verilen kişinin bana yasını vericek.Şimdi ben burda klavyeden nasıl deger alacagımı ögrenmek istiyorum.Simdiden teşekkürler..

  4. Esra Gül İckilli

    Merhaba.Ben Esra Gül.
    Burda SQL den bahsetmişsiniz.Bende yeni SQL ve C# calışmaya başladım.Bi sorum olucak.Sql server dan c# nasıl veri cekebiliriz Kısaca bilgi verebilirseniz gercekten cok memnun olurum.Kolay gelsin..

  5. Şadi Evren ŞEKER Article Author

    Elbette. Sizin sorunuz için yeni bir başlığa kod ve kodu adım adım anlatan açıklama ekledim. Konuyu CSharp ve SQL başlığı altında okuyabilirsiniz. Umarım yardımcı olur.

    Başarılar

  6. evren

    merhabalar hocam .hocam ben ettim etmedim c yi tam anlayamadım mantıkta sorun yaşıyorum özellikle fonksiyonlarda veri gönderme ve döngülerde sorun yaşıyorum(while for ) yardımcı olursanız sevinirim şimdiden teşekkürler

  7. Fatih Kabakcı

    Şadi hocam merhaba,DCL de kullanılan DENY ifadesi DROP ile kullanılabilir mi ? Okuduğum bir kitapta DENY DROP TABLE ifadesi ile bir kullanıcının tablo silme yetkisini kaldırınız sorusu geçiyordu.Ancak Sql server query bu ifadeyi parse etmiyor.Microsoftun sitesindeki ALL Permissions içerisinde de DROP ifadesi bulunmuyor.http://msdn.microsoft.com/en-us/library/ms188338(v=sql.90).aspx.Ben yinede emin olabilmek için size danışmak istedim hocam.

    Saygılarımla

evren için bir cevap yazın Cevabı iptal et

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir