Çoklu Tablolardan Sorgulamalar

Transkript

Çoklu Tablolardan Sorgulamalar
10. Hafta
Çoklu Tablolardan Sorgulama Yapma
BPR255 Veritabanı
Yönetim Sistemleri-II
Bu Derste Öğrenecekleriniz:
1- Birden Fazla Tablodan Sorgulama
2- Tablo Birleştirme işlemleri (JOIN)
a. INNER JOIN
b. OUTER JOIN
i. LEFT OUTER JOIN
ii. RIGHT OUTER JOIN
iii. FULL OUTER JOIN
3- Tablo Ekleme işlemleri (UNION)
4- Sorgulamaları VIEW (sanal tablo) olarak kaydetme
Aşağıdaki şemaya dikkat edin. Sorgulamalarımızı genellikle bu şemaya göre yapacağız.
Aşağıdaki sorgulama örneğine dikkat edin:
SELECT
B.[BÖLÜM KODU], S.[DERS KODU], D.[DERS ADI],
AVG(S.VİZE) AS [VİZE SINIF ORTALAMASI]
FROM
WHERE
SINAVLAR AS S, ÖĞRENCİLER AS O, BÖLÜMLER AS B, DERSLER AS D
S.[ÖĞRENCİ NO] = O.NUMARA AND S.[DERS KODU] = D.[DERS KODU]
AND B.[BÖLÜM KODU] = O.BÖLÜM
GROUP BY
HAVING
ORDER BY
S.[DERS KODU], D.[DERS ADI], B.[BÖLÜM KODU]
AVG(S.VİZE)>=60
[DERS KODU] DESC
Bu sorgunun ne anlama geldiği şimdilik sizin için bir şey ifade etmiyor olabilir. Ama bu karışık sorgulamanın
ne anlama geldiğini hep beraber öğreneceğiz.
1
Bartın MYO – Bilgisayar Programcılığı | Öğr. Gör. Bayram AKGÜL | 2013-2014 Güz Dönemi
10. Hafta
Çoklu Tablolardan Sorgulama Yapma
BPR255 Veritabanı
Yönetim Sistemleri-II
1. Birden Fazla Tablodan Sorgulama Yapma
Birden fazla tablodan sorgulama yapmak Kartezyen çarpım yapmak gibidir. Örneğin normalde öğrenciler
tablosunda 100 öğrenci bölümler tablosunda da 15 bölüm olduğunu düşünürsek aşağıdaki sorgulama
sonucu 100*15=1500 satır olacaktır.
SELECT *
FROM
ÖĞRENCİLER, BÖLÜMLER
Sorgu Sonuçlarından bazıları:
Dikkat ederseniz tabloda bölüm kodu iki defa görüntülenmiştir. Bunların birisi öğrenciler
tablosundan, diğeri ise bölümler tablosundan gelmektedir. Ve yine dikkat ederseniz bazı kayıtlar
tekrarlanmış gibidir. Çünkü iki tablo Kartezyen olarak çarpılmıştır.
Aslında bu tür bir sorgudan öğrenmek isteyeceğimiz öğrencilerin bölüm adıdır. Bu durumda
öğrenciler tablosundaki öğrencinin hangi bölümün öğrencisi olduğunu gösteren bir referans anahtarımızı
2
Bartın MYO – Bilgisayar Programcılığı | Öğr. Gör. Bayram AKGÜL | 2013-2014 Güz Dönemi
10. Hafta
Çoklu Tablolardan Sorgulama Yapma
BPR255 Veritabanı
Yönetim Sistemleri-II
kullanacağız. Öğrenciler tablosundaki öğrencinin hangi bölümün öğrencisi olduğunu gösteren referans
anahtar BÖLÜM alanıdır. Öyle ise referans anahtarımız ile kendisinden referans alınan alanın eşit olduğu
durumlar gerçek kayıtlar olacaktır.
Bu durumda tablodaki iki bölüm kodu bir birine eşit olan alanlara dikkat edin. Bizim sadece bu
satırları seçmemiz gerekir. Bunu yapmak için koşul olarak öğrenciler tablosundaki bölüm kodunun bölümler
tablosundaki bölüm koduna eşit olma şartını arayacağız. Buna tablo birleştirme diyoruz. Bunun sorgusu
aşağıdaki gibi yazılır.
SELECT
FROM
WHERE
*
ÖĞRENCİLER, BÖLÜMLER
ÖĞRENCİLER.BÖLÜM = BÖLÜMLER.[BÖLÜM KODU]
Sorgulama Sonucu:
Hala tabloda bölüm kodu iki defa var! Bundan kurtulmak için * yerine direk olarak görmek istediğimiz alan
isimlerini yazmamız gerekiyor.
SELECT
FROM
WHERE
NUMARA, ADI, SOYADI, [BÖLÜM KODU], [BÖLÜM ADI]
ÖĞRENCİLER, BÖLÜMLER
ÖĞRENCİLER.BÖLÜM = BÖLÜMLER.[BÖLÜM KODU]
Böyle bir sorgu yazdığımız zaman hata verebilir. Çünkü SELECT ile seçeceğimiz alanlardan bazıları iki tabloda
da olabilir. Böyle durumlarda hangi tablonun alanını seçmek istediğimizi belirtmemiz gerekiyor. Bunun
yerine sorguyu aşağıdaki gibi yapmamız gerekecektir.
SELECT
FROM
WHERE
3
ÖĞRENCİLER.NUMARA, ÖĞRENCİLER.ADI, ÖĞRENCİLER.SOYADI,
BÖLÜMLER.[BÖLÜM KODU], BÖLÜMLER.[BÖLÜM ADI]
ÖĞRENCİLER, BÖLÜMLER
ÖĞRENCİLER.BÖLÜM = BÖLÜMLER.[BÖLÜM KODU]
Bartın MYO – Bilgisayar Programcılığı | Öğr. Gör. Bayram AKGÜL | 2013-2014 Güz Dönemi
10. Hafta
Çoklu Tablolardan Sorgulama Yapma
BPR255 Veritabanı
Yönetim Sistemleri-II
Yukarıdaki örnekte aslında hangi alanın hangi tabloya ait olduğunu sistem biliyor. Dolayısıyla yukarıdaki
örnek için tablo isimlerini alanların önünde belirtmek zorunda değiliz. Fakat aynı isimde farklı tablolara ait
alanlar olsaydı bunu belirtmemiz zorunlu olacaktı. Aslında sisteme hangi alanın hangi tabloya ait olduğunu
sürekli biz bildirirsek hem sistemde daha az iş yükü oluşacak, hem de yazdığımız sorgu anlaşılır olacaktır.
Bu sefer de her alan için uzun uzun tablo adını yazmak zor gelebiliyor. Bunun yerine kısaltmaları
kullanabiliriz. Uzun uzun tabloların ismini yazmaktansa tablo isimlerini AS ile takma isimlerini oluşturarak
kullanabiliriz. Aşağıdaki örnekte öğrenciler için O, bölümler için B takma ismi kullanılmıştır.
SELECT
FROM
WHERE
O.NUMARA, O.ADI, O.SOYADI, B.[BÖLÜM KODU], B.[BÖLÜM ADI]
ÖĞRENCİLER AS O, BÖLÜMLER AS B
O.BÖLÜM = B.[BÖLÜM KODU]
Örneğin Öğrenciler, Dersler ve Sınavlar tablosunu birleştirelim. Öğrenciler tablosunda 100, Dersler
tablosunda 6, Sınavlar tablosunda ise 500 kayıt varsa aşağıdaki sorgu sonucu 6*100*500 = 300000 satır
olacaktır.
SELECT *
FROM
ÖĞRENCİLER, DERSLER, SINAVLAR
Fakat biz bunu düzeltmek için tablolardaki referans anahtarları kendisinden referans alınmış anahtarlar ile
eşitleyerek sorguyu oluşturduğumuzda gerçek sonuçları alacağız.
SELECT
FROM
WHERE
4
*
ÖĞRENCİLER AS O, DERSLER AS D, SINAVLAR AS S
O.NUMARA = S.[ÖĞRENCİ NO] AND D.[DERS KODU] = S.[DERS KODU]
Bartın MYO – Bilgisayar Programcılığı | Öğr. Gör. Bayram AKGÜL | 2013-2014 Güz Dönemi
10. Hafta
Çoklu Tablolardan Sorgulama Yapma
BPR255 Veritabanı
Yönetim Sistemleri-II
Sorgu sonucunda görüldüğü gibi ders kodu, öğrenci numarası tekrar etmiş, istemediğimiz alanlar tabloda
bulunuyor. Tüm alanları sorgulamak yerine sorgumuzu şekildeki gibi yaparsak daha anlamlı olacaktır.
SELECT O.NUMARA, O.ADI, O.SOYADI, D.[DERS KODU], D.[DERS ADI],
S.VİZE, S.FİNAL, S.ORTALAMA
FROM
ÖĞRENCİLER AS O, DERSLER AS D, SINAVLAR AS S
WHERE O.NUMARA = S.[ÖĞRENCİ NO] AND D.[DERS KODU] = S.[DERS KODU]
Sorgu Sonucu:
Şimdi artık aşağıdaki sorgunun ne anlama geldiğini biliyoruz:
SELECT
B.[BÖLÜM KODU], S.[DERS KODU], D.[DERS ADI],
AVG(S.VİZE) AS [VİZE SINIF ORTALAMASI]
FROM
SINAVLAR AS S, ÖĞRENCİLER AS O, BÖLÜMLER AS B, DERSLER AS D
WHERE
S.[ÖĞRENCİ NO] = O.NUMARA AND S.[DERS KODU] = D.[DERS KODU]
AND B.[BÖLÜM KODU] = O.BÖLÜM
GROUP BY
HAVING
ORDER BY
S.[DERS KODU], D.[DERS ADI], B.[BÖLÜM KODU]
AVG(S.VİZE)>=60
[DERS KODU] DESC
Yukarıdaki sorgulamanın sonucu aşağıdaki gibi olacaktır.
5
Bartın MYO – Bilgisayar Programcılığı | Öğr. Gör. Bayram AKGÜL | 2013-2014 Güz Dönemi
10. Hafta
Çoklu Tablolardan Sorgulama Yapma
BPR255 Veritabanı
Yönetim Sistemleri-II
2. Tablo Birleştirme İşlemleri (JOIN)
JOIN (birleştir, eşleştir) bir veri tabanında iki veya daha fazla veri tabanı tablosunu ortak bir paydada bir
araya getirmek amacıyla kullanılan SQL sorgu işlemidir. Örneğin bir tablonuzda Kişiler var, diğer iki
tablomuzda ise bu kişilerin telefonları ve mail adresleri olmuş olsun. Bazı kişilerin telefon veya mail
adreslerini sorgulamak istediğimizde önce kişinin numarasını daha sonrada bu numaraya göre kişinin mail
veya telefon numarasını sorgulayabiliriz. Bunun için en az iki veya üç sorgu yazmamız gerekecektir. Böyle
durumlarda JOIN işlemi bunu tek sorguda yapabilmenizi sağlar.
Aşağıdaki örnek veri tabanının tabloları arasındaki ilişkilere dikkat edelim. JOIN işlemlerini bu tablolara
göre yapacağız.
Bu tablolara göre bir kişinin sonsuz telefon numarası veya sonsuz mail adresi olabilmektedir. Örneğin
kişilere ait telefon numaralarını sorgulamak istersek şimdiye kadar öğrendiğimiz yöntem ile aşağıdaki gibi
bir sorgulama yapabiliriz.
SELECT K.NUMARA, ADI, SOYADI, TELEFON
FROM
KISILER K , TELEFONLAR T
WHERE K.NUMARA = T.NUMARA
Bu sorgulama sonucu ile kişilere ait varsa bütün telefon numaraları gelecektir. Fakat telefon numarası
olmayan kişi kayıtları gelmeyecektir.
Kişiler
tablosundaki
tüm kayıtlar .
6
Bartın MYO – Bilgisayar Programcılığı | Öğr. Gör. Bayram AKGÜL | 2013-2014 Güz Dönemi
10. Hafta
Çoklu Tablolardan Sorgulama Yapma
BPR255 Veritabanı
Yönetim Sistemleri-II
Yukarıdaki sorgunun aynısını JOIN komutu ile aşağıdaki gibi yapabiliriz.
SELECT K.NUMARA, ADI, SOYADI, TELEFON
FROM
KISILER K INNER JOIN TELEFONLAR T
ON K.NUMARA = T.NUMARA
JOIN komutları INNER JOIN ve OUTER JOIN olmak üzere iki temel gruba ayrılır. OUTER JOIN de kendi
içinde LEFT OUTER JOIN, RIGHT OUTER JOIN ve FULL OUTER JOIN olmak üzere üçe ayrılır. INNER JOIN
komutu ile birleştirilmek istenen her iki tabloda sadece eşleşen kayıtlar gösterilir. Örneğin kişilerin mail
adreslerine yönelik bir sorgulama yapılacağı zaman aşağıdaki gibi bir sorgulama yapılabilir.
SELECT K.NUMARA, ADI, SOYADI, MAIL
FROM
KISILER K INNER JOIN MAILLER M
ON K.NUMARA = M.NUMARA
Bu sorgunun sonucunda sadece numarası eşleşen kayıtlar gelecektir.
Eğer mail tablosunda olmayan kişilerin de sorguda görünmesi isteniyorsa bu durumda aşağıdaki gibi bir
sorgu yazılabilir.
SELECT
FROM
K.NUMARA, ADI, SOYADI, MAIL
KISILER K LEFT OUTER JOIN MAILLER M
ON K.NUMARA = M.NUMARA
Bu sorgulama sonucuna dikkat edilirse sol
tarafa yazılan tablo esas tablo olarak kabul
edilmektedir.
Bu sorgulama ile sol tablodaki tüm kayıtlar
getirilir. Buna karşılık sağ tarafa yazılan
tablodan kayıtlar getirilerek sol taraftaki
kayıtlar ile eşleştirilir. Eşleştirme bu
sorgulamada ON K.NUMARA = M.NUMARA
şeklinde yapılmıştır. Eğer sol tablodaki kayda
karşılık sağ tarafta eşleşen kayıt yoksa karşısı
NULL olarak kalmaktadır.
Bir başka örnek olarak telefonlar tablosu ile mailler tablosunu birleştirelim:
7
Bartın MYO – Bilgisayar Programcılığı | Öğr. Gör. Bayram AKGÜL | 2013-2014 Güz Dönemi
10. Hafta
SELECT
FROM
Çoklu Tablolardan Sorgulama Yapma
BPR255 Veritabanı
Yönetim Sistemleri-II
T.NUMARA, TUR, TELEFON, MAIL
TELEFONLAR T LEFT OUTER JOIN MAILLER M
ON T.NUMARA = M.NUMARA
LEFT JOIN birleştirmesinde ana
tablo sol tarafta yazılan tablo
olduğundan sol taraftaki
telefonlar tablosundaki tüm
kayıtlar getirilmiş, karşılığında
varsa mailler tablosundan
kayıtlar getirilmiştir. Karşılığı
yoksa NULL bırakılmıştır.
Şimdi de sol tarafa mailler tablosunu yazalım.
SELECT
FROM
M.NUMARA, MAIL, TUR, TELEFON
MAILLER M LEFT OUTER JOIN TELEFONLAR T
ON M.NUMARA = T.NUMARA
LEFT JOIN birleştirmesinde ana
tablo sol tarafta yazılan tablo
olduğundan sol taraftaki
mailler tablosundaki tüm
kayıtlar getirilmiş, karşılığında
varsa telefonlar tablosundan
kayıtlar getirilmiştir. Karşılığı
yoksa NULL bırakılmıştır.
RIGHT JOIN; LEFT JOIN birleştirmesinin tam tersi olarak davranmaktadır. RIGHT JOIN birleştirmesinde ana
tablo sağdaki tablo olmaktadır.
FULL OUTER JOIN birleştirmelerinde ise her iki tabloda da olan tüm kayıtlar birleştirilir. Varsa eşleşen
kayıtlar eşleştirilir. Yoksa karşıları NULL olarak kalır.
SELECT
FROM
T.NUMARA, TUR, TELEFON, MAIL
TELEFONLAR T FULL OUTER JOIN MAILLER M
ON T.NUMARA = M.NUMARA
Bu sorgulama ile hem telefonlar tablosundaki tüm kayıtlar hem de mailler tablosundaki tüm kayıtlar
eşleştirilerek görüntülenmiştir. Telefonu olup maili olmayan veya maili olup telefonu olmayan kayıtların
karşılıkları NULL olarak bırakılmıştır.
8
Bartın MYO – Bilgisayar Programcılığı | Öğr. Gör. Bayram AKGÜL | 2013-2014 Güz Dönemi
10. Hafta
Çoklu Tablolardan Sorgulama Yapma
BPR255 Veritabanı
Yönetim Sistemleri-II
Not: LEFT OUTER JOIN, RIGHT OUTER JOIN veya FULL OUTER JOIN birleştirmelerinde OUTER anahtar
sözcüğünü yazmak isteğe bağlıdır. Yazılmasa da işlem gerçekleştirilir.
Aynı şekilde INNER JOIN birleşimlerinde de INNER anahtar sözcüğünü yazmak isteğe bağlıdır. Eğer sadece
JOIN yazılsa INNER JOIN anlamına gelmektedir.
JOIN
LEFT JOIN
RIGHT JOIN
FULL JOIN
veya
veya
veya
veya
INNER
LEFT
RIGHT
FULL
JOIN
OUTER
OUTER
OUTER
JOIN
JOIN
JOIN
JOIN işlemleri ile ikiden fazla tablo birleştirilebilir.
SELECT
FROM
9
K.NUMARA, ADI, SOYADI, TUR, TELEFON, MAIL
KISILER K FULL JOIN TELEFONLAR T
ON K.NUMARA = T.NUMARA FULL JOIN MAILLER M ON K.NUMARA = M.NUMARA
Bartın MYO – Bilgisayar Programcılığı | Öğr. Gör. Bayram AKGÜL | 2013-2014 Güz Dönemi
10. Hafta
Çoklu Tablolardan Sorgulama Yapma
BPR255 Veritabanı
Yönetim Sistemleri-II
3. Tablo Ekleme İşlemleri (UNION)
JOIN birleştirmede tablolar sütun bazlı olarak birleştirilmekteydi. UNION işlemlerinde ise tablolar satır bazlı
olarak birleştirilmektedir.
UNION birden fazla sorgu cümlesinin sonucunu tek tabloda birleştirir. Kullanımı:
SELECT
UNION
SELECT
alan1,alan2,[,…n]
FROM
tablo_adı1
alan1,alan2,[,…n]
FROM
tablo_adı2
Not: varsayılanda UNION küme işlemleri gibi birleştirme yapar. Yani tekrarlayan kayıtlara izin vermez. Eğer
tekrarlayan kayıtlara izin verilsin isteniyorsa UNION ALL şeklinde yazılmalıdır.
SELECT
FROM
UNION
SELECT
FROM
K.NUMARA, ADI, SOYADI, TUR , TELEFON
KISILER K, TELEFONLAR T WHERE K.NUMARA = T.NUMARA
K.NUMARA, ADI, SOYADI, 'e-mail', MAIL
KISILER K, MAILLER M WHERE K.NUMARA = M.NUMARA
Not 1: UNION ile birleştirilen sorgu sonuçlarındaki alan isimleri her zaman ilk sorgudaki alan isimleri olur.
Yukarıdaki sorgu birleştirilmesinde telefonlar ile mailler birleştirilmiş ve telefon alanında maillerde
yazılmıştır.
Not 2: UNION ile sorgulamalar birleştirilmek isteniyorsa her iki sorgulamada da eşit sayıda alan olmalıdır.
Yukarıdaki ikinci sorguda mail için tür olmamasına rağmen eşit sayıda alan oluşması için tür için sabit olarak
‘e-mail’ bilgisi eklenmiştir.
Not 3: Aynı alana eklenmek istenen veriler bir birleri ile uyuşmalıdır. Örneğin sayısal veriye sahip bir alana
metinsel bir alan gelmemelidir.
10
Bartın MYO – Bilgisayar Programcılığı | Öğr. Gör. Bayram AKGÜL | 2013-2014 Güz Dönemi
10. Hafta
Çoklu Tablolardan Sorgulama Yapma
BPR255 Veritabanı
Yönetim Sistemleri-II
4. Sorgulamaları VIEW (Sanal Tablo) 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 O.NUMARA, O.ADI, O.SOYADI, D.[DERS KODU],
D.[DERS ADI], S.VİZE, S.FİNAL, S.ORTALAMA
FROM
ÖĞRENCİLER AS O, DERSLER AS D, SINAVLAR AS S
WHERE
O.NUMARA = 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.
Aşağıdaki sorgulama sonucu ile BPR251 dersinin sınav sonuçları listelenecektir.
SELECT * FROM [SINAV SONUCLARI] WHERE [DERS KODU] = 'BPR251'
Aşağıdaki sorgulama ile bir öğrencinin sınav sonuçları alınmıştır.
SELECT * FROM [SINAV SONUCLARI]
WHERE NUMARA = 1001001
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]
11
Bartın MYO – Bilgisayar Programcılığı | Öğr. Gör. Bayram AKGÜL | 2013-2014 Güz Dönemi

Benzer belgeler