SQL Yapısal Sorgulama Dili
Gönderildi: admin tarafından 31-07-2008 Saat 04:01
Bu makale PHP ve MySQL'e yeni başlayan ve orta düzeyde diyebileğimiz kullanıcılara SQL komutlarını anlatmak için yazılmıştır.Kendini iyi bir programcı olarak görenlerin bu makaleyi okumasını tavsiye etmem çünkü bunları zaten biliyorsunuzdur.
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.
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.
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.
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.
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.
Yukarıdaki sorgu kayıtları tarih alanı baz alınarak azalan bir sırada listelenecektir.
Yukarıdaki sorgu kayıtları maaş alanı baz alınarak artan bir sırada listeleyecektir.
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.
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.
Eğer bir kriter belirli bir aralığın içinde yer almasını isterseniz BETWEEN operatörü kullanbilirsiniz.
Yukarıdaki sorgu maaşı 600 milyon ile 2 milyar arasındaki personellerin tüm bilgisini görüntülecektir.
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()
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.
Bu sorgunun ne yaptığını sanırım tahmin ediyorsunuzdur 
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.
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.
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.
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.
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.
Bu sorgudan sonra her bölümde kaç adet bayan personelin çalıştığı listelenecektir.
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.
Eğer sorgumuzu ;
Gibi değiştirdiğimizde sonuç tablomuz
Ş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.
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.
Şimdilik Bu kadar. Gelecek makalemde Birden fazla tablonun ilişkilendirilerek sorgulanması ve DDL ile mevcut tablonun yapısını değiştirmek için kullanacağımız fonksiyonları açıklamaya çalışacağım.
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.
PHP- Kodu:
SELECT name,surname,bolum FROM employee WHERE name='Sedat';
SELECT * FROM employee WHERE maas < 1000000000 ;
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.
PHP- Kodu:
SELECT * FROM employee WHERE cinsiyet='K' AND maas > 600000000 AND bolum='Bilgi İşlem';
PHP- Kodu:
SELECT * from employee WHERE bolum='Satın Alma' OR bolum='Bilgi İşlem';
Sorgularımızda bazen verilerin artan yada azalan bir sıralamada listelenmesini isteyebilirsiniz. O zaman ASC ve DESC ifadelerini kullanmamız gerekecektir.
PHP- Kodu:
SELECT * FROM employee ORDER BY tarih DESC;
PHP- Kodu:
SELECT * FROM employee ORDER BY maas ASC;
PHP- Kodu:
SELECT * FROM employee WHERE maas >= 900000000 AND bolum ='Bilgi İşlem' ORDER BY maas DESC;
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.
PHP- Kodu:
SELECT bolum FROM employee WHERE maas > 50000000;
PHP- Kodu:
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.
PHP- Kodu:
SELECT * FROM employee WHERE maas BETWEEN 600000000 AND 2000000000;
PHP- Kodu:
SELECT * FROM employee WHERE is_bas_tar BETWEEN {1980-06-01} AND {2002-06-01};
AVG(),SUM(),MIN(),MAX(),COUNT()
PHP- Kodu:
SELECT MIN(maas) AS enazmaas FROM employee WHERE bolum='Bilgi İşlem';
PHP- Kodu:
SELECT MAX(maas) FROM employee WHERE bolum='Bilgi İşlem';

PHP- Kodu:
SELECT SUM(maas) FROM employee WHERE bolum='Bilgi İşlem';
PHP- Kodu:
SELECT AVG(yas) FROM employee where bolum='Halkla İlişkiler';
PHP- Kodu:
SELECT COUNT(*) fROM employee;
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.
PHP- Kodu:
SELECT COUNT(*) FROM employee WHERE maas<50000000 AND medeni_hal='evli' AND bolum='Basın Yayın'
Örneğin yaşı 20,21,22,23 olmayan personelleri listelemek için IN operatörünü kullanabiliriz.
PHP- Kodu:
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.
PHP- Kodu:
SELECT bolum,count(*) FROM employee WHERE cinsiyet='K' GROUP BY bolum;
PHP- Kodu:
SELECT count(*),cinsiyet,AVG(maas) FROM employee GROUP by cinsiyet;
| count( * ) | cinsiyet | AVG( maas ) |
|---|---|---|
| 6 | K | 888333333.3333 |
| 8 | E | 1218750000.0000 |
PHP- Kodu:
SELECT count( * ) AS kisi, cinsiyet, AVG( maas ) AS ortalama FROM employee GROUP BY cinsiyet;
| 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.
PHP- Kodu:
SELECT count( * ) , bolum
FROM employee
WHERE cinsiyet = 'E'
GROUP BY bolum
HAVING MAX( maas ) > 1000000000 ;
Şimdilik Bu kadar. Gelecek makalemde Birden fazla tablonun ilişkilendirilerek sorgulanması ve DDL ile mevcut tablonun yapısını değiştirmek için kullanacağımız fonksiyonları açıklamaya çalışacağım.
Toplam Yorum 0
Yorumlar
Toplam Trackback 0
Trackbacks
admin Tarafından Son Blog Kayıtları
- Domain Status (21-10-2008)
- Yottabyte, Zettabyte, Exabyte, Petabyte, Terabyte, Gigabyte, Megabyte (09-10-2008)
- Link Değişim Kuralları (02-10-2008)
- Google Monitör (15-09-2008)
- Paypal Hesabınızdaki Para 5$'a ayağınıza Gelsin (15-09-2008)





