SQL notu sonhali

66
1 - SQL NEDİR?...................................................3 Veri Tabanı (Database).........................................3 Tablolar (Tables).............................................. 3 Kolonlar ve Veri Türleri (Columns and Datatypes)...............4 Satırlar (Rows)................................................ 4 Tekil Anahtarlar (Primary Keys)................................4 A. DDL (Data Definition Language) Deyimleri....................5 CREATE Deyimi.................................................5 ALTER Deyimi..................................................7 DROP Deyimi...................................................7 B. DML (Data Manipulation Language) Deyimleri..................9 2 - Veriye Ulaşmak...............................................9 2.1 - SELECT İfadesi........................................... 9 3 - Verilerin Sıralanması.......................................10 3.1 - Sıralama İşlemi.........................................10 3.2 - Çoklu Kolonlara Göre Sıralama...........................11 3.3 - Kolon Pozisyonuna Göre Sıralama.........................11 3.4 - Sıralama Yönünün Belirtilmesi...........................12 4 - Veri Filtreleme - Arama.....................................12 4.1 - WHERE Deyiminin Kullanımı...............................12 4.2 - WHERE Deyiminde Kullanılacak Operatörler................13 4.2.1 Tek Bir Değere Göre Arama..............................13 4.2.2 Eşitsizlik Durumları...................................13 4.2.3 Belirli Bir Değer Aralığındaki Verilerin Araştırılması.14 4.2.4 Değer Girilmemiş Kayıtların Bulunması..................14 4.2.5. İşlem Öncelik Sırası..................................15 4.3 Veriler Üzerinde Ekleme, Silme Ve Değiştirme İşlemleri. .16 4.3.1 INSERT İfadesinin Kullanımı............................16 4.3.2 UPDATE İfadesinin Kullanımı............................17 4.3.3 DELETE İfadesinin Kullanımı............................18 5 - DETAYLI VERİ ARAMA TEKNİKLERİ...............................19 5.1 - WHERE Deyimi ve Kullanımı...............................19 5.1.1 AND Operatörü..........................................19 5.1.2 OR Operatörü...........................................20 5.1.3 Sorgularda İşlem Sırası................................20 5.2 - IN Operatörü............................................ 21 5.3 - NOT Operatörü........................................... 21 6 - Wildcard ile Arama – Filtreleme.............................21 6.1 - LIKE Operatörü..........................................21 6.1.1 Yüzde (%) (percent) Wildcard Karakteri.................22 6.1.2 Alttire (_) (underscore) Wildcard Karakteri............23 6.1.3 Köşeli Parantez ( [ ] )(brackets) Wildcard Karakteri...23

Transcript of SQL notu sonhali

1 - SQL NEDİR?...................................................3Veri Tabanı (Database).........................................3Tablolar (Tables)..............................................3Kolonlar ve Veri Türleri (Columns and Datatypes)...............4Satırlar (Rows)................................................4Tekil Anahtarlar (Primary Keys)................................4A. DDL (Data Definition Language) Deyimleri....................5CREATE Deyimi.................................................5ALTER Deyimi..................................................7DROP Deyimi...................................................7

B. DML (Data Manipulation Language) Deyimleri..................92 - Veriye Ulaşmak...............................................92.1 - SELECT İfadesi...........................................9

3 - Verilerin Sıralanması.......................................103.1 - Sıralama İşlemi.........................................103.2 - Çoklu Kolonlara Göre Sıralama...........................113.3 - Kolon Pozisyonuna Göre Sıralama.........................113.4 - Sıralama Yönünün Belirtilmesi...........................12

4 - Veri Filtreleme - Arama.....................................124.1 - WHERE Deyiminin Kullanımı...............................124.2 - WHERE Deyiminde Kullanılacak Operatörler................134.2.1 Tek Bir Değere Göre Arama..............................134.2.2 Eşitsizlik Durumları...................................134.2.3 Belirli Bir Değer Aralığındaki Verilerin Araştırılması.144.2.4 Değer Girilmemiş Kayıtların Bulunması..................144.2.5. İşlem Öncelik Sırası..................................15

4.3 Veriler Üzerinde Ekleme, Silme Ve Değiştirme İşlemleri. .164.3.1 INSERT İfadesinin Kullanımı............................164.3.2 UPDATE İfadesinin Kullanımı............................174.3.3 DELETE İfadesinin Kullanımı............................18

5 - DETAYLI VERİ ARAMA TEKNİKLERİ...............................195.1 - WHERE Deyimi ve Kullanımı...............................195.1.1 AND Operatörü..........................................195.1.2 OR Operatörü...........................................205.1.3 Sorgularda İşlem Sırası................................20

5.2 - IN Operatörü............................................215.3 - NOT Operatörü...........................................21

6 - Wildcard ile Arama – Filtreleme.............................216.1 - LIKE Operatörü..........................................216.1.1 Yüzde (%) (percent) Wildcard Karakteri.................226.1.2 Alttire (_) (underscore) Wildcard Karakteri............236.1.3 Köşeli Parantez ( [ ] )(brackets) Wildcard Karakteri...23

7 - TABLONUN ALANLARI İLE ÇALIŞMAK..............................257.1 Tabloların Alanları ile Neden Çalışılır?..................257.2 Alanların Birleştirilmesi.................................257.2.1 Kolon İsimlerinde Takma Ad Kullanımı (Alias)...........267.2.2 Matematiksel İfadelerin Hesaplanması...................26

8 - Veriler Üzerinde Değişiklik Yapan Fonksiyonlar..............278.1 - Fonksiyonlar Üzerine....................................278.2 – Fonksiyon Kullanımı.....................................278.2.1 Metinler Üzerinde İşlem Yapan Fonksiyonlar.............278.2.2 Tarih ve Zaman Üzerinde İşlem Yapan Fonksiyonlar.......318.2.3 Nümerik İşlem Yapan Fonksiyonlar.......................36

9 - Veriler Üzerinden Özet Bilgi Alınması.......................369.1 Toplam Fonksiyonlarının Kullanımı.........................369.1.1 AVG() Fonksiyonu.......................................379.1.2 COUNT() Fonksiyonu.....................................379.1.3 MAX() Fonksiyonu.......................................389.1.4 MIN() Fonksiyonu.......................................389.1.5 SUM() Fonksiyonu.......................................38

9.2 - Farklı Değerler Üzerinde Toplam İşlemleri...............399.3 - Toplam Fonksiyonlarının Beraber Kullanımı...............40

10 - Verilerin Gruplandırılması.................................4010.1 - Veri Gruplama Nedir?...................................4010.2 - Grup Oluşturmak........................................4010.3 - Grup Üzerinde Filtreleme Yapmak........................4110.4 SELECT İfadesinin İşlem Sırası...........................42

11 - Alt Sorgular...............................................4211.1 Alt Sorgu Nedir?.........................................4211.2 Alt Sorgular ile Filtreleme..............................4311.3 Alt Sorguları Hesaplanmış Alanlar Olarak Kullanmak.......44

12 – Tabloları Birleştirme......................................4512.1 Tablolar Arası Veri Birleştirme Nedir?...................4512.2 Tablolar Arası Veri Nasıl Birleştirilir (Join)?..........4512.3 WHERE Yan Cümlesinin Önemi...............................4612.4 INNER JOIN...............................................4612.5 Çoklu Tabloları JOIN ile Birleştirmek....................47

1 - SQL NEDİR?Veri tabanı ile bilgi alış verişi yapılmasını sağlayan bir

dildir. Ancak SQL yalnız başına bir dil olarak algılanmamalıdır.Çünkü SQL, programlama dillerinin içine gömülen kodlar sayesindeçalışır. Kullanıldığı işletim sisteminin API (ApplicationProgramming Interface) fonksiyonlarını çalıştırır, ancakprogramcının bundan haberi olmaz.

Programlama dillerinin İngilizcesidir. Birkaç İngilizcekelimeden oluşur. Veri tabanı sorgusu yapan dile aslında T-SQL(Transact SQL) denir. SQL denince program değil, programlamadillerinde kullanılan sorgulama ara dili akla gelmelidir. Veritabanlarını görüntülemeye ve yönetmeye yarayan programlara ise“Veri tabanı yönetim sistemi (Database Management System)” denir.

Piyasada pek çok veri tabanı yönetim sistemi vardır.Bunlardan en çok bilinenleri

Microsoft SQL Server Oracle My-Sql Microsoft Access Informix

Çeşitli programlama dilleri gibi, SQL de standart halegetirilmiştir. ANSI tarafından standart hale getirilmiş ANSI SQL,her bir veri tabanı yönetim sistemi tarafından desteklenmesigereken bir standarttır.

Veri Tabanı (Database)Günümüzde veri tabanı (database), neredeyse her alanda

kullanılmaktadır. Adres defterinizden bir adresi araştırmanız bilebir veri tabanı sorgusudur. Arama motorları sayesinde ulaştığınızbilgiler de yine veri tabanları ile haberleşir.

Bilgi: Veri tabanı, verileri derli toplu olarak saklamaya yarayan dosya vedosyalar kümesidir.

Bilgi: Yaygın olarak veri tabanı yazılımlarına hatalı bir kullanışla“veritabanı” adı kullanılır. Ancak o programlar veri tabanı değil, veri tabanıyönetim sistemleridir (Database Management System). Veri tabanları bu yazılımlarsayesinde de kullanılabilir.

Tablolar (Tables)Veri tabanında bilgilerin saklandığı alt birimlere tablo denir.

Bir veri tabanında pek çok bilgi saklanabilir. Ancak bunlarınbelirli bir şekilde ayrılması gerekir. Örneğin bir okulun tümöğrencilerinin ve tüm notlarının tek bir tablo içerisindetutulması karmaşaya yol açacaktır. Bu durumda veriler tablolaraayrılır. Ve tablolar birbirleriyle ilişkilendirilir.

Bir veri tabanında aynı isimde iki tablo bulunamaz. Tabi kifarklı veri tabanlarında aynı isimde tablolar bulunabilir.

Bilgi: Veri tabanına ait tabloların özelliklerini ve yerleşim şekilleriniiçeren bilgiye şema (schema) denir.

Kolonlar ve Veri Türleri (Columns and Datatypes)Veri tabanının tablolardan oluştuğunu belirtmiştik. Tablolar

da kolonlardan oluşur. Kolonlar, her birinde aynı türden verisaklayan birimlerdir. Örneğin öğrenci bilgilerini saklayan birtabloda, bir kolon öğrenci numarasını, bir kolon adını ve diğerbir kolon da soyadını tutar. Yani her bir özelleşmiş bilgi, birkolonda saklanır.

Verileri ayrı ayrı kolonlarda tutmak da çok önemlidir.Örneğin aynı isime sahip öğrencilere ulaşmak istendiğinde, eğer adve soyad bilgisi aynı kolonda tutulmuşsa işlem karmaşıklaşacaktır.Ancak ad ve soyad ayrı ayrı kolonlarda tutulmuşsa, işlem oldukçakolay olacaktır.

Her bir kolonun, saklayacağı bilginin özelliğini belirtenveri türü bulunmaktadır. Bu veri türü sayesinde o kolondasaklanacak bilgi sınırlanır. Örneğin sayısal ifadelerin yeralacağı bir kolona karakter girilmesinin yasaklanması gibi.

Bilgi: Veri tabanlarınsa saklanacak bilgilerin türlerini belirten veri türleri,farklı veri tabanı yönetim sistemlerinde farklı isimlere sahip olabilirler.İşte bu farklılık, veri tabanı uyumu konusunda uyumsuzluk oluşturan en temelkonudur. Aslında temel veri türleri aynı isimle kullanılsa da, özel veritürleri oldukça farklıdır.

Satırlar (Rows)Bir tablodaki bilgiler satırlarda saklanır. Her bir kayıt kendi

sırasında tutulur. Yine Excel tablolarını gözünüzdecanlandırırsanız, dikey kolonlar tabloların kolonlarına, yataysatırlar ise tabloların satırlarına karşılık geldiğini görürsünüz.

Bilgi: Bir satır, bir kayıt (record) demektir.

Tekil Anahtarlar (Primary Keys)Her bir tabloda, tablonun özelliğini taşıyan özel bir veya

birden fazla kolon bulundurmalıdır. Örneğin öğrenci tablosunda,öğrenci numarasını tutan kolon bu tablodaki tekil bilgiyi tutar. Ozaman tasarım sırasında öğrenci numarasını tutan kolon, tekilanahtar olarak belirtilmelidir.

Tekil anahtar kullanarak aynı kolonda farklı satırlarda aynıbilginin girilmesi engellenmiş olur. Ve bu kolona veri girilmemesigibi bir durum söz konusu olamaz. (NULL değer kabul edilmez.)Tekil anahtar olarak belirlenen kolonların değiştirlmemesigerekir.

SQL deyimleri veritabanları üzerinde çeşitli işlemleri yerinegetirirler. Veritabanından sorgulama yapmak için SELECT, eklemeyapmak için INSERT güncelleme yapmak için UPDATE, silme yapmakiçin DELETE, yeni tablo oluşturmak için CREATE TABLE gibikomutlara sahiptir. Bu komutlar işlevlerine göre şu şekildekategorilendirilir:

DDL (Data Definition Language): Veri tanımlama deyimleri. CREATE, ALTER VE DROP gibi nesne oluşturma, yapısını

değiştirme ve silme gibi işlem ifadelerinden oluşurlar. DML (Data Manipulation Language) : Veri düzenleme dili.

SELECT, INSERT, UPDATE, DELETE gibi veriler üzerinde seçme,ekleme, güncelleştirme ve silme gibi işlem ifadelerindenoluşurlar.

DCL (Data Control Language): Veri kontrol dili.

Veritabanındaki kullanıcı haklarını düzenlemek içinkullanılan deyimlerdir. Örneğin GRANT, DENY, REVOKE gibi.

A. DDL (Data Definition Language) Deyimleri

DDL deyimleri veritabanı üzerinde nesne yaratmak içinkullanılırlar. En yaygın kullanılan DDL deyimleri şunlardır:

CREATE Deyimi

CREATE deyimi tablo ve view gibi bir veritabanı nesnesi yaratmayı sağlar.

Tablo Yaratmak: Veritabanı üzerinde bir tablo yaratmak için CREATE deyimi

kullanılır.

Yapısı:

CREATE <tablo adı>

T-SQL’de tablo oluştururken kullanılabilecek olan veri türlerindenen çok kullanılan bazıları aşağıda açıklanmıştır :

Tamsayı veri türleri :

a) bigint : -263 ile 263-1 sınırları arasında tamsayıları tutabilir

b) int : -231 ile 231-1 arasındaki tamsayıları tutabilir.

c) Smallint : -215 ile 215-1 arasındaki tamsayıları tutabilir. d) Tinyint : 0 ile 255 arasındaki tamsayıları tutabilir. e) Bit : 0 veya 1 tamsayı değerlerini tutabilir

Ondalık sayısal veri türleri :

a) decimal : -1038+1 ile 1038-1 arasındaki ondalıklı sayılarıtutabilir. (uzunluk ve duyarlılık miktarı değiştirilebilir)

b) numeric : fonksiyonel olarak decimal’e denktir. c) Float : -1,79 x 10308 ile 1,79 x 10308 arası sayıları tutabilird) Real : -3,40 x 1038 ile 3,40 x 1038 arası sayıları tutabilir.

Parasal veri türleri :

a) money : -263 (-922,337,203,685,477.5808) ile 263-1(+922,337,203,685,477.5807) arasındaki parasal verileritutabilir.

b) smallmoney : -214,748.3648 ile +214,748.3647 arasındakiparasal verileri tutabilir.

Tarih/saat veri türleri :

a) datetime : 1.1.1753 ile 31.12.9999 aralığında tarih ve saat verilerini tutabilir.

b) smalldatetime : 1.1.1900 ile 6.6.2079 aralığında tarih ve saat verilerini tutabilir.

Unikod olmayan (Non-unikod) karakter veri türleri :

a) char : Sabit uzunluklu ve 8000 karaktere kadar unicodeolmayan karakter verilerini tutabilir.

b) varchar : Değişken uzunluklu ve 8000 karaktere kadar unicodeolmayan karakter verilerini tutabilir.

c) text : Değişken uzunluklu ve 231-1 karaktere kadar unicodeolmayan karakter verilerini tutabilir.

Unikod karakter veri türleri :

a) char : Sabit uzunluklu ve 4000 karaktere kadar unicodekarakter verilerini tutabilir.

b) varchar : Değişken uzunluklu ve 4000 karaktere kadar unicodekarakter verilerini tutabilir.

c) text : Değişken uzunluklu ve 230-1 karaktere kadar unicodekarakter verilerini tutabilir.

Örnek:

CREATE TABLE Musteri( mus_id char(4) NOT NULL mus_ad varchar(40) NULL, ili varchar(20) NULL, ulke char(2) NULL, adres varchar(30) NULL)

NOT: Char, varchar, integer, numeric gibi sözcükler tabloalanlarındaki temsil edilecek verinin türünü belirtir. SQL'deSMALLINT, VARCHAR, DECIMAL(x,y), FLOAT(x;y), DATETIME, LOGICAL,TIME, TIMESTAMP gibi alan veri türleri vardır.

Örnek:

CREATE TABLE personel(Sskno Integer,Adi Varchar(20) not null,Soyadi Varchar(20) not null,Departman integer)

Tablo oluşturma esnasında hesaplanmış alan da oluşturabilirsiniz.

Örnek:

CREATE TABLE mytable ( low int, high int, myavg AS (low + high)/2 )

ALTER Deyimi

Daha önce yaratılmış nesnenin değiştirilmesini sağlar. Örneğibir tablonun tasarımını değiştirmek gibi.

Örnek:

Aşağıdaki deyimde Musteri tablosuna 7 karakter bilgigirilebilen, boş geçilemeyen ve varsayılan değer olarak 1234567değeri atanan “tel” sütunu eklenmiştir.

ALTER TABLE MusteriADD tel varchar(7) NOT NULLDefault ‘1234567’

Aşağıdaki deyimde Ornek tablosuna datetime türünde birdogumtarihi sütunu eklenmiştir.

ALTER TABLE OrnekADD dogumtarihi datetime NULL

Aşağıdaki deyimde mytable tablosuna low ve high alanlarınıntoplanmasıyla elde edilen bir toplamları alanı eklenmiştir.

ALTER TABLE mytable add toplamlari as (low+high)

Aşağıdaki deyimde mytable tablosuna tek bir işlemle myavg vehesaplanan alanları eklenmiştir.

ALTER TABLE mytable addmyavg AS (low + high)/2,hesaplanan as (low+high)

Yukarıda gösterilen, bir tabloya tek işlemle birden fazlaalan eklenmesi işleminin yazılışının bir diğer yolu da aşağıdakiörnekte gösterilmiştir.

ALTER TABLE ornekadd tel varchar(11) default ('1234567'), boy tinyint default 120

DROP Deyimi

Bir nesnesin silinmesini sağlar.

Örnek:

DROP TABLE MUSTERI

Müşteri tablosunun verilerini ve tabloyu siler.

DROP deyimi, ALTER deyimi ile beraber kullanılarak nesneler içerisinden bazı yapısal parçaların silinmesi için de kullanılabilir.

Örnek:

ALTER TABLE MusteriDROP COLUMN tel

Yukarıdaki deyimde musteri tablosunun alanlarından tel adlı bir alansilinmiştir.

ALTER TABLE mytable DROP COLUMN myavg,COLUMN hesaplanan

ALTER TABLE ornek DROP COLUMN tel,boy

Yukarıdaki deyimlerde belirtilen tablolardan birden fazla alan silme işlemi gerçekleştirilmiştir. .

Örnek :

ALTER TABLE ornek ALTER COLUMN ad varchar(25) not null

Yukarıdaki deyimde, önceki örneklerde oluşturulmuş ornektablosunda bulunmakta olan “varchar(10) ve null” özelliğindeki adalanın özelliği “varchar(25) ve not null” olarak değiştirilmiştir.

Örnek:

ALTER TABLE ornek

ALTER COLUMN tel bigint

Yukarıdaki deyimde daha önceden oluşturulmuş olan ornektablosundaki “smallint ve not null” özelliğindeki tel alanınınözelliği, “bigint ve null” olarak değiştirilmiştir.

Örnek:

CREATE TABLE ornek2(Ad varchar(10),Boy tinyint Constraint boykontrol Check (boy>0),İl varchar(10) Constraint ilkontrol Default (‘Bolu’))

Yukarıdaki deyimde ornek2 isimli tablo oluşturulurken tabloiçerisindeki boy ve il alanlarına ilişkin check (boykontrol) vedefault (ilkontrol) constraintleri de oluşturulmuştur. Üzerindebir constraint tanımlı herhangi bir alan, drop ile silinmeyeçalışıldığında hata verecektir. Bu yüzden bu tür bir alanı silmekiçin tanımlı constraintin silinmesi gerekir. Bu işlemin yapılışıda aşağıdaki şekilde gösterilmiştir.

Hatalı alan silme (boy) Doğru alan silme (boy)ALTER TABLE ornek2DROP column boy

ALTER TABLE ornek2 DROPCONSTRAINT boykontrol,COLUMN boy

B. DML (Data Manipulation Language) DeyimleriVeritabanı içindeki verileri elde etmek ve değiştirmekle ilgili SQL deyimleridir.

SELECT INSERT UPDATE DELETE

2 - Veriye UlaşmakBir tablodan bir veya birden fazla kolona ait bilgiye

ulaşabilmek için SELECT ifadesi kullanılır.

2.1 - SELECT İfadesi SQL’in birkaç İngilizce kelimeden oluştuğunu belirtmiştik.Aslında bu kelimelere anahtar sözcük denir. Tablolardan bilgi almakiçin SELECT anahtar sözcüğü kullanılır.

Bilgi: Anahtar sözcük, diğer programlama dillerinde olduğu gibi SQL’de de“reserverd keywords” yani değişken adı olarak kullanılması yasaklanmışsözcüklerdir. Örneğin SELECT adında bir tablo veya kolon kullanmamak gerekir.

Bir tablodan veri almak için iki bilgiye ihtiyaç vardır:Hangi tablodan ve hangi kolondan alınacağı.

SELECT ifadesinin sözdizimi (sentax):SELECT <kolon ad(lar)ı> FROM <tablo adı>

Örnek 2.1: Ürünler tablosunda bulunan tüm ürünlerin adının listesinialmak isteyelim.Sorgu 1:SELECT ProductNameFROM Products;

Ürünler tablosundan urun_adi olarak isimlendirilmiş kolondakibilgilere ulaşmak için SELECT sorgusu kullanıldı.

Bilgi: Bir sorgudan elde edilen bilgiler topluluğuna “sonuç kümesi” denir.

Sonuç kümesinde görüntülenen veriler, veri tabanına girilişegöre listelenmiştir. Yani bir sıralama söz konusu değildir.İleride sıralanmış bilgiyi elde edebileceğiz.

SQL ifadeleri, aralarında istenildiği kadar boşlukkullanılarak çalıştırılabilir.

SQL’de büyük harf küçük harf duyarlılığı, veri tabanı yönetimsistemine göre değişir.

Bir tablodan birden fazla kolona ait bilgi almak için kolonadları arasına virgül konulur.

Örnek 2.2: Ürünler tablosunda bulunan ürünlerin kodunu, adını vefiyatlarını listelemek isteyelim.Sorgu 2 :SELECT ProductID, ProductName, UnitPriceFROM Products;

Ürünler tablosundan almak istediğimiz kolonarı birbirinden virgülile ayırdık.

Bir tabloya ait tüm kolonların bilgisini almak için ise *operatörü kullanılır.

Örnek 2.3: Ürünler tablosundaki tüm bilgileri görüntülemekisteyelim.Sorgu 3: SELECT * FROM Products

Sorguda * operatörü kullanınca, tablodaki tüm kolonlargörüntülenir. Sıralanması ise tabloda bulunduğu gibidir.

3 - Verilerin SıralanmasıSELECT sorgusu ile ORDER BY deyimini kullanarak sonuç

kümesindeki verileri sıralamayı inceleyeceğiz.

3.1 - Sıralama İşlemiSonuç kümesindeki verileri istenilen kritere göre sıralamak

için ORDER BY deyimini kullanacağız.

Bilgi: SQL ifadelerinde sorguları kuvvetlendirmek için çeşitli kalıplarkullanılır. Bu kalıplara deyim (clause) da denebilir.

ORDER BY Sözdizimi:SELECT <kolon ad(lar)ı> FROM <tablo adı> ORDER BY <kolon adı>

Örnek 3.1: Ürünler tablosundan alfabetik sıralı olarak ürün adlarınılisteleyelim.Sorgu 4:

SELECT ProductNameFROM ProductsORDER BY ProductName;

Bu sorgunun diğer sorgularımızdan farkı, ürün isimlerine göresıralandırma yapabiliyor olmasıdır. Tablo ismi belirtildiktensonra hangi kolona göre sıralandırma yapılmak isteniyorsa ORDER BYdeyiminden sonra o kolonun adı belirtilir. Burada dikkat edilmesigereken, ORDER BY deyiminin en sonda kullanılıyor olmasıdır.

Görüntülenmek istenen kolonlara göre sıralama yaptırılacağınagöre, SELECT listemizde yer almayan bir kolona göre sıralamayaptırmak pek kullanışlı olmayacaktır.

3.2 - Çoklu Kolonlara Göre SıralamaBazı durumlarda tek bir sıralama kriteri yeterli olmaz.

Örneğin bir personel tablosunda soyada göre sıralanıp listenenenpersonelin bir de adına göre sıralanması istenebilir. Aynı soyadasahip işçiler için bu durum söz konusudur.

Çoklu kolona göre sıralama yapmak için, tıpkı çoklu kolonbilgilerini görüntülerken kolon isimleri arasına konulan virgüllergibi ORDER BY deyiminden sonra da kolonlar arasına virgül koymakgerekir.

Örnek 3.2: Ürünler tablosunda ürün kodu, fiyatı ve ismini, öncefiyata göre, sonra da ürün adına göre görüntülemek isteyelim.Sorgu 5:SELECT ProductName, UnitPriceFROM ProductsORDER BY UnitPrice, ProductName;

Birden fazla kolona göre sıralama yapıldığı durumlarda, eğer ilkkritere göre sıralanan kayıtlarda aynı değere sahip kayıt varsa,ikinci kritere göre sıralama yapılır. Yani fiyatı 45 Ytl olanbirden fazla ürün varsa, bu ürünler de kendi aralarında ürün adınagöre sıralanacaktır.

3.3 - Kolon Pozisyonuna Göre SıralamaORDER BY deyiminden sonra kolon isimlerini sıralamak yerine,

kolonun pozisyonuna göre de sıralama yapılabilir.

Örnek 3.3: Ürünler tablosunda ürün kodu, fiyatı ve ismini, öncefiyata göre, sonra da ürün adına göre görüntülemek isteyelim.Ancak sıralamada kolon adları yerine pozisyonları kullanalım.Sorgu 6:SELECT ProductID, ProductName, UnitPriceFROM ProductsORDER BY 2, 3;

ORDER BY 2, SELECT listesinde belirtilen ikinci kolon adına göresıralama yapılacağı anlamına gelir. ORDER BY 2, 3 ifadesinineşdeğeri,

ORDER BY ProductName, UnitPrice, ifadesidir.

Kolon pozisyonu belirterek yeniden kodlamadan uzaklaşmış olunur.Ancak pozisyona karşılık gelen isimlere dönüp bakmak da bazıdurumlarda oldukça zaman kaybettirebilir.

3.4 - Sıralama Yönünün BelirtilmesiVerilerin varsayılan sıralama yönü azdan çoğa artan

(ascending) şekildedir. ORDER BY deyiminde hiçbir yönbelirtilmezse bu artan olarak algılanır. Artan yönde sıralamakiçin ASC anahtar sözcüğü kullanılır. Azalan yönde (descending)sıralamak için ise DESC anahtar sözcüğü kullanılır.

Örnek 3.4: Ürünler tablosunu fiyata göre azalan sırada listeleyelim.Sorgu 7:SELECT ProductID, UnitPrice, ProductNameFROM ProductsORDER BY UnitPrice DESC;

Bu sorguda tabiki aynı değere sahip kayıtlar kendi aralarındasıralanma kriteri belirtilmeden rastgelen listelenmiştir.

Örnek 3.5: Ürünler tablosunu fiyata göre azalan sırada, sonra daürün adına göre sıralı listeleyelim.Sorgu 8:SELECT ProductID, UnitPrice, ProductNameFROM ProductsORDER BY UnitPrice DESC, ProductName;

Bu sorguda aynı değere sahip kayıtlar kendi aralarında artan yöndesıralanmıştır.

4 - Veri Filtreleme - AramaWHERE deyimi kullanılarak veriler arasında çeşitli kriterlere

göre sorgu yapmayı öğreneceğiz.

4.1 - WHERE Deyiminin KullanımıTablodaki veriler arasında belirli kritere uygun sorgu yapmak

için WHERE deyimi kullanılır. Arama kriteri veya filteleme ifadesiolarak da isimlendirilebilir.

WHERE deyimi, FROM ifadesinin hemen sağında kullanılır.

WHERE Söz dizimi:SELECT <kolon ad(lar)ı> FROM <tablo adı> WHERE <kolon adı ve koşulu>

Örnek 4.1: Ürünler tablosudan ürün fiyatı 2.5 olanları listelemekisteyelim.Sorgu 9:SELECT ProductName, UnitPriceFROM Products WHERE UnitPrice = 2.5

Bu sorguda, ürünler tablosundan sadece ürün fiyatı 2.5 olankayıtlar listelenecektir.

4.2 - WHERE Deyiminde Kullanılacak OperatörlerWHERE deyimi ile kombine edilebilecek çeşitli operatörler

vardır. Bu operatörler tablo 4.1’de listelenmiştir.

Operatör Açıklama= Eşitlik<> Eşit değil!= Eşit değil< Küçüktür> Büyüktür<= Küçük eşittir>= Büyük eşittir!< Küçük değildir!> Büyük değildirBETWEEN İki değer

arasında

IS NULL NULL DeğerTablo 4.1: Where Deyimi Operatörleri

Bu operatörlerden bazıları birbirleriyle aynı anlama gelmektedir.Örneğin <> ile !=, !< ile >=, ve !> ile <= aynı etkilerioluşturur. Fakat bunların hepsi bazı veri tabanı yönetimsistemleri tarafından desteklenmez. Örneğin !=, !< ve !>operatörleri, Ms Access tarafından desteklenmez.

4.2.1 Tek Bir Değere Göre AramaÖnceki örnekte 2.5 liraya eşitliğe göre arama yaptık. Şimdi

ise belirli bir fiyattan daha küçük fiyata sahip olanlarılisteleyelim.

Örnek 4.2: Ürünler tablosundan fiyatı 5 liradan küçük olanlarılisteleyelim.Sorgu 10:SELECT ProductName, UnitPriceFROM Products WHERE UnitPrice < 5

Örnek 4.3: Ürünler tablosundan fiyatı 15 liradan büyük ve eşitolanları listeleyelim.Sorgu 11:SELECT ProductName, UnitPriceFROM ProductsWHERE UnitPrice >= 15;

4.2.2 Eşitsizlik DurumlarıŞimdi ise eşitsizlik durumlarını inceleyelim.

Örnek 4.4: Satıcı numarası 4 olan hariç tüm satıclardan alınanürünleri listelemek isteyelim.Sorgu 12:SELECT SupplierID, ProductNameFROM ProductsWHERE (SupplierID <> 4);

Örnek 4.5: Ürün adı Chang dışındaki tüm ürünleri listeleyelim.Sorgu 13:SELECT ProductName FROM ProductsWHERE ProductName <> 'Chang'

Örnekten de gördüğünüz gibi, metinsel ifadeler ile ilgili sorguyaparken ayıraç olarak tekli tırnak kullanılır.

4.2.3 Belirli Bir Değer Aralığındaki Verilerin AraştırılmasıBelirli bir değer aralığındaki verileri araştırmak için

BETWEEN operatörü kullanılır. Bu operatörün kullanımı WHEREdeyiminden biraz daha farklıdır. Arama yapılacak aralığınbaşlangıcı BETWEEN anahtar sözcüğünden sonra belirtilmeli ve ANDanahtar sözcüğünden sonra ise aralığın bitiş noktasıbelirtilmelidir.

Örnek 4.6: Fiyatı 10 ve 20 lira arasında değişen ürünleri listeleyelim.Sorgu 14:SELECT ProductName , UnitPriceFROM ProductsWHERE UnitPrice BETWEEN 10 and 20

BETWEEN operatörü sayesinde istenilen her aralıkta bulunanverileri ulaşabilirsiniz. Önemli olan başlangıç ve bitiş aralığınıbelirtmektir. Örnekte fiyat araması için nümerik değerlerkullanıldı. Ayrıca metin ifadeleri için de aralık belirtilebilir.Bu sefer metinin alfabetik duruma göre arama yapılacaktır.

Örnek 4.7: Ürün adı “Chang” ile “Longlife Tofu” arasında yer alanürünleri listeleyelim.Sorgu 15:SELECT ProductName, UnitPriceFROM ProductsWHERE ProductName BETWEEN 'Chang' AND 'Longlife Tofu';

4.2.4 Değer Girilmemiş Kayıtların BulunmasıBir tablo oluşturulduğunda, bazı alanlara değer girilmemesine

izin verilebilir. Örneğin bir adres bilgisinde posta kodu alanıopsiyonel olarak bırakılabilir. Bu şekilde hiç bir değergirilmemiş alanlarda saklanan değere NULL değer denir.

NULL bilgiya ulaşmak için WHERE deyimi ile IS NULL anahtar sözcüğübirlikte kullanılır.

Örnek 4.8: Tedarikçiler (Suppliers) tablosundan fax bilgisigirilmemiş tedarikçilerin listesini alalım.

Sorgu 16:SELECT SupplierID, CompanyNameFROM Suppliers WHERE Fax IS NULL;

WHERE Fax IS NULL kodu sayesinde fax numarası girilmemiştedarikçiler listelenir.

4.2.5. İşlem Öncelik Sırası

WHERE deyiminde tek bir şart belirtme gibi bir zorunluluk yoktur.Gerektiğinde birden fazla şarta göre arama yapılmak istendiğindearalarına AND/OR bağlaçları konularak şartlar belirtilebilir.Birden fazla şartın belirtildiği bu durumlarda bağlaçların kendiaralarındaki işlem öncelik sıralarına dikkat edilmeleri gerekir.İşlemlerde öncelik sırası aşağıda belirtilmiştir :

1- Tüm karşılaştırmalar ve parentez içi işlemler2- NOT işlemi3- AND işlemi4- OR işlemi

İşlemlerdeki öncelik sırasıyla ilgili örneklerde kullanılacak olanörnek PERSONEL tablosu aşağıda verilmiştir.

PerID Ad Gorev

Ucret

BasTar

1 Ali Memur

2500 1.1.2001

2 Can Memur

2000 2.2.2002

3 Ali Şef 3000 3.3.2003

4 Cem Memur

1500 4.4.2004

5 Eda Şef 2500 5.5.2005

6 Ali Müdür

4000 6.6.2006

7 Can Memur

1250 7.7.2007

8 Cem Şef 2250 8.8.2008

9 Can Şef 2000 9.9.2009

Aşağıda verilmiş olan SQL cümlelerini çalıştırarak sonuçlarıinceleyiniz.

1 SELECT ad, gorev, ucret FROM Personel WHERE Gorev=’memur’ OR Gorev=’Şef’ AND ucret>3000

2 SELECT ad, gorev, ucret FROM Personel WHERE ( Gorev=’memur’ OR Gorev=’Şef’ ) AND ucret>3000

3 SELECT ad, gorev, ucret FROM Personel WHERE Gorev IN (‘Memur’,’Şef’) AND ucret>3000

4 SELECT * FROM PersonelWHERE gorev=’memur’ AND ucret>2500

5 SELECT * FROM PersonelWHERE NOT(gorev=’memur’) AND ucret>2500

6 SELECT * FROM PersonelWHERE NOT(gorev=’memur’) AND ucret>2500

7 SELECT * FROM PersonelWHERE (ad like ‘a%’ AND gorev=’memur’) AND ucret>2500

8 SELECT * FROM PersonelWHERE (ad like ‘a%’ AND gorev=’memur’) OR ucret>2500

9 SELECT * FROM PersonelWHERE (ad like ‘a%’ OR gorev=’memur’) AND ucret>2500

10 SELECT * FROM PersonelWHERE (ad like ‘a%’ AND NOT(gorev=’memur’)) OR ucret>2500

11SELECT * FROM PersonelWHERE gorev IN (‘memur’,’şef’) AND bastar<’5.5.2005 AND adlike ‘_ _ _’

12SELECT * FROM PersonelWHERE gorev IN (‘memur’,’şef’) AND bastar<’5.5.2005 OR adlike ‘_ _ _’

13SELECT * FROM PersonelWHERE NOT(gorev IN (‘memur’,’şef’) AND bastar<’5.5.2005)AND ad like ‘_ _ _’

4.3 Veriler Üzerinde Ekleme, Silme Ve Değiştirme İşlemleri

Select ifadesi ile tablodan veri çekme işlemleri yapılırken;INSERT, UPDATE ve DELETE ifadeleri ile de tabloya veri ekleme,veriler üzerinde değişiklikler yapma ve tablodan veri silmeişlemleri yapılır.

4.3.1 INSERT İfadesinin Kullanımı

Bir tabloya veya görünüm’e (view) bir satır (kayıt) ekler.

A. Basit bir INSERT ifadesi kullanımı

Aşağıdaki örnek T1 tablosunu oluşturur ve tabloya bir kayıtekler.

CREATE TABLE T1 ( column_1 int, column_2 varchar(30))INSERT T1 VALUES (1, 'Row #1')

B. Tablo yapısındaki sütun sırasıyla aynı sırada olmayan veri girişi yapılması

Tabloya veri girişinde sütun listesi (alan isimleri) veValues ifadesinin kullanımı

CREATE TABLE T1 ( column_1 int, column_2 varchar(30))INSERT T1 (column_2, column_1) VALUES ('Row #1',1)

CREATE TABLE T1 ( column_1 int identity, column_2 varchar(30) column_3 int NULL, column_4 varchar(40))INSERT INTO T1 (column_4) VALUES ('Explicit value')INSERT INTO T1 (column_2,column_4) VALUES ('Explicit value', 'Explicit value')INSERT INTO T1 (column_2,column_3,column_4)

VALUES ('Explicit value',-44,'Explicit value')

SELECT * FROM T1

C. SELECT cümlesinde TOP anahtarı kullanılarak veri girişi yapılması

USE pubsCREATE TABLE new_authors( au_id id, au_lname varchar(40), au_fname varchar(20), phone char(12), address varchar(40), city varchar(20), state char(2), zip char(5), contract bit)INSERT INTO new_authors SELECT TOP 10 * FROM authors

4.3.2 UPDATE İfadesinin Kullanımı

Tablo içerisindeki verilerin değiştirilmesi işlemleriniyapar.

A. Basit bir UPDATE kullanımı

Aşağıdaki örnekler, bir UPDATE cümlesinden WHERE ifadesininçıkarıldığında tablodaki tüm verilerin etkileneceğini gösterirler.

Aşağıdaki örnek, Publisher tablosundaki tüm kayıtlar için cityve state alanlarının değerlerinin değişimini yapar.

UPDATE publishersSET city = 'Atlanta', state = 'GA'

Aşağıdaki örnek, Publishers tablosundaki tüm kayıtlarınpub_name alanlarına NULL değeri atar.

UPDATE publishersSET pub_name = NULL

Bir UPDATE cümlesi içerisinde hesaplamalar yaparak sonucutekrar tabloya yazabilirsiniz.

Aşağıdaki örnek, Titles tablosundaki tüm price alanlarınınikiyle çarpılarak tablodaki verilerin değişimini yapar.

UPDATE titlesSET price = price * 2

B. UPDATE ifadesinin WHERE anahtarı ile beraber kullanımı

WHERE anahtarı, tablodaki değiştirme yapılacak olan satırlarıbelirtir. Aşağıdaki örnekte WHERE ifadesi kullanılarak tablodakieyaleti ( state ) ‘CA’ ve şehri ( city ) ‘Oakland’ olan kayıtlardakistate ve city alanlarının ‘Pc’ ve ‘Bay City’ olarak değiştirilmesiyapılmaktadır.

UPDATE authors SET state = 'PC', city = 'Bay City' WHERE state = 'CA' AND city = 'Oakland'

C. UPDATE ifadesinin başka bir tablodan bilgiyle beraber kullanımı

Aşağıdaki örnek, Titles tablosundaki ytd_sales sütununu Salestablosundaki satışları yansıtacak şekilde değiştirilmesini yapar.

UPDATE titles SET ytd_sales = titles.ytd_sales + sales.qty FROM titles, sales WHERE titles.title_id = sales.title_id AND sales.ord_date = (SELECT MAX(sales.ord_date) FROM sales)

D. UPDATE ifadesinin SELECT cümlesinde TOP anahtarı ile beraber kullanımı

Aşağıdaki örnek, state sütununun Authors tablosundaki ilk 10kayıt için değiştirilmesini yapar.

UPDATE authors

SET state = 'ZZ' FROM (SELECT TOP 10 * FROM authors ORDER BY au_lname) AS t1WHERE authors.au_id = t1.au_id

4.3.3 DELETE İfadesinin Kullanımı

Tablodan kayıt silme işlemini yapar.

A. DELETE ifadesinin parametresiz kullanımı

Aşağıdaki örnek, Authors tablosundaki tüm kayıtları siler.

USE pubsDELETE authors

B. DELETE ifadesinin belirtilen kayıtlar üzerinde kullanımı

Aşağıdaki örnek, au_lname’i ‘McBadden’ olan satırlarıtablodan siler.

USE pubsDELETE FROM authorsWHERE au_lname = 'McBadden'

/* SQL-92-Standard subquery */USE pubsDELETE FROM titleauthorWHERE title_id IN (SELECT title_id FROM titles WHERE title LIKE '%computers%')

/* Transact-SQL extension */USE pubsDELETE titleauthorFROM titleauthor INNER JOIN titles ON titleauthor.title_id = titles.title_idWHERE titles.title LIKE '%computers%'

E. DELETE ifadesinin SELECT cümlesinde TOP anahtarı ile beraber kullanımı

Aşağıdaki örnek, DELETE ifadesi içerisinde SELECT cümlesi veTOP anahtarının kullanımıyla authors tablosundaki ilk 10 kayıtınsilinmesini yapar.

DELETE authors FROM (SELECT TOP 10 * FROM authors) AS t1WHERE authors.au_id = t1.au_id

5 - DETAYLI VERİ ARAMA TEKNİKLERİÖnceki bölümlerde öğrenilen sorgulamanın temel yapılarını

birleştirerek daha ileri seviyede ve detaylı sorguların nasılyapılacağını göreceğiz.

5.1 - WHERE Deyimi ve KullanımıWHERE deyiminin temel kullanım şeklini öğrendik. Şimdi ise

daha detaylı veri sorgulaması için gereken yöntemleriinceleyeceğiz. Örneğin WHERE deyiminin çeşitli operatörlerlebirlikte kullanımına ilişkin teknikler vereceğiz.

5.1.1 AND OperatörüBirden fazla kolona ait bilgileri sorgulamak için AND

operatörü kullanılır. AND operatörü, WHERE deyimi ile birliktekullanılacaktır.

Örnek 5.1: Satıcı kimlik numarası 8 olan ve fiyatı 40 liradan küçükolan ürünleri listeleyelim.Sorgu 17:SELECT SupplierID, ProductName, UnitPriceFROM ProductsWHERE SupplierID = 8 AND UnitPrice <= 40;

Daha önceki örneklerimizde satıcı kimlik numarası 8 olan satıcınınürünlerini listelemek için WHERE SupplierID = 8 kodunu, ve fiyatı40 liradan küçük olan ürünleri listelemek için ise WHERE UnitPrice<= 40 kodunu kullanmıştır.

Bu sorguda, satıcı kimlik kodu 8 olan ve fiyatı 40 liradan küçükolan ürünleri listelemek istiyorsak bu iki koşulu birleştirmemizgerekmez mi? İşte bu gibi durumlarda AND operatörü kullanılır. İkifarklı kolona ait sorguları birleştirmek için AND operatörünüWHERE deyimi ile birleştiririz.WHERE SupplierID = 8 AND UnitPrice <= 40;sorgusu ile istenilen sonuca ulaşılır.

5.1.2 OR OperatörüAND operatörünün mantıksal değili OR operatörüdür. OR

operatörü, birden fazla koşuldan en az birine uyan koşullarılistelemek için kullanılır. Kullanımı AND operatörüna oldukçabenzer.

Örnek 5.2: Satıcı kimlik kodu 8 ve 10 olan ürünleri listeleyelim.Sorgu 18:SELECT SupplierID, ProductName, UnitPriceFROM ProductsWHERE SupplierID=8 OR SupplierID=10

Bu sorguda iki satıcıya ait bilgiler listelendi. Ancak örneğimizdekurduğumuz cümlede satıcı kimlik kodu 8 ve 10 olan satıcılara aitürünleri listelemek istediğimizi belirttik. Bu cümleyi kodadökerken ise OR operatörünü kullandık, AND değil. Çünkü bizaslında satıcı kodu 8 olan veya satıcı kodu 10 olan satıcılara aitürünleri listelemek istedik. Burada dikkat edilecek konu, ORoperatörünün gerekliliğini anlamaktır.

5.1.3 Sorgularda İşlem SırasıWHERE deyimi ile AND ve OR operatörlerini birlikte

kullanabiliyoruz. WHERE deyimi ile sonsuz sayıda AND ve ORoperatörü kullanılabilir. Peki bu operatörlere birleştirilensorgular hangi sırada işleme sokulur? Bunu bir örnekleaçıklayalım.

Örnek 5.3: Satıcı kimlik numarası 8 ve 10 olan satıcılardan alınanürünler arasından fiyatı 20 lira veya fazla olan ürünlerilisteleyelim.Sorgu 19:SELECT SupplierID, ProductName, UnitPriceFROM ProductsWHERE SupplierID=8 OR SupplierID=10 AND UnitPrice >=20

Ancak bu sorgu sonucunda göreceğimiz küme, aslında doğru sonuçlarıiçermeyecektir. Bu sorguda fiyatı 20 liradan küçük olan sorgularda gelecektir. Çünkü operatörlerin bir öncelik sırası vardır. SQLde ve çoğu programlama dillerinde AND operatörü önceliğe sahiptir.Yani AND ve OR operatörünün bir arada bulunduğu durumlarda önceAND operatörünün operantları ile işlem yapılır.

Bilgi: Operant, operatörlerin önünde kullanılan değerlerdir.

Bu önceliğin getireceği yanlış sonuçları ortadan kaldırmak içinparantezleri kullanacağız.Sorgu 20:SELECT SupplierID, ProductName, UnitPriceFROM ProductsWHERE (SupplierID=8 OR SupplierID=10) AND UnitPrice >=20

Parantezlerin kullanılmasıyla önce satıcı kimlik numaralarına göresorgu yapılacak, sonra bu satıcılara ait ürünler arasından ürünfiyatı 10 liradan büyük olanlar listelenecektir.

5.2 - IN OperatörüIN operatörü ise, belirli bir aralıktaki verileri kümelek

için kullanılır. İki parantez arasında kümenin elemanları virgülile ayrılarak bildirilir.

Örnek 5.4: Satıcı kimlik kodu 8 ve 10 olan ürünleri IN operatörükullanarak listeleyelim.Sorgu 21:SELECT SupplierID, ProductName, UnitPriceFROM ProductsWHERE SupplierID IN(8, 10)ORDER BY ProductName

Sorguda da görüldüğü gibi, belirli bir kümeye ait elemanlaraulaşmak için IN operatörü kullanıldı. Bu sorgunun sonuç kümesiSorgu 18’in sonuç kümesi ile aynı olacaktır. Çünkü IN operatörügereksiz OR kullanımlarını engellemek için kullanılmıştır.

(WHERE SATICI In ("can","veli");)

OR operatörü yerine IN operatörünü kullanarak kodunuzunokunabilirliğini arttırabilirsiniz. Böylece ne yapmak istediğinizbir başkası tarafından daha kolay anlaşılacaktır.

5.3 - NOT OperatörüNOT operatörünün sadece bir işlevi vardır. Kendisinden sonra

gelen ifadeyi olumsuz yapar. NOT operatörünün kullanımında diğeroperatörlerden farklı olarak kolon isimlerinin önüne gelir.

Örnek 5.5: Satıcı kimlik kodu 8 dışındaki tüm satıcılarılisteleyelim. Sorgu 22: SELECT SupplierID, ProductNameFROM ProductsWHERE NOT SupplierID = 8;

Bu sorgunun sonuç kümesi, sorgu 12’nin sonuç kümesi ile aynıolacaktır.

Aslında NOT operatörünün hiçbir avantajı yoktur. Ancak çokkarmaşık sorgularda IN operatörüyle belirtilen kümenin dışındakikayıtlara ulaşmak amacıyla kullanılabilir.

Bilgi: NOT operatörünün bu şekilde kullanımı, MySql veri tabanı yönetim sistemitarafından desteklenmemektedir. NOT operatörü MySql’de sadece EXISTS anahtarsözcüğünün önüne gelebilir ve ona negatif anlam katar.

6 - Wildcard ile Arama – FiltrelemeWildcard, metin aramalarında oldukça kolaylık sağlayacak

ifadeler içeren karakter arama tekniğidir. Birkaç özel karakterdenoluşur.

6.1 - LIKE OperatörüBu zamana kadar yaptığımız sorgularda bilinen değerleri

aradık. Örneğin fiyatı belirli bir değere aralığında olanlar, adıbelirli olan bir ürünü aradık. Şimdi ise tam olarak bilinmeyendeğerlere nasıl ulaşacağımızı öğreneceğiz. İçinde food geçenürünlere ulaşmak istediğimizde, wildcard kullanmak durumundayız.

Bilgi: Arama kriteri (Search pattern), arama ifadeleri ve/veya wildcardkarakterleri içeren sorgu metinidir.

SQL ifadelerinde wildcard kullanabilmek için LIKE anahtarsözcüğü gereklidir. WHERE deyimlerinden kullandığımız sorgulardanfarklı olarak wildcard ifadelerine karşılık gelen değerlereulaşırken, istediğimizden daha fazla kayıt karşımıza çıkabilir.

Daha önceden operatör olarak kullanılan karakterler, wildcardifadesi olarak kullanıldığında tamamen farklı görevlerleyüklenirler.

Wildcard ifadeleri, yalnızca metin veri türü içeren alanların(yani kolonların) sorgularında kullanılabilir.

6.1.1 Yüzde (%) (percent) Wildcard KarakteriWildcard karakterleri arasında en çok kullanılanı, yüzde

karakteridir. Anlamı ise bir arama metninde herhangi birkarakterden herhangi bir sayıda bulunabileceğidir. Yani R harfiile başlayan ürünlerin listesi istendiğinde LIKE anahtar sözcüğüile % karakteri kombine edilecektir.

Örnek 6.1: R harfi ile başlayan ürünlerin listesini alalım.Sorgu 23:SELECT ProductNameFROM ProductsWHERE ProductName LIKE 'R%'

Bu sorguda yüzde ifadesinden önce belirtilen karakter veyakarakterler ile başlayan kayıtlara ulaşmak istedik. İkinci veyadiğer herhangi bir karakter hakkında bir bilgi vermedik. Sonuçkümesi hakkında tek bildiğimiz, sadece ürün adlarının ilk harfininR olacağıdır.

Önemli Not: Ms Access veri tabanı yönetim sistemi, % karakteriyerine * karakteri kullanır. Yani yukarıdaki sorgu Ms Access’deSELECT ProductNameFROM ProductsWHERE ProductName LIKE 'R*'şeklinde olacaktır.

Bazı veri tabanı yönerim sistemlerinde büyük harf – küçük harfduyarlılığı vardır. O yüzden arama kriterini belirlerken bunadikkat etmek gerekebilir.

Yüzde karakteri ile bir metinin içinde geçen bir ifadeyi dearayabiliriz.

Örnek 6.2: İçinde Chef geçen ürün isimlerinin listesini alalım.Sorgu 24:SELECT ProductNameFROM ProductsWHERE ProductName LIKE '%chef%'

Bu sorguda bulunmak istenen, içinde chef geçen ürünlerdir. Oyüzden chef sözcüğünün başına ve sonuna birer yüzde karakterikonur ve ilgili kayıtlar listelenir.Örnek 6.3: S ile başlayan ve s ile biten ürünleri listeleyelim.Sorgu 25: SELECT ProductNameFROM ProductsWHERE ProductName LIKE 'S*s'

LIKE ‘S*s’ diyerek, sonuç kümem ilk harfi S, aradaki harflerle vesayısıyla ilgili hiçbir kriter belirtilmesin, ve son harfi yine solan kayıtları içersin demek istedik.

6.1.2 Alttire (_) (underscore) Wildcard KarakteriAlttire karakterinin kullanımı da yüzde karakterine oldukça

benzemektedir. Ancak yüzde karakterinden en önemli farkı, herhangisayıda değil de, tek bir karaktere karşılık gelmesidir.

Önemli Not: Ms Access veri tabanı yönetim sisteminde _ yerine ?kullanılır.

Örnek 6.4: Ürün adı Tof ile başlayan ve 4 harften oluşan ürünlerilisteleyelim.Sorgu 26:SELECT ProductNameFROM ProductsWHERE ProductName LIKE 'Tof_'

Ürün adı Tof ile başlıyor ancak son, yani dördüncü karakteri neydiunuttum diyorsak alttire karakteri kullanmalıyız.

Eğer başında ve sonunda birer karakter olan ve arasında bir metinparçası içeren arama yapmak istiyorsak, wildcard ifademizin birbaşına bir de sonuna birer alttire kullanacağız demektir.

Örnek 6.5: 5 harfli bir ürün adı var, ilk ve son harflerinibilmiyoruz ancak içinde “kur” sözcüğü geçiyor. Bu ürünün adınedir?Sorgu 27:SELECT ProductNameFROM ProductsWHERE ProductName LIKE '_kur_'

Örnek 6.6: Bir ürün var “Cha” ile başlıyor, 5 harfli ve adınıhatırlayamadım.Sorgu 28:SELECT ProductNameFROM ProductsWHERE ProductName LIKE 'Cha__'

Bu sorguda da, her bir karakter için bir alttireyi aramakriterinin içerisine yerleştirdik.

6.1.3 Köşeli Parantez ( [ ] )(brackets) Wildcard KarakteriKöşeli parantez wildcard karakteri ile çeşitli karakterler

bir küme halinde belirtilir. Bu karakter kümesinden herhangi birieşleşebilir.

Bilgi: Köşeli parantez kullanımını her veri tabanı yönetim sistemidesteklemeyebilir. Access, SQL Server ve Sybase Adaptive Server veri tabanıyönetim sistemlerinin desteklediği bilinmektedir. Diğerleri için özellikleriniincelemenizi tavsiye ederiz.

Örnek 6.7: Müşteriler (Customers) tablosundan R veya T harfleriylebaşlayan müşteri isimlerini bulalım.Sorgu 29:SELECT ContactName, CompanyNameFROM CustomersWHERE ContactName LIKE '[RT]*'ORDER BY ContactName

Bu sorguda köşeli parantezler içerisinde belirtilen R ve Tharflerinden biriyle başlayan müşteri isimleri görüntülenmiştir.Köşeli parantez içinde listelerken, IN operatöründeki gibivirgüller ile ayırmak sözkonusu değildir. Bu küme istenildiği kadar genişletilebilir.

Bu sorgunun eşdeğeri sorgu 30’da belirtilmiştir.Sorgu 30:

SELECT ContactName, CompanyNameFROM CustomersWHERE ContactName LIKE 'R*' OR ContactName LIKE 'T*'ORDER BY ContactName

Gördüğünüz gibi OR operatörü kullanmak yerine köşeli parantezlerile sorgumuzu daha okunabilir kıldık.

Örnek 6.8: Adı R veya T ile başlamayan müşterilerimizi sorgulayalım.Sorgu 31:SELECT ContactName, CompanyNameFROM CustomersWHERE ContactName LIKE '[^RT]%'ORDER BY ContactName

^ (karat karakteri) sayesinde bir kümenin değili elde edilir. Yaniiçinde R ve T olmayan elemanların oluşturduğu küme içerisindendeğerler gelir.

Bilgi: Ms Access’de ise ^ operatörü yerine ! kullanılır. Yani sorgu 31’inAccess’de çalışabilmesi için

SELECT ContactName, CompanyNameFROM CustomersWHERE ContactName LIKE '[!RT]*'ORDER BY ContactName;

şeklinde kodlanması gerekir.

Karat karakteri (^) yerine NOT operatörünü de kullanabiliriz.

Sorgu 32:SELECT ContactName, CompanyNameFROM CustomersWHERE NOT ContactName LIKE '[RT]%'ORDER BY ContactName;

Karat karakteri kullandığımızda R ve T dışındaki elemanlarınoluşturduğu kümeyi elde ettiğimizi belirtmiştik. NOT operatörü iseaynı görevi yapar ve R ve T ile başlamayan tüm kayıtlara ulaştır.

Wildcard kullanmaya karar vermeden önce iki kere düşünün:

Aynı işlevi bir operatör ile yapabiliyorsanız, bu sorguperformansını arttıracaktır. Çünkü wildcard ile aramayapmak, en yavaş çalışan görevdir.

Wildcard karakterlerini kullanırken çok dikkatli olunuz.İstemeyerek yanlış sonuçlar elde edilebilir.

7 - TABLONUN ALANLARI İLE ÇALIŞMAKTablolarda bulunan kolonlar dışında, çeşitli hesaplamalar

yapılarak yeni sonuçlar elde edilebilir.

7.1 Tabloların Alanları ile Neden Çalışılır?Tablolar, bilgileri kolonlar halinde saklar. Ve bir veri

tabanında çoğu bilgiler, küçük parçalara ayrıştırılarak saklanır.Ve kimi zaman bu kolonlardaki bilgilerin birleşitirilmesi gerekir.Belki de bu alanlar üzerinde çeşitli hesaplamaların da yapılmasıgerekebilir.Örneğin;

Bir müşterinin adı, soyadı ve bulunduğu şehri bir aradagörüntülemek

Adresi oluşturan kolonları birleştirerek tam adresoluşturmak

Ürünleri ve isimlerini birlikte görüntülemekvs.

Görüntülemek istediğimiz veriler, istenilen formatta değilse,onları biz istediğimiz şekilde görüntüleyebiliriz.

Bilgi: Tablonun kolonlarını kastederek, alan dediğimiz durumlar da olacaktır.

7.2 Alanların BirleştirilmesiAlanlar ile yapacağımız ilk işlem, iki alanı bir kolonda

birleştirmek olacaktır.

Örnek 7.1: Tedarikçiler (Suppliers) tablosundan tedarikçi adını vebulunduğu ülkeyi bir arada bulunduracak sorguyu oluşturalım.

Sorgu 33:SELECT CompanyName + ' (' + Country + ') 'FROM Suppliers

Burada tedarikçiler tablosundan tedarikçi şirketin adı vebulunduğu ülkenin bilgisi + operatörü ile birleşitirilerek sonucavarılmıştır.Yapılan işlemleri sıralayacak olursak;

CompanyName kolonunda bulunan bilgi alınır Bir boşluk ve bir parantezden oluşan metin ifadesi

eklenir. Sonra Country kolonunda bulunan bilgi de alınıp eklenir. Ve son olarak da bir parantez ve bir boşluk karakterleri

de eklenir.

Bilgi: Ms Access, SQL Server ve Sybase veri tabanı yönetim sistemleri, metinekleme işlemleri için + operatörünü desteklerler. DB2, Oracle, PostgreSQL veSybase ise metin ekleme işlemleri için || (pipe) operatörünü destekler.

MySql ise, metin ekleme işlemleri için bu iki operatörden hiçbirinidesteklemez. Bu işlem için CONCAT() fonksiyonu tanımlanmıştır. MySql’de ||operatörü OR operatörü ile aynı anlamdadır.

SELECT CONCAT(CompanyName, ‘( ‘, Country, ‘) ’ )

Bazı veri tabanı yönetim sistemlerinde alanlar birleştirilirkenaralara istenmeyen boşluklar gelebilir. Bu durum, veri tabanısistemlerinin kolonun maksimum karakter sayısına göreyerleştirmesinden kaynaklanır. İstenmeyen boşlukları kaldırmakiçin, RTRIM(), LTRIM() ve TRIM() SQL fonksiyonları kullanılabilir.

Sorgu 34:SELECT RTRIM(CompanyName) + ' (' + RTRIM(Country) + ') 'FROM SuppliersORDER BY CompanyName

RTRIM sağdaki, LTRIM soldaki ve TRIM hem baştaki hem de sondakiboşlukları yok eder.

7.2.1 Kolon İsimlerinde Takma Ad Kullanımı (Alias)Birleştirilen alanların oluşturduğu yeni kolona ait bir kolon

ismi tanımlamak için AS anahtar sözcüğü kullanılır.

Örnek 7.2: Tedarikçiler (Suppliers) tablosundan tedarikçi adını vebulunduğu ülkeyi bir arada bulunduracak sorguyu oluşturalım. Veyeni oluşan kolona “Supplier_Name” adı verelim.Sorgu 35:SELECT RTRIM(CompanyName)+' ('+RTRIM(Country)+') ' AS Supplier_NameFROM SuppliersORDER BY CompanyName

Sorguda da görüldüğü gibi, oluşturulan bu yeni kolonaSupplier_Name adı verilmiştir. Dikkat ettiyseniz bir metinifadesini ayırmak için kullanılan tek tırnakları buradakullanmadık.

7.2.2 Matematiksel İfadelerin HesaplanmasıAslında alanlar üzerinde en çok yapılan işlemler matematiksel

işlemlerdir. Sipariş detaylarına ilişkin verilerin tutulduğu“Order Details” tablosu üzerinde çeşitli işlemler yapılabilir.

Örnek 7.3: 10840 numaralı ürüne ait siparişlerin detaylarınıgörüntüleyelim.Sorgu 36:SELECT ProductID, Quantity, UnitPriceFROM [Order Details]WHERE OrderID = 10840

Bu sorgu sonucunda UnitPrice, her bir ürün için geçerli olanfiyatları gösterir. Peki ya bu siparişin toplam tutarınıgörüntülemek için ne yapılmalı?

Sorgu 37:SELECT ProductID, Quantity,

UnitPrice, Quantity * UnitPrice AS Total_PriceFROM [Order Details]WHERE OrderID = 10840

Sorgu sonucunda da görüldüğü gibi, mevcut kolonlardaki bilgilerkullanılarak yeni veriler elde edilmek isteniyorsa, SELECTdeyiminin içerisinde bu işlemler tanımlanabilir. Bu alanlardaistenilen tüm matematiksel hesaplamalar yapılabilir.

8 - Veriler Üzerinde Değişiklik Yapan Fonksiyonlar

Veri tabanı yönetim sistemleri tarafından desteklenen SQLfonksiyonlarını öğreneceğiz.

8.1 - Fonksiyonlar Üzerine SQL içerisinde dei programlama dillerinde olduğu gibi veriler

üzerinde işlem yapmaya yarayan standart fonksiyonlar vardır.

Bir önceki konuda TRIM, LTRIM ve RTRIM fonksiyonlarındanbahsetmiştik. Aslında fonksiyon kullanmak kimi zaman da işlerioldukça ağırlaştırmaktadır. Örneğin SELECT deyimi standart birdeyimken, fonksiyonlar standart değildir. Tablo 8.1’de veri tabanıyönetim sistemlerinin fonksiyonları arasındaki farklılıklarbelirtilmiştir.

Fonksiyon Söz dizimiBir metnin birkısmından yenibir metinoluşturmak

Ms Access MID(), DB2, Oracle vePostgreSQL SUBSTR(), Ms SQL Server,MySQL ve Sybase ise SUBSTRING()fonksiyolarını kullanır.

Tür Dönüştürme DB2 ve PostgreSQL CAST(), MySQL, SqlServer ve Sybase CONVERT()fonksiyonlarını kullanır. Access veOracle her dönüşüm türüne göre birfonksiyon kullanır.

Tarih Alma Access NOW(), DB2 ve PostgreSQLCURRENT_DATE, MySQL CURDATE(), OracleSYSDATE, Sql Server ve Sybase GETDATE()fonksiyonlarını kullanır.

Tablo 8.1: Veri Tabanı Yönetim Sistemlerinde Bazı Fonksiyonlar veFarklılıkları

Tablo 8.1’den de görüldüğü gibi, SQL fonksiyonları kullanmak okadar da avantajlı değildir. Çünkü bir sistemde yazılmış kod,diğer bir sistemde çalışamayabilir. Yani taşınabilir değildir.

8.2 – Fonksiyon KullanımıFonksiyonlar, yaptığı işlevlere göre gruplandırılabilir.

Örneğin metin üzerinde işlemler yapan fonksiyonlar, nümerik işlem

yapan fonksiyonlar, zaman ve tarih fonksiyonları ve sistemfonksiyonları olarak gruplandırılabilir.

8.2.1 Metinler Üzerinde İşlem Yapan FonksiyonlarÖnceki bölümde gördüğümüz TRIM() fonksiyonları, bu gruba

dahildir. Örneğin ele alınan metini tamamen küçük harfe dönüştürenLOWER() ve büyük harfe dönüştüren UPPER() fonksiyonları da bugruptadır.

Örnek 8.1: Sorgu 33’deki sorgumuzun sonuçlarını tamamen büyükharflerle görüntüleyelim.Sorgu 38:SELECT UPPER(CompanyName) + ' (' + UPPER(Country) + ') 'FROM SuppliersORDER BY CompanyName

UPPER() fonksiyonu ile tüm karakterler büyük harfe dönüştürüldü.Tamamen küçük harfe dönüştürmek isteseydik LOWER() fonksiyonunukullanacaktır. Sıklıkla kullanılan metinsel veriler üzerindedeğişiklik yapan fonksiyonlar tablo 8.2’de gösterilmiştir.

Fonksiyon AçıklamaLEFT() Metinin sol

tarafından karakteralır

RIGHT() Metinin sağtarafından karakteradır

LENGHT(), Access’deLEN()

Metinin uzunluğunuverir

LOWER(), Access’deLCASE()

Metini tamamen küçükharflere dönüştürür

UPPER(), Access’deUCASE()

Metini tamamen büyükharflere dönüştürür

LTRIM() Metinin solundakiboşlukları kaldırır

RTRIM() Metinin sağındakiboşlukları kaldırır

TRIM() Metinin başındaki vesonundaki boşluklarıkaldırır

SOUNDEX() Bir metinin SOUNDEX

değerini geridöndürür

Tablo 8.2: Metin üzerinde değişiklik yapan Fonksiyonlar

CHARINDEX

Bir karakter dize içinde belirtilen bir ifadenin (karakterin) başlangıç konumunu döndürür.

Kullanımı: CHARINDEX ( ifade1, ifade2[ , başlangıç konumu] ) İfade1: aranacak karakterleri belirtir. İfade2: İfade1'deki karakterlerin aranacağı karakterleri belirtir.Başlangıç konumu ise aramanın başlanacağı konumu belirtir. Döndürdüğü tür: Intİfadelerden birisi NULL ise CHARINDEX fonksiyonu NULL değerini döndürür. İfade1, İfade2 içinde bulunamazda 0 değeri döner.

Örnek: ADI alanında BOYASI sözcüğünün başladığı konumu döndürür.

SELECT CHARINDEX('BOYASI', adi)FROM urun

-- arama için başlangıç konumu belirtmek istersekSELECT CHARINDEX('BOYASI', adi, 5) FROM urun

Yalnızca adlar listesi:

select left (adi,charindex(' ', adi)) from cariana

LEFT

Bir karakter dizesinin sol taraftan belirtilen sayı kadar keser.

Kullanımı: LEFT ( karakter dize, tarmsayı)

Örnek: Adların soldan beş karakteri:

USE ornekGOSELECT LEFT(adi, 5)

FROM carianaORDER BY koduGO

LEN

Dize verinin uzunluğunu döndürür. Kullanımı: LEN ( karakter dize)

Örnek: Adı alanının uzunluğu:

SELECT LEN(adi) AS 'Uzunluk'FROM cariana

use ornekselect substring (adi,charindex(' ',adi)+1,(len(adi)-charindex(' ',adi))) from cariana-- soyadını ayırmak

LTRIM

Önündeki boşlukları siler. Kullanımı: LTRIM ( karakter dize)

RIGHT

Belirtilen dizenin sağ tarafından keser.

Kullanımı: RIGHT ( karakter dizesi, tamsayı) Arguments

Örnek:

Adı alanını sağlan 10 karakteri: SELECT RIGHT(adi, 10) FROM cariana

RTRIM

Karakter dizesinin arkasındaki boşlukları kaldırır. Kullanımı:RTRIM ( karakter dize)

Örnek: Bir alan güncelleme:

update denemeset alan1 = rtrim(alan1) + rtrim('a')

STUFF

Belirtilen uzunluktaki karakterleri siler ve yerine belirtilen diğer karakterleri ekler. SyntaxSTUFF ( karaker dize, başlangıç, uzunluk, karakter dize)

Örnek:

use ornekSELECT STUFF(tel, 7, 1, '8') from cariana-- telefon numarasında 7 karakteri 9 ile değiştirmek

SUBSTRING

Bir karakter dizesinin içinden belli karakterleri seçer. Kullanımı:SUBSTRING ( karakter dize, başlangıç, uzunluk)

Örnek:

Adı alanının içinde üçüncü karakter başlayım 4 tane karakteri döndürmek:

SELECT SUBSTRING(adi, 3, 4)FROM cariana

Adı soyadı alanından soyadını çekmek:

select substring (adi,charindex(' ',adi)+1,(len(adi)-charindex(' ',adi))) from cariana

8.2.2 Tarih ve Zaman Üzerinde İşlem Yapan FonksiyonlarHer bir veri tabanı yönetim sisteminin kendine has tarih ve

zaman bilgilerini saklama yöntemi vardır. Tabiki bizi ilgilendirenbu verilerin nasıl tutulacağı ve nasıl ulaşılacağıdır.

Tarih ve zaman bilgisini ayrıştıran çeşitli fonksiyonlarvardır.

TARİH VE ZAMAN FONKSİYONLARI (T-SQL)

Bu fonksiyonlar tarih (date) ve zaman (time) üzerinde işlemler yapmayı sağlar. Tarih ve zaman fonksiyonları şunlardır:

        DATEADD        DATEDIFF        DATENAME        DATEPART        DAY        GETDATE        MONTH        YEAR        CONVERT

DATEADD

Belli bir tarihin üzerine değer eklenerek yeni bir tarih değeri üretir. Kullanım biçimi:

DATEADD ( tarihkısmı, sayı, tarih) Argümanları:

Tarih kısmıTarih Parçası Kısaltması

Year yy, yyyyQuarter qq, qMonth mm, mDayofyear dy, yDay dd, dWeek wk, wwHour hhMinute mi, nSecond ss, sMillisecond ms

sayıTarih kısmını artırmak için kullanılan değer. tarihTarih değerini döndüren tarih bilgidi.

Örnek: Yayın tarihinin 30 gün sonrası: USE pubsGOSELECT DATEADD(day, 30, pubdate) FROM titlesGO

Örnek: Son on gün içinde yapılan siparişler:

SELECT ord_num, ord_dateFROM salesWHERE(ord_date >=   DATEADD(day, -10, GETDATE()))

DATEDIFF

İki tarih arasındaki gün sayısını verir. Kullanımı:

DATEDIFF ( Tarih parçası, başlangıç tarihi, bitiş tarihi) Argümanları:

Tarih parçasıTarih Parçası KısaltmasıYear yy, yyyyQuarter qq, qMonth mm, mDayofyear dy, yDay dd, dWeek wk, wwHour hhMinute mi, nSecond ss, smillisecond Ms

Örnek: Şu anki tarih ile yayın tarihi arasındaki fark:

USE pubsGOSELECT DATEDIFF(day, pubdate, getdate()) FROM titlesGO

DATEPART (T-SQL)Belirtilen tarihin istenen parçasına karşılık olarak bir tamsayı döndürür.

Kullanım Biçimi:

DATEPART(tarihparçası, tarih)

Argümanları: Tarih parçası

Tarih bilgisinin bir kısmını ifade eden bilgi.

Tarih bölümü Kısaltma

year yy, yyyyquarter qq, qmonth mm, mdayofyear dy, yday dd, dweek wk, wwweekday Dwhour Hhminute mi, nsecond ss, smillisecond Ms

Örnek:

Aşağıdaki örnekte şu anki tarihin karşılık geldiği ay adı ve ay numarası bulunmaktadır:

SELECT GETDATE()

Tarihi verir:

SELECT DATEPART(month, GETDATE())

Ayı verir:

DAY (T-SQL)Bir tarih bilgisinin gün kısmını verir.

Kullanım Biçimi:

DAY(tarih)

Argümanları:

tarih

datetime ya da smalldatetime tarih bilgisi.

Aşağıdaki örnekte verilen tarihin gün kısmı verilmektedir:

SELECT DAY('26/03/1999') AS 'Gün'

GO

Sonuç:

Gün------------ 26

MONTH (T-SQL)Bir tarih bilgisinin ay kısmını verir.

Kullanım Biçimi:

MONTH(tarih)

Argümanları:

tarih

datetime ya da smalldatetime tarih bilgisi.

Aşağıdaki örnekte verilen tarihin ay kısmı verilmektedir:

SELECT MONTH('26/03/1999') AS 'Ay'GOSonuç:

Ay------------ 03

YEAR (T-SQL)

Bir tarih bilgisinin yıl kısmını verir.

Kullanım Biçimi:

YEAR(tarih)Argümanları: tarih

Örnek 8.3: 1996 yılına ait tüm siparişleri listeleyelim.Sorgu 41:SELECT OrderID FROM Orders WHERE DATEPART(yy, OrderDate) = 1996

Bilgi: Ms Access’de DATEPART fonksiyonunun kullanımında bir farklılık vardır.

SELECT OrderIDFROM OrdersWHERE DATEPART('yyyy',OrderDate)=1996;şeklinde belirtmek gerekir. Bu formu SQL Server ve Sybase de destekler. MySqlise

SELECT OrderIDFROM OrdersWHERE YEAR(OrderDate)=1996;

şeklide destekler. Oracle ise

SELECT OrderIDFROM OrdersWHERE to_number(to_char(OrderDate, ‘YY’))=1996;

şeklinde destekler.

Örnek 8.4: 1 Ocak 1996 ile 1 Ocak 1998 tarihleri arasındakisiparişleri listelemek isteyelim.Sorgu 42:SELECT OrderID, OrderDateFROM OrdersWHERE OrderDate Between ‘1/1/1996’ And ‘1/1/1998’

Bilgi: Ms Access’de tarih belirtirken # işareti kullanılır.

WHERE OrderDate Between #1/1/1996# And #1/1/1998#

Örnek: Şu anki tarih ile yayın tarihi arasındaki fark:

USE pubsGOSELECT DATEDIFF(day, pubdate, getdate()) FROM titles

GO

8.2.3 Nümerik İşlem Yapan FonksiyonlarNümerik veriler üzerinde çeşitli cebirsel işlem yapan

fonksiyonlardır. Metin ve tarih fonksiyonları kadar çokkullanılmazlar.Tablo 8.3’de nümerik fonksiyonlar listelenmiştir.

Fonksiyon AçıklamaABS() Sayının mutlak değerini

verirCOS() Belirtilen açının

trigonometrik kosinüsdeğerini verir

SIN() Belirtilen açınıntrigonometrik sinüsdeğerini verir

TAN() Belirtilen açınıntrigonometrik tanjantdeğerini verir

EXP() Belirtilen sayının expüstel değerini verir

SQRT() Belirtilen sayının karekökdeğerini verir

PI() Pi sayısını verirTablo 8.3: Nümerik Fonksiyonlar

9 - Veriler Üzerinden Özet Bilgi AlınmasıTabloların kolonlarında saklanan verilere ilişkin özet bilgi

elde edebilemek için SQL’in çeşitli toplam fonksiyonlarından(aggregate functions) yararlanacağız.

Bilgi: Aggregate Functions (toplam fonksiyonları), kolonlar üzerinde toplam değer,ortalama değer gibi bilgileri geri döndüren işlemleri yapan fonksiyonlardır.

9.1 Toplam Fonksiyonlarının KullanımıTablolarda saklanan veriler üzerinde sıklıkla gerçekleşen

işlemler için tasarlanmış fonksiyonların nasıl kullanıldığınıinceleyelim.

Bir veri tabanından istenen bilgilerin başında; Bir tablodaki kayıt sayısını elde etmek

Belirli bir koşulu sağlayan kayıtların sayısını elde etmek

Tablonun kolonlarındaki verilerin toplamını elde etmek

Kolonlara ait en yüksek, en düşük ve ortalama değerleri

elde etmek

gelir. Bu gibi işlemler gerçekleştirmek için beş adet toplamfonksiyonu tasarlanmıştır. Tablo 9.1’de toplam fonksiyonlarılistelenmiştir.

Fonksiyon AçıklamaAVG() Kolona ait ortalama

değerCOUNT() Kolondaki satır

sayısıMAX() Kolondaki en yüksek

değerMIN() Kolondaki en düşük

değerSUM() Kolondaki değerlerin

toplamıTablo 9.1: Toplam Fonksiyonları (Aggregate Functions)

9.1.1 AVG() FonksiyonuTablonun belirli bir kolonuna ait veriler üzerinde, o

kolondaki tüm değerlerin toplanıp değer girilen satırlarınsayısına bölümünden elde edilen ortalama değeri geri döndürür.Yani değer girilmemiş satırlar işleme sokulmaz.

Örnek 9.1: Ortalama ürün fiyat bilgisini almak isteyelim.Sorgu 43:SELECT AVG(UnitPrice) AS Ortalama_Fiyat FROM Products

Sorgudan da görüldüğü gibi, hesaplama yapılacak kolon ismi AVG()fonksiyonunun parantezleri içerisinde bildirildi. Ve hesaplanan budeğere Ortalama_Fiyat adında yeni bir kolon ismi verildi.

Örnek 9.2: Tedarikçi kayıt numarası 3 olan ürünlerin ortalama fiyatbilgisine ulaşmak isteyelim.Sorgu 44:SELECT AVG(UnitPrice) AS Ortalama_Fiyat FROM ProductsWHERE SupplierID = 3

Bu sorguda ise belirli bir kritere göre gelen sonuç kümesiüzerinde ortalama işlemi yapılmıştır.

AVG() fonksiyonu sadece nümerik değerler içeren kolon üzerindeişlem yapar ve bu kolon adı fonksiyon parametresindebelirtilmelidir. Ayrıca birden fazla kolona ait ortalama değerielde etmek için elbette birden fazla AVG() fonksiyonukullanılmalıdır.

Bilgi: NULL değer içeren satırlar, AVG() fonksiyonu tarafından işleme sokulmaz.

9.1.2 COUNT() FonksiyonuAdından da anlaşılacağı gibi COUNT() fonksiyonu, belirli bir

kolondaki kayıtları sayar. Bu fonksiyonun iki farklı kullanımşekli vardır.

COUNT(*) ile, tablodaki kayıt sayısı elde edilir. NULL

değerler de sayılır.

COUNT (kolon_adı) ile, NULL değer içeren satırlar işlem

dışı tutularak belirli bir kolondaki kayıt sayısı elde

edilir.

Örnek 9.3: Kaç tane müşterimiz var acaba?Sorgu 45:SELECT COUNT(*) AS Müşteri_SayısıFROM Customers

COUNT(*) kullanılan sorgularda satır içerisinde veri girilipgirilmediğine bakılmadan toplam satır sayısı geri döndürülür.

Örnek 9.4: Fax numarası girilmiş kaç tane müşterimiz var acaba?Sorgu 46:SELECT COUNT(Fax) AS Faxlı_Müşteri_SayısıFROM Customers

COUNT(kolon_adı) kullanılan sorgularda kolona ait verilergirilmişse sayım yapılır. Yani NULL değer içeren kayıtlarsayılmaz.

9.1.3 MAX() FonksiyonuMAX() fonksiyonu, belirtilen kolondaki en büyük değere ait

veriyi geri döndürür.

Örnek 9.5: En yüksek fiyatlı ürünü öğrenmek isteyelim.Sorgu 47:SELECT MAX(UnitPrice) AS Maksimum_FiyatFROM Products

Bu örnekte en pahalı ürün görüntülenmiştir.

MAX() fonksiyonu nümerik değerlerin yanı sıra, zaman, tarihve metinsel ifadelerde de kullanılır. Çoğu veri tabanı yönetimsistemi bunu destekler. Örneğin metinsel ifadeler içeren birkolona MAX() fonksiyonu uygulanırsa alfabedeki sıralamaya göre enson sıraya düşen kayıt görüntülenir.

Örnek 9.6: Alfabetik listeye göre en sonda yer alan müşteriyigörüntüleyelim.Sorgu 48:SELECT MAX(CompanyName) AS En_Sondaki_MüşteriFROM Customers

MAX() fonksiyonu NULL değer içeren kayıtlar ile işlem yapmaz.

9.1.4 MIN() FonksiyonuMIN() fonksiyonu, belirtilen kolondaki en küçük değere ait

veriyi geri döndürür.

Örnek 9.7: En düşük fiyatlı ürünü öğrenmek isteyelim.Sorgu 49:SELECT MIN(UnitPrice) AS Minimum_FiyatFROM Products

Bu örnekte en ucuz ürün görüntülenmiştir.

MIN() fonksiyonu nümerik değerlerin yanı sıra, zaman, tarihve metinsel ifadelerde de kullanılır. Çoğu veri tabanı yönetim

sistemi bunu destekler. Örneğin metinsel ifadeler içeren birkolona MIN() fonksiyonu uygulanırsa alfabedeki sıralamaya göre enöndeki kayıt görüntülenir.

9.1.5 SUM() FonksiyonuSUM() fonksiyonu, belirtilen kolondaki değerlerin toplamını

geri döndürür.

Örnek 9.10: Toplam kaç adet malın sipariş verildiğini bulalım.Sorgu 50:SELECT SUM(Quantity) AS Toplam_ÜrünFROM [Order Details]

Bu örnekte Order Details tablosu baştan sona dolaşılmış veQuantity kolondaki tüm değerler toplanmıştır.

Örnek 9.11: 10255 numaralı siparişte toplam kaç adet malın siparişverildiğini bulalım.Sorgu 51:SELECT SUM(Quantity) AS Toplam_ÜrünFROM [Order Details]WHERE OrderID = 10255

Bu örnekte ise 10255 numaralı siparişe ait kayıtlardaki Quantitykolonuna ait değerler toplanmıştır.

Örnek 9.12: 10255 numaralı siparişten elde edilecek tutarı bulalım.Sorgu 52:SELECT SUM(Quantity * UnitPrice) AS TutarFROM [Order Details]WHERE OrderID = 10255

Sorgudan da görüldüğü gibi, önce Quantity ile UnitPrice verileriçarpılarak her bir siparişin tutarı hesaplandı. Ve bu alan SUM()fonksiyonu ile toplam tutar elde edildi.

Toplam fonksiyonları sayesinde farklı kolonlara aitmatematiksel işlemler gerçekleştirilebilir.

NULL değer içeren kayıtlar da SUM() fonksiyonu tarafındanişleme sokulmazlar.

9.2 - Farklı Değerler Üzerinde Toplam İşlemleriToplam fonksiyonları ile yaptığımız işlemler tüm kayıtlar

üzerinde gerçekleştirildi. ALL anahtar sözcüğü kullanılmasa da,aslında toplam fonksiyonlar içerisinde varsayılan değer olarak ALLanahtar sözcüğünün kullanılmıştır. DISTINCT anahtar sözcüğü ise,aynı değere ait kayıtlardan sadece birer tanesinin işlemekoyulacağını belirtir.Bilgi: ALL değeri, varsayılan değerdir. Yani toplamfonksiyonlarında hiçbir değer belirtilmezse, ALL değerikullanılmış kabul edilir.

Ancak, MS Access veri tabanı yönetim sistemi, toplamfonksiyonlarında DISTINCT anahtar sözcüğünü desteklemez.

Örnek 9.13: 15 kayıt numaralı tedarikçiye ait ürünlerin tekildeğerilerinin ortalama fiyatını almak isteyelim. Sorgu 53:SELECT AVG(DISTINCT UnitPrice) AS tekil_ortalama_deger FROM Products WHERE SupplierID = 15

Burada her bir fiyat değeri sadece bir kere işleme sokulmuştur.Yani aynı fiyattaki ürünler sadece bir kez toplanır. Ve tabikiortalama değer bu şekilde hesaplanır.kaç farklı ülke ile çalışıldı ekle

DISTINCT anahtar sözcüğü COUNT(*) fonksiyonu ilekullanılamaz. Ancak kolon adı belirtilerek COUNT(kolon_adı)şeklinde kullanılabilir.

9.3 - Toplam Fonksiyonlarının Beraber KullanımıToplam fonksiyonları ile yaptığımız örnekler bunların birer

birer kullanılmasıyla ilgiliydi. Şimdi ise aynı ifadede birdenfazla toplam fonksiyonunun nasıl kullanıldığına bakacağız.

Örnek 9.14: Ürünler tablosunda, ürün sayısını, en düşük, en yüksekfiyatı ve ortalama değeri gösterelim.Sorgu 54:SELECT

COUNT(*) AS Ürün_Sayısı,MIN(UnitPrice) AS En_Düşük,MAX(UnitPrice) AS En_Yüksek,AVG(UnitPrice) AS Ortalama_Deger

FROM Products

Sorgudan da görüldüğü gibi ürün fiyatlarına ilişkin kolona dörtadet toplam fonksiyonu uygulanmıştır.

10 - Verilerin GruplandırılmasıTablolara ait içerikler üzerinde verileri nasıl

gruplandırılacağını göreceğiz. Bu durumda SELECT deyimininyanında, GROUP BY ve HAVING deyimlerini kullanacağız.

10.1 - Veri Gruplama Nedir?SQL toplam fonksiyonları sayesinde verilere ait çeşitli özet

bilgileri elde etmeyi öğrendik. Bu sorgular belirli bir değereilişkin verileri içermişti. Şimdi ise verileri belirli bir kriteregöre gruplayarak toplam fonksiyonlarını nasıl kullanacağımızıöğreneceğiz.

Örnek 10.1: 4 kayıt numaralı tedarikçiye ait ürünlerin sayısınıöğrenelim.Sorgu 55:SELECT COUNT(*) AS Ürün_SayısıFROM ProductsWHERE SupplierID = 4

Bu örnekte 4 numaralı tedakçiden gelen ürünlerin sayısını aldık.Peki her bir tedarikçiden gelen ürünlerin sayısını ayrı ayrıolarak öğrenmek istesek ne yapacağız?

10.2 - Grup OluşturmakGruplar, SELECT ifadesi ile GROUP BY deyiminin birleşmesiyle

oluşur.

Örnek 10.2: Her bir tedarikçiden gelen ürünlerin sayısını ayrı ayrıgörüntülemek isteyelim.Sorgu 56:SELECT SupplierID, COUNT(*) AS Ürün_Sayısı FROM ProductsGROUP BY SupplierID

Bu sorgunun sonucunda, her bir tedarikçi ve bu tedarikçilere aitürün sayısı bilgisi listelenmiştir. GROUP BY deyimi ile belirtilenkolon adına göre kayıtlar ayrıştırılır, sonra SELECT ifadesindebelirtilen COUNT(*) fonksiyonu, sayımı yapar ve görüntüler.

Yani kayıtlar, GROUP BY ile belirtilen kolon sayısındaki farklıveriler kadar sayıda satır oluşacak ve her bir kayıtta kaç adetürün bulunduğu da hemen yanındaki kolonda görüntülenecektir.

GROUP BY deyimini kullanmadan önce, şu bilgileri göz önündebulundurmalıyız:

İstenildiği kadar sayıda GROUP BY deyimi iç içekullanılabilir.

GROUP BY deyimi kullanıldığında, toplam fonksiyonu SELECTifadesinin en son alanında bildirilmelidir.

GROUP BY deyiminde belirtilen ifade, ya geçerli bir kolonadı olmalıdır, ya da toplam fonksiyonları dışında geçerlibir ifade olması gerekir.

GROUP BY deyiminin nümerik değer içeren kolonlarauygulanması gereklidir.

Gruplandırılacak kolonda NULL değer varsa, NULL değeri debir grup değeri olarak ayrılır. Birden fazla NULL değeriiçeren kayıt varsa, hepsi bir grupta toparlanır.

GROUP BY deyimi WHERE anahtar sözcüğünden sonra ve ORDERBY deyiminden önce gelmelidir.

10.3 - Grup Üzerinde Filtreleme YapmakGROUP BY ile veri gruplarken hangi verilerin gruba katılacağı

veya ayrı tutulacağı da belirtilebilir. Örneğin, toplam siparişmiktarı 1200 adetten fazla olan ürün kodlarının görüntülenmesiniisteyelim. O zaman her bir kayıtlar üzerinde tek tek değil,gruplar üzerinde filtreleme yapılacaktır.

WHERE deyimini biliyoruz. Ancak bu durumda WHERE deyimi işeyaramayacaktır. Çünkü WHERE deyimi kayıtlat üzerinde filtrelemeyapabilirken, gruplar üzerinde filtreleme yapamayacaktır. PekiWHERE deyiminin yerini tutacak olan şey nedir? HAVING yancümlesidir. WHERE deyimi ile kullandığımız tüm işlemleri HAVINGyan cümlesi ile de kullanabileceğiz.

Örnek 10.3: Toplam sipariş miktarı 1200 adetten fazla olan ürünkodları listelenmiştir.Sorgu 57:SELECT ProductID, SUM(Quantity) AS total_quantity FROM [Order Details] GROUP BY ProductID HAVING SUM(Quantity) > 1200

Sorguda da görüldüğü gibi, SELECT ifadesinde kullanılan ProductIDve Quantity alanları, GROUP BY ve HAVING deyimleri ile debirleştirilmiştir. Sorguyu sondan başa doğru okursak, siparişmiktarı 1200’den fazla olan ürünleri al, ProductID değerine göregrupla gibi bir cümle çıkar.

Örnek 10.4: 100’den fazla müşteriden sipariş alan çalışanları,müşteri sayısına göre gruplayarak listeleyelim.Sorgu 58:SELECT EmployeeID, COUNT(CustomerID) AS Müşteri_SayısıFROM Orders GROUP BY EmployeeID HAVING COUNT(CustomerID)>100 ORDER BY EmployeeID

Sorguda da görüldüğü gibi, SELECT ifadesinde kullanılan EmployeeIDve CustomerID alanları, GROUP BY ve HAVING deyimleri ile debirleştirilmiştir.

Örnek 10.5: Onaltı veya daha fazla sipariş veren müşterilerilisteleyelim.Sorgu 59:SELECT CustomerID, COUNT(*) AS SiparişlerFROM OrdersGROUP BY CustomerIDHAVING COUNT(*) >= 16

Örneklerden de görüldüğü gibi, WHERE ve HAVING anahtar sözcükleriarasındaki en büyük fark; WHERE deyimi veri gruplandırılmadan öncefiltreleme yapar, HAVING ise veriyi gruplandırdıktan sonrafiltreleme yapar.

WHERE ve HAVING deyimlerinin birlikte kullanıldığı durumlar daolacaktır.

Örnek 10.6: 15 lira ve daha yukarı fiyata sahip ürünleritedarikçilerine göre gruplandırarak listeleyelim.Sorgu 60:SELECT SupplierID, COUNT(*) AS Ürün_SayısıFROM ProductsWHERE UnitPrice >= 15GROUP BY SupplierID

HAVING COUNT(*) >=1

10.4 SELECT İfadesinin İşlem SırasıÖğrendiğimiz deyimlerin bir arada kullanılmasına ilişkin bir

tablo tanımlayalım.

Deyim Açıklama GereklilikSELECT Geri döndürelecek

kolon veyaifadeler

Evet

FROM Veri alınacaktablo

Sadece tablodan veriseçimi yapılacağıdurumlarda gerekli

WHERE Filtreleme HayırGROUP BY Grup tanımalam Gruplar ile toplam

fonksiyonlarınınkullanıldığı durumda

HAVING Grupfiltrelemesinde

Hayır

ORDER BY Sıralanarakgörüntüleme

Hayır

Tablo 10.1: Deyimlerin Kullanım Sırası

11 - Alt SorgularBu bölümde alt sorgular ile çalışacağız.

11.1 Alt Sorgu Nedir?Bu zamana kadar çalıştığımız örnekler sadece bir sorgu

üzerinde gelen verileri içeriyordu.

Bilgi: Sorgu, herhangi bir SQL ifadesine denir.

Alt sorgu ise, bir sorgu içinda başka bir sorgunun yer almasıdurumudur. Alt sorgulara neden ihtiyaç duyulduğu ilerikiörneklerde göreceğiz.

Bilgi: MySQL kullanıcıları, 4.1’den önceki versiyonlar alt sorgularıdesteklemez.

11.2 Alt Sorgular ile FiltrelemeKullandığımız Northwind veritabanı, tabloları arasında

ilişkiler kurulmuş bir veri tabanıdır. Siparişlere ait bilgileriki tabloda saklanmıştır. Orders, siparişi veren müşteriye vezamana ait bilgileri tutar. Order Details tablosu ise bu siparişiçindeki ürünleri, adedini, fiyat ve indirim bilgilerini tutar.Müşterilere ilişkin veriler ise Customers tablosunda tutuldu,Order ve Order Details tablolarında müşteriye ait kimliknumarasına referans verildi.

Örneğin 37 numaralı ürünü sipariş veren tüm müşterilerilistelemek için neler yapılmalıdır?

1 – 37 numaralı ürünü içeren tüm siparişleri getir.2 – Bir önceki adım sonucu gelen kümenin içerisinden müşteri

kimlik numaraları alınır.3 – Her bir müşterinin bilgisini bu şekilde al.

Bu olayları gerçekleştirmek için 2 ayrı sorgu tasarlayabiliriz.

Örnek 11.1: 37 numaralı ürüne ait siparişlerin sipariş numaralarınıgetirelim.Sorgu 61:SELECT OrderID FROM [Order Details]WHERE ProductID = 37

Şimdi ise 61 numaralı sorgunun sonuç kümesindeki her bir elemaniçin müşteri kimlik numaralarını almamız gerekir. Bu sorgununsonuç kümesi, 10259, 10337, 10408, 10523, 10847, 10966 den oluşur.

Örnek 11.2: 61 numaralı sorgunun sonuç kümesindeki müşterilerinkimlik numaralarını alalım.Sorgu 62:SELECT CustomerID FROM Orders WHERE OrderID IN(10259, 10337, 10408, 10523, 10847, 10966)

Peki bu iki ayrı sorguyu birlikte kullanarak daha verimli birsorgu oluşturmak için ne yapmalıyız?

Örnek 11.3: 37 numaralı ürünü sipariş veren tüm müşterilerilistelemek isteyelim.Sorgu 63:SELECT CustomerID

FROM OrdersWHERE OrderID IN ( SELECT OrderID FROM [Order Details] WHERE ProductID = 37)

Bu sorguda ilk önce içeride bildirdiğimiz sorgu çalıştırılacak, busorgudan oluşan sonuç kümesi içerisindeki bilgiler ise diğersorguya veri olarak aktarılır. Yani önce “SELECT OrderID FROM [Order Details] WHERE ProductID = 37” sorgusu çalıştırılır. Bu sorgu sonucunda (10259, 10337, 10408,10523, 10847, 10966) verileri gelir. Daha sonra ise bu siparişleriveren müşteri numaralarına erişmek için “SELECT CustomerID FROM Orders WHERE OrderID IN ( içteki sorgu sonucu)” sorgusu çalıştırılır.

İşleme her zaman en içteki sorgudan başlanır.

Bu sorgular sonucunda müşteri numaralarını elde ettik. Müşterinumarasına göre ayrıntılı bilgi almak için ise Örnek 11.4’ebakalım.

Örnek 11.4: 37 numaralı ürünü sipariş veren her bir müşterinin adınıve kontak ismini alalım.Sorgu 64:SELECT CompanyName, ContactName FROM CustomersWHERE CustomerID IN

(SELECT CustomerID FROM Orders WHERE OrderID IN (SELECT OrderID FROM [Order Details]

WHERE productID = 37))

Bu sorguda iç içe iki sorgu ile sonuca ulaşılmıştır. Gördüğünüzgibi önce 37 numaralı ürüne ait sipariş numaraları, sonra bunumaralı siparişleri veren müşterilerin kayıt numaraları, ve ensonunda ise bu numaralara sahip müşterilerin iletişim bilgilerialınır.

Açıklama : Bir işyerinde çalışmakta olan personelin personelkod,ad, bölümkodu, bölümadı,işe başlama tarihleri ve ücretkayıtlarının tutulduğu bir Personel tablosu üzerinde aşağıdakisorgular yapılmaktadır.

Örnek : Yukarıda oluşturulmuş olan personel tablosuna göre, işyeriortalama ücretinden yukarıda ücret almakta olan personelinad’larını listeleyen SQL sorgusunu yazınız.

SELECT ad, ucret FROM Personel WHERE ucret> (SELECT avg(ucret) FROM Personel)

Örnek : Personel tablosundaki kayıtlara göre en az ücret alanpersonelin ad ve ücret bilgisini listeleyen SQL sorgusunu yazınız.

SELECT ad, ucret FROM Personel WHERE ucret= (SELECT min(ucret) FROM Personel)

Örnek : Personel tablosundaki kayıtlara göre personelkodu 100 olankişi ile aynı bölümde çalışmakta olan personelin adlarınılisteleyen SQL kodunu yazınız.

SELECT ad FROM PersonelWHERE Bolumad= (SELECT bolumad FROM Personel WHERE personelkod=100)

Örnek : Personel tablosundaki kayıtlara göre adı ‘Ali’ olankişilerle aynı bölümde çalışan kişilerin ad’larını listeleyen SQLkodunu yazınız.

SELECT ad FROM personelWHERE bolumad IN (SELECT bolumad FROM personel where ad='ali') ANDad<>'ali'

Örnek : Personel tablosundaki kayıtlara göre personel kodu 105 olankişinin ücretinden daha fazla ücret alan kişilerin ad’larınılisteleyen SQL kodunu yazınız.

SELECT ad FROM personel WHERE ucret> (SELECT ucret FROM Personel WHERE personelkod=105)

11.3 Alt Sorguları Hesaplanmış Alanlar Olarak KullanmakAlt sorguları kullanmanın bir diğer yolu ise, hesaplanmış

alanlar içinde alt sorgulara yer vermektir. Örneğin, Customerstablosunda her bir müşterinin verdiği toplam sipariş miktarınıgörüntülemek isteyelim. Biliyoruz ki siparişlerin hepsi Orderstablosunda tutulur ve OrderID anahtar değeri ile ulaşılır.

Örnek 11.5: Her bir müşteri tarafından verilen sipariş miktarınıgörüntüleyen sorgu oluşturalım.

Bu işlemi gerçekleştirmek için şu adımları gerçekleştirmeliyiz:1- Customers tablosundan müşterilerin listesi gelir2- Her bir müşteri için, Orders tablosunda verilen siparişler

hesaplanır

Biliyoruz ki bir tablodaki kayıtları saymak için SELECT COUNT(*)deyimi kullanılır, WHERE yan cümlesi ile her bir müşteri numarasıiçin sipariş bilgilerini ulaşılır. Örneğin kodu ‘CACTU’ olanmüşteriye ait siparişleri listelemek için

Sorgu 65:SELECT COUNT(*) AS Toplam_Siparis FROM OrdersWHERE CustomerID = 'CACTU'

sorgusu kullanılır. Ancak görüyoruz ki bu sorgu sadece CACTU kodlumüşteriye ait siparişleri listeler. Biz bu sorguyu her bir müşteriiçin elde etmek istesek ne yapmamız gerekir? İşte burada işimizbiraz daha karmaşıklaşacak. SELECT COUNT(*) sorgusunu alt sorguolarak kullanmamız gerekecek.

Sorgu 66:SELECT CompanyName, Country,

(SELECT COUNT(*) FROM ORDERS WHERE Orders.CustomerID = Customers.CustomerID) AS Toplam_Siparisler

FROM CustomersORDER BY CompanyName

Daha önce kullanmadığımız bir biçimde sorgu kalıbı kullandık. Olayı şöyle canlandıralım:

CompanyName, Country alalarının yanında bir de buşirketlerden gelen toplam sipariş sayısını öğrenmek istiyoruz. Bukolonu oluşturmak için bir iç sorgu yapıyoruz.

(SELECT COUNT(*) FROM Orders WHERE Orders.CustomerID = Customers.CustomerID AS Toplam_Siparisler)

İşte bu sorgu, her bir şirket için verilen sipariş sayısınıhesaplar. Peki nasıl? Dikkat ettiyseniz WHERE yan cümlesindensonra Orders ve Customers tablolarının CustomerID alanlarıbirbirlerine bağlanmış, yani ilişkilendirilmiş. Eğer burada Orders.CustomerID = Customers.CustomerID ifadesi kullanılmasaydı bu işlem gerçekleşmezdi.

12 – Tabloları BirleştirmeBu bölümde tabloları birleştirerek yep yeni sorgular

oluşturacağız.

12.1 Tablolar Arası Veri Birleştirme Nedir?SQL’in en güzel ve en güçlü yönlerinden biri, sorguların

çalıştırıldığı zaman birden fazla tabloya ait verilerin bir sonuçkümesi içinde görüntülenebilmesidir. Burada pek çok şeye dikkatetmemiz gerekecek. Hangi tablonun tekil anahtar değeri (primarykey) ile hangi tablonun foreign key değerlerinin birleştirilmesigerektiği bilgileri iyice belirlenmelidir.

Aslında verinin nasıl birleştirileceğinden önce ilişkiseltablolar üzerinde biraz bilgi tazelemesi yapmak gerekiyor.

Örneğin veri tabanımızda ürün kataloğu içeren bir veri tablomuzvar. Her bir katalog ürünü ise kendi sırasında yer almakta. Herbir ürüne ait tanımlama, fiyat, tedarikçi bilgisi gibi verileri debulundurmamız gerekir.

Peki, aynı tedarikçiye ait ürünlerimiz varsa ne olacak? Tedarikçibilgilerini nerede tutacağız? Tabiki her bir ürün için tek tek bubilgileri girmemiz gereksiz olacak.

İşte bu gibi durumlarda veriler, parçalanabilecek en küçükparçalara ayrıştırılacak, tablolara bölüştürülecek, ve bu tablolarbirbirleriyle ilişkilendirilecektir.

Bu örneğimizde Products, Suppliers tablolarını ele alırsak, herbir tedarikçiye bir tekil kimlik numarası (ID) verilecek veProducts tablosunda ise her bir ürünün tedarikçi alanına isetedarikçi adı değil, kimlik numarası girilecektir.

12.2 Tablolar Arası Veri Nasıl Birleştirilir (Join)?Aslında join işlemi oldukça basittir. Veri getirilecek tüm

tabloların isimleri ve bu tabloların hangi alanlar vasıtasıylabirleştirileceği bilgisi belirtilmelidir.

Örnek 12.1: Ürünlerimize ait tedarikçi firma adı, ürün adı vefiyatını görüntüleyelim.Sorgu 67:SELECT CompanyName, ProductName, UnitPrice FROM Suppliers, ProductsWHERE Suppliers.SupplierID = Products.SupplierID

Sonuç kümesini incelersek, Suppliers tablosundan CompanyName, veProducts tablosundan ProductName, UnitPrice alanlarınıngetirildiğini görürüz. Burada en önemli olay, bu iki tablonunSupplierID alanları ile birleştirilebiliyor olmasıdır. Supplierstablosundaki SupplierID tekil anahtar (primary key) ve Productstablosundaki SupplierID ise foreign key vazifesindedir.

SELECT anahtar sözcüğü ve WHERE yan cümlesini iki farklı tablodanveri alıp birleştirmek için kullandık. İlişkili tablolardan verialmak için gerekli olan, WHERE yan cümlesinden sonra bu tablolararasında ilişki kuracak alanın belirtilmesidir.

Aslında bu sorguyu şu şekilde yeniden yazarsak, aynı kolon adınasahip olabilecek tablolarda sorun çıkmasını engelleriz.

Sorgu 68:SELECT Suppliers.CompanyName, Products.ProductName, Products.UnitPrice FROM Suppliers, ProductsWHERE Suppliers.SupplierID = Products.SupplierID

12.3 WHERE Yan Cümlesinin Önemiİki tablo arasındaki ilişkiyi belirtmek için WHERE yan

cümlesini kullanıyor olmamız ilk başta biraz tuhaf gelebilir.

SELECT ifadesinde belirtilen ilişkiler, sorgu çalıştığı zamankurulur ve görüntülenir.

WHERE yan cümlesinden sonra belirtilen tablolar arası ilişkiifadesi, unutulursa istenilenden fazla sayıda sonuç görüntüler.

Sorgu 69:SELECT CompanyName, ProductName, UnitPrice FROM Suppliers, Products

Bu sonuç kümesi oldukça kalabalık değil mi? Sebebi ise, Supplierstablosundaki kayıtlar ile Products tablosundaki kayıtlarınkartezyen çarpılmasıdır. Yani Suppliers tablosundaki bir kayıt,Products tablosundaki tüm kayıtlarla birer birer eşleşir. Yanisonuç kümesindeki eleman sayısı (Suppliers tablosundaki kayıtsayısı) * (Products tablosundaki kayıt sayısı) na eşittir.

İşte bu gereksiz eşleşmeleri önlemek için WHERE yan cümlesindensonra Suppliers.SupplierID = Products.SupplierID ifadesikullanılır. Tekrar belirtmeliyiz ki, iki tablo arasındaki ilişkiyibelirtmek için tekil anahtar olan değeri tablo adı ilebirleştirip, foreign key olarak kullanılacak alanı bu tablo adıile birleştiririz.

12.4 INNER JOINBir önceki konuda iki tablo arasında kurduğumuz birleştirme

ilişkisine “equijoin” denir. Yani iki tablo arasında eşitliğintest edilmesi ile oluşturulan join.Şimdi biraz daha farklı bir sentaks kullanacağız.

Örnek 12.2: Ürünlerimize ait tedarikçi firma adı, ürün adı vefiyatını görüntüleyelim.Sorgu 70:SELECT CompanyName, ProductName, UnitPrice FROM Suppliers INNER JOIN ProductsON Suppliers.SupplierID = Products.SupplierID

İşte tablolar arasındaki ilişkiler için INNER JOIN anahtarsözcüğünü kullanmamız daha yararlı olacaktır.

Sorguyu incelersek, hangi tablodan hangi tabloya ilişki kurulacağıFROM anahtar sözcüğünden sonra belirtilir.

Hatırlayacağınız gibi Suppliers tablosunda her bir tedarikçiyeverilen numaralar SupplierID alanında tutuluyordu (primary key).Products tablosunda ise ürünün hangi tedarikçiye ait olduğubilgisi yine SupplierID alanında tutuluyordu (foreign key).Bu iki alan arasında ON anahtar sözcüğü kullanılır.

INNER JOIN Products ON Suppliers.SupplierID = Products.SupplierID

Burada kullanılan INNER JOIN ve ON anahtar sözcükleri, daha öncekullandığımız WHERE Suppliers.SupplierID = Products.SupplierID ile oluşturulan ilişkiyerine kullanılır.İlişkinin yönü belirtildiği için bu tarzkullanım önerilmektedir.

İki tablo arasında ilişki kurmak için WHERE geçerli olsa da, çoklutablolarda o kadar da kolay olmayacaktır.

12.5 Çoklu Tabloları JOIN ile BirleştirmekSELECT ifadesi içerisinde istenildiği kadar tablo arasında

ilişki kurulabilir. SQL bunun için bir sınır belirlememiştir. Olayaslında o kadar da karmaşık değildir. Yapılması gereken, öncelikletüm tablolar listelenir ve sonra birbirleri arasındaki ilişkitanımlanır.

Örnek 12.3: 10274 numaralı siparişe ait ayrıntılı bilgi almakistiyoruz.Sorgu 71:SELECT Products.ProductName, Suppliers.CompanyName,

[Order Details].UnitPrice,[Order Details].QuantityFROM [Order Details], Products, SuppliersWHERE Products.SupplierID = Suppliers.SupplierID AND[Order Details].ProductID = Products.ProductID AND OrderID = 10274

Unutmayalım ki sorguyu incelemek istiyorsak, cümleyi okumaya ensondan başlamalıyız. Bu sorguda, Order Details tablosundan 10274numaralı sipariş ele alınır. Bu kayıt üzerinden UnitPrice veQuantity bilgisinin yanında Products tablosuna ulaşılır veProductName bilgisi alınır. Aynı şekilde Suppliers tablosundanCompanyName bilgisi alınır.

Aslında bu sorgu, alt sorgular kullanılarak da çalıştırılabilirdi.

Örnek 12.4: 9 numaralı ürünü sipariş veren müşterilere aitayrıntılı bilgi almak istiyoruz.Sorgu 72:SELECT CompanyName, ContactName FROM CustomersWHERE CustomerID IN

(SELECT CustomerID FROM Orders WHERE OrderID IN(SELECT OrderID FROM [Order Details] WHERE ProductID = 9))

Sonuca ulaşmak için hangi yolun kullanılacağı tamamen sizindeneyimlerinize dayanmaktadır. Önemli olan doğru veriye ulaşmak.Sorgu 73 bu sonucu farklı yöntemle görüntüler.

Sorgu 73:SELECT CompanyName, ContactName FROM Customers, Orders, [Order Details]

WHERE Customers.CustomerID = Orders.CustomerIDAND [Order Details].OrderID = Orders.OrderIDAND ProductID = 9

STORED PROCEDURE’LER

Stored Procedure’ler, SQL Server veritabanı içerisindedefalarca kullanılan ve farklı işlemler yapmak için kullanılan birçok SQL koduna erişip kullanımını kolaylaştırmak ve hızlandırmakamaçlı olarak sunulan bir nesne türüdür. Programlama dillerindekifonksiyon ve procedureler gibi düşünülebilir. Oluşturulan storedprocedureler, bir kere derlenip çalıştırıldıktan sonraki diğerçağırımlarda daha hızlı çalışırlar ve gerektiğinde direkt olarakismi verilerek çalıştırılabilir ve hatta duruma göre kullanıcınıngöndereceği parametrelere göre farklı değerler üzerinden deçalıştırılabilir. Stored procedurler, birbirlerini deçağırabildikleri için iç içe veya peşpeşe de birden fazla storedprocedureler çalıştırılabilir.

KAYNAKLAR :

1- www.farukcubukcu.com2- SQL Server 2000 Books Online / Help3- www.sqlcourse.com4- SQL Server 2005 ve Veritabanı Programlama –Yaşar GÖZÜDELİ5- Veri Tabanı Sistemleri – Dr. Yalçın ÖZKAN6- www.devguru.com