0% found this document useful (0 votes)
7 views5 pages

SQL06

Uploaded by

kmltykmlty
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
7 views5 pages

SQL06

Uploaded by

kmltykmlty
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd

SQL Ders 6: Kompleks Sorgu İşlemleri BPR205 Veritabanı

Yönetim. Sis. II

Bu Derste Öğrenecekleriniz:
1. Sorgulama Yaparken Gruplama (GROUP BY)
2. HAVING kullanımı
3. Sorgulama Yaparken Sıralama (ORDER BY)
4. Sorgulama Yaparken Takma İsim Kullanma (AS)
5. Sorgulamalarda İşlem Yapma
6. Birden Fazla Tablodan Sorgulama
7. Sorgulamaları VIEW olarak kaydetme

Sorgulamaları genellikle bu şemaya göre yapacağız.

SQL’de bir sorgulama cümlesinin özeti aşağıdaki gibidir. Koşul ifadesine kadar olan kısmı daha önce işlemiştik. Bu
dersimizde sorgulamalarda gruplama, having koşul ifadesi ve sırlamayı da öğreneceğiz.

SELECT seçim_listesi
FROM tablo_kaynağı
[ WHERE koşul_ifadesi ]
[ GROUP BY gruplama_ifadesi ]
[ HAVING koşul_ifadesi ]
[ ORDER BY sıralama_şartı [ ASC | DESC ] ]

Bu sorgunun ne anlama geldiği şimdilik sizin için bir şey ifade etmiyor olabilir. Ama birazdan bu karışık
sorgulamanın ne anlama geldiğini hep beraber öğreneceğiz.

SELECT S.[DERS KODU], AVG(S.VİZE) AS [VİZE SINIF ORTALAMASI]


FROM SINAVLAR AS S, ÖĞRENCİLER AS O, BÖLÜMLER AS B
WHERE O.[BÖLÜM KODU] = 'BPR1' AND S.[ÖĞRENCİ NO] = [Link]
GROUP BY S.[DERS KODU]
HAVING AVG(S.VİZE)>=60
ORDER BY [DERS KODU] DESC

Bartın MYO – Öğr. Gör. Bayram AKGÜL 1


SQL Ders 6: Kompleks Sorgu İşlemleri BPR205 Veritabanı
Yönetim. Sis. II

1. Sorgulama Yaparken Gruplama 3. Sorgulama Yaparken Sıralama


(GROUP BY) (ORDER BY)
Sınavlar tablosundan bir derse ait vize veya final Sorgulama yaptığımız zaman sonuç genellikle
ortalamaları alınmak istenince aşağıdaki gibi bir kod kayıtların giriş sırasına göre gelir. İstersek sorgulama
yazılabilir. sonucunu bir veya birkaç alana göre sıraya koyabiliriz.
SELECT AVG(VİZE) Bunu sağlamak için ORDER BY anahtar sözcüğü
FROM SINAVLAR
WHERE [DERS KODU] = 'BPR205' kullanılır.

Fakat bu kod ile sadece bir derse ait ortalama alınmış SELECT [ÖĞRENCİ NO], VİZE
FROM SINAVLAR
olur. Bununla beraber ortalamasını görmek istediğimiz WHERE [DERS KODU] = 'BPR201'
ders kodunu bilmemiz gerekiyor. Sınavlar tablosundaki ORDER BY VİZE
tüm derslere ait ortalamaları görmek istediğimiz
Burada BPR201 kodlu dersin vize sonuçları küçükten
durumda tüm dersleri ders koduna göre gruplayıp
büyüğe sıralı olacak şekilde sınavlar tablosundan
sonra ortalamalarını almamız gerekiyor. Bunu SQL’de
öğrenci no ve vize alanları sorgulanıyor.
aşağıdaki kod ile sağlayabiliyoruz. SQL’de
sorgulamalarda kayıtları gruplamak GROUP BY
ORDER BY ile sıralama yapılırken küçükten-büyüğe
anahtar sözcüğü kullanılır.
veya büyükten-küçüğe sıralama yapmak mümkün.
SELECT [DERS KODU], AVG(VİZE)
FROM SINAVLAR Eğer küçükten büyüğe sıralama yapmak isteniyorsa
GROUP BY [DERS KODU] ORDER BY alan_adı ASC kullanılır. Eğer büyükten
küçüğe sıralama yapılacaksa ASC yerine DESC kullanılır.
GROUP BY kullanmak için AVG, SUM, MAX, MIN, Yani ORDER BY alan_adı DESC. Yukarıdaki sorguda ASC
COUNT fonksiyonlarından biri veya bir kaçı veya DESC belirtilmemiş. Böyle bir durumda ASC
kullanılmalıdır. geçerlidir ve sıralama küçükten büyüğe doğru yapılır.
SELECT [ÖĞRENCİ NO], VİZE
2. HAVING kullanımı FROM SINAVLAR
WHERE [DERS KODU] = 'BPR201'
ORDER BY VİZE DESC
Belirten bir grup veya bir küme işlemi için bir arama
koşulu olarak kullanılır. HAVING genellikle GROUP BY Burada sorgu sonucu vize büyükten küçüğe sıralanmış
deyimi ile beraber kullanılır. GROUP BY kullanılmadığı şekilde olacaktır.
durumlarda, HAVING bir WHERE yan tümcesi gibi
davranır. Eğer sıralama yapılacak alan tipi char veya varchar gibi
SELECT [DERS KODU], AVG(VİZE) yazı tiplerinden oluşuyorsa bu durumda sıralama
FROM SINAVLAR alfabetik olarak yapılır.
GROUP BY [DERS KODU]
SELECT NUMARA, ADI, SOYADI
HAVING AVG(VİZE) >= 50
FROM ÖĞRENCİLER
WHERE [BÖLÜM KODU] = 'BPR1'
Bu sorgulama örneğinde vize ortalaması 50’den büyük ORDER BY SOYADI ASC
eşit olan derslerin vize ortalamalarını getirir.
Bu sorgu sonucuna göre öğrenciler tablosundan
Eğer bir öğrencinin ortalamasını almak istersek bu numara, adı, soyadı alanları seçilecek ve sorgu sonucu
durumda aşağıdaki gibi bir sorgulama yazabiliriz. soyadına göre alfabetik sırada olacak. Yani önce
SELECT [ÖĞRENCİ NO] , AVG(VİZE) soyadları ‘A’ ile başlayanlar, en sonunda da ‘Z’ ile
FROM SINAVLAR
GROUP BY [ÖĞRENCİ NO] başlayanlar olacak. Eğer tersine bir sorgulama
yapılmak istenirse yani önce Z ile başlayanlar gelsin
istiyorsanız ASC yerine DESC kullanmanız gerekecektir.

Bartın MYO – Öğr. Gör. Bayram AKGÜL 2


SQL Ders 6: Kompleks Sorgu İşlemleri BPR205 Veritabanı
Yönetim. Sis. II

4. Sorgulama Yaparken Takma İsim 5. Sorgulamalarda İşlem Yapma


Kullanma (AS)
SQL’de sorgulamalarda matematiksel işlemler
CREATE TABLE ÖĞRENCİLER yapılabiliyor.
( SELECT 3*4+6 AS İŞLEM
OGR_NO INT PRIMARY KEY,
OGR_ADI VARCHAR(25) NOT NULL,
OGR_SOY VARCHAR(25) NOT NULL,
TEL VARCHAR(20) NULL,
...
SELECT [ÖĞRENCİ NO],
)
(VİZE*0.4+FİNAL*0.6) AS ORTALAMA
Yukarıdaki gibi bir tablo tanımlandığını düşünelim. FROM SINAVLAR
WHERE [DERS KODU] = 'BPR205'
SELECT OGR_NO, OGR_ADI, OGR_SOY, TEL
FROM OGRENCILER Bu sorgulamada BPR205 kodlu derse ait ortalama her
Şeklinde bir sorgulama olduğu zaman sorgulamada öğrenci numarası için vize notunun yüzde 40’ı ve final
sütun isimleri aşağıdaki şekilde görüldüğü gibi tablo notunun yüzde 60’ı alınarak ortalama olarak ekrana
oluşturulurken kullanılmış isimlerden olacaktır. verilecektir. Sorgu sonucu şekildeki gibi olacaktır.

Burada OGR_NO yerine NUMARA, OGR_ADI yerine


ADI OGR_SOY yerine SOYADI, TEL yerine TELEFON
isimlerini görmek isteyebiliriz. Buna SQL de takma isim Sorgulama yaparken işlemler yapılabildiği gibi
kullanımı diyoruz. Bunu sağlamak için SQL’de AS güncellemelerde de işlemler yapılabilir. Örneğin vize
anahtar sözcüğü kullanılır. ve final notları girilmiş derslerin ortalamalarını
SELECT OGR_NO AS NUMARA, OGR_ADI AS ADI, otomatik olarak hesaplamak için aşağıdaki gibi bir
OGR_SOY AS SOYADI, TEL AS TELEFON
FROM OGRENCILER yöntem uygulanabilir.
UPDATE SINAVLAR
Bu sorgulama yapıldığı zaman sonuç aşağıdaki SET ORTALAMA = VİZE*0.4+FİNAL*0.6
WHERE [DERS KODU] = 'BPR201'
görünecektir.
Burada ortalama alanı başlangıçta tüm dersler için
NULL iken, update ifadesinden sonra BPR201 dersi için
vizenin yüzde 40’ı ve finalin yüzde 60’ı alınarak
Eğer takma isim birden fazla kelimeden oluşuyorsa ortalama olarak tablo güncellendi.
yani arada boşluklar olacaksa alan ismi tanımlarken
yaptığımız gibi köşeli parantezler arasına yazılır.
SELECT OGR_NO AS [ÖĞRENCİ NO]
FROM OGRENCILER

Tablo isimlerinde de takma isimler kullanılabilir. Fakat


tablo isimleri sorgulamalarda görünmediği için
genellikle anlaşılır isimler yerine kısaltmalar kullanılır.
Bunun ile ilgili ayrıntı birden fazla tablodan
sorgulamada gelecek.

SELECT * FROM ÖĞRENCİLER AS O

Bartın MYO – Öğr. Gör. Bayram AKGÜL 3


SQL Ders 6: Kompleks Sorgu İşlemleri BPR205 Veritabanı
Yönetim. Sis. II

6. Birden Fazla Tablodan Sorgulama SELECT NUMARA, ADI, SOYADI, [BÖLÜM KODU], [BÖLÜM ADI]
FROM ÖĞRENCİLER, BÖLÜMLER
WHERE ÖĞRENCİLER.[BÖLÜM KODU] = BÖLÜMLER.[BÖLÜM KODU]
Birden fazla tablodan sorgulama yapmak Kartezyen
Böyle bir sorgu yazdığımız zaman hata verecektir.
çarpım yapmak gibidir. Aşağıdaki sorguyu düşünün:
Çünkü select ile seçeceğimiz alanlardan bölüm kodu
Normalde öğrenciler tablosunda 4 öğrenci bölümler
hangi tabloya ait belli değil. Bunu belirtmemiz
tablosunda da 3 bölüm olduğunu düşünürsek
gerekiyor. Bunun yerine sorguyu aşağıdaki gibi
aşağıdaki sorgulama sonucu 12 satır olacaktır.
yapmamız gerekecek.
SELECT * FROM ÖĞRENCİLER, BÖLÜMLER
SELECT NUMARA, ADI, SOYADI,
Öğrenciler Tablosu: Bölümler Tablosu: BÖLÜMLER.[BÖLÜM KODU], [BÖLÜM ADI]
FROM ÖĞRENCİLER, BÖLÜMLER
WHERE ÖĞRENCİLER.[BÖLÜM KODU] = BÖLÜMLER.[BÖLÜM KODU]

Sorgu Sonucu:

Burada sistem numara, adı, soyadı alanlarının


öğrenciler tablosuna, bölüm adı alanının da bölümler
tablosuna ait olduğunu bir mekanizma sayesinde
biliyor. Aslında sisteme hangi alanın hangi tabloya ait
olduğunu bildirirsek daha az iş yükü oluşacaktır.

SELECT ÖĞRENCİ[Link], ÖĞRENCİ[Link],


Dikkat ederseniz tabloda bölüm kodu iki defa var. ÖĞRENCİ[Link], BÖLÜMLER.[BÖLÜM KODU],
BÖLÜMLER.[BÖLÜM ADI]
Bunların birisi öğrenciler tablosundan, diğeri ise FROM ÖĞRENCİLER, BÖLÜMLER
bölümler tablosundan geliyor. Aslında bu tür bir WHERE ÖĞRENCİLER.[BÖLÜM KODU] = BÖLÜMLER.[BÖLÜM KODU]
sorgudan öğrenmek isteyeceğimiz öğrencilerin bölüm
adıdır. Bu durumda tablodaki iki bölüm kodu bir birine Bu sefer de her alan için uzun uzun tablo adını yazmak
eşit olan işaretlenmiş alanlara dikkat edin. Bizim zor geliyor. Bunun yerine kısaltmaları kullanabiliriz.
sadece bu satırları seçmemiz gerekir. Bunu yapmak SELECT [Link], [Link], [Link],
için koşul olarak öğrenciler tablosundaki bölüm B.[BÖLÜM KODU], B.[BÖLÜM ADI]
kodunun bölümler tablosundaki bölüm koduna eşit FROM ÖĞRENCİLER AS O, BÖLÜMLER AS B
WHERE O.[BÖLÜM KODU] = B.[BÖLÜM KODU]
olma şartını arayacağız. Buna tablo birleştirme diyoruz.
Bunun sorgusu aşağıdaki gibi yazılır. Örnek 1: Öğrenciler, Dersler ve Sınavlar tablosunu
birleştirelim. Öğrenciler tablosunda 4, Dersler
SELECT * FROM ÖĞRENCİLER, BÖLÜMLER
WHERE ÖĞRENCİLER.[BÖLÜM KODU] = BÖLÜMLER.[BÖLÜM KODU] tablosunda 6, Sınavlar tablosunda ise 12 kayıt varsa
Sorgu Sonucu: aşağıdaki sorgu sonucu 6*4*12 = 288 satır olacaktır.

SELECT * FROM ÖĞRENCİLER, DERSLER, SINAVLAR

Bunu düzeltmek için sorguyu aşağıdaki gibi koşullarla


yeniden düzenleyelim.
Hala tabloda bölüm kodu iki defa var! Bundan
kurtulmak için * yerine direk alan isimlerini yazmamız SELECT * FROM ÖĞRENCİLER AS O, DERSLER AS D,
gerekiyor. Ama dikkat edin aşağıdaki gibi bir sorgu SINAVLAR AS S
WHERE [Link] = S.[ÖĞRENCİ NO]
yazdığımız zaman hata verecektir.
AND D.[DERS KODU] = S.[DERS KODU]

Bartın MYO – Öğr. Gör. Bayram AKGÜL 4


SQL Ders 6: Kompleks Sorgu İşlemleri BPR205 Veritabanı
Yönetim. Sis. II

Sorgu sonucunda görüldüğü gibi ders kodu, öğrenci numarası tekrar etmiş. Birde istemediğimiz alanlar tabloda
bulunuyor. Tüm alanları sorgulamak yerine sorgumuzu şekildeki gibi yaparsak daha anlamlı olacaktır.

SELECT [Link], [Link], [Link], D.[DERS KODU], D.[DERS ADI], S.VİZE, S.FİNAL, [Link]
FROM ÖĞRENCİLER AS O, DERSLER AS D, SINAVLAR AS S
WHERE [Link] = S.[ÖĞRENCİ NO] AND D.[DERS KODU] = S.[DERS KODU]

Ödev: Öğrenciler, Dersler, Bölümler ve Sınavlar tablosunu birleştirin. (Teslim tarihi 20 Aralık 2010 ders saati)

7. Sorgulamaları VIEW olarak kaydetme


Sorgulamalar view (sanal tablo) olarak kaydedilip daha sonra bu sanal tablolardan sorgulama yapılabiliyor. View
oluşturmak için CREATE VIEW view_adı AS sorgu şeklinde tanımlama yapılıyor.

CREATE VIEW SINAV_SONUCLARI


AS
SELECT [Link], [Link], [Link], D.[DERS KODU], D.[DERS ADI], S.VİZE, S.FİNAL, [Link]
FROM ÖĞRENCİLER AS O, DERSLER AS D, SINAVLAR AS S
WHERE [Link] = S.[ÖĞRENCİ NO] AND D.[DERS KODU] = S.[DERS KODU]

Daha sonra sanki SINAV_SONUCLARI diye bir tablomuz varmış gibi istediğimiz şekilde sorgulama yapabiliriz.
SELECT * FROM SINAV_SONUCLARI WHERE [DERS KODU] = 'BPR201'

View i sistemden silmek için DROP VIEW view_adı şeklinde komut yazılır. View silinince sistemdeki gerçek
tablolara bir zarar gelmez.
DROP VIEW SINAV_SONUCLARI

Bartın MYO – Öğr. Gör. Bayram AKGÜL 5

You might also like