PDA

Orijinalini görmek için tıklayınız : SQL Yapısal Sorgulama Dili I


kurtkuzu
10-11-2007, 23:41 PM
SQL - Structured Query Language (Yapısal Sorgulama Dili) -I-

SQL Bir veritabanı sorgulama ve Yönetim Dilidir. Hemen hemen tüm ilişkisel veritabanı sistemleri SQL'i anlama yeteneğine sahiptir. İngilizceye olan yakınlığı bu dili veritabanı endüstrisinde hatrı sayılır bir yere getirmiştir. Her firma SQL'i kendine uygun bir şekle sokarak bazı eklentiler yaparak kendi veritabanı sistemlerinde kullanmaktadırlar. Mesela Interbase için ISQL Oracle için PL/SQL vs..Ancak hangi ilişkisel veritabanını kullanırsanız kullanın Standart SQL bu sistemler tarafından sorunsuz çalışacaktır.Çünkü SQL bir ANSI ve ISO standartıdır. SQL bilinenin aksine bir Programlama dili değildir. SQL veritabanı sorgulama ve yönetim dilidir. SQL komutları temelde iki alt grupta ele alınır.

DDL - Data definition Language (Veri tanımlama dili)
DML - Data manipulation Language (Veri İşleme dili)

Bu yazı dizisi PHP ve MySQL'e yeni başlayan ve orta düzeyde diyebileğimiz kullanıcılar içindir.

DML - Data manipulation Language (Veri işleme Dili)

- SELECT
- INSERT
- UPDATE
- DELETE

SELECT KOMUTU
Select komutu kullandığımız tablodan bizim belirlediğimiz kriterlere göre kayıtları seçer. Hangi alanlar görüntülenmek isteniyorsa o alanların ismi araya virgül koyularak yazılır.

SELECT name,surname FROM employee;
Bu sorgu deyimi employee tablosundaki name ve surname alanlarındaki tüm verileri görüntüler.

SELECT * FROM employee;
Eğer tablodaki tüm alanların görüntülenmesini istiyorsak * karakterini kullanırız.

Çoğu zaman tablodaki tüm kayıtları değilde bizim belirlediğimiz kriterlere göre görüntülenmesini isteriz. Mesela ismi'S' ile başlayan, adı Hatice olan, maaşı 1.000.000.000 dan az olan gibi. Bu durumda WHERE deyimini de gerekli operatörle birlikte kullanarak sorgumuza eklememiz gerekecektir.

SELECT name,surname,bolum FROM employee WHERE name='Sedat';
SELECT * FROM employee WHERE maas < 1000000000 ;

Eğer sorgusu yapılacak anahtar değer bir string ise o zaman ' ' yada " " içine almamız gerekecektir. Sayısal ifadeler için gerekli değildir.

WHERE ile kullanabilecek operatörler
< Küçük
> Büyük
>= Büyük veya eşit
<= Küçük veya eşit
!< Küçük değil
!> Büyük değil
= Eşit
<> veya != veya # Eşit değil

Birden fazla kritere göre sorgu yapmak istediğimizde AND,OR,NOT operatörleri Sorgu içinde kullanılmalıdır.

SELECT * FROM employee WHERE cinsiyet='K' AND maas > 600000000 AND bolum='Bilgi İşlem';

Yukarıdaki sorgu bilgi işlem bölümünde çalışan maaşı 600.000.000 dan fazla bayan personel yada personellerin tüm versisini görüntüler.

SELECT * from employee WHERE bolum='Satın Alma' OR bolum='Bilgi İşlem';

Yukarıdaki sorgu bölümü satın alma yada bilgi işlem olan personel yada personellerin tüm versini görüntüler.

Sorgularımızda bazen verilerin artan yada azalan bir sıralamada listelenmesini isteyebilirsiniz. O zaman ASC ve DESC ifadelerini kullanmamız gerekecektir.

SELECT * FROM employee ORDER BY tarih DESC;

Yukarıdaki sorgu kayıtları tarih alanı baz alınarak azalan bir sırada listelenecektir.

SELECT * FROM employee ORDER BY maas ASC;

Yukarıdaki sorgu kayıtları maaş alanı baz alınarak artan bir sırada listeleyecektir.

SELECT * FROM employee WHERE maas >= 900000000 AND bolum ='Bilgi İşlem' ORDER BY maas DESC;

Yukarıdaki sorgu ifadesi bilgi işlem de çalışan maaşı 900.000.000 a eşit veya fazla olan personeli maaş bilgisi baz alınarak azalan sırada listeler.

Buraya kadar yazdıklarımı eğer usta bir programcı okuduysa şöyle bir eleştiri de bulunabilir. Performans açısından veritabanında bolum alanına Bilgi işlem,satın alma,halkla ilişkiler gibi bellekte fazla yer kaplayacak stringlerin bulunması iyi olmayabilir. Bu durumda MySQL de Enum Tipi tanımlanarak her bölüme bir numara verilebilir.

Tekrarlı kayıtları bir seferde listelemek :

Bazen kullanıdığımız sorgu aynı kaydı birden fazla listeleyebilir.
Bu birebir aynı olan kayıtları bir kez listelemek istiyorsak DISTINCT deyimini kullanabiliriz.

SELECT bolum FROM employee WHERE maas > 50000000;

Sorgusu sonucunda mesela bilgi işlem bolumunda çalışan ve maaşı 500 milyondan fazla olan kişiler buluancağı için sorgu sonucunda bilgi işlem bölümü bir den fazla listelenecektir.Bunu önlemek için Sorgu aşağıdaki gibi düzenlenebilir.

SELECT DISTICT bolum FROM employee WHERE maas>500000000;



Eğer bir kriter belirli bir aralığın içinde yer almasını isterseniz BETWEEN operatörü kullanbilirsiniz.

SELECT * FROM employee WHERE maas BETWEEN 600000000 AND 2000000000;

Yukarıdaki sorgu maaşı 600 milyon ile 2 milyar arasındaki personellerin tüm bilgisini görüntülecektir.

SELECT * FROM employee WHERE is_bas_tar BETWEEN {1980-06-01} AND {2002-06-01};

Yukaridaki sorgu ise işe başlama tarihini baz alarak iki tarih arasındaki değerleri sorgulayacaktır. Ancak burada Küme parentezleri dikkatinizi çekmiş olabilir. Eğer sorgu yapacağımız alan bir tarih (Date) tipinde ise küme parentezlerini kullanıyoruz.

AVG(),SUM(),MIN(),MAX(),COUNT()
SELECT MIN(maas) AS enazmaas FROM employee WHERE bolum='Bilgi İşlem';

Yukarıdaki sorgu bilgi işlem bölümünda çalışan ve en düşük maaşı alan personeli görünütüler. Ancak AS enazmaas eklentisi ile tabloda var olmayan harici bir alan oluşturuyoruz.Kullanmazsak sorgu yine çalışırdı ben yer gelmişken bu konuyada yer vermek istedim sadece.

SELECT MAX(maas) FROM employee WHERE bolum='Bilgi İşlem';

Bu sorgunun ne yaptığını sanırım tahmin ediyorsunuzdur :)

SELECT SUM(maas) FROM employee WHERE bolum='Bilgi İşlem';

Yukarıdaki sorgu bilgi işlem bölümünde çalışan tüm personelin maaşlarının toplamını görüntüler. Eğer bir alandaki tüm kayıtların toplamını bulmamız gerekirse SUM() fonksiyonu işimize yarayacaktır.

SELECT AVG(yas) FROM employee where bolum='Halkla İlişkiler';

Yukarıdaki sorgu halkla ilişkiler bölümünde çalışan personelin yaş ortalamasını verecetir.AVG() fonksiyonu istenen alandaki verilerin aritmetik ortasını görüntüler.

SELECT COUNT(*) fROM employee;

Yukarıdaki sorgu tablodaki kayıt sayısını görüntüler;

Eğer şirketin basın yayın bölümünde çalışan evli ve maaşı 500 milyondan az olan kişilerin sayısını öğrenmek istiyorsak aşağıdaki sorgu işimizi görecektir.


SELECT COUNT(*) FROM employee WHERE maas<50000000 AND medeni_hal='evli' AND bolum='Basın Yayın'

Bazen sorgu kriterleri bir veri kümesi ile tanımlanır ve bu veri kümesi içinde aradığımızın değerin var olup olmamasına göre görüntülenmesini isteyebiliriz.

Örneğin yaşı 20,21,22,23 olmayan personelleri listelemek için IN operatörünü kullanabiliriz.

SELECT * FROM employee WHERE yas NOT IN (20,21,22,23);


Gruplandırılmış veriler üzerinde işlem
Şirektimizde ki her departmanda çalışan bayan personel sayısını bulmak ve bolu isimlerine göre gruplandırmak istersek : örneğin Bilgi İşlem 10 halkla ilişkiler 3 vs..
O zaman GROUP BY foksiyonunu kullanmamız gerekecektir.

SELECT bolum,count(*) FROM employee WHERE cinsiyet='K' GROUP BY bolum;

Bu sorgudan sonra her bölümde kaç adet bayan personelin çalıştığı listelenecektir.

SELECT count(*),cinsiyet,AVG(maas) FROM employee GROUP by cinsiyet;

Yukarıdaki sorgu şirketimizde kaç bayan ve kaç erkek personel olduğunu ve bunların ortalama maaşlarını görüntüleyecektir.Çıktı aşağıdaki gibidir.


count( * ) cinsiyet AVG( maas )
6 K 888333333.3333
8 E 1218750000.0000

Eğer sorgumuzu ;

SELECT count( * ) AS kisi, cinsiyet, AVG( maas ) AS ortalama FROM employee GROUP BY cinsiyet;
Gibi değiştirdiğimizde sonuç tablomuz

Kisi cinsiyet Ortalama
6 K 888333333.3333
8 E 1218750000.0000


Şeklinde değişecekti.

Bazen verileri hem gruplandırmak hemde bu gruplandılmış veriler üzerinde bazı kriterlere göre seçim yapmak zorunda kalabiliriz.

Mesela en yüksek maaşın 1.000.000.000 ın üzerinde olan bölümlerde çalışan erkek personelin sayısını isteyebiliriz.

SELECT count( * ) , bolum
FROM employee
WHERE cinsiyet = 'E'
GROUP BY bolum
HAVING MAX( maas ) > 1000000000 ;

HAVING gruplandırılmış veriler üzerinde işlem yapar ve mutlaka min() max(),count(),SUM(),AVG() vs.. ile birlikte kullanılması gerekir. Dolayısıyla SELECT + GROUP BY ifadelerinin kullanılmadığı sorgularda HAVING kullanmak mantıksızdır. Kullanıdığınız da zaten bir hata mesajı alırsınız.