...Alıntıdır...BÖLÜM 1 SQL'E GİRİŞ SQL'E (STRUCTURED QUERY LANGUAGE) GİRİŞ SQL kısaltması, Structured Query Language'e (Yapılandırılmış Sorgulama dili) karşılık gelir, ancak genellikle eski adı olan Sequel olarak okunur. SQL farklı türlerde ve pek çok donanım platformunda ilişkisel veri tabanı yönetim sistemi (RDBMS) oluşturarak erişmek için kullanılan standart dildir.
SQL veri tabanı uygulamalarında bir alt dil görevi yapar demiştik. Alt dil denmesinin nedeni, bir bilgisayar dilinin sahip olması gereken tüm komutlara sahip olmadığındandır. Sql'in sahip olmadığı bu komutlar, döngü komutları if then else yada goto gibi kontrol ve dallanma komutlarıdır. Fakat Sql'in diğer dillerle birlikte kullanılması mümkün olduğundan, gerekiyorsa, Sql komutları diğer dillerin döngü yada kontrol komutları içinde kullanılabilir.
Yer Tablosu
Bölüm-No Bulunduğu yer
Proje Tablosu
Proje-Adı Proje-No Yer Bölüm-No
Çalışma Tablosu
Personel soy. Güv. No. Proje-No. Saat
Bu tabloların her sütunu, tabloda saklanan verilerle ilişkili bir özelliği belirtmektedir. Her tablo satırı, birbiri ile ilişkili verileri saklamaktadır.
TABLOLARIN YARATILMASI SQL ile giriş bölümünde verilen tabloların yaratılması için, CREATEE TABLE komutu kullanılmaktadır. Aşağıda bir tablo yaratacak SQL komutları verilmiştir.
CREATE TABLE yer Bölüm_No SMALLINT, Bul_Yer VARCHAR(15));
CREATE TABLE Proje (Proje_Adi CHAR (10), Proje_No SMALLINT, Yer VARCHAR (15), Blm_No SMALLINT;
CREATE TABLE Calısma Personel_g_no CHAR (
, Proje_No SMALLINT, Saat SMALLINT );
SQL'DE VERİ TİPLERİTabloların oluşturulması için kullanılan sütun isimlerinin her biri farklı tipte tanımlanmıştır.
Char, Varchar, İnteger, Smallint, date, logical, numerik (x, y)
TABLOLARA VERİ YÜKLENMESİ Bir tabloya veri girişi işlemi için, SQL'de mevcut olan komut: INSERT INTO/VALUES komutudur. Bu komut yardımı ile personel adlı tabloya, ilk satır bilgileri, aşağıdaki gibi düzenlenmiş bir INSERT komutu ile girilebilir.
INSERT INTO Personel VALUES (1, '1234', 'Ali', 'Kuşcu', {01/03/99}, 'Samsun', . T. );
Komut içindeki değerler incelendiğine, sayısal nümerik değerler olduğu gibi yazılmakta, karakter türü veriler '' sembolleri içine alınmakta, lojik (mantıksal türdeki veriler. T. yada . F. şeklinde belirtilmekte ve tarih (date) türü bilgiler ise {} sembolleri ile ayırt edilmektedir.
SQL dilinin tüm ekran, üzerinde bilgi girişi için (full screen mode) kolaylık sağlayan ve etkileşimli (interacivate) olarak çalışmayı sağlayan komutları yoktur. Bu nedenle SQL tabloları içinde bilgi girişi genellikle, SQL'in içinde kullanıldığı üst dilin bilgi giriş komutlarından yararlanılarak yapılır.
TABLOLARDAKİ SÜTÜN VE TABLO İSİMLERİ ARASINDAKİ KURALLARSQL dilinde bir tabloya yada içindeki bir sütuna (kolon) ismi vermek için gerekli kurallar, bir SQL uygulamasından ötekine değişebilmektedir. Fakat genellikle, geçerli olan kurallar aşağıdaki gibidir.
İsim uzunlukları 18 karaktere kadar olabilir. (Bazı SQL uygulamalarında 8 olabilmektedir.
İlk karakter bir harf olmalıdır. Onu izleyen karakter, harf, rakam yada alt çizgi olabilir.
BÖLÜM 2 SORGULAMALAR TEK TABLO İÇİNDE SORGULAMALAR SQL içinde, tek bir tablo içinden çeşitli kriterlere göre bilgi sorgulama, bilgiyi sıralı olarak elde etme, bilgiyi özetleme, ortalama vb. gibi matematiksel işleri gerçekleştirmeyi sağlayan komut ve fonksiyonlar vardır. Ayrıca doğal olarak, aynı tipte işlemleri birden çok tabloyu birlikte ele alarak gerçekleştirmek de mümkündür.
SQL KOMUTLARISelect komutu : Select kalıbı sorgunun sonucunda istediğiniz bir alanın listesini gösterir Bir alan listesi yerine asterisk (*) işaretini kullanarak bir tablodaki bütün alanları seçebilirsiniz.
From komutu : From kalıbı, sorgunun oluşturulmasında dikkate almak istediğimiz tabloları gösterir.
Tek tablodan gerekli bilgileri elde etmek için sorgulama yapılabilecek SQL komutu olan SELECT'in en basit şekli aşağıdaki gibidir.
Örnek: SELECT * FROM Personel;Bu komut personel adlı tablo içindeki bütün bilgileri koşulsuz olarak listeleyecektir. Select sözcüğünü izleyen kısımda (*) sembolünün bulunması, ilgili tablodaki bütün sütun isimlerinin ve ilgili bilgileri listelemesini sağlayacaktır. Yukarıdaki komutun eşdeğeri :
Örnek: SELECT Sicil, Adi, Syd, Dtr, Dyr, Adr FROM personel;
SELECT sözcüğünü izleyen kısmında sütun adları, FROM sözcüğü kısmında ise tablo ismi belirtilmektedir.
Where Komutu : Where kalıbı kayıt seçiminde kullanılacak kriteri gösterir. Where olamadığı zaman bütün kayıtlar seçilir.
Örnek : SELECT Ismi, Sehir FROM Sehirler WHERE nüfus > 20000000;
Bu örneğe göre toplam nüfusu 20000000'den büyük olan tablonun adı şehirler olan kütükdeki bilgileri gösterir.
Distinct Komutu : Sql'de tablo içinde, birbirinin aynı data içeren satırlara müsaade edilir. Birbirinin aynı olan satırların, listeleme esnasında, bir kez yazılması için SELECT komutuna DISTINCT sözcüğü eklenir.
Örnek : SELECT DISTINCT Satici_No FROM Parca_Satis;
Burada Parça Satışı diye bir tablomuz var. Bu tabloda satıcı numaralarını listelemek istiyoruz. Fakat bilindiği gibi SQL tabloda aynı alanları listelemeye izin verir. Buradaki listelenmek istenen satıcıların numaralarını listelemektir. Bilindiği gibi bir satıcının sattığı birden çok mal olabilir. Bu sebeple her satış için satıcı nosu listelenecektir. DISTINCT burada bir satıcı nosunu tekrarlamadan listelemeye yarar.
TABLO BİLGİLERİNİN SIRALANMIŞ OLARAK LİSTELENMESİTablodan listelenecek bilgilerin, belili bir sütuna adına göre (numaraya vb. . )sıralanmış olarak görüntülenmesi için, Select komutuna Order by sözcüğü ilave edilir.
Örnek : Personel tablosundaki bilgilerden, sicil, ad, soyad ve brüt sütunlarını, maaş'a göre artan sırada (küçükten büyüğe doğru) sıralı olarak listeleyiniz. ?
SELECT sicil, ad, soyad, brüt FROM personel ORDER BY brüt ASC;
ASC sözcüğü (ascending) artan anlamındadır.
Örnek : SELECT ad, soyad, brüt FROM personel ORDER BY brüt DESC;
DESC (descending) sözcüğü azalan anlamındadır.
BİRDEN ÇOK ALANA GÖRE SIRALAMA Bir tablo içindeki verileri aynı anda birden çok sütuna (alana) göre sıralamak da mümkündür.
Örnek : Personel tablosu personel adı ve maaşa göre sıralamak isteyelim. Buna göre aşağıdaki Select komutunu yazmamız gerekir.
SELECT sicil, ad, soyad, brüt FROM personel ORDER By ad, brüt;
Burada, tablo öncelikle ad'a göre artan sırada (A'dan Z'ye doğru) sıralanacak, sadece aynı ad'a sahip olanlar kendi aralarında brüt'e göre artan sırada (düşük maaştan yüksek maaşa doğru) sıralanacaktır.
KOŞULA BAĞLI LİSTELEME SELECT komutu ile bir tablonun satırları içinde sadece bir koşulu sağlayanlar listelenebilir.
Örnek : Brüt maaşı 500 'den faza olan personel listelenmek istenirse, SELECT komutu aşağıdaki gibi yazılmalıdır.
SELECT * FROM personel WHERE brut>500;
Burada WHERE sözcüğünü izleyen kısımda koşul belirtilmektedir.
Koşul belirtilirken iki veri birbiri ile karşılaştırılır. SQL içinde verileri karşılaştırmak için bazı operatörler vardır. Karşılaştırılma ifadesinde karşılaştırılan verilerin türü aynı olmalıdır. Yani alfabetik bilgi alfabetik bilgiyle, nümerik veri ise nümerik bir veriyle karşılaştırılır.
SQL'de Karşılaştırma Operatörleri Operatör Anlamı < Den daha küçük > Den daha küçük = Eşit <= Küçük eşit >= Büyük eşit <> Farklı != Eşit Değil NOT IN Bir grup değer içinde olmayanlar. != ALL eşdeğeridir. ANY Bir grup içindeki değerlerden birini belirler. ALL Bir liste içindeki tüm değerlerle karşılaştırır. BETWEENxANDy X ve y değerleri arasındaki değerleri belirler. NOT X ve y arasında olmayan değerleri belirler. I NULL Yokluk değerine sahip olanları tanımlar. IS NOT NULL Yokluk değerine sahip olmayanları tanımlar.
ÇEŞİTLİ VERİ TİPLERİ İÇİN BASİT SORGULAMALARNümerik veri tipi: Sayısal veri tipi, SMALLINT, İNTEGER, DECIMAL, NUMERIC ve FLOAT tip bildiren sözcüklerde kullanılır.
Örnek : Brüt maaşı 800'den fazla olmayan personeli listeleyen program. ?
SELECT * FROM personel WHERE brüt <= 800; Karakter (Char) veri tipi: Karakter türündeki veriler, çift tırnak (" "), veya tek tırnak (' ') sembolleri içine yazılırlar. Bu tip veriler, rakamlardan oluşsa bile, matematiksel işlemler içinde kullanılamazlar.
Örnek : Adı ali olmayan personele ait kayıtları listeleyiniz?
SELECT * FROM personel WHERE ad <> "Ali" veya
SELECT * FROM personel WHERE ad != "Ali";
Tarih veri tipi: Tarih tipli veriler { } sembolleri içine yazılmalıdır.
Örnek : Hangi personelin doğum tarihi 1979'dan daha öncedir?
Mantıksal veri tipi (lojik) Mantıksal veriler 2 değer alır. Doğru (.T.true) ve yanlış (.F.false)
Örnek : Personel tablosundaki erkek elemanları listeleyiniz?
Not: Tabloda personelin cinsiyetini belirten cins adlı alan mantıksal türde tanımlanmıştır.
SELECT * FROM personel WHERE cins = .T. ;veya
SELECT * FROM personel WHERE cins;
Bu durumda cins alanında .T. olanlar listelenecektir.
BİRDEN ÇOK KOŞULA BAĞLI SORGULAMALAR NOT-AND-OR Bu operatörlerle birden çok koşula bağlı listelemeler yapılabilir.
Örnek : Maaşı 500'dan fazla ve cinsiyeti erkek olan personelin listeleyiniz. ?
SELECT * FROM personel WHERE brut > 500 AND cins=. T. ;
Her iki koşulunda aynı anda gerçekleşmesi istendiğinde AND sözcüğü kullanılmıştır.
Aşağıda örnek sorularla, mantıksal işlem operatörlerinin kullanımı konusunda fikir verilmektedir.
Örnek : Bölümü satış veya muhasebe olan kadın personelini listeleyiniz?. Satış bölümünün bölüm numarası 1 ve muhasebe bölümünün bölüm numarası 2 olduğunu varsayarsak:
SELECT * FROM personel WHERE (bolumno = 1 OR bolumno = 2)AND cins = . F. ;
Örnek : Satış bölümü ile muhasebe bölümündekiler kimlerdir?
SELECT * FROM personel WHERE (bolumno = 1 OR bolumno = 2);
Örnek : Bölümü satış yada muhasebe olmayan, 1978'den sonra doğmuş bayan personeli listeleyiniz?
SELECT * FROM personel WHERE NOT (bolumno = 1 OR bolumno = 2) AND
dogumtrh >= {01/01/78}AND cinsiyet = . F. ;
BİR VERİ KÜMESİ İÇİNDE ARAMA-IN OPERATÖRÜ Aşağıdaki örnek sorunun cevabını şu ana kadar öğrendiğimiz SQL komutları ile gerçekleştirebiliriz.
Örnek : Bölüm numarası 1, 2 yada 3 olan personelleri listeleyiniz?
SELECT * FROM personel WHERE bolumno = 1 OR bolumno = 2 OR bolumno = 3;
Fakat SQL'de bu işlemi gerçekleştirmenin daha kısa bir yolu vardı. IN sözcüğünü kullanarak yazacağımız :
SELECT * FROM personel WHERE bolumno IN (1, 2, 3);
Şeklindeki komut OR ile düzenlenen 1. SELECT'le aynıdır.
ARALIK SORGULAMASI (BETWEEN)Örnek : Maaşı 5-10 Milyon arasında olan personel kimlerdir ?
1-) SELECT * FROM personel WHERE brüt >= 50000000 AND brüt <= 100000000;
Şeklindeki bir SELECT komutu cevap verebilir. Aynı soruya daha kısa bir şekilde BETWEEN sözcüğü ile cevap verilebilir.
2-) SELECT * FROM personel WHERE brüt BETWEEN 50000000 AND 100000000;
KARAKTER TÜRÜ BİLGİ İÇİNDE ARAMA YAPMA LIKE SÖZCÜĞÜ Personel tablosu içinde adres adlı 50 karakterlik bir bilgi olduğunu varsayalım. Adres değişkeni içerisinde belirli bir semtte ikamet eden personeli listelemek istediğimizde şu satırları yazabiliriz.
SELECT * FROM personel WHERE adres LIKE '%küçük çekmece%';
Bu komut ile küçük çekmece de oturanları listelemektedir. Yalnız bu komut ile sadece semti değil bütün adresi listeleyecektir. Burada yapılan işlem, küçükçekmece sözcüğünü aramaktır.
% sembolü içinde küçük çekmece sözcüğünün öncesi ve sonrasındaki karakterler ne olursa olsun anlamındadır.
BÖLÜM 3 SQL'DE ARİTMATİKSEL İFADELER VE FONKSİYONLAR GRUPLANDIRARAK İŞLEM YAPMABir tablo üzerindeki bilgileri bazı özelliklere göre gruplandırarak listeleme yapabiliriz. Bunun için kullanılan komut GROUP BY sözcükleridir.
Örnek : Her bölümdeki ortalama maaş nedir?
Personel tablosundaki satırlar, bölüm numaralarına göre (bolumno ) gruplandırılarak, her bir grubun maaş ortalaması ayrı ayrı hesaplanarak listelenebilir.
SELECT bolumno, AVG (brut)FROM personel GROUP BY bolumno;
Avg : Avg sözcüğü matematiksel ortalama hesaplamak için kullanılır.
Bolum_no AVG_brut
1 250
2 450
3 780
Örnek : Her bölümdeki en yüksek maaşı alan kişiler listelenmek istendiğinde:
SELECT bolumno, MAX (brut), ad, soyad FROM personel GROUP BY bolumno;
Gruplandırarak kümeleme fonksiyonlarını uygularken, koşul da verilebilir. Bu durumda, grup üzerindeki hesaplamalarla ilişkili koşul belirtilirken HAVING sözcüğünü kullanmak gerekir.
Örnek : En yüksek maaşın, 900 'den fazla olduğu bölümlerde personele ait ortalama maaşları listeleyiniz?
SELECT bolumno, AVG(brut)FROM personel GROUP BY bolumno HAVING AVG (brut) < 900;
Personel tablosunda aşağıdaki bilgiler bulunsun.
Bolumno Brut
1 -----250
2 -----145
3 -----780
4 -----120
5 -----180
Yukarıdaki SELECT komutunun sonucunda, aşağıdaki tablo elde edilecektir.
Bolumno AVG_Brut
1 --------145
3 --------120
3 --------780
4 --------120
5 --------180
HAVING sözcüğü, SELECT komutunda GROUP BY sözcükleri bulunmadığı zaman, geçersizdir. HAVING sözcüğünü izleyen ifade içinde, SUM, COUNT (*), AVG, MAX yada MIN gibi kümeleme fonksiyonlarından en az biri bulunmaktadır.
Sum :Fonksiyonun argümanı olarak belirtilen sütun ile ilişkili olarak toplama işlemini gerçekleştirir.
Max : Tablo içinde, belirtilen sütun (alan)içindeki en büyük değeri bulur.
Min : Tablo içinde, belirlenen sütun (alan) içindeki en küçük değeri bulur.
Count :Tablo içerisinde herhangi bir sayma işlemi gerçekleştirmek için kullanılır.
WHERE sözcüğü bir tablonun tek tek satırları üzerinde işlem yapan koşullar için geçerli iken, HAVING sözcüğü sadece, gruplanmış veriler üzerinde işlemlerde geçerlidir.
Örnek : Personel içindeki, her bölümde, erkek personele ait maaşlar için, ortalamanın 900'den fazla olduğu bölümleri listeleyiniz?
SELECT bolumno, AVG (brut)FROM personel WHERE cins =.T. GROUP BY bolumno HAVING AVG (brut)>900;
Personel tablosunda aşağıdaki bilgiler olsun:
Bolumno Brut Cins
1 --------250 .T.
1 --------145 .F.
2 --------780 .F.
3 --------120 .T.
1 --------200 .T.
Yukarıda uygulanan SELECT komutu, her bölümdeki erkek personele ait ortalama brüt maaşı hesaplayarak (erkek personel . T. ile belirtilmiş) ve erkek personel maaş ortalaması, 90000000'dan yüksek olan bölümler listelenecektir.
Komutun çıktısı aşağıdaki gibidir:
Bolumno AVG_Brut
1 -----------135
3 -----------120
BİRDEN FAZLA TABLOYU İLİŞKİLENDİREREK SORGULAMA Bu bölüme kadar, SQL ile sadece tek tablo üzerinde sorgulamalar gerçekleştirilmiştir. Daha sık karşılaşılan ve güç olan sorgulamalar, birden çok tablonun birbiri ile ilişkilendirilmesini gerektiren sorgulamalardır. SQL'in sorgulama gücüde daha ziyade bu tip sorgulamalarda ortaya çıkmaktadır.