Temel Kavramlar & Relational Algebra'ya Giriş
İlişkisel veritabanlarını anlamak için dört temel kavramı bilmek gerekir:
Relational Algebra (İlişkisel Cebir), SQL gibi gerçek sorgu dillerinin temelini oluşturan matematiksel bir dildir. Her SQL sorgusunun karşılık gelen bir relational algebra sorgusu vardır.
Üniversite Veritabanı Şeması
Örneklerimizde kullanılan üniversite veritabanı 5 tablodan oluşmaktadır. Altı çizili alanlar birincil anahtar, renkli alanlar ise dış anahtardır.
Örnek veriler: 9 öğrenci, 3 bölüm, 6 ders, 5 section ve 6 kayıt mevcuttur. Bu veriler üzerinden tüm operatörleri adım adım inceleyeceğiz.
Select Operatörü
select(input_table, predicate)
Select operatörü, girdi tablosunun aynı sütunlarını korurken sadece belirtilen koşulu sağlayan satırları döndürür. Yani sütun sayısı değişmez; yalnızca bazı satırlar elenir.
Q3 için sorgu ağacı (query tree):
and, or, not mantıksal operatörleri ve
=, <, >, <=, >= karşılaştırma operatörleri kullanılabilir.
İç içe select'ler her zaman tek bir select'teki and ile eşdeğerdir.
Project Operatörü
project(input_table, {field_name(s)})
Project operatörü, girdi tablosunun tüm satırlarını korurken sadece belirtilen sütunları döndürür. Yani satır sayısı değişmez; yalnızca bazı sütunlar elenir.
Q6 için sorgu ağacı:
Q7 = select(project(STUDENT, {SName}), MajorId=10)
Bu sorgu geçersizdir!
Çünkü iç sorguda (project) sadece SName sütunu kalmıştır.
MajorId sütunu artık mevcut olmadığından dıştaki select bunu bulamaz ve hata verir.
Kural: Select her zaman Project'ten önce uygulanmalıdır (eğer select koşulunda kullanılan alan project'te elenmişse).
Sort Operatörü
sort(input_table, [field_name(s)])
Sort operatörü, girdi tablosunun tüm sütunlarını ve satırlarını aynen korur;
yalnızca satırların sırasını değiştirir.
Köşeli parantez [ ], sıralama alanlarının sıralı listesini belirtir.
İlk alan birincil sıralama, ikincisi ikincil sıralama kriteridir.
Rename Operatörü
rename(input_table, field_name, new_field_name)
Rename operatörü, girdi tablosunu olduğu gibi döndürür; yalnızca belirtilen bir sütunun adını değiştirir. Satır sayısı, sütun sayısı ve veriler değişmez.
Extend Operatörü
extend(input_table, expression, new_field_name)
Extend operatörü, girdi tablosunu olduğu gibi alır ve bir hesaplama ifadesi (expression) sonucunu içeren yeni bir sütun ekleyerek döndürür. Mevcut sütunlar ve satırlar değişmez; tabloya yeni bir alan eklenir.
GradYear-1863), sabit değerler ('BC'),
string birleştirme veya diğer sütun değerlerini kullanan hesaplamalar olabilir.
SQL'deki karşılığı SELECT cümlesindeki türetilmiş sütunlardır (ör. SELECT GradYear-1863 AS GradClass).
GroupBy Operatörü
groupby(input_table, {grouping_fields}, {aggregation_expressions})
GroupBy operatörü, girdi tablosunun satırlarını belirtilen alanlara göre gruplara ayırır ve her grup için bir çıktı satırı üretir. Gruplama alanları boş bırakılırsa tüm tablo tek grup sayılır. Aggregation ifadeleri boş bırakılırsa yalnızca benzersiz gruplama değerleri döner (DISTINCT etkisi).
Desteklenen aggregation fonksiyonları:
| MajorId | MinOfGradYear | MaxOfGradYear |
|---|---|---|
| 10 | 2004 | 2005 |
| 20 | 2001 | 2005 |
| 30 | 2003 | 2004 |
| MajorId | GradYear | CountOfSId |
|---|---|---|
| 10 | 2004 | 2 |
| 10 | 2005 | 1 |
| 20 | 2001 | 2 |
| 20 | 2004 | 1 |
| 20 | 2005 | 1 |
| 30 | 2003 | 1 |
| 30 | 2004 | 1 |
Karmaşık örnek: Herhangi bir section'da verilen en yüksek A sayısı
Alternatif: tek iç içe ifade olarak (Q21) — aşağıdaki sorgu ağacıyla özetlenir:
İki-Tablo Operatörlerine Giriş
İki-tablo operatörleri iki girdi tablosunu alır ve tek bir çıktı tablosu üretir. Her birinin farklı bir semantiği vardır.
Product & Join
product(T1, T2)
İki tablodaki her satırın her satırla eşleştirilmesiyle oluşan tüm kombinasyonları üretir. Eğer T1'de N satır, T2'de M satır varsa çıktıda N×M satır olur. STUDENT (9 satır) × DEPT (3 satır) = 27 satır.
join(T1, T2, predicate) ≡ select(product(T1, T2), predicate)
Join, Product ve Select'in bileşimidir. İki tablonun sadece belirtilen koşulu sağlayan satır kombinasyonlarını döndürür. Bu sayede gereksiz kombinasyonlar otomatik elenir.
Q23 için sorgu ağacı:
Semijoin (Yarı Birleştirme)
semijoin(T1, T2, predicate)
Semijoin, birinci tablonun satırlarından yalnızca ikinci tablodaki herhangi bir satırla koşulu sağlayanları döndürür. İkinci tablodan hiçbir sütun gelmez — yalnızca birinci tablonun sütunları çıktıdadır.
| Q38 çıktısı — SectId | CourseId | Prof | YearOffered |
|---|---|---|---|
| 43 | 32 | einstein | 2001 |
| Q39 çıktısı — EId | StudentId | SectionId | Grade |
|---|---|---|---|
| 24 | 1 | 43 | C |
| 34 | 2 | 43 | B+ |
| Q40 çıktısı — SId | SName | GradYear | MajorId |
|---|---|---|---|
| 1 | joe | 2004 | 10 |
| 2 | amy | 2004 | 20 |
Sorgu ağacı (Q38–Q40):
Antijoin (Karşı Birleştirme)
antijoin(T1, T2, predicate)
Antijoin, Semijoin'in tam tersidir. Birinci tablonun satırlarından ikinci tablodaki herhangi bir satırla koşulu sağlamayanları döndürür. Yine yalnızca birinci tablonun sütunları çıktıdadır.
Gelişmiş örnek: Hiç F vermemiş profesörler
antijoin(SECTION, Q46, Prof=Prof)
hangi tablonun Prof'u olduğu belirsiz kalırdı.
Ek örnek: Her verdiği section'da F veren profesörler
Union (Birleşim)
union(T1, T2)
Union operatörü, iki tablonun tüm satırlarını birleştirir. Her iki tablonun da aynı şemaya (aynı sütun adları ve türleri) sahip olması zorunludur. SQL'deki UNION ile doğrudan örtüşür.
SName → Person, Q53'te Prof → Person yapılmadan union mümkün olmazdı.
Outer Join (Dış Birleştirme)
outerjoin(T1, T2, predicate)
Outer Join, normal join'in çıktısına ek olarak koşulu sağlamayan satırları da null değerlerle doldurarak ekler. Bu sayede hiç eşleşmesi olmayan satırlar da kaybolmaz.
| SId | SName | MajorId | GradYear | EId | StudentId | SectionId | Grade |
|---|---|---|---|---|---|---|---|
| 1 | joe | 10 | 2004 | 14 | 1 | 13 | A |
| 1 | joe | 10 | 2004 | 24 | 1 | 43 | C |
| 2 | amy | 20 | 2004 | 34 | 2 | 43 | B+ |
| 4 | sue | 20 | 2005 | 44 | 4 | 33 | B |
| 4 | sue | 20 | 2005 | 54 | 4 | 53 | A |
| 6 | kim | 20 | 2001 | 64 | 6 | 53 | A |
| 3 | max | 10 | 2005 | null | null | null | null |
| 5 | bob | 30 | 2003 | null | null | null | null |
| 7 | art | 30 | 2004 | null | null | null | null |
| 8 | pat | 20 | 2001 | null | null | null | null |
| 9 | lee | 10 | 2004 | null | null | null | null |
• LEFT OUTER JOIN: Sol tablonun tüm satırları korunur (yukarıdaki örnek)
• RIGHT OUTER JOIN: Sağ tablonun tüm satırları korunur
• FULL OUTER JOIN: Her iki tablonun tüm satırları korunur
SQL (Structured Query Language)
SQL, relational algebra üzerine inşa edilmiş endüstri standardı sorgu dilidir. Her SQL sorgusu bir relational algebra sorgusuna karşılık gelir. SQL komutları 5 ana kategoriye ayrılır:
ALTER
DROP
TRUNCATE
UPDATE
DELETE
REVOKE
(FROM, WHERE,
GROUP BY...)
ROLLBACK
SAVEPOINT
Veritabanı şemasını tanımlamak ve yapısal değişiklikler yapmak için kullanılır.
- CREATE: Yeni veritabanı veya tablo oluşturur
- ALTER: Mevcut tabloya sütun ekler/değiştirir/siler
- DROP: Tablo veya veritabanını siler (geri alınamaz)
- TRUNCATE: Tablodaki tüm satırları siler (yapı kalır)
Veritabanındaki veriyi güncellemek için 4 temel yol:
- Değerleri vererek tek satır eklemek (INSERT INTO ... VALUES)
- Bir sorgu sonucunu kullanarak çoklu satır eklemek (INSERT INTO ... SELECT)
- Satırları silmek (DELETE FROM ... WHERE)
- Mevcut satırları güncellemek (UPDATE ... SET ... WHERE)
Kullanıcı yetki yönetimi için:
- GRANT: Belirtilen kullanıcıya belirtilen işlemleri yapma izni verir
- REVOKE: Kullanıcının veritabanı nesnelerine erişimini kaldırır
Bir SQL sorgusunun 6 temel cümlesi (clause) vardır:
-
1SELECT — Çıktı tablosunun sütunlarını listeler. Bir giriş tablosunun sütunu olabileceği gibi hesaplanmış bir ifade de olabilir (extend'e karşılık gelir).
-
2FROM — Giriş tablolarını listeler. Saklı bir tablo/view adı ya da anonim view tanımlayan bir alt sorgu (subquery) olabilir (product/join'e karşılık gelir).
-
3WHERE — Seçim koşulunu (predicate) içerir (select operatörüne karşılık gelir).
-
4GROUP BY — Gruplama alanlarını belirtir. Çıktıda her benzersiz alan kombinasyonu için bir satır üretir (groupby operatörüne karşılık gelir).
-
5HAVING — GROUP BY sonrasında uygulanan koşul. Aggregation fonksiyonlarını kullanabilir (ör.
HAVING COUNT(*) > 2). -
6ORDER BY — Çıktı satırlarının sıralama düzenini belirtir (sort operatörüne karşılık gelir). Tüm diğer işlemler tamamlandıktan sonra uygulanır.