SEN2104 · 4. hafta · Relational Algebra

İ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.

relational algebraselectionprojectionunionset differenceintersectionCartesian productrenameunion-compatibleset semanticsquery tree

İ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:

  1. σ satır, π sütun seçer. Karıştıran en kolay puanı kaybeder.
  2. Her sonuç bir küme. Tekrar eden satır olmaz; π tekrarları siler.
  3. ∪, −, ∩ sadece birleşim uyumlu (union-compatible) ilişkiler arasında yapılır.
  4. × tek başına neredeyse hiç işe yaramaz. Arkasından bir σ ile eşleşme koşulu gelir.
  5. İ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_idnamedept_nametot_cred
S1AdaCS60
S2BoraCS30
S3CemEE45
S4DefneMATH90
S5EceCS15
S6FiratEE0
S7GizemNULL10

course

course_idtitledept_namecredits
CS101Intro to ProgrammingCS4
CS201Data StructuresCS4
CS305DatabasesCS3
EE210CircuitsEE3
MA101CalculusMATH4
MA202Linear AlgebraMATH3
BI100BiologyBIO3

takes (S6 hiç ders almamış, S3’ün CS101 notu henüz yok)

stu_idcourse_idgrade
S1CS101A
S1CS201B
S1CS305A
S1MA101B
S2CS101B
S2CS201C
S3EE210A
S3MA101C
S3CS101NULL
S4MA101A
S4MA202A
S4CS305B
S5CS101F
S7MA202B

instructor ve department

inst_idnamedept_namesalary
I1AksoyCS95000
I2DemirCS80000
I3KayaEE85000
I4SahinMATH70000
I5CelikMATH72000
I6YildizBIO60000
dept_namebuildingbudget
CSGalata500000
EEGalata350000
MATHRumeli200000
BIOKadikoy150000

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) σp(R)\sigma_{p}(R), RR‘nin pp koşulunu sağlayan satırlarını döndürür. Sütunlar aynen kalır. Koşulda karşılaştırma operatörleri (=,≠,<,≤,>,≥=, \neq, <, \le, >, \ge) ve mantıksal bağlaçlar (∧\land ve, ∨\lor veya, ¬\lnot değil) kullanılır.

σdept_name=’CS’(student)\sigma_{dept\_name = \text{'CS'}}(student)

stu_idnamedept_nametot_cred
S1AdaCS60
S2BoraCS30
S5EceCS15

İki koşul aynı satırı ilgilendiriyorsa tek seçmede birleşir: σdept_name=’CS’∧tot_cred>20(student)\sigma_{dept\_name = \text{'CS'} \land tot\_cred > 20}(student) sonucu S1 (Ada) ve S2 (Bora).

Seçme sırası önemli değildir: σp(σq(R))=σq(σp(R))=σp∧q(R)\sigma_{p}(\sigma_{q}(R)) = \sigma_{q}(\sigma_{p}(R)) = \sigma_{p \land q}(R).

İzdüşüm: π

İzdüşüm (projection) πA1,…,Ak(R)\pi_{A_1, \dots, A_k}(R), sadece listelenen sütunları bırakır. İlişki bir küme olduğu için tekrar eden satırlar silinir.

πdept_name(student)\pi_{dept\_name}(student)

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ı:

πname(σsalary>75000(instructor))={Aksoy,Demir,Kaya}\pi_{name}(\sigma_{salary > 75000}(instructor)) = \{\text{Aksoy}, \text{Demir}, \text{Kaya}\}

Sıra önemli: önce σ, sonra π. Tersini yazarsan (σsalary>75000(πname(instructor))\sigma_{salary > 75000}(\pi_{name}(instructor))) 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ı,
  • ii. 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: A=πcourse_id(σstu_id=’S1’(takes))A = \pi_{course\_id}(\sigma_{stu\_id = \text{'S1'}}(takes)) = {CS101, CS201, CS305, MA101}, B=πcourse_id(σstu_id=’S4’(takes))B = \pi_{course\_id}(\sigma_{stu\_id = \text{'S4'}}(takes)) = {MA101, MA202, CS305}.

İfadeAnlamıSonuç
A∪BA \cup Bikisinden en az birinin aldığıCS101, CS201, CS305, MA101, MA202
A∩BA \cap Bikisinin de aldığıCS305, MA101
A−BA - BS1’in alıp S4’ün almadığıCS101, CS201
B−AB - AS4’ün alıp S1’in almadığıMA202

Fark değişmeli değildir: A−B≠B−AA - B \neq B - A. Kesişim temel operatör sayılmaz, çünkü farkla yazılabilir: A∩B=A−(A−B)A \cap B = A - (A - B).

Fark ile “hiç” soruları. Hiçbir öğrencinin almadığı dersler:

πcourse_id(course)−πcourse_id(takes)={BI100}\pi_{course\_id}(course) - \pi_{course\_id}(takes) = \{\text{BI100}\}

Öğrencisi ve hocası olan bölümler ise kesişimdir: πdept_name(student)∩πdept_name(instructor)\pi_{dept\_name}(student) \cap \pi_{dept\_name}(instructor) = {CS, EE, MATH}. BIO’nun öğrencisi yok, NULL’un hocası yok.

Kartezyen çarpım: ×

R×SR \times S, RR‘nin her satırını SS‘nin her satırıyla yan yana koyar. Satır sayısı ∣R∣⋅∣S∣|R| \cdot |S|, sütun sayısı derece toplamı. Aynı adlı sütunlar tablo adıyla ayrılır.

instructor×departmentinstructor \times department: 6⋅4=246 \cdot 4 = 24 satır, 4+3=74 + 3 = 7 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(σinstructor.dept_name=department.dept_name(instructor×department))\pi_{name,\, building}(\sigma_{instructor.dept\_name = department.dept\_name}(instructor \times department))

namebuilding
AksoyGalata
DemirGalata
KayaGalata
SahinRumeli
CelikRumeli
YildizKadikoy

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: ρ

ρx(E)\rho_{x}(E), EE ifadesinin sonucuna xx adını verir. ρx(A1,…,An)(E)\rho_{x(A_1, \dots, A_n)}(E) sütunları da yeniden adlandırır. Asıl işi: bir tabloyu kendisiyle karşılaştırmak. İki kopyaya farklı ad vermeden instructor×instructorinstructor \times instructor 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}

πsalary(instructor)−πi.salary(σi.salary<j.salary(ρi(instructor)×ρj(instructor)))={95000}\pi_{salary}(instructor) - \pi_{i.salary}(\sigma_{i.salary < j.salary}(\rho_{i}(instructor) \times \rho_{j}(instructor))) = \{95000\}

Koşulu >> yaparsan aynı kalıp en düşük maaşı (60000) verir.

Temel ve türetilmiş operatörler

Altı temel (fundamental) operatör: σ,π,∪,−,×,ρ\sigma, \pi, \cup, -, \times, \rho. Bunlarla her ilişkisel cebir sorgusu yazılabilir. ∩\cap, birleştirmeler ve bölme bu altısından türetilir; sadece kısaltmadır.

OperatörTürGirdiSonuç derecesi
σp(R)\sigma_{p}(R)tekli1 ilişkiderece(R)
πL(R)\pi_{L}(R)tekli1 ilişki∣L∣\lvert L \rvert
ρx(R)\rho_{x}(R)tekli1 ilişkiderece(R)
R∪SR \cup S, R−SR - Sikiliuyumlu 2 ilişkiderece(R)
R×SR \times Sikili2 ilişkiderece(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:

  1. Hangi tablolar lazım? Birden fazlaysa çarp ve bağlayan sütunları eşitle.
  2. Satır koşullarını σ’ya yaz.
  3. İstenen sütunları en dışta π ile al.
  4. 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:

πs.name(σs.stu_id=t.stu_id∧t.course_id=c.course_id∧s.dept_name≠c.dept_name(ρs(student)×ρt(takes)×ρc(course)))\pi_{s.name}(\sigma_{s.stu\_id = t.stu\_id \land t.course\_id = c.course\_id \land s.dept\_name \neq c.dept\_name}(\rho_{s}(student) \times \rho_{t}(takes) \times \rho_{c}(course)))

Çarpım 7⋅14⋅7=6867 \cdot 14 \cdot 7 = 686 satır, seçmeden sonra Ada, Cem ve Defne kalır. Gizem’in bölümü NULL olduğu için ≠\neq karşılaştırması doğru çıkmaz, satır elenir.

Sık yapılan hatalar

Yanlış düşünceDoğrusu
π satır sayısını korurTekrarları siler; πbuilding(department)\pi_{building}(department) 3 satır
“İkisini de alan” için σc=’X’∧c=’Y’\sigma_{c = \text{'X'} \land c = \text{'Y'}}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 ∪ olurAlanlar da sırayla aynı olmalı
R−S=S−RR - S = S - RFark değişmeli değil
R×SR \times S satır sayısı ∣R∣+∣S∣\lvert R \rvert + \lvert S \rvertÇarpılır: ∣R∣⋅∣S∣\lvert R \rvert \cdot \lvert S \rvert
Kendi kendine çarpımda ρ gerekmezAdlar çakışır; ρ ile iki kopyayı ayır
NULL ≠ ‘CS’ doğrudurNULL 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ç.

Soru 1kolay

Give the result of πcourse_id(σcredits=4(course))\pi_{course\_id}(\sigma_{credits = 4}(course)) on the sample database.

Cevabı göster
CS101, CS201, MA101

Ö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.

Soru 2kolay

How many tuples and how many attributes does student×coursestudent \times course have?

Cevabı göster
49 tuples, 8 attributes

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. 7⋅7=497 \cdot 7 = 49 satır, 4+4=84 + 4 = 8 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.

Soru 3kolay

Give the result of πbuilding(department)\pi_{building}(department). How many tuples does it have?

Cevabı göster
Galata, Rumeli, Kadikoy (3 tuples)

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.

Soru 4orta

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
π_name(σ_{dept_name='MATH' ∧ salary>71000}(instructor)) = Celik

İki koşul aynı satır üzerinde olduğu için tek bir seçmede ∧\land ile birleşir:πname(σdept_name=’MATH’∧salary>71000(instructor))\pi_{name}(\sigma_{dept\_name = \text{'MATH'} \land salary > 71000}(instructor)).
MATH hocaları Sahin (70000) ve Celik (72000). Sadece Celik 71000'i geçer.

Soru 5orta

Give the result of πcourse_id(course)−πcourse_id(teaches)\pi_{course\_id}(course) - \pi_{course\_id}(teaches). What does it mean in plain English?

Cevabı göster
BI100 (courses that no instructor teaches)

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.

Soru 6orta

Write a relational algebra expression for the IDs of students who took both CS101 and MA101. Give the result.

Cevabı göster
π_stu_id(σ_{course_id='CS101'}(takes)) ∩ π_stu_id(σ_{course_id='MA101'}(takes)) = S1, S3

“İkisini de” isteyen sorular tek seçmeyle çözülmez: σcourse_id=’CS101’∧course_id=’MA101’\sigma_{course\_id = \text{'CS101'} \land course\_id = \text{'MA101'}} 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.

Soru 7orta

Give the result of πstu_id(σcourse_id=’CS101’(takes))∪πstu_id(σcourse_id=’MA202’(takes))\pi_{stu\_id}(\sigma_{course\_id = \text{'CS101'}}(takes)) \cup \pi_{stu\_id}(\sigma_{course\_id = \text{'MA202'}}(takes)).

Cevabı göster
S1, S2, S3, S4, S5, S7

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: σcourse_id=’CS101’∨course_id=’MA202’\sigma_{course\_id = \text{'CS101'} \lor course\_id = \text{'MA202'}}.

Soru 8orta

Is πstu_id, name(student)∪πcourse_id(course)\pi_{stu\_id,\, name}(student) \cup \pi_{course\_id}(course) a valid relational algebra expression? Why?

Cevabı göster
No, not union-compatible (2 vs 1 attributes)

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”.

Soru 9zor

Write a relational algebra expression that returns the IDs of students who have not taken any course. Give the result.

Cevabı göster
π_stu_id(student) − π_stu_id(takes) = S6

“Hiç ... yapmamış” kalıbı fark ile çözülür: herkes eksi yapanlar.πstu_id(student)\pi_{stu\_id}(student) = S1..S7. πstu_id(takes)\pi_{stu\_id}(takes) = S1, S2, S3, S4, S5, S7. Fark: S6 (Firat).

Soru 10zor

Using only σ\sigma, π\pi, ×\times, −- and ρ\rho (no aggregation), write an expression for the lowest instructor salary. Give the result.

Cevabı göster
π_salary(instructor) − π_i.salary(σ_{i.salary > j.salary}(ρ_i(instructor) × ρ_j(instructor))) = 60000

Tabloyu kendisiyle çarpmak için iki kopyaya farklı ad ver: ρi(instructor)×ρj(instructor)\rho_i(instructor) \times \rho_j(instructor) (36 satır).σi.salary>j.salary\sigma_{i.salary > j.salary} “kendinden daha az kazanan biri olan” satırları tutar. Bunların i.salaryi.salary değerleri en düşük olamaz.
Bütün maaşlardan bunları çıkar: geriye 60000 (Yildiz) kalır.

Soru 11zor

Using σ\sigma, π\pi, ×\times and ρ\rho, 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
Ada, Cem, Defne

Üç tabloyu çarp, eşleşme koşullarını ve farklı bölüm koşulunu seçmede yaz:πs.name(σs.stu_id=t.stu_id∧t.course_id=c.course_id∧s.dept_name≠c.dept_name(ρs(student)×ρt(takes)×ρc(course)))\pi_{s.name}(\sigma_{s.stu\_id = t.stu\_id \land t.course\_id = c.course\_id \land s.dept\_name \neq c.dept\_name}(\rho_s(student) \times \rho_t(takes) \times \rho_c(course))).
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.

Soru 12kolay

How many tuples does σgrade=’A’(takes)\sigma_{grade = \text{'A'}}(takes) return? Is σstu_id=’S4’(σgrade=’A’(takes))\sigma_{stu\_id = \text{'S4'}}(\sigma_{grade = \text{'A'}}(takes)) equal to σgrade=’A’∧stu_id=’S4’(takes)\sigma_{grade = \text{'A'} \land stu\_id = \text{'S4'}}(takes)?

Cevabı göster
5 tuples; yes, both give (S4, MA101, A) and (S4, MA202, A)

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 ∧\land 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).

Deftere not kartı

σ_koşul(R): SATIR seçer, sütun sayısı aynı kalır. Koşulda ∧ ∨ ¬ = ≠ < > π_liste(R): SÜTUN seçer, TEKRARLARI SİLER (SQL'de DISTINCT gibi) R ∪ S, R − S, R ∩ S: birleşim uyumlu olmalı (aynı derece, aynı alanlar) R ∩ S = R − (R − S) (temel değil, türetilmiş) R × S: satır |R|·|S|, sütun derece(R)+derece(S); ortak adlar R.a, S.a × + σ(eşitlik) = birleştirme. Çarpımı tek başına bırakma, anlamsız eşleşme üretir ρ_x(R): kopyaya ad ver; tabloyu kendisiyle çarpmanın tek yolu "ikisini de" → ∩ "ya da" → ∪ veya σ(p ∨ q) "hiç yapmamış" → hepsi − yapanlar En büyük: hepsi − (daha büyüğü olanlar), ρ ile kendi çarpımı σ_p(σ_q(R)) = σ_{p∧q}(R) π_a(π_ab(R)) = π_a(R) NULL ile karşılaştırma doğru değil, satır elenir 6 temel: σ π ∪ − × ρ