İlişkisel cebir: temel operatörler
Seçme, izdüşüm, küme işlemleri, Kartezyen çarpım ve yeniden adlandırma ile sorgu yazmak; sınavdaki “write the relational algebra expression” ve “give the result” sorularının temeli.
İlişkisel cebir (relational algebra), ilişkiler (tablolar) üzerinde çalışan ve sonucu yine ilişki olan küçük bir operatör kümesidir. SQL’in arkasındaki matematik budur. Veritabanı motoru senin SQL sorgunu önce buna benzer bir ifadeye çevirir, sonra optimize eder. Sınavda iki tip soru çıkar: “Write a relational algebra expression for …” ve “Give the result of this expression”. İkisi için de bu sayfadaki altı temel operatörü bilmek yeter.
Altın kurallar:
- σ satır, π sütun seçer. Karıştıran en kolay puanı kaybeder.
- Her sonuç bir küme. Tekrar eden satır olmaz; π tekrarları siler.
- ∪, −, ∩ sadece birleşim uyumlu (union-compatible) ilişkiler arasında yapılır.
- × tek başına neredeyse hiç işe yaramaz. Arkasından bir σ ile eşleşme koşulu gelir.
- İfadeyi içten dışa oku. En içteki parantez önce hesaplanır.
Örnek veritabanı
Bütün dönem aynı küçük üniversite veritabanını kullanıyoruz. Bu sayfada en çok şu tablolar lazım.
student
| stu_id | name | dept_name | tot_cred |
|---|---|---|---|
| S1 | Ada | CS | 60 |
| S2 | Bora | CS | 30 |
| S3 | Cem | EE | 45 |
| S4 | Defne | MATH | 90 |
| S5 | Ece | CS | 15 |
| S6 | Firat | EE | 0 |
| S7 | Gizem | NULL | 10 |
course
| course_id | title | dept_name | credits |
|---|---|---|---|
| CS101 | Intro to Programming | CS | 4 |
| CS201 | Data Structures | CS | 4 |
| CS305 | Databases | CS | 3 |
| EE210 | Circuits | EE | 3 |
| MA101 | Calculus | MATH | 4 |
| MA202 | Linear Algebra | MATH | 3 |
| BI100 | Biology | BIO | 3 |
takes (S6 hiç ders almamış, S3’ün CS101 notu henüz yok)
| stu_id | course_id | grade |
|---|---|---|
| S1 | CS101 | A |
| S1 | CS201 | B |
| S1 | CS305 | A |
| S1 | MA101 | B |
| S2 | CS101 | B |
| S2 | CS201 | C |
| S3 | EE210 | A |
| S3 | MA101 | C |
| S3 | CS101 | NULL |
| S4 | MA101 | A |
| S4 | MA202 | A |
| S4 | CS305 | B |
| S5 | CS101 | F |
| S7 | MA202 | B |
instructor ve department
| inst_id | name | dept_name | salary |
|---|---|---|---|
| I1 | Aksoy | CS | 95000 |
| I2 | Demir | CS | 80000 |
| I3 | Kaya | EE | 85000 |
| I4 | Sahin | MATH | 70000 |
| I5 | Celik | MATH | 72000 |
| I6 | Yildiz | BIO | 60000 |
| dept_name | building | budget |
|---|---|---|
| CS | Galata | 500000 |
| EE | Galata | 350000 |
| MATH | Rumeli | 200000 |
| BIO | Kadikoy | 150000 |
teaches(inst_id, course_id): (I1, CS101), (I1, CS305), (I2, CS201), (I3, EE210), (I4, MA101), (I5, MA202). I6 ders vermiyor, BI100’ü kimse vermiyor.
Seçme: σ
Seçme (selection) , ‘nin koşulunu sağlayan satırlarını döndürür. Sütunlar aynen kalır. Koşulda karşılaştırma operatörleri () ve mantıksal bağlaçlar ( ve, veya, değil) kullanılır.
| stu_id | name | dept_name | tot_cred |
|---|---|---|---|
| S1 | Ada | CS | 60 |
| S2 | Bora | CS | 30 |
| S5 | Ece | CS | 15 |
İki koşul aynı satırı ilgilendiriyorsa tek seçmede birleşir: sonucu S1 (Ada) ve S2 (Bora).
Seçme sırası önemli değildir: .
İzdüşüm: π
İzdüşüm (projection) , sadece listelenen sütunları bırakır. İlişki bir küme olduğu için tekrar eden satırlar silinir.
| dept_name |
|---|
| CS |
| EE |
| MATH |
| NULL |
7 öğrenci var ama sonuç 4 satır. SQL’de SELECT dept_name FROM student 7 satır döndürür; ilişkisel cebirle aynı sonucu almak için SELECT DISTINCT yazman gerekir. SQL çoklu küme (multiset) semantiği kullanır, cebir küme semantiği.
TUZAK · π satır sayısını küçültebilir. “How many tuples?” sorusunda tabloyu sayıp geçme. İzdüşümden sonra aynı görünen satırları tek say.
Bileşim (composition)
Her operatörün sonucu bir ilişki olduğu için operatörler iç içe yazılır. 75000’den fazla kazanan hocaların adları:
Sıra önemli: önce σ, sonra π. Tersini yazarsan () ifade geçersiz olur, çünkü izdüşümden sonra salary sütunu artık yok.
Küme işlemleri: ∪, −, ∩
Üçü de iki ilişkinin birleşim uyumlu olmasını ister:
- aynı derece (arity), yani aynı sütun sayısı,
- . sütunların alanları (domain) aynı.
Sütun adlarının aynı olması gerekmez, sonuç soldaki ilişkinin adlarını alır.
S1’in ve S4’ün aldığı derslerle çalışalım: = {CS101, CS201, CS305, MA101}, = {MA101, MA202, CS305}.
| İfade | Anlamı | Sonuç |
|---|---|---|
| ikisinden en az birinin aldığı | CS101, CS201, CS305, MA101, MA202 | |
| ikisinin de aldığı | CS305, MA101 | |
| S1’in alıp S4’ün almadığı | CS101, CS201 | |
| S4’ün alıp S1’in almadığı | MA202 |
Fark değişmeli değildir: . Kesişim temel operatör sayılmaz, çünkü farkla yazılabilir: .
Fark ile “hiç” soruları. Hiçbir öğrencinin almadığı dersler:
Öğrencisi ve hocası olan bölümler ise kesişimdir: = {CS, EE, MATH}. BIO’nun öğrencisi yok, NULL’un hocası yok.
Kartezyen çarpım: ×
, ‘nin her satırını ‘nin her satırıyla yan yana koyar. Satır sayısı , sütun sayısı derece toplamı. Aynı adlı sütunlar tablo adıyla ayrılır.
: satır, sütun (instructor.dept_name ve department.dept_name ayrı).
Bu 24 satırın çoğu anlamsızdır: Aksoy’u BIO binasıyla eşleştirir. Anlamlı olanları seçmeyle tutarsın:
| name | building |
|---|---|
| Aksoy | Galata |
| Demir | Galata |
| Kaya | Galata |
| Sahin | Rumeli |
| Celik | Rumeli |
| Yildiz | Kadikoy |
24 satırdan 6’sı kaldı, her hocaya kendi bölümü. Bu “çarp, sonra eşitlikle seç” kalıbı birleştirmenin (join) tanımıdır. Haftaya ⋈ ile kısaltacağız.
TUZAK · eşleşme koşulunu unutmak. Çarpımdan sonra σ yazmazsan “her hoca her binada” gibi sahte satırlar sonuca girer. Çarpım gören her ifadede “tabloları hangi sütun bağlıyor?” diye sor.
Yeniden adlandırma: ρ
, ifadesinin sonucuna adını verir. sütunları da yeniden adlandırır. Asıl işi: bir tabloyu kendisiyle karşılaştırmak. İki kopyaya farklı ad vermeden içinde hangi salary’nin hangi kopyadan geldiğini söyleyemezsin.
Örnek: en yüksek maaş (toplu fonksiyon kullanmadan). Fikir: en yüksek maaş, kendisinden daha yüksek bir maaş bulunmayan maaştır.
1) ρ_i(instructor) × ρ_j(instructor) 36 satır
2) σ_{i.salary < j.salary}(...) i'den fazla kazanan bir j var
3) π_{i.salary}(...) = {80000, 85000, 70000, 72000, 60000}
4) π_salary(instructor) − (3) = {95000}
Koşulu yaparsan aynı kalıp en düşük maaşı (60000) verir.
Temel ve türetilmiş operatörler
Altı temel (fundamental) operatör: . Bunlarla her ilişkisel cebir sorgusu yazılabilir. , birleştirmeler ve bölme bu altısından türetilir; sadece kısaltmadır.
| Operatör | Tür | Girdi | Sonuç derecesi |
|---|---|---|---|
| tekli | 1 ilişki | derece(R) | |
| tekli | 1 ilişki | ||
| tekli | 1 ilişki | derece(R) | |
| , | ikili | uyumlu 2 ilişki | derece(R) |
| ikili | 2 ilişki | derece(R) + derece(S) |
Sorgu ağacı (query tree)
Bir ifade ağaç olarak çizilir: yapraklar tablolar, iç düğümler operatörler, kök sonuç. Hocaların bina sorgusu için:
π name, building
|
σ instructor.dept_name = department.dept_name
|
×
/ \
instructor department
Ağaç aşağıdan yukarı hesaplanır. Optimizasyon haftasında (13. hafta) aynı sorgunun farklı ağaçlarını karşılaştırıp σ’yı çarpımın altına itmenin neden ucuz olduğunu göreceğiz.
Soru çözme yöntemi
“Write the relational algebra” sorusunda şu sırayı izle:
- Hangi tablolar lazım? Birden fazlaysa çarp ve bağlayan sütunları eşitle.
- Satır koşullarını σ’ya yaz.
- İstenen sütunları en dışta π ile al.
- Soruda “both / every / never / only” varsa küme işlemine ihtiyaç var: “both” → ∩, “never” → fark.
Örnek: kendi bölümü dışından ders alan öğrencilerin adları. Üç tablo lazım, iki eşleşme koşulu ve bir farklılık koşulu:
Çarpım satır, seçmeden sonra Ada, Cem ve Defne kalır. Gizem’in bölümü NULL olduğu için karşılaştırması doğru çıkmaz, satır elenir.
Sık yapılan hatalar
| Yanlış düşünce | Doğrusu |
|---|---|
| π satır sayısını korur | Tekrarları siler; 3 satır |
| “İkisini de alan” için | Tek satır iki değer alamaz, boş döner. İki küme kur, ∩ al |
| Önce π, sonra o sütuna σ | π attığı sütunu geri getirmez; önce σ yaz |
| Her iki ilişki aynı sütun sayısındaysa ∪ olur | Alanlar da sırayla aynı olmalı |
| Fark değişmeli değil | |
| satır sayısı | Çarpılır: |
| Kendi kendine çarpımda ρ gerekmez | Adlar çakışır; ρ ile iki kopyayı ayır |
| NULL ≠ ‘CS’ doğrudur | NULL ile her karşılaştırma bilinmez, satır seçilmez |
Kendini test et
Sınavdaki gibi İngilizce sorular. Önce kâğıt kalemle çöz, sonra cevabı aç.
Give the result of on the sample database.
Cevabı göster
Önce seçme: course tablosunda credits = 4 olan satırlar CS101, CS201 ve MA101. Sonra izdüşüm sadece course_id sütununu bırakır. Tekrar yok, üç satır kalır.
How many tuples and how many attributes does have?
Cevabı göster
Kartezyen çarpımda satır sayıları çarpılır, sütun sayıları toplanır. student 7 satır ve 4 sütun, course 7 satır ve 4 sütun. satır, sütun. İki tabloda da dept_name olduğu için sonuçta student.dept_name ve course.dept_name diye iki ayrı sütun olur.
Give the result of . How many tuples does it have?
Cevabı göster
department 4 satır ama CS ve EE ikisi de Galata'da. İlişkisel cebir küme semantiği kullanır, izdüşüm tekrarları siler. Sonuç 4 değil 3 satır: Galata, Rumeli, Kadikoy.
Write a relational algebra expression that returns the names of instructors in the MATH department whose salary is greater than 71000. Give the result.
Cevabı göster
İki koşul aynı satır üzerinde olduğu için tek bir seçmede ile birleşir:.
MATH hocaları Sahin (70000) ve Celik (72000). Sadece Celik 71000'i geçer.
Give the result of . What does it mean in plain English?
Cevabı göster
Soldaki küme bütün dersler (7 ders). Sağdaki küme teaches içinde geçen dersler: CS101, CS305, CS201, EE210, MA101, MA202. Fark, solda olup sağda olmayan: BI100. Anlamı: hiçbir hocanın vermediği dersler.
Write a relational algebra expression for the IDs of students who took both CS101 and MA101. Give the result.
Cevabı göster
“İkisini de” isteyen sorular tek seçmeyle çözülmez: boş döner, çünkü bir satırın course_id değeri aynı anda iki şey olamaz. Doğrusu iki ayrı küme kurup kesişim almak.
CS101 alanlar: S1, S2, S3, S5. MA101 alanlar: S1, S3, S4. Kesişim: S1, S3.
Give the result of .
Cevabı göster
CS101 alanlar: S1, S2, S3, S5. MA202 alanlar: S4, S7. Birleşim ikisini de tekrarsız toplar: S1, S2, S3, S4, S5, S7. Aynı sorgu tek seçmeyle de yazılabilir: .
Is a valid relational algebra expression? Why?
Cevabı göster
Birleşim, fark ve kesişim için iki ilişki birleşim uyumlu (union-compatible) olmalı: aynı sayıda sütun ve sırayla aynı tür alan (domain). Sol taraf 2 sütunlu, sağ taraf 1 sütunlu. İfade geçersiz. SQLite de aynı hatayı verir: “do not have the same number of result columns”.
Write a relational algebra expression that returns the IDs of students who have not taken any course. Give the result.
Cevabı göster
“Hiç ... yapmamış” kalıbı fark ile çözülür: herkes eksi yapanlar. = S1..S7. = S1, S2, S3, S4, S5, S7. Fark: S6 (Firat).
Using only , , , and (no aggregation), write an expression for the lowest instructor salary. Give the result.
Cevabı göster
Tabloyu kendisiyle çarpmak için iki kopyaya farklı ad ver: (36 satır). “kendinden daha az kazanan biri olan” satırları tutar. Bunların değerleri en düşük olamaz.
Bütün maaşlardan bunları çıkar: geriye 60000 (Yildiz) kalır.
Using , , and , write an expression for the names of students who took at least one course offered by a department other than their own. Give the result on the sample data.
Cevabı göster
Üç tabloyu çarp, eşleşme koşullarını ve farklı bölüm koşulunu seçmede yaz:.
Ada (CS) MA101 almış, Cem (EE) MA101 ve CS101 almış, Defne (MATH) CS305 almış. Gizem'in bölümü NULL: NULL ile karşılaştırma doğru sayılmaz, Gizem sonuca girmez.
How many tuples does return? Is equal to ?
Cevabı göster
A notları: S1-CS101, S1-CS305, S3-EE210, S4-MA101, S4-MA202. Toplam 5 satır.
Art arda iki seçme her zaman tek bir seçmesine eşittir ve sıraları değiştirilebilir (commutative). İkisi de S4'ün iki A satırını döndürür.
Doğrulama: Bütün sonuç tabloları verify/SEN2104/04.mjs içinde JS küme işlemleriyle (lib.mjs: sigma, pi, union, minus, intersect, product, rho) hesaplandı ve her ifadenin SQL karşılığı node:sqlite (SQLite 3.53) üzerinde çalıştırılıp aynı sonucu verdiği kontrol edildi (54 kontrol, 0 hata).