BÖLÜM-1
Yapısal Sorgulama Dili (SQL)
İlişkisel veri tabanı yönetim sistemleri (RDBS) modeli ilk önce 1970 yılında Dr.E.F. Codd tarafından tarif edilmiştir. SQL veya Structured English Query Language (SEQUEL), IBM firması tarafından Codd’un modeli kullanılmak için geliştirilmiştir. SEQUEL sonraları SQL olmuştur. 1979 yılında, Relational Software ,SQL’in ilk ticari uygulamasını geliştirmiştir. Bugün SQL, ilişkisel veri tabanı yönetim sistemleri standartı olarak kabul edilmektedir.
SQL, ilişkisel veri tabanlarındaki bilgileri sorgulamak için kullanılan bir dildir. SQL, tüm kullanıcıların ve uygulamaların veri tabanına erişmek için kullandıkları komutlar bütünüdür. Uygulama programları ve veri tabanı araçları kullanıcılara çoğu durumda SQL kullanmadan veri tabanına erişim imkanını sunmaktadırlar fakat bu uygulamalarda geri planda SQL kullnmaktadırlar.
Oracle SQL’I, standartlara uygundur. Daha da ötesinde, Oracle,SQL standartlarının gelişmesinde motor güç olan bir kurumdur. American National Standarts Institue (ANSI) ve International Standarts Organization (ISO) tarafından belirlenen son SQL standartı, SQL-92’dir. SQL-92’de üç aşamalı uygunluk vardır,
- İlk seviye (Entry Level)
- Orta seviye (Intermediate Level)
- İleri seviyedir (Full Level)
SQL, ilişkisel veri tabanları ile uygulamaların diyaloğunu sağlamaktadır. SQL temelde verilerle mantıksal seviyede çalışmaktadır. Yani, bir tablodan birkaç kayıt seçebilmek için, o kayıtları seçebilecek bir koşul belirtilir. Koşula uyan tüm kayıtlar bir basamakta gelir ve bunlar kullnıcıya gösterilebildiği gibi, bir başka SQL’e veya uygulamaya da gönderilebilir. Kayıtların tek tek nasıl geldiği ve fiziksel olarak veri tabanının neresinde ve nasıl tutulduğu ile SQL ilgilenmektedir.
SQL komutları ile ,
- Veri sorgulama
- Bir tabloya kayıt ekleme, değiştirme ve silme
- Veri tabanı nesneleri (database objects) yaratma, değiştirme ve silme
- Veri tabanına ve nesnelerine erişimi kontrol etme
- Veri tabanı bütünlüğünü ve tutarlılığını sağlama işlemleri yapılabilmektedir.
SQL komutları bir veya daha fazla satır olbilmektedir. SQL cümlelerinin sonuna noktalı virgül (;) konmaktadır. Birden fazla satır olan komutlarda en son satırın sonuna “ / ” işareti isteğe bağlı olarak konabilmektedir. PL/SQL , Oracle’in SQL komutlarına yapısal dillere AİT özellikleri (begin, end, loop, for, if, elsif, vb.) eklediği kendi standardı olan bir dildir. SQL*Plus, SQL ve PL/SQL komutlarının kullanılabildiği Oracle ürünüdür.
1.1 Veri Tipleri (Data Types)
Bir tablo oluştururken her sütunun; bir yordam veya fonksiyon oluştururken de her argümanın veri tipi olmak zorundadır. Bu veri tipleri o alana girilecek veriyi veya o yordamda kullanılacak argümanı sınırlandırır. Bu veri tipleri şunlardır:
- CHAR(sayı)
- DATE
- MSLABEL
- NUMBER (tam,ondalık)
- VARCHAR2 (sayı)
- LONG
- LONG RAW
- RAW (sayı)
- ROWID
Şimdi bu tanımları açıklayalım.
CHAR (sayı): Sabit uzunluktaki alfanümerik (karakter) verilerin tutulabildiği alanlar için kullanılır. Maksimum 255 karakter olabilir. Eğer sayı ile ifade edilen numaralardan daha kısa uzunlukta veriler girilirse Oracle kaydın sonuna boşluk ekleyerek sabit uzunuğa jadar getirir.
DATE: Tarih tutan alanlar için kullanılır. Bu tip alanlarda, tarih bilgileri ve saat bilgileri tutulabilir. Tarih formatları, ülkelere göre değişmektedir. Tarih alanları ile aritmatik işlemleri yapılabilmektedir. Standart olanı, DD-MON-YY’dir fakat bu amerikalıların kullandıkları şekildir, bu formatta MON yerine JAN, FEB, MAR gibi ayların ingilizce karşılıklarının ilk üç karakteri yazılmaktadır.
MLSLABEL: Trusted Oracle’ da ( Oracle’ nın güvenlik açısından biraz daha gelişmiş versiyonu) kullanılan işletim sistemine ait binary dosyadır.
NUMBER (tam, ondalık): Nümerik verilerin tutulduğu alanlar için kullanılır. Tam kısım maksimum 38 basamak olabilir. Ondalık kısmın basamak sayısı da –84 ile 127 arasındadır.
LONG: 2 GB’ a kadar karakter bilgi tutabilen alanlar için kullanılır.Bir tabloda birden fazla long veri tipine sahip olamaz. LONG veri tipine sahip olan alanlar üzerinde indeks oluşturulamaz. LONG alanlar aşağıdaki tip SQL cümlelerinde kullanılamazlar:
*WHERE *GROUP BY * ORDER BY * DISTINC * CREATE CLUSTER *CREATE TABLE AS SELECT *SUBSTR, INSTR gibi …
LONG RAW: 2 GB’ a kadar binary bilgi tutabilen alanlar için kullanılır.
RAW (sayı): Maksimum 255 byte’a kadar bilgi tutabilen binary alanlar için kullnılır.
RAWID: Bir Kaydın tekil adresini tutan alanlar için kullanılır. Veri tabanındaki her kaydın bir adresi vardır. Bu değer , SQL cümlesi içinde diğer sütunlar ile birlikte
ROWID yazarak öğRenilebilir. ROWID üç kısımdan oluşmaktadır: BLOK.KAYIT.DOSYA ‘dır.
VARCHAR2 (sayı) : Değişken uzunluktaki alfanümerik dataların tutulabildiği alanlar için kullanılır. Maksimum 2000 karakter olabilir.
1.2 SQL’ in Bölümleri :
SQL, temel olarak aşağıdaki bölümlerden oluşmaktadır.
- SELECT: Seçilecek alanların yazıldığı bölümdür.
- FROM: Kullanılacak tabloların yazıldığı bölümdür.
- WHERE: Sorgu şartlarının yazıldığı bölümdür.
- GROUP BY: Belli alanlara göre kayıtları gruplayıp getirmek için kullanılan bölümdür.
- HAVING: Group By’ ın kullanıldığı SQL’lerdeki grupla ilgili şart bölümüdür.
- ORDER BY: Sorgu sonucunda dönen kayıtlar için sıralamanın tanımlandığı bölümdür.
SQL KOMUTLARI
FROM Deyimi
From deyimi sorgulanacak ve kullanılacak bilgilerin hangi tablodan alınacağını belirtir. Tablodan hangi hücrelerin içindeki bilgilerin kullanılacağını ise;
TabloAdı.Hücre1, TabloAdı.Hücre2, … veya * jokeri ile belirleriz. Bir örnek ile daha iyi anlayacağız.
Ögrenci Tablosu;
| ADI | SOYADI | NO |
| metin[20] | metin[20] | sayı |
Örnek : Ögrenci tablosu ADI, SOYADI, NO omak üzere 3 hücreden oluşan bir tablo olsun. SQL ile, Bu tabodan ADI ve SOYADI hücrelerini seçerek yeni bir tablo (Bu bir sorgudur{Query} ) oluşturunuz.
Select ögrenci.ADI, ögrenci.SOYADI From ögrenci
Eğer tüm hücreleri seçin deseydik ; o zaman yazacağımız SQL cümlesi şöyle olmalı idi. :
Select ögrenci.ADI, ögrenci.SOYADI, ögrenci.NO From ögrenci
yada
Select * From ögrenci
WHERE Deyimi
Where deyimini de ; bir tablodan istediğimiz hücreleri seçerken, o tabloda bulunan kayıtlardan hangilerini, hangi kriterlere göre almak istersek kullanırız. Yani tabloda bulunan kayıtlardan hangilerini almak istiyorsak istediğimiz koşulu where deyiminden sonra kullanarak bu kayıtları elde edebiliriz. Aşağıdaki örnekleri inceleyelim…
Örnek 1 : Yine ögrenci tablosunda bulunan kayıtlardan Adı Serkan olan öğrencileri seçmemizi sağlayan SQL cümlesi şöyledir..:
Select * From ögrenci Where ögrenci.ADI = “Serkan”
Örnek 2: Yada soyadında ” r ” harfi geçen öğrencileri aşağıdaki SQL cümlesi ile seçeriz..:
Select * From ögrenci Where ögrenci.SOYADI = “%r%”
Örnek 3: Eğer Tabloda bulunan kayıtlardan diyelim ki; numarası 1044 ile 2866 arasında olan öğrencileri seçmek istersek aşağıdaki SQL cümlesini kullanırız..:
Select * From ögrenci Where 1044<ögrenci.NO<2866
###############################################
GROUP BY Deyimi
Group by deyimi SUM, COUNT kullanarak toplam bir sonuç ile bir tablodan istenilen kritere göre istenilen hücreler alınır ve yine group by ‘dan sonra yazılan hücrelere göre gruplanır. GROUP BY isteğe bağlıdır. SELECT deyiminde SQL toplam işlevi yoksa özet değerler gözardı edilir.
Örnek 1 : Yine ögrenci tablomuzu kullanarakdan soyadı Türkel olan öğrencileri seçerek AD, SOYAD ve NO fieldlarına göre gruplandıralım…:
Select ögrenci.AD, ögreci.SOYAD, ögrenci.NO From ögrenci Where ögrenci.SOYAD=’Türkel’ Group By ögrenci.AD, ögreci.SOYAD, ögrenci.NO
###############################################
ORDER BY Deyimi
Order By deyimi ile de; sorgulama sonucunda bulunan kayıtlar verilen hücrelere göre, Büyükten küçüğe yada Küçükden büyüğe doğru sıralanır.
Örnek 1 : Adı Serkan olan Öğrencilerin numaralarını küçükden büyüğe doğru sıralayınız..:
Select * From ögrenci Where ögrenci.AD=’Serkan’ Order By ögrenci.NO [asc]
asc yi yazmasakda burada default değer olduğu için küçükden büyüğe doğru sıralama yapardı. Eğer büyükden küçüğe doğru sırala dese idik o zaman şöyle bir SQL cümlesi yazmalıydık…:
Select * From ögrenci Where ögrenci.AD=’Serkan’ Order By ögrenci.NO Desc
###############################################
HAVİNG Deyimi
Having Deyimi de; GROUP BY yan tümcesi olan bir SELECT deyiminde hangi gruplandırılmış kayıtların görüntüleneceğini belirler. Yani GROUP BY kayıtları birleştirdikten sonra, HAVING deyimide, HAVING yan tümcesinin koşullarını sağlayan ve GROUP BY yan tümcesi ile gruplandırılmış kayıtları görüntüler.
Örnek 1 : ögrenci tablosundan AD, SOYAD ve NO fieldlarını alıp bunları gruplayan ve sonra bunlarıda Numarası 1000 ile 2000 arasında olan kayıtlara göre listeleyen SQL cümlesini yazınız..:
Select ögrenci.AD, ögrenci.SOYAD, ögrenci.NO From ögrenci
Group By ögrenci.AD, ögrenci.SOYAD, ögrenci.NO
Having 1000<ögrenci.NO<2000
###############################################
INSERT INTO Deyimi
Insert Into Deyimi bir tabloya bir veya daha çok sayıda kayıt eklemeye yarayan SQL komutudur. Buna ekleme sorgusu da denir. Esas kullanılma kalıbı aşağıdaki gibidir..:
Çok sayıda kayıt ekleme sorgusu:
INSERT INTO TabloAdı [(alan1[, alan2[, ...]])] [IN dışveritabanı]
SELECT [kaynak.]alan1[, alan2[, ...] FROM tabloifadesi
Tek kayıt ekleme sorgusu:
INSERT INTO TabloAdı [(alan1[, alan2[, ...]])] VALUES (değer1[, değer2[, ...])
Örnek 1 : ögrenci tablosuna AD = “Serkan” SOYAD = “Türkel” NO = 4683 bilgilerini ekleten SQL cümlesini yazın..:
Insert Into ögrenci (AD,SOYAD,NO) Values(‘Serkan’,'Türkel’,4683)
###############################################
DELETE Deyimi
Delete deyimini bir tablodan bir yada daha fazla kayıt silmek için kullanırız. aşağıdaki gibi bir yazılış kalıbı vardır..:
DELETE [Tablo.*] FROM Tablo WHERE sorgulama ifadesi
Örnek 1 : Yine ögrenci tablosundan numarası 4556 olan öğrencinin kaydını silen SQL cümlesiniz yazınız..:
Delete * From ögrenci Where ögrenci.NO=4556
###############################################
UPDATE Deyimi
Belirtilen kriterlere göre tablodan ilgili kayıt/kayıtları alarak değerlerini değiştirmeye yarayan SQL komutudur. Kullanılış Kalıbı aşağıdaki gibidir..:
UPDATE Tablo SET yenideğer WHERE Sorgulama İfadesi
Örnek 1 : ögrenci tablosuna eklediğimiz 4683 numaraları Serkan Türkel ‘in adını ve soyadını değiştirelim. Adı = “Ali”, Soyadı = “Sert” olsun. SQL cümlesini yazın…:
UPDATE ögrenci SET ögrenci.AD = ‘Ali’,ögrenci.SOYAD = ‘Sert’ Where ögrenci.NO = 4683
1.3 SQL’ de aritmatiksel ifadeler ve fonksiyonlar :
1.3.1 Aritmatiksel ifadeler:
SELECT komutu ile, veri tabanında mevcut tablolardan listeleme yaparken, tabloda ayrı bir sütun olarak yer almamış ve ancak bir hesaplama sonucunda üretilebilecek bilgileri de liste içine katmak mümkündür.
Aşağıdaki SELECT komutu ile personelin şu anda geçerli olan maaşı ile bu maaşın %32 zamlı şekli listelenmektedir:
SELECT ad, soyad, maaş, maaş*1.32
FROM personel;
Hesaplanmış alanları elde etmek için oluşturulacak aritmatiksel ifadelerde, aşağıda belirtilen tablodaki sembollerden yararlanılır:
Tablo1.1.
| SQL’de Aritmatiksel semboller | |
| Operatör | İşlevi |
| ** veya ^ | Üs alma |
| * | Çarpma |
| / | Bölme |
| + | Toplama |
| - | Çıkarma |
Öncelik sırası matematikte ve diğer bilgisayar dillerinde olduğu gibidir.Üs alma hepsinden önceliklidir. Sonra * ve / gelir. * ve / aynı önceliğe sahiptir. + ve – en son önceliklidir. Parantezler kullanılarak öncelik sırası değiştirilebilir.
1.3.2 Kümeleme Fonksiyonları :
SQL, tablo içinden çeşitli matematiksel işlemlerin sonucunu otomatik olarak üretmeyi sağlayan fonksiyonlara sahiptir. Bu fonksiyonlar örneklerle birlikte aşağıda verilmiştir.
- Sum Fonksiyonu :
Fonksiyonun argümanı olarak belirtilen sütun ile ilişkili olarak toplama işlemini gerçekleştirir.
Örnek : İşletmedeki personelin brüt maaşları toplamı ne kadardır?
Çözüm : SELECT SUM (brüt)
FROM personel;
Örnek : Bilgi işlem bölümündekilerin toplam maaşı ne kadardır?
Çözüm : Bilgi işlem bölümünün bölüm numarasını 5 olarak kabul edelim;
SELECT SUM ( brüt)
FROM personel
WHERE bol_no=5;
İfadesi ile sonuç elde edilebilir. Sonuç sadece bilgi işlem bölümündekilerin maaşlarının toplamı olacaktır.
Örnek : Satış, muhasebe, ve bilgi işlem bölümlerindeki personelin maaşları toplamı nedir?
Çözüm : Satış bölümü için, böl_no 1, muhasebe için 2 ve bilgi iþlem için 5 olarak alınırsa ;
SELECT SUM (brüt)
FROM personel
WHERE böl_no IN (1,2,5);
Örnek : Maaşları 5000000 TL’ nin altında olan bayan personelin maaşları toplamı nedir?
Çözüm : Bayan personeli, daha önceden cins alanına .F. yerleştirerek kodlamış isek ;
SELECT SUM(brüt)
FROM personel
WHERE cins=.F. AND
Brüt < 5000000;
İfadesi istenen çözüm verecektir.
AVG Fonksiyonu :
Aritmatiksel ortalama hesaplamak için kullanılır.
SELECT AVG (brüt)
FROM personel;
Komutu , işletmedeki ortalama maaşı hesaplayarak görüntüleyecektir. Bu fonsiyon ile de , koşula bağlı olarak hesaplatma yaptırılabilir.
Örnek : Bilgi işlem bölümündekilerin maaş ortalamaları ne kadardır?
Çözüm : Bilgi işlem bölümünün böl_nosu 5 ise
SELECT AVG (brüt)
FROM personel
WHERE böl_no =5
MAX Fonksiyonu :
Tablo içinde , belirtilen sütun (alan) içindeki en büyük değeri bulur.
Örnek : İşletme içindeki en yüksek maaş ne kadardır?
Çözüm : SELECT MAX (brüt)
FROM personel ;
Örnek : Bilgi işlem bölümündeki en yüksek maaş ne kadardır ?
Çözüm : SELECT MAX (brut)
FROM personel
WHERE böl_no=5;
Örnek : Bayan personel içinde en yüksek maaş ne kadardır ?
Çözüm : SELECT MAX (brüt)
FROM personel
WHERE cins=.F. ;
MIN Fonksiyonu :
Tablo içinde, belirlenen sütun içindeki en küçük değeri bulur.
Örnek : İşletme içinde 4 Mayıs 1970’ den önce doğanlar için asgari ücret nedir?
Çözüm : SELECT MIN (brüt)
FROM personel
WHERE dog_tar < {05/04/70} ;
COUNT Fonksiyonu :
Tablo içinde herhangi bir sayma işlemi gerçekleştirmek için kullanılır.
Örnek : Personel tablosunda kaç satır vardır ? (Bu , her satırda farklı bir personel olduğu düşünülürse personel sayısı anlamına da gelmektedir.)
Çözüm : SELECT COUNT (*)
FROM personel;
Bu koşula bağlı olarak da saydırma yapmak mümkündür.
Örnek : Ücreti 6000000 ‘dan fazla olan personel sayısı nedir ?
Çözüm : SELECT COUNT (*)
FROM personel
WHERE brüt > 6000000 ;
COUNT fonksiyonu, DISTINCT sözcüğü ile de kullanılabilir. Örneğin personel tablosunda mevcut personelin, işletme içinde kaç tane farklı bölümde çalıştığı bulunmak istenirse aşağıdaki SELECT komutu kullanılabilir.
SELECT COUNT ( DISTINC böl_no)
FROM personel;
Count (böl_no)
5
Sonuçta 5 farklı bölüm olduğu listelenmiştir.
COUNT komutunda , * argümanının kullanılması, tüm sütunların (alanların) işleme sokulmasını, alan adının belirtilmesi ise (COUNT (böl_no) gibi), sadece belirtilen sütunun işleme sokulmasını sağlar.
1.3.3 Gruplandırarak işlem yapma :
Yukarıda anlatılan fonksiyonları, tablodaki bilgileri , bazı özelliklere göre gruplandırarak bu gruplandırılmış veri üzerinde de uygulama yapmak mümkündür.Bu işlem GROUP BY sözcükleri ile gerçekleştirilmektedir.
Örnek : Her bölümdeki ortalama maaş nedir?
Çözüm : Burada istenen, bölümler bazında ortalama maaş olduğuna göre, personel tablosundaki satırlar, bölüm numaralarına göre (böl_no) gruplandırılarak her bir grubun maaş ortalaması ayrı ayrı hesaplanarak listelenebilir.Aşağıda SELECT komutu ile bu işlem gerçekleştirilektedir:
SELECT böl_no , AVG (brüt)
FROM personel
GROUP BY böl_no ;
Sonuç :
Böl_no AVG (brüt)
1 2500000
2 6800000
3 7400000
4 12500000
Her bölümdeki en yüksek maaşı olan kişiler listelenmek istenirse, aşağıdaki komut kullanılabilir:
SELECT böl_no , MAX (brüt) , ad , soyad
FROM personel
GROUP BY böl_no ;
Tablo1.2. Peronel tablosundaki bilgiler :
| Brüt | Ad | soyad | Böl_no |
| 5000000 | Ali | Can | 1 |
| 3000000 | Ayşe | Okan | 1 |
| 8000000 | Akın | Oran | 2 |
| 10000000 | Rana | Şensoy | 2 |
Tablo1.3. Şeklinde ise yukarıdaki SELECT komutunun çıktısı
| Böl_no | Max_brüt | Ad | Soyad |
| 1 | 5000000 | Ali | Can |
| 2 | 10000000 | Rana | Şensoy |
Şeklinde olacaktır.
Gruplandırarak kümeleme fonsiyonlarını uygularken koşul da verilebilir. Bu durumda grup üzerindeki hesaplamalarla ilgili koşul belirtilirken HAVING sözcüğünü kullanmak gerekir.
Örnek : En yüksek maaşın 9000000’ dan fazla olduğu bölümlerdeki personele ait ortalama maaşları listeleyiniz.
Çözüm :
SELECT böl_no , AVG (brüt)
FROM personel
GROUP BY böl_no
HAVING AVG (brüt) > 9000000 ;
Tablo1.4. Personel tablosunda şu bilgiler mevcut olsun :
| ……………… | Böl_no | ………………… | Brüt |
| 1 | 6000000 | ||
| 1 | 17000000 | ||
| 2 | 7500000 | ||
| 2 | 8000000 | ||
| 3 | 12000000 | ||
| 3 | 11000000 | ||
| 1 | 14000000 | ||
| 1 | 18000000 |
Yukarıdaki SELECT komutu sonrasında
| Böl | Avg_brüt |
| 1 | 13750000 |
| 3 | 11500000 |
Tablosu elde edilecektir.
HAVING sözcüğü SELECT komutunda GROUP BY sözcükleri bulunmadığı zaman geçersizdir. HAVING sözcüğünü içeren ifade içinde SUM , COUNT , (*), AVG ,MAX , MIN gibi diğer kümeleme elemanlarından enaz biri bulunmalıdı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 üzerindeki işlemlerde geçerlidir.Bazı durumlarda HAVING ve WHERE sözcükleri birlikte SELECT komutu içinde kullanılabilir.
Örnek
ersonel tablosu içinde her bölümde erkek personele ait maaşlar için ortalamanın 9000000’ den fazla olduğu bölümleri listeleyiniz.
Çözüm :
SELECT böl_no ,AVG (brüt)
FROM personel
WHERE cins =.T.
GROUP BY böl_no
HAVING AVG (brüt) >9000000 ;
Tablo1.5. Personel tablosunda aşağıdaki bilgiler olsun :
| Böl_no | brüt | Cins | ||
| 1 | 6000000 | .T. | ||
| 1 | 17000000 | .F. | ||
| 2 | 7500000 | .F. | ||
| 2 | 8000000 | .F. | ||
| 3 | 12000000 | .T. | ||
| 3 | 11000000 | .F. | ||
| 1 | 14000000 | .T. | ||
| 1 | 18000000 | .T. |
Yukarıda uygulanan SELECT komutu , her bölümdeki erkek ppersonele ait ortalama brüt maaşı hesaplayacak (erkek personel .T. ile belirlenmiştir.) ve erkek personel maaş ortalaması 9000000’ den yüksek olan bölümler listelenecektir. Komutun çıktısı aşağıdaki gibidir :
| Böl_no | Avg_brüt |
| 1 | 12666666.67 |
| 3 | 12000000 |
1.4 Tabloların Yaratılması :
SOL ‘de bazı tabloların yaratılması için CREATE TABLE komutunu uygun şekilde kullanmak gerekir.Yaratacaağımız tablolar personel , bölüm, yer, proje, çalışma, bağımlı, parca, satıcı olsun ve bunların içinde şunlar yer alsın :
Personel tablosu : Sicil no , sos.güv.no,ad, soyad, dogum-tarihi, adres, cinsiyet, brüt maaş, böl_no,yönetici sos.güv.no
Bölüm Tablosu : Bölüm adı, bölüm_no, yönetici sos.güv.no
Yer Tablosu : Bölüm_no, bulunduğu yer
Proje Tablosu : Proje adı, proje no, yer, bölüm_no
Çalışma Tablosu : Personel sos.güv.no, proje no, saat
Bağımlılık Tablosu : Personel sos.güv.no, bağl.old.isim, cinsiyet, doğum tarihi, ilişki
Parça Tablosu : Parça no, parça adı, proje no, fiyat, ağırlık
Satıcı Tablosu : Satıcı no, adı, adres
Parça Satıcı Tablosu : Satıcı no , parça no, miktar
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.Örneğin : İstanbul’ da yürütülen projelerde çalışan kişileri listeleyiniz: şeklinde bir talep proje, çalışma ve personel tabloları arasında ilişki kurulmasını gerektirecek ve çalışma tablosundan proje noları mukayese edilecek, aynı olanlar için çalışma tablosundan alınacak olan Personel sos.güv.no’ları personel tablosunda arama yapılacak, bulunan kişilere ait bilgiler listelenecektir.
Şimdi bu tabloları yaratacak SQL komutlarını inceleyelim :
CREATE TABLE personel
(sicil INTEGER NOT NULL,
sos.g.no CHAR (8) NOT NULL,
ad CHAR(10) NOT NULL ,
soyad CHAR (10) NOT NULL,
dog_tar DATE,
adres CHAR (50),
cins LOGICAL,
brüt NUMERIC (13,2),
böl_no SMALLINT,
yon_s_g_n CHAR(8));
CREATE TABLE bölüm
( bölüm_ad CHAR (15) ,
bölüm_no SMALLINT,
y_sos_g_no CHAR (8),
y_ıs_b_tar DATE) ;
CREATE TABLE yer
( bölüm_no SMALLINT,
bul_yer VARCHAR (15)) ;
CREATE TABLE proje
( proj_ad CHAR (10),
proj_no SMALLINT,
yer VARCHAR (15),
bl_no SMALLINT) ;
CREATE TABLE çalışma
( Per_s_g_no CHAR (8),
proje_no SMALLINT,
saat SMALLINT) ;
CREATE TABLE bağımlı
( Per_s_g_no CHAR (8),
baglı_isim CHAR (10),
cinsi LOGICAL,
dog_t DATE,
ilişki VARCHAR (7)) ;
CREATE TABLE parca
( par_no SMALLINT,
par_ad CHAR (10),
pr_no SMALLINT,
fiyat FLOAT,
agırlık INTEGER) ;
CREATE TABLE satıcı
( satıcı_n SMALLINT,
adı CHAR (10),
adres CHAR (50)) ;
CREATE TABLE par_sat
( sat_no SMALLINT,
parca_n SMLLINT,
miktar INTEGER) ;
SQL ‘de Veri Tipleri :
Tablo1.6.
SQL’de veri tipleri |
||
| Veri tipi | SQL komutu | Özelliği |
| Sabit uzunluklu karakter | CHAR (uzunluk) | Sayısal işleme sokulmayacak veriler. |
| Değişken uzunluklu karakter | VARCHAR (uzunluk) Buradaki uzunluk max.uzunluktur. | Karakter tipindeki veriler gibidir.Tek fark uzunluk değişkendir. |
| Nümerik tam sayı | INTEGER | -2147483648 ile 2147483647 arasındaki tam sayılardır.Bellekte 4 Byte’ lık yer kaplarlar. |
| Ondalık sayı | DECIMAL (x,y) REAL(x,y) ya da NUMERIC (x,y) | X sayısının max. hanesayısı y ondalık notadan sonraki hane sayısıdır.x en fazla 20, y ise 0-18 arasındadır. |
| Üstel sayı | FLOAT (x,y)örnek: 3.1E+17 gibi | X sayısının toplam hane sayısıdır.max. değer 20 dir.0.1E-307 ile 0.9E+308 arasındaki değerleri alabilir. |
| Tarih türü veriler | DATE | Tarih türü veriler için işlem yapmayı sağlar. |
| Mantıksal veri | LOGICAL | Doğru (true .T.) ya da yanlış (false .F.) şeklinde değer alabilen veriler için kullanılır. |
| Zaman türü veriler | TIME | Ssddsnsn şeklindeki veriler için kullanılır. |
| Tarih ve zaman türü veriler | TIMESTAMP | Tarih ve zaman türü verilerin bir karışımı şeklinde kullanılan veriler içindir. |
| Grafik türü veriler | GRAPHIC(n) | N adet 16 bitlik karakterden oluşan bir sabit uzunluklu bilgi tanımlamak için kullanılır. |
| Değişken uzunluklu grafik türü veri | VARGRAPHIC(n) | N adet 16 bitlik karakterden oluşan değişken uzunluklu bir bilgi tanımlamak için kullanılır. |
Tablo yaratılırken NOT NULL ifadesi kullanılmıştı. NOT NULL ifadesi söz konusu olan alan ile ilişkili olarak mutlaka veri yüklemesi gerektiğini, ilgili alanın boş bırakılamayacağını anlatmaktadır. Sicil gibi yada sos.güv.no’su gibi sıralamada kullanılabilecek alanlar bu şekilde kullanılmaktadır. NOT NULL ifadesi yoksa o alan NULL anlamındadır yani o alan ile ilişkili olarak tabloya veri yüklenmemesi durumuna da müseade edilmektedir. Bu tür alanlar genellikle veri konusunda belirsizlik olması durumunda tanımlanır.
1.5 Tablolara Veri Yüklenmesi :
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, ’27345627’ , ‘Ahmet’, ‘Okan’ , {01/05/62},’Cum.Cad.47/2 Taksim-İstanbul’, .T. , 17000000.00, 1, ‘23112244’ ) ;
Komut içindeki değerler incelendiğinde, sayısal değerler olduğu gibi yazılmakta, karakter veriler ‘ ’ sembolleri arasına alınmaktadır. Lojik türdeki veriler ise .T. ya da .F. şeklinde belirtilmektedir ve tarih türü bilgiler {} sembolleri ile ayırt edilmektedir.
INSERT INTO komutu ile belli bir anda tabloya bir satır yüklenmektedir. Tabloya çok sayıda satır girilmek istenirse peşpeşe satır sayısı kadar INSERT komutu kullanılmalıdır. SQL dilinin tüm ekran üzerinde bilgi girişi için kolaylıksağlayan ve etkileşimli olarak çalışmayı sağlayacak komutları yoktur.
1.6 Tablodaki Sütun İsimleri Ve Tablo İsimleri İle İlişkili Kurallar :
SQL dilinde bir tabloya ya da tablo içinde bir sütuna isim vermek için gerekli kurallar, bir SQL uyulamasından ötekine değişebilmektedir. Fakat genellikle , geçerli olan kurallar aşağıda verilmiştir :
- İsim uzunlukları 18 karaktere kadar olabilir.
- İlk karakter bir harf olmalıdır.Onu izleyen karakterler harf , rakam ya da alt çizgi (_) sembolü olabilir.
BÖLÜM 2
Temel SQL Sorgulamaları :
SELECT Komutu :
Tek tablodan gerekli bilgileri elde edbilmek için sorgulama yapabilecek SQL komutu olan SELECT ‘ in en basit hali aşağıdaki gibidir :
SELECT *
FROM personel ;
Bu komut, personel adlı tablo içindeki tüm bilgileri koşulsuz olarak listeleyecektir. SELECT sözcüğünü izleyen kısımda * sembolünün bulunması ilgili tablodaki tüm sütun isimlerinin ve ilgili bilgilerin listelenmesini sağlayacaktır.
SELECT sicil, sos_g_no, ad, soyad, dog_tar, adres, cins, brüt, böl_no, yön_s_g_n
FROM personel ;
Şeklinde olacaktır.SELECT sözcüğünden sonra gelen kısımda sütun adları, FROM sözcüğünden sonra gelen kısımda ise tablo ismi yer almaktadır.
2.1 Tekrarlı Satırların Ortadan Kaldırılması :
SQL ‘ de tablşo içinde birbirinin aynı data içeren satırlara müseade edilir. Birbirinin aynı olan satırların listeleme esnasında bir kez yazılması için SELECT komutuna DISTINC sözcüğü eklenir.
SELECT DISTINC sat_no
FROMpar_sat;
Bu komut ile par_sat adlı tablodan satıcı noları tekrarsız olarak listelenecektir.
2.2 Tablo Bilgilerinin Sıralanmış Olarak Listelenmesi :
Tablodan listelenecek bilgilerin belirli bir sütun adına göre sıralanmış olarak görüntülenmesi için SELECT komutuna ORDER BY sözcüğü ilave edilir. Örneğin personel tablosundaki bilgilerin sicil, ad, soyad, ve brüt sütunlarını maaşa göre sıralı olarak listeleyiniz:
SELECT sicil,ad,brüt
FROM personel
ORDER BY brüt asc ;
Sonuç : ASC sözcüğü artan anlamındadır.Veriler azalan sırada büyükten küçüğe ya da alfabetijk olarak Z ‘den A ‘ya sıralanmak istense idi bu sözcük yerine DESC kullanılacaktı.
2.3 Birden Çok Alana Göre Sıralama :
Bir tablo içindeki verileri aynı anda birden çok sütuna göre sıralamak da mümkündür. Örneğin personel tablosundaki personel adı ve MaaŞa göre listelemek isteyelim:
SELECT sicil, ad, soyad, brüt
FROM personel
ORDER BY ad, brüt ;
Burada tablo öncelikle ada göre artan sırada sıralanacak, sadece aynı ada sahip olanlar kendi aralarında BRÜTE göre artan sırada sıralanacaklardır:
Tablo2.1. Ada ve maaşa göre sıralama
| Sicil | Ad | Soyad | Brüt |
| 1215 | Ali | Can | 2000000 |
| 3712 | Ali | Okan | 6000000 |
| 8145 | Birol | Çelen | 8500000 |
| 3712 | Birol | Akın | 4000000 |
Burada çok sayıda alana göre sıralama , farklı sıralama kriterlerine göre gerçekleştirilebilir.
2.4 Koşula Bağlı Olarak Listeleme :
SELECT komutu ile bir tablonun satırlrı içinden sadece verilen bir koşulu sağlayanlar listelenebilir.Örneğin brüt maaşı 5000000’dan fazla olan personel listelenmek istenirse SELECT komutu aşağıdak gibi yazılmalıdır :
SELECT *
FROM personel
WHERE brüt > 5000000 ;
Burada WHERE sözcüğünüizleyen kısımda koşul belirtilmektedir. Koşul belirtilirken iki veri birbiri ile karşılaştırlmaktadır. SQL içinde verileri çeşitli açılardan karşılaştırmak için karşılaştırma operatörleri kullanılmaktadır. Karşılaştırma ifadesinde karşılaştırılacak verilerin türleri aynı olmalıdır.
Tablo2.2 Karşılaştırma Operatörleri
| SQL ‘ de Karşılaştırma Operatörleri | |
| Operatör | Anlamı |
| < | …’den küçük |
| > | …’den büyük |
| = | Eşit |
| <= | Küçük veya eşit |
| >= | Büyük veya eşit |
| <> | Eşit değil |
| != | Eşit değil |
2.5 Birden Çok Koşula Dayalı Sorgulamalar :
Not, And, Or :
Not, And ve Or mantıksal operatörleri yardımı ile birden çok koşulun gerçekleştirilmesine bağlı olarak ifade edilebilecek karmaşık yada bileşik koşulu ile listelemeleri gerçekleştirmek mümkündür.
Örnek : Maaşı 5000000 TL’den fazla olan ve cinsiyeti erkek olan personelin listelenmesi gibi bir işlemde söz konusu personel için iki koşul verilmekte ve her ikisinin de gerçekleşmesi istenmektedir.
1.koşul : Maaşın 5000000 TL’den fazla oluşu
2.Koşul : Cinsiyetin ERKEK olması
SELECT *
FROM personel
WHERE brüt > 5000000 AND cins =.T. ;
Tablo2.3
| NOT Operatörü | |
| Koşul | NOT Koşul |
| .T. | .F. |
| .F. | .T. |
Tablo2.4
| AND OPERATÖRÜ | ||
| 1.Koşul | 2.Koşul | 1.koşul AND 2.koşul |
| .T. | .T. | .T. |
| .T. | .F. | .F. |
| .F. | .T. | .F. |
| .F | .F. | .F. |
Tablo2.5
| OR OPERATÖRÜ | ||
| 1.Koşul | 2.Koşul | 1.Koşul AND 2.koşul |
| .T. | .T. | .T. |
| .T. | .F. | .T. |
| .F. | .T. | .T. |
| .F | .F. | .F. |
Örnek : Doğum tarihi 1960’ dan önce olan ve maaşı 6000000-10000000 arasında olan bayan personel kimlerdir?
Cevap : SELECT *
FROM personel
WHERE dog_tar <{01/01/1960} AND brüt >=6000000 AND brüt <= 10000000
AND cins =.F. ;
Örnek : Satış bölümü ile muhasebe bölümündekiler kimlerdir ?
Çözüm : Satış bölümünün böl_no’sunun 1 ve muhasebe bölümünün böl_no’sunun 2 olduğunu varsayarsak ;
SELECT *
FROM personel
WHERE böl_no=1 OR böl_no=2 ;
2.6 Bir Veri Kümesi İçinde Arama –IN Operatörü
Aşağıda vereceğim örnek sorunun cevabını şu ana kadar anlattığım SQL komutları ile gerçekleştirebiliriz :
Örnek : böl_no’su 1,2 yada 3 olan personeli listeleyiniz.
- SELECT *
FROM personel
WHERE böl_no=2 OR böl_no=2 OR böl_no=3 ;
Fakat SQL ‘de bu işlemi gerçekleştirmenin daha kısa ve daha şık bir yolu vardır; IN sözccüğü ;
- SELECT *
FROM personel
WHERE böl_no IN (1,2,3) ;
Şeklindeki komut. Bu komut OR ile düzenlenen 1. SELECT’ denktir.Fakat belirtildiği gibi daha kısa ve anlaşılır bir ifade oluşmaktadır.
IN oparatörü NOT ile birlikte kullanılabilir.
2.7 Aralık Sorgulaması Between Sözcüğü :
Maaşı 5-10 Milyon arasında olan personel kimlerdir ? şelinde bir soruya
SELECT “
FROM personel
WHERE brüt >=5000000 AND brüt <=10000000 ;
Şeklinde birSELECT komutu ile cevap verilebilir.Aynı soruya daha kısa ve daha etkin bir cevap verilecek olursa BETWEEN sözcüğü kullanılır.
SELECT *
FROM personel
WHERE brüt BETWEEN 5000000 AND 10000000 ;
2.8 Karakter Türü Bilgi İçinde Arama Yapma –LIKE Sözcüğü :
Personel tablosu içinde adres alanı 50 karakter uzunluğunda karakter türü olarak tanımlanmıştı.Adres bilgisinin aşağıdaki şekilde verildiğini varsayalım :
Cumhuriyet Cad. 46/9 Taksim-İstanbul. Burada adres içinde , semtin de belirtildiğini ve bunun ayrı bir sütun olmadığına dikkat çekelim. Şimdi belirli bir semtte ikamet eden personeli listelemek istersek semt adını , adres alanı içinde aramak gerekecektir.Bu işlemi gerçekleştirmek için SQL 2 de LIKE sözcüğü kullanılır.
SELECT *
FROM personel
WHERE adres LIKE ‘% Taksim %’ ;
Bu komut ile “Taksim” semtinde ikamet eden personel listelenmek istenmektedir. Bu komut gerçekten de Taksim’ de oturan personeli listeleyecektir. Ama bu arada
“Taksim Caddesi 22-7 Kadıköy – İstanbul”
şeklindeki adresleri de isteleyektir.
Adres LIKE ‘ % Taksim %’
İfadesi adres içinde Taksim’ I arayacaktır. Adres içinde herhangi bir yerde bulduğu taktirde bu satırı listeleyecektir.
% sembolü Taksim sözcüğünün öncesinde ve sonrasındaki karakterler ne olursa olsun anlamındadır.
Yukarıdaki LIKE ifadesi
“Taksim Cad.81-Fatih”
şeklindeki Taksim’in en başta ve en sonda olduğu adresleri listeleyecektir.
LIKE sözcüğünü , alt çizgi (_) sembolü ile birlikte de kullanmak da mümkündür.
BÖLÜM 3
Birden Fazla Tabloyu İlişkilendirerek Sorgulama :
3.1 Birleştirme ( JOIN ) İşlemi :
Birleştirme işemini anlayabilmek için konumuzun başında anlattığımız personel ve bölüm tablolarının içinde yer alan bölümleri hatırlayalım :
Personel tablosu : Sicil no , sos.güv.no,ad, soyad, dogum-tarihi, adres, cinsiyet, brüt maaş, böl_no,yönetici sos.güv.no
Bölüm Tablosu : Bölüm adı, bölüm_no, yönetici sos.güv.no ‘sundan oluşuyordu
Bu tablolar ile ilişkili olarak aşağıdaki soruyu soralım :
Çalışan her personel ve bu personelin yöneticisi ile ilişkili bilgiler nelerdir ?
Belirli bir personel ile ilişkili bilgiler personel tablosunun o personele ait satırında mevcuttur. Ancak personelin yöneticisi ile ilişkili bilgilerin bir kısmına ise bölüm tablosundan erişilebilir. Bu durum zorunlu olarak personel ile bölüm tabloları arasında ilişki kurulmasını gerektirir. Bu ilişki ancak müşterek bir alan yardımı ile kurulabilir.
Müşterek alan burada bölüm numarasıdır ve personel tablosunda böl_no, bölüm tablosunda ise bölüm_no adı ile yer almaktadır. Müşterek alana göre personel ve bölüm tablolarının birleştirilmesi ( JOIN ) demek , her iki tablodaki tüm sütunları içeren yeni bir tablo oluşturmak demektir. Yalnız bu tabloda sadece her iki tabloda da mevcut olan bölüm numaraları ile ilişkili satırlar yer alacaktır.
Birleştirme işlemi ile listeleme aşağıdaki SQL komutu ile gerçekleştirilmektedir :
SELECT *
FROM personel , bölüm
WHERE personel . böl_no =bölüm .bölüm_no ;
İlişkilendirme kolayca görülebileceği gibi
WHERE personel . böl_no = bölüm .bölüm_no
Tablo adı Kolon adı
İfadesi ile sağlanmaktadır. Aşağıdaki örnek veri için bu JOIN işlemi sonucu, aşağıdaki tabloda görülmektedir. Örnek veri :
Tablo3.1 Personel
| sicil | Sos_g_no | ad | Soyad | Dog_tar | adres | cins | brüt | Böl_no | Yo_s_g_n |
| 112 | 27641 | Ali | Can | 01/05/60 | Fatih | .T. | 8000000 | 1 | 037165 |
| 175 | 3777654 | Ayşe | Şen | 04/07/65 | Kadıköy | .F. | 7000000 | 1 | 037165 |
| 217 | 176241 | Akın | Öncel | 11/07/64 | Üsküdar | .T. | 6000000 | 2 | 277143 |
| 517 | 27615 | Can | Öner | 05/08/65 | Fatih | .T. | 4000000 | 2 | 277143 |
| 618 | 57253 | Beril | Meral | 08/07/62 | Pendik | .F. | 3750000 | 2 | 277143 |
| 1540 | 44721 | Ayşe | Cansu | 07/08/63 | Beşiktaş | .F. | 4800000 | 3 | 577211 |
Tablo3.2 Bölüm
| Bölüm_ad | Bölüm_no | Y_sos_g_n | Y_is_b_tar |
| Satış | 1 | 037165 | 01/07/89 |
| Muhasebe | 2 | 277143 | 02/08/91 |
| Üretim | 3 | 577211 | 04/06/92 |
| Eğitim | 4 | 443421 | 01/05/91 |
| Bilgi işlem | 5 | 288111 | 05/02/92 |
Personel ve bölüm tablolarının müşterek alan olan bölüm numarası üzerinde JOIN birleştirme işlemine tabi tutulması sonucu elde edilen bilgi sadece her iki tabloda da aynı bölüm numaralarına ait satırlar alınarak birleştirilmiş ve her iki tablonun alanlarından oluşan büyük bir tablo halinde listelenecektir.
3.2 UNION Sözcüğü :
Unıon sözcüğü küme birleştirme işlemi görür. İki ayrı SELECT komutunun sonucunda elde edilen tabloların birleşimi işlemini görür.
Örnek : Adı Ahmet ve soyadı Caner olan kişi ve kişileri işletmenin yürüttüğü projelerde çalışan kişi olarak bulunduran projelerin isimlerini ve projelerin yürütüldüğü yerleri listeleyiniz.
( SELECT proj_ad ,yer
FROM proje , bölüm , personel
WHERE bl_no=bölüm_no AND
Y_sos_g_no = sosy_g_no
AND ad=”Ahmet” AND Soyad =”Caner”)
UNION ( SELECT proj_ad ,yer
FROM proje , çalışma, personel
WHERE proj_no =proje_no AND
Per_s_g_no =sosy_g_no AND ad=”Ahmet”
AND soyaD =”Caner”)
UNION sözcüğü ile iki yada daha çok SELECT ‘in sonucu olan tabloların küme birleşimi işlemine tabi tutulması için iki koşul gereklidir :
- SELECT komutları sonucunda elde edilecek tablolar aynı sayıda kolon içermeleridirler:
1.SELECT
sonuç tablosu
2.SELECT
sonuç tablosu
- Sonuç tablolarının karşılıklı olarak kolonları aynı veri tipi ve aynı genişlikte olmalıdır.
3.3 ANY Sözcüğü :
Bunu bir örnekle açıklayalım :
Örnek : Satış bölümünde çalışan personelin herhangibirinden daha düşük maaş alan ve mühendislik bölümünde çalışan kişileri listeleyiniz :
Çözüm :
SELECT *
FROM personel
WHERE brüt < ANY
( SELECT brüt
FROM personel
WHERE böl_no =2) AND böl_no =1 ;
Bu çözümün eşdeğer ifadesi şöyledir :
SELECT *
FROM personel
WHERE brüt <( SELECT MAX (brüt)
FROM personel
WHERE böl_no =2) AND böl_no =1 ;
Burada satış bölümü kodu 2 ve mühendislik bölümü kodu ise 1 olarak kabul edilmiştir.İkinci çözüm ifadesinden de anlaşılacağı gibi içiçe SELECT ifadesinde içteki SELECT sorgulaması sonucun ; 2. Bölümde çalışan personelin içinde en yüksek maaş alan kişinin maaşı bulunmakta dıştaki SELECT ise mühendislik bölümünde bu maaştan düşük olan maaşa sahip kişiler listelenmektedir.
Buradaki düşünce tarzı şöyledir :
Mühendislik bölümünde çalışan ve satış bölümündeKİ en yüksek maaştan düşük maaş alan bir kişi “satış bölümündeki herhangi bir maaştan düşük olma “ koşulunu sağlayacaktır. ANY sözcüğünün yerine tamamen eşdeğeri olan SOME sözcüğü de kullanılabilir.
3.4 ALL Sözcüğü :
“Hepsi , tamamı “ anlamındaki bu sözcük SELECT komutu içerisinde belirli bir koşulu sağlayan bir grup datanın tamamınca sağlanan koşullarla ilişkili olarak kullanılır.
Örnek : Satış bölümünde çalışan ve mühendislik bölümündeki personelin hepsinden daha fazla maaş alan personeli listeleyiniz. Satış bölümü kodu 2 ve mühendislik bölümü kodu1 olarak alınırsa ;
Çözüm : 1. Altenatif
SELECT *
FROM personel
WHERE brüt > ALL (SELECT brüt FROM personel
WHERE böl_no=1)
AND böl_no=2 ;
3.5 EXISTS Operatörü :
“Var,mevcuttur” anamındaki bu sözcük, SQL’ de bir Boolean ( lojik,mantıksal) operatördür. İçteki SELECT komutunun sorgulaması sonucunda en az bir tablo satırı üretilmişse EXISTS operatörü true değerini , hiçbir tablo satırı üretilmemişse, EXISTS operatörü false değerini üretir.
EXISTS operatörü, AND ,OR ve NOT gibi diğer mantıksal operatörlerle birlikte de kullanılabilir.
Örnek : Numarası 27 olan parçayı satan satıcılarla ilişkili tüm bilgileri listeleyiniz.
Çözüm : İlgili SELECT komutlarını yazabilmek için, sistemde satıcı adlı tabloda ve par_sat adlı tabloda aşağıdaki kolon ve verilerin olduğunu vrsayalım :
Tablo3.3
| Satıcı_n | Adı | Adres |
| 1 | Ali akın | İstanbul |
| 2 | Ayşe can | İstanbul |
| 3 | AkınPeker | Ankara |
| 4 | Can Ozan | İzmir |
| 5 | Mert Ak | Antalya |
SELECT *
FROM satıcı
WHERE EXISTS
( SELECT *
FROM par_sat
WHERE sat_no =satıcı _n
AND parca_n=27) ;
Aşağıdaki sonuç elde edilir.
Tablo3.4
| Satıcı_n | Adı | Adres |
| 1 | Ali akın | Istanbul |
| 2 | Ayşe can | Istanbul |
Yukarıda da belirtildiği gibi , iç SELECT ‘te WHERE ‘I izleyen koşulu sağlayaan satırlar par_sat içinde bulundukça EXISTS operatörü true değerini verecek bu durumda dış SELECT’in WHERE kısmı doğru olacağı için o satıcı ile ilişkili bilgiler satıcı tablosundan listelenecektir.
BÖLÜM 4
View Oluşturmak :
Veri tabanı kavramı içinde teorik olarak mevcut olan view (bakış ) terimi ,farklı kullanıcıların veri tabanına nasıl baktıklarını yada bakış açılarını anlatan terimdir. Bu anlamda bir kullanıcı fiziksel olarak mevcut olan tabloların sadece bir kısmı ile ilgilenir.
4.1 VIEW Oluşturmanın Yararları :
4.1.1 Veri Güvenliği :
Veri tabanı içinde bulunan tablolardaki bazı sütunlarda bulunan bilgilerin herkes tarafından görülmesi istenmeyebilir.
Örneğin : Personelin brüt maaşlarının herkes tarafından listelenebilir olması mahsurlu olabilir. Bu durumda personel adlı temel tablodan persview adlı bir view oluşturulabilir:
CREATE VIEW persview
AS SELECT sicil , sosy_g_no, ad , soyad, dog_tar, adres, cins, böl_no,
yön_s_g_n
FROM personel ;
Persview adlı view, herkesin kullnımına açık , personel adlı tablo ise yetkili kişiler dışındakilere, erişilemez hale getirilirse, maaşların herkes tarafından erişilebilir bilgi olması önlenmiş olur.
Bir view’den bilgi listelenmesi temel tablodan bilgi listelenmesinden farklı değildir :
SELECT *
FROM persview ;
Persview’den maaşlar hariç tüm personel bilgileri listelenecektir. Bir temel tablodaki aynı sütun isimleri kullanılmak zorunda değildir.
4.1.2 Sorgulamanın Daha Basit Hale Gelmesi :
Karmaşık sorgulamalarda, bazı SELECT komutlarının sonuçları diğer SELECT komutlarında kullanıldığında, sorgulanmanın düzenlenmesinde yanlışlıklar yapma olasılığını artar.
Karmaşık sorgulamalar, View özelliği kullanılarak daha basit hale getirilebilir. Burada temel fikir şudur: Mademki bir view, bir sorgulama sonucu elde edilen bilgiyi (tabloyu) isimlendirerek elde edilen bir virtüel tablodur; o halde karmaşık SELECT komutu içinde, sonucu kullanacak başka bir SELECT komutu yerine, bu sonucu bir view olarak isimlendirerek, view adını kullanmak. Bazı durumlarda ise, işletmenin veri tabanı uygulamasında çok sık olarak sorulan karmaşık soruları bir view yapısı ile saklayarak, daha sonra aynı tip sorgulamalar için bu view yapısını kullanarak daha basit ifadeler kullanmak da olasıdır.
ÖRNEK: Satış bölümünde çalışan personelin herhangi birinden daha düşük maaş alan ve mühendislik bölümünde çalışan kişileri listeleyiniz:
ÇÖZÜM:
SELECT *
FROM personel
WHERE brut < ANY
(SELECT brut
FROM personel
WHERE bol_no=2) AND
Bol_no=1;
(Satış bölümü kodu 2 ve mühendislik bölümü kodu ise 1 kabul ediliyor).
Şimdi bu sorunun cevabı olan tablo bir view olarak saklanırsa:
CREATE VIEW S1view
AS SELECT *
FROM personel
WHERE brut < ANY
(SELECT brut
FROM personel
WHERE bol_no=2) AND
bol_no=1;
Bundan sonra aynı tip sorgulama için sadece
SELECT *
FROM S1view;
yazmak yeterli olacaktır.
4.1.3 Sadece Vıew Kullanılarak Gerçekleşebilen Sorgulamalar
Bir tablodan elde edilecek bilgiler için, iki kademeli işlem gerektiren sorgulamalarda, iki adımda bir view oluşturup ikinci adımda esas sorgulamayı bu view yardımı ile gerçekleştirmek, çoğu kez kaçınılmaz bir durumdur.
Aşağıdaki soru ve bunun çözümü olan SQL ifadeleri bu konuda bir fikir verecektir:
ÖRNEK: Her bölümde, o bölümdeki ortalama maaştan daha yüksek maaş alanları listeleyiniz.
ÇÖZÜM: Bu sorunun cevaplandırılması için önce her bölümdeki ortalama maaşların bulunması gereklidir.
CREATE VIEW BOL_OR_VIEW (bol_no, ort_brut)
AS SELECT bol_no, AVG (brut)
FROM personel
GROUP BY bol_no;
Daha sonra, yaratılan BOL_OR_VIEW yardımı ile (bu view, bölüm no’ları ve bölüm ortalama maaşlarını saklamaktadır) sorulan sorunun cevabı elde edilebilir:
SELECT *
FROM personel
WHERE bol_no=BOL_OR_VIEW. Bol_no
.AND. brut > ort_brut;
BÖLÜM 5
Tablolarda Değişiklik Yapma
5.1 Tabloya Veri Ekleme
SQL’de, mevcut bir tabloya veri eklemek için kullanılacak olan komut INSERT komutudur.
Standart SQL’de, oluşturulan bir tabloya veri yüklemek için tek imkan INSERT komutudur.INSERT komutu ile, tabloya, belli bir anda, tek bir satır eklemek imkanı vardır. INSERT komutunun yazılış biçimi aşağıdaki gibidir:
INSERT INTO Tablo adı
(Sütun adı1, sütun adı2, ………..sütun adı(n))
VALUES (değer1, değer2,………değer(n));
Örneğin, persınel tablosuna, sicil no’su 275 olan personel ile ilişkili bilgiler aşağıdaki gibi bir INSERT komutu ile yüklenebilir:
INSERT INTO personel (sicil,
sosy_g_no, ad, soyad, dog_tar, adres,
cins, brüt, bol_no, yon_s_g_n)
VALUES (‘275’, ‘27652418’, ‘ali’, ‘caner’,
{01/05/1962}, ‘Merkez cad. 46-Fatih-Ist’,
.T., 27000000, 2, ‘876215342’);
Karakter türü verilen “ sembolleri arasına yüklendiğine, diğer veriler içinse buna gerek olmadığına dikkat ediniz. Burada, tabloya tüm kolonlarla ilgili veri yüklendiği için, istenirse kolon isimleri ihmal edilebilir.
Standart SQL’deki INSERT komutunun, belli bir anda, tabloya, tek bir satırı tüklemesine karşılık, birçok SQL gerçekleştiriminde, yığın halinde veri yükleyen hizmet programlarından (utility) faydalanmak imkanı da vardır.
Ayrıca, INSERT komutunun bu şekli ile tabloya veri yüklemek pratikte tercih edilebilecek bir şekil değildir. (Her tablo satırı için bir INSERT komutu kullanılıyor) Daha kullanışlı olan yol, verilerin kullanıcın zorlanmayacağı bir ekran düzeni ile klavyeden yüklenmesi daha bunların INSERT ile tabloya yerleştirilmesidir.
SQL’de ekrandan interactive bilgi girişi ve ekran tasarımı sağlayacak komutlar yoktur. Fakat SQL’in bir veri tabanı yönetim yazılımının (dbase, foxpro, ORACLE) ya da bir üst düzey dilinin (C, Pascal, Cobol, vb.) interactive bilgi girişine uygun komutlarını kullanarak bu işlemi arzu edilen kalitede gerçekleştirmesi mümkündür.SQL’in diğer dillerle etkileşimi daha sonra incelenecektir.
5.2 Tablo Satırlarını Silme
Bir tablonun satırlarını silmek için gerekli komut DELETE komutudur.
Satır silme koşullu veya koşulsuz olarak gerçekleştirilebilir.
DELETE FROM personel;
25 Rows Deleted
Bu komut ile personel tablosundaki tüm satırlar silinecektir.
25 Rows Deleted
mesajı ile, o anda tabloda bulunan 25 satırın silindiği bildirilmektedir.
Koşula bağlı bağlı olarak satır silmenin de mümkün olduğunu söylemiştik.Bunu gerçekleştirmek için, DELETE komutuna WHERE sözcüğü eklenmeli ve bunu izleyen ifade koşulu göstermelidir.
ÖRNEK:
DELETE FROM personel
WHERE bol_no=2;
5 Rows Deleted
Bu komut ile, 2 numaralı bölümdeki personelin tümü tablodan silinecektir.
4 Rows Deleted
Mesajı ile de, o anda 2 numaralı bölümde çalışan 5 personele ait satırların silindiği belirtilmektedir.
Aşağıdaki örnekte ise brüt maaş alanı boş olmayan tüm personel silinmektedir:
DELETE FROM personel
WHERE brut IS NOT NULL;
25 Rows Deleted
5.3 View’ ler Üzerinde Değişiklik , Ekleme, Silme işlemleri :
View’ler üzerinde ekleme, silme , ve değişiklik işlemleri esas itibarı ile tablolar üzerinde yapılan benzer işlemlerden çok farklı değildir. Fakat view’ler üzerinde bu tip işlemlerin gerçekleştirilmesinde bazı kısıtlamalar mevcuttur. Aşağıdaki hususlar bilinmelidir :
- Bir view’in güncellenebilir nitelikte olması için bir birleştirme işlemi sonucunda üretilmiş olması gerekir. Başka bir deyişle CREATE VIEW komutunda FROM sözcüğünü .zleyen kısın-mda sadece bir tablo adı bulunmaktadır.
- View içindeki hiçbir kolon bileşik fonksiyonlarca üretilmiş olmamalıdır. ( MAX, SUM vb.)
- View’in üretildiği SELECT komutunda , DISTINC, GROUP BY ya da HAVING sözcüklerini içeren parçaların işlevleri yerine getirilmiş olmamalıdır.
Bu koşulları sağlamayan view’ler sadece okunabilir özellikteki view’lerdir , ve bunlar üzerinde değişiklik yapılamaz.
5.3.1 View İçine Satır Ekleme :
Daha önceden oluşturulmuş px adlı view ad, soyad , ve brüt alanlarını içermiş olsun. Bu view güncellenebilir nitelikte ise aşağıdaki INSERT komutu ile aynen tablolarda olduğu gibi kendisine bir satır eklemek mümkün olacaktır.
INSERT INTO Px
VALUES (‘ ali’, ‘çakır’, 12000000) ;
Daha önceden view oluşturulurken CHECK OPTION alternatifi kullanılmamışsa bu durumda ekleme esnasında view’ I oluşturan koşul ihlal ediliyorsa sistem eklemeye müseade etmeyip hata mesajı verecektir.
5.3.2 View İçinden Satır Silme :
Güncellenebilir bir view içinden satır silme işlemi, tablodan satır silme işlemi ile aynı şekilde gerçekleştirilebilir.
Örnek : DELETE FROM UST_PER_VIEW
WHERE brüt< 25000000 ;
5.3.3 View Satırları Üzerinde Güncelleme İşlemi :
Güncellenebilir view’lerde güncelleme işlemi tablolardakinin aynısıdır. Örneğin UST_PER_VIEW adlı view’de sicili 27251 olan kişinin maaşını 37000000 olarak değiştirmek için
UPDATE UST_PER_VIEW
SET brüt =37000000
WHERE sicil =27251 ;
Komutu kullanılabilir.
5.3.4 Bir Viewi Silmek :
Tablolarsdan silinmesine benzer şekilde sistemden oluşturulan bir view DROP VIEW komutu ile silinebilir.
DROP VIEW UST_PER_VIEW ;
Bir viewin silinmesi ile o view’e bağlı olarak oluşturulmuş diğer tüm view’ler ve bu view’le ilişkisiolan önceliklerin hepsi silinmiş olur.
BÖLÜM 6
İndeks Oluşturmanın Amacı :
Bir indeks, veri tabanı ortamında bir tablo ya da bir view gibi bir nesnedir ve ilişkili olarak kullanıldığı tablo ya da view’deki satırların, indeksleme alanı olarak kullanılan kolondaki verilere göre sıralanmış biçimde işlenme sokulmasını sağlar.
Bir tablo, indekslenmiş ise , bu tablo içinde gerçekleştirilecek bir arama ya da koşullu listeleme ( SELECT komutu ile ) işlemi çok daha hızlı biçimde gerçekleştirecektir.
6.1 İndeks Yaratma :
SQL ‘de bir tablo ile ilişkili olarak bir indeks yaratmak için gerekli komut CREATE INDEKS komutudur.Komutun yazılış biçimi aşağıdaki gibidir :
CREATE INDEX indeks adı
ON tablo adı ( kolon adı1, koon adı2,………kolon adı (n)) ;
İndeksleme artan ya da azalan şekilde olabilir. A’dan Z’ye nümerik olarak küçükten büyüğe şeklindedir. Azalan ise bunun tam tersidir. Hiçbir özel sözcük kullnılmazsa indeksleme artan sayılır ya da alan adının yanında ASC sözcüğü kullanılırsa artan sıralama yapılacağı anlaşılır. Herhangi bir DESC sözcüğünün kullanılması ise azalan sıralama yapılacağı anlamına gelmektedir.
6.1.1 Tek Bir Alana Göre Artan Sırada İndeksleme :
İşletmede çalışan personeli brüt maaşlarına göre artan sırada listelemek istersek, brüt alanına göre bir indeks oluşturmalıyız.
CREATE INDEX pers_maas
ON personel (brüt) ;
Index created 127 rows
127 satırlık personel tablosu ile ilişkili olarak brüt kolonuna indeks anahtarı olarak kullanılan pers_maas adlı indeks oluşturuluştur. Bu durumda
SELECT *
FROM personel ;
Şeklindeki listeleme komutu sonucunda personel tablosundaki tüm personel brüt maaşlarına göre listelenecektir.
6.1.2 Tek Bir Alana Göre Azalan Sırada İndeksleme :
İşletmede çalışan personeli brüt maaşlarına göre azalan sırada listelemek istenirse brüt alanına göre aşağıdaki gibi indeks oluşturmak gerekir :
CREATE INDEX pers_maas
ON personel (brüt DESC) ;
6.1.3 Birden Fazla Alana Göre İndeksleme :
İşletmedeki personelin öncelikle adlarına göre aynı adda olanların soyadlarına göre hem adı hem soyadı aynı olanların maaşlarına göre sıralanmış olarak listelenmesi istenirse aşağıdaki komut kullnılmalıdır :
CREATE INDEX p_ad_soy_m
ON personel ( ad, soyad ,brüt ) ;
Bu durumda
SELECT *
FROM personel ;
Komutu sonucunda sıralanmış tablo görülecektir.
Unıque Sözcüğü :
Bir tablo , seçilen bir sütuna göre indekslenirken indeksleme alanı olarak seçilen sütundaki verilerin tekrarlanmasına izin verilmesi istenmiyorsa indeksleme yapılırken , CREATE INDEX komutu içinde UNIQUE sözcüğü kullanılır.
CREATE UNIQUE INDEX pers_sicil
ON personel ( sicil );
Mevcut Bir İndeksin Silinmesi :
Bir tablo üzerinde tanımlanmış herhangi bir indeks , o tablonun veri tabanından silinmesi ile otomatik olarak silinecektir.
Tablo silinmeksizin , o tablo üzerinde oluşturulan indeksin silinmesi içinse DROP INDEX komutu kullnılmalıdır.
DROP INDEX pers_in ;
komutu ile
INDEX DROPPED
Mesajı alınacaktır.
SQL ‘in Diğer Bilgisayar Dillerine Ve Yazılımlarına Katılımı :
SQL’in Katılım Amacı :
SQL için iki çalışma modu vardır :
- Etkileşimli SQL modu
- Katılımlı SQL modu
Buraya kadar SQL’in etkileşimli modu anlatıldı. Bu modda her komut , sisteme gönderilmekte ve sistem cevabı olarak bir sonuç ya da bir hata mesajı karşılığı alınmaktadır. Etkileşimli modda belirtilen 3 noktada güçlük vardır :
- Tablolara bilgi girişi : Her tablo satırı girişi için ayrı bir INSERT komutuna gerek vardır. Bu oldukça önemli güçlük oluşur. Ayrıca kullnıcı için kolaylık sağlayan bilgi giriş ekranlarını etkileşimli modda ve SQL komutları ile gerçekleştirmek olanaksızdır.
- Bilgi İşleme : Belli bir anda tek bir komut icra edebilir ve aynı zamanda bir komut otomatik olarak tekrar tekrar icra edebilme yeteneğine sahip değildir.
- Bilgi Çıkışı : Gerçekleştirilen bir sorgulama sonucunu kullanıcının arzu edeceği düzen ve esneklikle ekrana aktarma imkanı yoktur.
SQL , tanım olarak bir veri tabanı alt dilidir. Yani bilgisayar dilinin gerek gösterdiği tüm yapılara saip değildir.
SQL’in sahip olduğu özellikler bu noktaya kadar görüldüğü gibi, veri tanımlam,bütünlük kontrolü, veriye erişim ve sorgulama ,veriyi güncelleme ile ilişkili komut yapılarıdır. Dolayısıyla eksik olan I/O, ekran tasarımı,loop ili ilişkili program eksiklikleridir.
SQL, dili yordamsal bir dil değildir tamtersine küme esaslı bir dildir. Bunun anlamı şudur: SQL dili bir sorgulama esnasında SELECT komutu ile belli bir koşulu sağlayan tablo satırlarının tümü birden elde edilebilir.
Kürsör * Kullanımı :
SQL’deki kürsörün anlamı : SELECT komutu ile seçilmiş tablo satırları arasından belirli bir satırı işaret eden gösterge demektir. Belli bir anda kürsörün işaret ettiği satırın üzerinde güncelleme ya da silme işlemi yapılabilir.Bir SELECT işlemi ile ilişkili olarak bir kürsör tanımlama iki aşamalı bir süreçtir :
- DECLARE CURSOR komutu ile kürsör için bildiride bulunulur.
- OPEN komutu ile de kürsör açılır.
Kürsör açıldığı zaman veriye erişmek için FETCH deyimi kullanılmalıdır. Kürsör ile ilgili işlemler bitince CLOSE deyimi ile ürsör kapatılır.
DECLARE komutu bir kürsör ismini SELECT komutu ile ilişkili hale getirir.
DECLARE kürsör adı CURSOR
FOR SELECT –komutu [FOR READ [ONLY]]
Kullanım şeklidir.
OPEN komutu, DECLARE CURSOR komutundaki SELECT deyiminin icra edilmesi ile elde edilen tablo satırları kümesi içinden erişim yapılabilmesi işlemini başlatır.
OPEN kürsör1
Komutu ile küsör1 adlı kürsör açılmaktadır.
FETCH komutu ile açılan erişim seti içindeki tablo sütunlarındaki veriler SQL’in içinde kullanıldığı program içindeki değişkenlere aktarılabilir.





Son Yorumlar