Bölüm 3: DML Veri İşleme Dili -15-
Dr. Serkan DİŞLİTAŞ DML (Data Manipulation Language Veri İşleme Dili) : Bu kategorideki SQL komutları veriler üzerinde işlemler yapmaya yönelik ifadeleri içermektedir. Tablolara ait kayıtlar için sorgulama, ekleme, silme ve değiştirme (güncelleme-update) gibi işlemler yapılabilmektedir. Örnek : Select, Update, Delete, Insert vb. 3.1. Veri ve Tablo Seçimi ( Select / From) Select ile tablodan veriler sütunlar (columns) halinde seçilir. From ile sorguların yapılacağı tablonun yolu (ya da Alias) ve adı belirlenir. Select Sütunlar From Tablo_Adı ------------------------------------------------------------------------------------------------ Sütunlar : Eğer * ise tüm alanlar geçerli olur, diğer durumlarda adları virgülle ayrılarak yazılan alanlar geçerli olur. Tablo_Adı : Verilerine ulaşılması istenen tablonun adı. Örnek 1 : Select * From Ogrenci ya da Select Ogrenci.* From Ogrenci Aktif dizindeki (alias) Ogrenci adlı tablodaki tüm kayıtlar tüm sütunlarıyla birlikte getirilir. Örnek 2 : Select Ad, Soyad, Adres From Ogrenci Aktif dizindeki (alias) Ogrenci adlı tablodaki tüm kayıtların sadece Ad, Soyad ve Adres alanları getirilir. Örnek 3 : Select Ogrenci.Ad, Ogrenci.Soyad, Ogrenci.Adres From Ogrenci Aktif dizindeki (alias) Ogrenci adlı tablodaki tüm kayıtların sadece Ad, Soyad ve Adres alanları getirilir. Örnek 4 : Select Distinct Numara, DersKodu From Notlar Yukarıdaki örnekte tekrarlı kayıtları engellemek amacıyla Distinct kullanılmıştır. Listelenen alanlar içinde tekrar engellenir. Distinct hep baştadır ve listelenen tüm satıra hitap eder. Burada hem Numara hem de DersKodu alanları aynı olan ikinci bir kayıt listelenmez. Distinct All : Belirtilen alanda kayıtları tek getirir. : Varsayılan değerdir. Tüm kayıtları getirir. -16-
Bölüm 3: DML Veri İşleme Dili Örnek 5 : Select O.Numara, O.Ad, O.Soyad From Ogrenci as O ya da Select O.Numara, O.Ad, O.Soyad From Ogrenci O Yukarıdaki örneklerde tablo adı için temsili isimler verilmiştir. Her iki kullanımda da Ogrenci adlı tablo O adı ile temsil edilmektedir. Örnek 6 : Select Ad Öğrenci_Adı, Soyad Öğrenci_Soyadı From Ogrenci ya da Select Ad as Öğrenci_Adı, Soyad as Öğrenci_Soyadı From Ogrenci ya da Select Ad as [Öğrenci Adı], Soyad as [Öğrenci Soyadı] From Ogrenci (Boşluk karakteri Transact-SQL de kullanılabilmektedir.) Yukarıdaki örneklerde alan adları için temsili isimler verilmiştir. Yukarıdaki her iki kullanımda da tablodaki Ad alanı listenin alınmasında Ogrenci_Adı alan başlığıyla listelenecektir. Aynı şekilde Soyad da Ogrenci_Soyadı olarak listelenecektir. Örnek 7 : Select O.Numara, O.Ad, O.Soyad, N.Vize, N.Final From Ogrenci as O, Notlar as N Yukarıdaki örnekte çoklu tablo (burada iki adet tablo) kullanılmıştır. Ogrenci O ile Notlar ise N ile temsil edilmektedir. Listelenmesi istenen sütun isimlerinin başında hangi tablodan alındığı belirtilmektedir. Örnek 8 : Select Numara, Vize, Final, Vize * 0.4 + Final * 0.6 as Ortalama From Notlar ya da Select Numara, Vize, Final, Ortalama = Vize * 0.4 + Final * 0.6 From Notlar Yukarıdaki örnekte Vize ve Final alanları üzerinde hesaplama yapılarak Ortalama adında yeni bir alan oluşturulmuştur. Örnek 9: Select Ad, Soyad, Adres into Kimlik From Ogrenci Yukarıdaki örnekte seçim sonucu yeni bir tabloya (daha önce mevcut olmayan) aktarılmaktadır. Ogrenci tablosundan sadece Ad, Soyad ve Adres sütun bilgileri alınarak Kimlik adlı yeni bir tabloya aktarılmaktadır. Örnek 10: Select Left ( Ad, 1 ) + '.' + Soyad as AdSoyad From Kimlik Burada Kimlik tablosundan Left fonksiyonu ile Ad alanının sadece ilk karakteri alınmış ve Soyad alanı ile birleştirilerek tek bir alan oluşturulmuştur. Oluşturulan bu yeni alanın adı AdSoyad olarak verilmiştir. AdSoyad alanı sadece sorgulama ile oluşturulmakta olup tablo ile ilgili fiziksel bir işlem yapılmamaktadır (Transact-SQL desteklidir). -17-
Dr. Serkan DİŞLİTAŞ Örnek 11: Select Top 5 * From Kimlik Kimlik tablosuna ait ilk 5 kayıt elde edilir (Transact-SQL desteklidir). Örnek 12: Select Top 5 Percent * From Kimlik Kimlik tablosuna ait kayıtların ilk %5 i elde edilir (Transact-SQL desteklidir). 3.2. Şart Belirleme ( Where ) Tablo ya da tablolardan belirli şartlara uyan kayıtların listelenmesinde kullanılmaktadır. Where ( Şart ) Where cümlesinde normal karşılaştırma, mantıksal, aritmetiksel operatörlerin kullanılmasının yanında özel birtakım operatörler de kullanılmaktadır. Bunlar aşağıdaki tabloda verilmektedir. Like Between Exists In Is Null Some/Any/All Şart Belirlenmesinde Kullanılan Özel Operatörler Benzer İki değer arasında Mevcut ise Kümede ise Boş ise Bazısından/Herhangi birinden/ Hepsinden Örnek 1: Where Numara > 034527015 Öğrenci tablosundan Numarası 034510015 den büyük olan öğrencilerin Numara, Ad ve Soyad alanları listelenir. Örnek 2: Where Ad = Zeynep Or Ad = Halis Öğrenci tablosundan adı Zeynep ya da Halis olan öğrencilerin Numara, Ad ve Soyad alanları listelenir. Örnek 3: Where Ad = Zeynep Or Ad = Halis And Numara >'044527020' Öğrenci tablosundan Adı Zeynep olanlar ya da hem Numarası '044527020' dan büyük hem de Adı Halis olan öğrencilerin Numara, Ad ve Soyad alanları listelenir. -18-
Bölüm 3: DML Veri İşleme Dili Not : Mantıksal operatörlerde işlem önceliği NOT, AND, OR şeklinde sıralanır. Aynı operatörün birden çok kullanılması durumunda soldan sağa doğru işlem önceliği dikkate alınır. ( ve ) parantezleri yardımıyla işlem önceliği değiştirilebilmektedir. Örnek 4: Where Ad Like A% Öğrenci tablosundan Adı A ile başlayan öğrencilerin Numara, Ad ve Soyad alanları listelenir. Not : MSSQL de % birden çok, _ ise tek karakter yerine geçen jokerdir. Access veritabanında ise bunların yerine sırasıyla * ve? joker karakterleri kullanılmaktadır. Örnek 5: Where Ad Like _A% Öğrenci tablosundan Adının ikinci harfi A olan öğrencilerin Numara, Ad ve Soyad alanları listelenir. Örnek 6: Where Numara Like 26% Öğrenci tablosundan Numarasının 5. ve 6. karakterleri 26 olan (Bilgisayar Programcılığı Normal Öğretim) öğrencilerin Numara, Ad ve Soyad alanları listelenir. Örnek 7: Where Adres Like % ANKARA % Öğrenci tablosundan Adresinde ANKARA geçen öğrencilerin Numara, Ad ve Soyad alanları listelenir. Örnek 8: Where Soyad Like %TAŞ Öğrenci tablosundan Soyadı TAŞ ile biten öğrencilerin Numara, Ad ve Soyad alanları listelenir. Örnek 9: Where Soyad Like [KS]% Öğrenci tablosundan soyadı K veya S ile başlayan öğrencilerin Numara, Ad ve Soyad alanları listelenir. Burada [ ] karakterleri küme belirtmektedir ve içerisine yazılan karakterlerden biri anlamını katmaktadır. -19-
Örnek 10: Where Soyad Like _[^K]% Dr. Serkan DİŞLİTAŞ Öğrenci tablosundan soyadının ikinci harfi K olmayan öğrencilerin Numara, Ad ve Soyad alanları listelenir. Örnek 11: Where Soyad Like _[C-K]% Öğrenci tablosundan soyadının ikinci harfi alfabede C ile K arasındaki karakterlerden biri olan öğrencilerin Numara, Ad ve Soyad alanları listelenir. Örnek 12: Where Numara Between 034510010 And 034510020 Diğer bir ifade şekli Where Numara >= 034510010 And Numara <= 034510020 Öğrenci tablosundan numarası 034510010 ile 034510020 arasında olan öğrencilerin Numara, Ad ve Soyad alanları listelenir. Not : * Beetwen / And kullanımında sınırlar sorgulamaya dahildir. * (1. sınır değeri) <= (2. sınır değeri) kuralı geçerli olmalıdır. Örnek 13: Where Harf in ( AA, BA, BB ) Diğer bir ifade şekli Where Harf = AA Or Harf = BA Or Harf = BB Öğrenci tablosundan notunun Harf karşılığı AA, BA ya da BB olan öğrencilerin Numara, Ad ve Soyad alanları listelenir. Örnek 14: Where Adres is Null Öğrenci tablosundan Adres alan değeri olmayan (hiç veri girilmemiş) öğrencilerin Numara, Ad ve Soyad alanları listelenir. -20-
Bölüm 3: DML Veri İşleme Dili 3.3. Sıralama ( Order By ) Belirtilen sütun ya da sütunlara bağlı olarak artan ya da azalan sırada tablodaki kayıtların listelenmesinde kullanılmaktadır. Order By (Alan1 [ASC ya da DESC ] ), [Alan2 [ASC ya da DESC ] ] --------------------------------------------------------------------------------------------------- ASC : Ascending (Artan). Hiçbir şey yazılmazsa varsayılan değer Asc olur. DESC : Descending (Azalan). Örnek 1: Select * From Ogrenci Where Final < 50 Order By Numara Yukarıdaki kullanımda; Öğrenci tablosundan Final notu 50 den küçük olan öğrenciler Numara sırasına göre artan olacak şekilde tüm sütun bilgileriyle listelenir. Örnek 2: Select * From Ogrenci Where Final < 50 Order By Numara Desc Yukarıdaki kullanımda; Öğrenci tablosundan Final notu 50 den küçük olan öğrenciler Numara sırasına göre azalan olacak şekilde tüm sütun bilgileriyle listelenir. Örnek 3: Select * From Ogrenci Order By Ad Desc, Soyad Desc Yukarıdaki kullanımda; Öğrenci tablosundan Ad ve Soyad alanına göre azalan olacak şekilde öğrenciler tüm sütun bilgileriyle listelenir. Örnek 3: Select Row_Number() Over (Order By OkulNo) as Sira_No, * From Notlar Notlar tablosuna ait kayıtları Final alanına göre Azalan sırada olacak şekilde Sira_No alanına 1 den başlayarak artan şekilde kayıt sıra numarasını da ekleyerek elde eder.(transact-sql desteklidir). AÇIKLAMA Order By için as ile oluşturulan yeni alan adı da kullanılabilir Select Ad, Soyad, Ad + Soyad as AdSoyad From Kimlik Order By AdSoyad -21-
3.4. Grup Oluşturma ( Group By ) Dr. Serkan DİŞLİTAŞ Tablolar üzerinde gruplandırma yapılarak sorguların oluşturulmasında kullanılmaktadır. Tablo içerisinde bir ya da daha çok alana göre gruplama yaparak kayıtların sorgulanması mümkündür. Ancak gruplama yapabilmek için, gruplama alanının Select ifadesinde kullanılması gereklidir. Notların bulunduğu bir tabloda öğrencilerin başarı ortalaması, personel bilgilerinin bulunduğu tabloda bölümlere göre hesaplamalar yaptırılabilir. Group By (Alan) Örnek 1: Select OgrNo From Notlar Group By OgrNo Yukarıdaki sorgulamada OgrNo alanına göre gruplandırma yapılmaktadır. Böylelikle tablodaki kayıtlara göre farklı numaralar listelenir. Örnek 2: Notlar Tablosu Select OgrNo, Avg(Vize*0.4+Final*0.6) as Ortalama From Notlar Group By OgrNo Burada Notlar tablosunda OgrNo alanına göre gruplama yapılmıştır. Böylelikle her öğrencinin notlarının ortalaması ayrı ayrı elde edilmiştir. Örnek 3: (Örnek 2 deki Notlar Tablosu esas alınmıştır.) Select DersKodu, Avg(Vize*0.4+Final*0.6) as Ders_Ortalaması From Notlar Where Donem = ' 2004-2005' Group By DersKodu Burada Notlar tablosundan 2004-2005 dönemine ait dersler için sınıf aritmetik ortalamaları elde edilmektedir. -22-
Bölüm 3: DML Veri İşleme Dili Örnek 4 : Select OgrNo, Count( * ) as [ Ders Sayısı ] From Notlar Where Donem = '2005-2006 GÜZ' Group By OgrNo Burada Notlar tablosundan '2005-2006 GÜZ' dönemime ait dersler elde edilerek, OgrNo ya göre gruplandırma yapılmakta ve her öğrenci için Ders Sayısı elde edilmektedir. ResultSet olarak OgrNo ve Ders Sayısı değerleri listelenmektedir. Örnek 5 : Select DersKodu, Count(*) as Mevcut From Notlar Where Donem = '2005-2006 GÜZ' Group By DersKodu Burada Notlar tablosundan '2005-2006 GÜZ' dönemime ait dersler elde edilerek, DersKodu na göre gruplandırma yapılmakta ve her ders için mevcut elde edilmektedir. ResultSet olarak DersKodu ve Mevcut değerleri listelenmektedir. 3.5. Grup Şartı Belirleme ( Having ) Gruplandırmalara yönelik kısıtlama amacıyla şart ifadelerinin verilmesinde kullanılırlar. Having ( Şart ) Örnek 1: Select OgrNo, Avg(Vize*0.4+Final*0.6) as Ortalama From Notlar Group By OgrNo Having Avg(Vize*0.4+Final*0.6) > 60 Yukarıdaki sorgulamada; Notlar tablosunda OgrNo alanına göre gruplama yapılarak her öğrenci için tüm derslerinin Vize ve Final den elde edilen ağırlıklı ortalamalarının Aritmetik ortalamaları elde edilerek, Aritmetik ortalamaları 60 dan büyük olanların OgrNo ve Aritmetik ortalamaları listelenir. -23-
Dr. Serkan DİŞLİTAŞ Örnek 2: Select OgrNo, Avg(Vize * 0.4 + Final * 0.6 ) as Ortalama From Notlar Where Donem = 2009-2010 GÜZ Group By OgrNo Having Avg ( Vize * 0.4 + Final * 0.6 ) > 60 Order By OgrNo Desc Bu sorgulamada; Notlar tablosunda 2009-2010 GÜZ döneminde alınan dersler için; OgrNo alanına göre gruplama yapılarak her öğrenci için tüm derslerinin Vize ve Final den elde edilen ağırlıklı ortalamalarının Aritmetik ortalamaları elde edilerek, Aritmetik ortalamaları 60 tan büyük olanların OgrNo ve Aritmetik ortalamaları OgrNo alanına göre azalan olacak şekilde listelenir. Not : Select için şart belirlenmesinde Where komutu kullanılırken, Group By için şart belirlenmesinde Having komutu kullanılmaktadır. Örnek 3: Select OgrNo, Sum( Kr ) as [Toplam Kredi] From Notlar Where Donem = '2004-2005 GÜZ' Group By OgrNo Having Sum( Kr ) >= 36 Yukarıdaki sorgulamada; Notlar tablosunda 2004-2005 GÜZ dönemine ait dersler için OgrNo alanına göre gruplama yapılmaktadır. Bu gruplama ile her öğrenci için kredi toplam değeri bulunarak, 36 ve yukarısı olanların numaraları ile kredi toplam değerleri verilir. Örnek 4 : Select OgrNo, Sum( Kr ) as [Kredi Miktarı ] From Notlar Where Aciklama = 'GEÇER' Group By OgrNo Having Sum ( Kr ) >= 110 Burada Notlar tablosundan GEÇER dersler elde edilerek, OgrNo ya gruplandırma yapılmakta ve her öğrenci için kredi toplamı elde edilmektedir. ResultSet olarak Kredi Miktarı 110 ve üzerinde olan öğrencilerin OgrNo ve kredi miktarları listelenmektedir. -24-
Bölüm 3: DML Veri İşleme Dili 3.6. Gruplama Fonksiyonları Fonksiyonlar parametrik olarak aldıkları değerlere göre yeni sonuçlar üreten yapılardır. Örnek Kullanımlar: Notlar Tablosu NOT : NULL değer içeren bir alan olması sonraki örnekler için yaralı olabilir. Aşağıdaki örnekler için Notlar adlı tablo kullanılmaktadır. Örnek 1: Select Count ( * ) as Toplam From Notlar Yukarıdaki kullanımda; Notlar tablosundaki tüm kayıt sayısı elde edilerek alan adı Toplam olacak şekilde verilir. Örnek 2: Select Count (Numara ) as Toplam From Notlar Yukarıdaki kullanımda; Notlar tablosundaki Numara alanına göre Null olmayan değerler sayısı Toplam adında verilir. -25-
Dr. Serkan DİŞLİTAŞ Örnek 3: Select Count ( Distinct Numara ) as Toplam From Notlar Notlar tablosundaki Numara alanına göre Null olmayan ve birbirinden farklı olan değerler sayısı elde edilerek Toplam adında verilir. Örnek 4: Select Avg ( Ortalama ) as Aritmetik_Ortalama From Notlar Notlar adlı tablodaki Ortalama alanındaki değerlerin Aritmetik Ortalaması alınır. Örnek 5: Select Numara, Avg ( Ortalama ) as Aritmetik_Ortalama From Notlar Group By Numara Notlar adlı tablodaki her öğrenci için derslerinin aritmetiksel ortalaması alınır. Örnek 6: Select Numara, Max(Final) as [En Yüksek Final] From Notlar Group By Numara Notlar adlı tablodaki her öğrencinin dersleri içinde en yüksek Final notları elde edilir. Not : Min() fonksiyonu en küçük değeri verir. NOT : SUM için de örnek yapılabilir. -26-
Bölüm 3: DML Veri İşleme Dili 3.7. Hesaplama ( Compute ) Compute ifadesi ile Sum, Avg, Max, Min, Count gibi fonksiyonlara ilişkin hesaplamalar yapılmaktadır. Örnek 1: Select * From Notlar Compute Avg ( Final ) Yukarıdaki sorgulamada Notlar tablosu listelenir ve Final sütununa ait Ortalama verilir. Örnek 2: - - S_Compute1.Sql Select *, Ortalama From Notlar Where Numara Like '04%' And Ortalama <> 'G' And Ortalama <> 'D' And Ortalama <> 'M' And Ortalama <> '' Compute Avg( Cast (Ortalama as Integer ) ) Yukarıdaki sorgulamada Numarası 04 ile başlayan (2004 yılı girişli) öğrenciler için, Ortalama alanı üzerinden Aritmetik Ortalama (AVG) hesaplanır. Ortalama alanı tabloda Char(3) olarak tanımlı olduğundan Cast ile tip dönüşümü yapılmıştır. Burada; Cast RTrim Compute : Tip dönüşümünde kullanılır. : (Fonksiyon) Karakter tipli verinin sağ tarafından boşluklar kırpılır. : Sorgu sonunda hesaplama sonucu verilir. Compute ile hesaplanan alanın aynısı Select ifadesi içerisinde yer almalıdır. 3.8. Tabloya Kayıt Ekleme ( Insert Into ) Tabloya yeni kayıtların girilmesi amacıyla kullanılan SQL deyimidir. Insert Into Tablo_Adı ( Sütun Listesi ) Values ( Veri_Listesi ) --------------------------------------------------------------------------------------------- Tablo_Adı : Yeni kayıtın ekleneceği tablo adı. Sütun_Listesi : Tabloya eklenecek verilere ilişkin alan listesi Veri_Listesi : Sütun listesine uyumlu sırada veri listesi -27-
Örnek 1: Insert Into Notlar ( DersKodu, Vize, Final ) Values ( 4510205, 70, 80 ) Dr. Serkan DİŞLİTAŞ Yukarıdaki kullanımda Notlar adlı tabloya 024510001 numaralı öğrenci için 4510205 kodlu derse ait Vize ve Final notları girilmiştir. Not : Sütun tiplerine uygun olarak, veriler uygun tiplere otomatik olarak dönüştürülerek atanır. Yukarıdaki kullanımda string olarak 70 ve 80 olarak veri girişi yapılsa da bir sorun çıkmayacak, Vize ve Final alan tiplerine bağlı olarak bu veriler tamsayıya dönüştürülerek atanacaktır. Ayrıca tabloda olmasına rağmen sütun listesinde ve dolayısıyla da veri listesinde yer almayan veriler için Null değerler atanır. Örnek 2: Insert Into Notlar ( OgrNo, DersKodu, Vize ) Values ( 024510001, 4510205, 70 ) Yukarıdaki kullanımda Notlar adlı tabloda Final alanı olmasına rağmen, veri ekleme aşamasında bu alan değeri kullanılmamıştır. Bu yüzden Final alanı için otomatik olarak Null değeri atanacaktır. Eğer tabloda Final alanı için Null kısıtlaması var ise bu şekilde kullanım hatalı olacaktır. Örnek 3: Insert Into Notlar ( OgrNo, DersKodu, Vize, Final ) Values ( 024510001, 4510205, Null, Null ) Yukarıdaki kullanımda Notlar adlı tabloya 024510001 numaralı öğrenci için 4510205 kodlu ders kaydı girilmiştir. Burada Vize ve Final notları için Null değerler atanmıştır. Ancak tabloda Final veya Vize alanı için Not Null kısıtlaması var ise bu şekilde kullanım hatalı olacaktır. Not: Tabloda olduğu halde değeri belirtilmeyen alanlar için NULL değer ataması yapılmıştır. Örnek 4: Insert Into Ogrenciler ( OkulNo, Ad, Soyad ) Values ( 134510001, Halis, DİŞLİTAŞ ), ( 134510002, Hatice, DİŞLİTAŞ ) Yukarıdaki kullanımda Ogrenciler tablosuna 2 kayıt eklenmektedir. -28-
Bölüm 3: DML Veri İşleme Dili Örnek 5: Insert Into Yedek_Notlar ( OgrNo, DersKodu, Donem ) Select Numara, DersKodu, Donem From Notlar Yukarıdaki sorgulamada Notlar tablosundan sorgulama ile elde edilen kısmi (OgrNo, DersKodu, Donem) veriler Yedek_Notlar adlı başka bir tabloya eklenmiştir. Yedek_Notlar tablosunun var olan diğer alanları Null değer almıştır. Not: 1. Alan adları birebir eşlenecek sırada verilmelidir. 2. Alan adları aynı olmak zorunda değildir. Yapısal olarak aynı yada uygun olmalıdır. Örnek 6: Insert Into Yedek_Notlar Select * From Notlar Where Ogrno > '034526009' Yukarıdaki sorgulamada Notlar tablosundan Ogrno değeri 034526009 dan büyük olan öğrencilerin not kayıtları elde edilerek, Yedek_Notlar adlı başka bir tabloya eklenmektedir. Burada tablo yapıları uygun olmalıdır. Not: Eğer tablonun tüm alanlarına ilişkin bir kayı yapılacaksa; tablo adından sonra alan adlarını belirtmeye gerek yoktur. Örnek 7: Insert Into Yedek_Notlar (Ogrno, DersKodu, Donem) Select OgrNo, DersKodu, '2005-2006 BAHAR' From Notlar Yukarıdaki sorgulamada Notlar tablosundan sorgulama ile elde edilen OgrNo, DersKodu değerleri ile sabit 2005-2006 BAHAR değeri Yedek_Notlar adlı başka bir tabloya eklenmiştir. Yedek_Notlar tablosunun var olan diğer alanları Null değer almıştır. 3.9. Tablo Güncelleme ( Update ) Tabloda mevcut sütun ya da sütunlardaki verilerin yenileri ile değiştirilmesi amacıyla kullanılmaktadır. Update Tablo_Adı Set Sütun1 = Yeni_Değer1, Sütun2 = Yeni_Değer2... ------------------------------------------------------------------------------------------ Tablo_Adı : Güncelleme yapılacak olan tablonun adı Sütun : Tablonun güncelleme yapılacak olan sütunu Yeni_Değer : Sütuna verilecek yeni değer -29-
Örnek 1: Dr. Serkan DİŞLİTAŞ Update Kimlik Set Numara = Left (Numara, 4) + 27 + Right (Numara, 3) Where Numara Like 26% Yukarıdaki kullanımda Kimlik adlı tablodaki 26 nolu programa ait öğrencileri 27 nolu programa aktarır. Örnek 2: Update Personel Set Maas = 1 000 Yukarıdaki kullanımda Personel adlı tablodaki tüm kayıtlarda Maas alan içeriği 1.000 yapılmaktadır. Bu şekildeki kullanımda tablodaki tüm kayıtlar için ilgili sütunda güncelleme yapılmaktadır. Örnek 3: Update Personel Set Maas = 1 000 Where Maas < 500 Yukarıdaki kullanımda bir şart belirtilerek, güncellemenin sadece şarta uyan kayıtlar için yapılması sağlanmıştır. Örnek 4: Update Notlar Set Vize ='70', Final ='100' Where (OgrNo='044526005') And (Donem ='2004-2005 BAHAR') And (DersKodu ='4526102') Yukarıdaki kullanımda 044526005 numaralı öğrencinin 2004-2005 BAHAR dönemi 4526102-00 kodlu dersi için Vize notu 70, final notu ise 100 olarak değiştirilmiştir. Örnek 5: Update Personel Set Maas = Maas * 1.25 Ya da Update Personel Set Maas = Maas + Maas * 25/100 Yukarıdaki kullanımların her ikisinde de Personel adlı tabloda Maas alanındaki değerler %25 zamlı olarak değiştirilmektedir. Not: 2. Kullanım daha çok işlem gerektirdiğinden işlemciyi yormaktadır. -30-
Bölüm 3: DML Veri İşleme Dili 3.10. Kayıt Silme ( Delete ) Tablodan bir veya daha çok kayıtın, hatta tamamının silinmesi amacıyla kullanılmaktadır. Delete From Tablo_Adı -------------------------------------------------------------------------------- Tablo_Adı : Kayıt ya da kayıtların silineceği tablonun adı. Örnek 1: Delete From Kimlik Yukarıdaki kullanımda Kimlik adlı tablodaki tüm kayıtlar silinir. Örnek 2: Delete From Kimlik Where Memleket = ANKARA Yukarıdaki kullanımda Kimlik adlı tabloda sadece Memleket alanı ANKARA olan kayıtlar silinir. Örnek 3: Delete From Kimlik Where OgrNo Like 27% Yukarıdaki kullanımda Kimlik adlı tabloda numarasının 5. hanesi 2, 6. hanesi 7 (27 kodlu) olan kayıtlar silinir. Kullanımda _ karakteri o hane ne olursa olsun, % karakteri ise birden çok haneyi kapsayan bir şekilde ne olursa olsun anlamına gelmektedir. 3.11. Alt Sorgular ( SubQueries ) İç içe SQL ifadelerinin kullanılmasıdır. Bu sayede sorgulamalar daha basit ve anlaşılır olarak ifade edilebilmektedir. Select SütunAdı From Tablo_Adı Where ( Select ) ----------------------------------------------------------------------- Tablo_Adı : Sorgulamaya esas tablonun adı. Örnek 1: Select * From Notlar Where OgrNo = (Select OgrNo From Kimlik Where Ad = ZEYNEP ) Yukarıdaki kullanımda iç sorgulamada ad alanındaki değer ZEYNEP olan kayıta ait OgrNo bilgisi sonuç olarak üretilecektir. Bu öğrenci numarası dıştaki sorgunun OgrNo alanı için bir eşitleme yaratacak, böylelikle de bu öğrencinin Notlar tablosuna bağlı bilgileri listelenecektir. -31-
Dr. Serkan DİŞLİTAŞ Burada iç sorgunun tek değer üretmesi durumunda sorun olmayacaktır, ancak birden fazla değer üretmesi durumunda ise (burada Zeynep adlı birden çok öğrenci varsa) dış sorgu şartı için uygun olmayan bir ifade olacaktır. Bu durumda aşağıdaki hata mesajı verilecektir. Subquery returned more than 1 value. This is not permitted when the subquery follows =,!=, <, <=, >, >= or when the subquery is used as an expression. Örnek 2: Select * From Notlar Where OgrNo in (Select OgrNo From Kimlik Where Ad= ZEYNEP ) Burada alt sorgu birden çok değer döndürebileceğinden karşılaştırmada in kullanılmaktadır. Yapılan sorgulamada adı ZEYNEP olan öğrencilerin not bilgileri elde edilmektedir. Örnek 3: Select * From Notlar Where Final > ( Select Avg( Final ) From Notlar ) Burada Final notu sınıf ortalamasının üstünde olan öğrenciler elde edilmektedir. Aynı şekilde >, >=, <, <=, <> karşılaştırma operatörleri de kullanılarak değişik sonuçlar elde edilebilir. Örnek 4: Select * From Notlar Where Final >= Any ( Select Final From Notlar Where OgrNo= 034526004 ) Burada numarası 034526004 olan öğrencinin final notlarından herhangi birinden büyük eşit olan öğrenciler elde edilmektedir. (Başka bir ifadeyle, alt sorgudan elde edilen ResultSet- Sonuç Kümesi nin en küçüğünden büyük eşit ise). Örnek 5: Select * From Notlar Where Final >= All ( Select Final From Notlar Where OgrNo= 034526004 ) Burada numarası 034526004 olan öğrencinin final notlarından hepsinden büyük eşit olan öğrenciler elde edilmektedir. (Başka bir ifadeyle, alt sorgudan elde edilen ResultSet- Sonuç Kümesi nin en büyüğünden büyük eşit ise). Örnek 6: Select * From Dersler Where Exists (Select * From Notlar Where Aciklama = TEKRAR ) -32-
Bölüm 3: DML Veri İşleme Dili Burada Notlar tablosunda durumu Tekrar olan varsa (Alt sorgunun bir sonucu ResulSet geri dönüyorsa) Dersler tablosunu listeler. Örnek 7: Select * From Kimlik Where Not Exists ( Select * From Notlar Where Aciklama= TEKRAR ) Burada Notlar tablosunda durumu Tekrar olan yoksa Kimlik tablosunu listeler. Örnek 8: Select OgrNo, Ad, Soyad From Kimlik Where OgrNo in ( Select Distinct OgrNo From Notlar Where DYilDonem = '2003-2004 GÜZ' And Aciklama = 'TEKRAR' ) Yukarıdaki sorguda 2003-2004 GÜZ döneminde en az bir ders tekrarı olan öğrencilerin kimlikleri (OgrNo, Ad, Soyad) elde edilir. Örnek 9: Select * From Kimlik Where OgrNo in ( Select Distinct OgrNo From Notlar Where Final = 'G' ) Yukarıdaki sorguda Notlar tablosunda Final sınavlarından herhangi birine girmeyen öğrencilerin numaraları elde edilerek, bu numaralara ilişkin kimlik bilgileri Kimlik tablosundan elde edilir. Örnek 10: Select * From Dersler Where DersKodu in ( Select DersKodu From Notlar Where Vize='100' And Final ='100' ) Yukarıdaki sorguda Notlar tablosunda hem Vize hem de Final notu 100 olarak belirlenen bir not kaydının olduğu derslerin kimlik bilgilerini vermektedir. Örnek 11: Select OgrNo, Sum ( Kr ) as KrediToplami From Notlar Where Aciklama ='GEÇER' And OgrNo in ( Select OgrNo From Kimlik Where MezDurum is Null ) Group By OgrNo Yukarıdaki sorguda öğrenciliği devam edenlerin geçtikleri derslere ait kredi toplamları Öğrenci No ve Kredi Toplamı şeklinde listeleme yapılmaktadır. -33-
Dr. Serkan DİŞLİTAŞ Örnek 12: Select OgrNo, Ad, Soyad From Kimlik Where OgrNo in ( Select OgrNo From Notlar Where Aciklama = 'GEÇER' Group By OgrNo Having Sum( Kr ) >= 110 ) Yukarıdaki sorguda; Notlar tablosunda öğrenci tabanlı gruplandırma yapılarak geçilen derslerin kredi toplamı 110 a eşit ve daha büyük olan öğrencilerin Kimlik tablosundan OgrNo, Ad ve Soyad alanları listelenir. Örnek 13: (Uygulama) (HUBİS DC Not Güncelleme Store Procedure içerisinden alınmıştır) -- DC Notu : GEÇER olarak Güncellenir ---------------------------------------------- Update o_karteks Set Basari_Durumu = 'GEÇER' Where O_Ogrenim_Bilgileri_ID in ( Select O_Ogrenim_Bilgileri_ID From @YANO_Ogr_Tablo Where YANO>=2.0 ) AND L_Donem_Adi_ID = @L_Donem_Adi_ID AND ( GANO_Harf_Notu = 'DC' ) AND D_Alinis_Turu Not in ('M', 'm') ------------------------------------------------------------------------------------ 3.12. Tablolar Arası Bağlantı Şekilleri Birden çok tablodan verilerin alınarak çeşitli sorguların yapılması için değişik yöntemler kullanılmaktadır. Bu yöntemlere bağlı olarak elde edilen sonuçlar değişik değişik olmaktadır. Bağlantı şekilleri: Kartezyen Bağlantı Eşit Bağlantı İç Bağlantı ( Inner Koin ) Dış Bağlantı ( Left Outer Join, Right Outer Join, Full Outer Join ) Birleşim ( Union ) Bağlantı Heterojen Bağlantı Örnek 1: Select * From Kimlik, Notlar Yukarıdaki örnekte Kartezyen Bağlantı yöntemi kullanılmıştır. Elde edilen kayıt sayısı iki tablo sayısının çarpımına eşittir. Burada birinci tablonun her kaydı için ikinci tablonun tüm kayıtlarıyla bağlantı yapılarak sonuç elde edilir. -34-
Bölüm 3: DML Veri İşleme Dili Not: Bir tablonun tüm kayıtlarını diğer tabloya uygulamak için Kartezyen bağlantı kullanılabilir. Örnek 2: --s_kartezyen_01.sql Select o.ogrno, o. Ad, o.soyad, d.derskodu, d.dersadi From Ogrenciler as o, DersKimlik as d Order By OgrNo Örnek 3: -- s_kartezyen_02.sql Select o.okulno, o.ad, o.soyad, d.derskodu, d.dersadi, d.kr From Ogrenciler as o, Dersler as d Where o.okulno Like '114526%' AND d.yoptikkod like '4526%' Örnek 4: Select K.OgrNo, K.Ad, K.Soyad, N.DersKodu, N.Donem, N.Vize, N.Final, N.Aciklama From Kimlik as K, Notlar as N Where K.OgrNo = N.OgrNo -35-
Dr. Serkan DİŞLİTAŞ Yukarıdaki örnekte Eşit Bağlantı yöntemi kullanılmıştır. Burada iki tablo içerisinde bir eşitleme yapılmış ve ikisinde de şarta uyan ortak olan kayıtlar elde edilmektedir. Burada Kimlik tablosundan Numara, Ad ve Soyad bilgileri, Notlar tablosundan da Donem, DersKodu, Vize, Final ve Aciklama bilgileri alınarak bir liste elde edilmiştir. Örnek 5: Select K. OgrNo, K.Ad, K.Soyad, N.Donem, N.DersKodu, N.Vize, N.Final, N.Aciklama From Kimlik as K, Notlar as N Where (K.OgrNo = N.OgrNo) And N.Derskodu='4526205' Kimlik ve Notlar tablosundan OgrNo alanına göre Eşit Bağlantı ile Derskodu 4526205 olan kayıtlar için ilgili alanlar alınmaktadır. Örnek 6: Select * From Kimlik as K Inner Join Notlar as N on (K.OgrNo = N.OgrNo ) Yukarıdaki örnekte İç Bağlantı (Inner Join) yöntemi kullanılmıştır. Sadece şarta uyan kayıtlar elde edilmektedir. Burada Inner Join ya da Join kullanılabilir. -36-
Bölüm 3: DML Veri İşleme Dili Örnek 7: Select * From Kimlik as K Left Outer Join Notlar as N on ( K.OgrNo = N.OgrNo ) Yukarıdaki örnekte Dış Bağlantı ( Left Outer Join ) yöntemi kullanılmıştır. Burada eşleşmede sol taraftaki tablo referans alınır ve diğer tabloda karşılığı yoksa boş kalır. -37-
Dr. Serkan DİŞLİTAŞ Örnek 8: Select * From Kimlik as K Right Outer Join Notlar as N on ( K. OgrNo = N.OgrNo ) Yukarıdaki örnekte Dış Bağlantı ( Right Outer Join ) yöntemi kullanılmıştır. Burada eşleşmede sağ taraftaki tablo referans alınır ve diğer tabloda karşılığı yoksa boş kalır. -38-
Bölüm 3: DML Veri İşleme Dili Örnek 9: Aşağıda MSSQL Server de Transact-SQL olarak yazılmış bir Left Outer Join örneği ve elde edilen sonuç görülmektedir. -39-
Dr. Serkan DİŞLİTAŞ Örnek 10: Aşağıda MSSQL Server de Transact-SQL olarak yazılmış bir Right Outer Join örneği ve elde edilen sonuç görülmektedir. Örnek 11: Select * From Kimlik as K Full Outer Join Notlar as N on (K. OgrNo = N.OgrNo) -40-
Bölüm 3: DML Veri İşleme Dili Yukarıdaki örnekte Dış Bağlantı ( Full Outer Join ) yöntemi kullanılmıştır. Burada şarta uymayan kayıtlar için karşılıkları boş kalır. Örnek12: Select * From Kimlik26 Union Select * From Kimlik27 Yukarıdaki örnekte Birleşim (Union) yöntemi kullanılmıştır. Yapısal olarak benzer özellikli iki tablonun birleştirilerek sanki tek bir tablodan sorgu yapılır gibi listenin elde edilmesi sağlanır. İki tabloda da tamamıyla aynı olan ikinci bir kayıt tekrarı engellenir. Burada N.Ö. ve İ.Ö. Bilgisayar Tek. ve Prog. Öğrenci kimlik tabloları birleştirilerek ortak bir liste elde edilir. Örnek 13: Select * From :Takip: Bilgisayar.Dbf as T1, :Ogrenci: Seramik.Db as T2 Where T1. Numara = T2. OgrNo Yukarıdaki örnekte Heterojen Bağlantı yöntemi kullanılmıştır. Bu bağlantı şeklinde farklı veritabanlarından alınan tablolar üzerinde şartlar oluşturularak sonuç liste elde edilmektedir. (Burada *. Dbf dosyası Database, *.db ise Paradox veritabanıdır.) -41-
Dr. Serkan DİŞLİTAŞ ÖRNEK UYGULAMA 3 Tablo Bağlantısı Yöntem : Left Outer Join Bağlantısı Select o.okulno, o. Adi, o. Soyadi, n.ogretimyili, n. DersKodu, d.dersadi, d.kredi, n.harfsonuc From Ogrenciler as o Left Outer Join Notlar as n on (o.okulno=n.okulno) Left Outer Join Dersler as d on (n.derskodu=d. DersKodu) Yöntem : Eşit Bağlantı Select From Where o.okulno, o. Adi, o. Soyadi, n.ogretimyili, n.yoptikkod, d.dersadi, d.kredi, n.harfsonuc Ogrenciler as o, Notlar as n, Dersler as d (o.okulno=n.okulno) AND (n.yoptikkod=d.yoptikkod) -42-