Query

Ãœben aufhttps://sqlbolt.com/

Arbeitet auf Tabellen, nicht Tupel-Mengen, deshalb Duplikate möglich und es hat eine Implizite Ordnung.

Basics

SELECT <attr> as a1,  <attr> as a2, ...
FROM <tables...>
WHERE <conditions>
ORDER BY <attr1> desc, <attr2> asc;

Bei mehreren Tables wird Kreuzprodukt gebildet.

Bei jeder Anfrage kann andere Ordnung auftauchen.

Sortieren nach attr1 und wenn gleich dann nach attr2 .

Ausführungsreihenfolge

  1. FROM erstellt Kreuzprodukt
  1. WHERE checkt Bedingung
  1. ORDER BY ändert die beliebige Reihenfolge die beim Ausführen entstanden ist
  1. SELECT wählt gewählte Attribute

Dehalb kann man auf Spalten zugreifen die man am Ende nicht ausgewählt hat.

Mengenoperationen

Ohne Duplikate UNIONINTERSECTEXCEPT(MINUSin Oracle)

Mit Duplikate UNION ALLINTERSECT ALLEXCEPT ALL

Aggregatfunktionen

avg() , max() , min() , sum() , count()

Group by

Pro Gruppe ein einziges Tupel erstellt.

Duplikate werden entfernt.

SELECT <attr1>, <attr2>, sum(attr3) ... <attrn>
FROM <tables...>
WHERE <conditions>
GROUP BY <attr1>, <attr2>, <attr3> ... <attrn>
HAVING <conditions>

  1. Alle Attribute aus SELECT müssen auch in GROUP BY sein,

    außer sie werden in einer aggregierenden Funktion benutzt.

    • Grund
           Pets
      ----------------
      A    B    C
      ----------------
      Cat   10   False
      Dog   25   True
      Dog   20   False
      Cat   5    False
      SELECT A, B
      FROM Pets
      GROUP BY A

      Was sollte jetzt bei B ausgegeben werden in SELECT ?

  1. Wenn aggregierende Funktion in SELECT mit anderen Attributen → GROUP BY benutzen.

    Dann müssen sie auch in GROUP BY benutzt werden.

    • Beispiel

      Student ( MatrNr , Name , Semester )

      Angenommen wir suchen alle Namen von Studierenden die am längsten studieren

      select Name, max(Semester)
      from Student;
      select Name, max(Semester)
      from Student
      group by Name;
      select Name
      from Student
      where Semester = (select max(Semester) from Student);

Nested Queries

Skalare retournieren in SELECT , WHERE

Tabellen retournieren in FROM

Mengenvergleiche

IN , NOT IN∈,∉\in, \not \in

ANY , ALL vergleich mit allen Werten einer Tabelle, zb durch >= any ageTable.age

EXISTS!isEmpty()solche queries nennt man "Existenziell quantifizierte Anfragen"

Umgang mit null

Prüfen

IS NULL , IS NOT NULL

Count

count(*) Zählt alle Tupel

count(att) Zählt alle ≠ null

count(distinct att) Zählt alle ≠ null

Arithmetische Ausdrücke

Wenn irgendein Operant null ist → immer null

Vergleichsoperatoren

Dreiwertige Logik in SQL: true, false, unknown

Wenn irgendein Operant null ist → immer unknown

Syntactic Sugar

Between, in

select * from StudentIn
where Semester >= 1 and Semester <= 4;
select * from StudentIn
where Semester between 1 and 4;
select * from StudentIn
where Semester in (1 ,2 ,3 ,4); --konstante Liste

Zeichenketten Wildcards

like

_ genau 1 Zeichen

% beliebig viele (oder gar kein) Zeichen

select distinct MatrNr
from Vorlesung v, hören h
where h.VorlNr = v.VorlNr and v.Titel like '%thik%';

Case

select MatrNr , ( case when Note < 1.5 then 'S1'
when Note < 2.5 then 'U2'
when Note < 3.5 then 'B3'
when Note < 4.5 then 'G4'
else 'N5' end )
from prüfen ;

coalesce

coalesce(val , -1) → Wenn val null ist, dann gebe -1 aus.

kann auch mit cases gelöst werden

concat

select Vorname + Nachname from Person;
select Vorname || Nachname from Person;
select concat(Vorname, Nachname) from Person; 

Joins

Zwischen Table namen:

cross join Kreuzprodukt (kann Beistrich ersetzen)

natural join natürlicher Join

[inner] join Theta-Join (oder inner join) → natürlicher Join mit Selektion

(left|right|full) outer join äußerer Join

Cross Join

select * from ProfessorIn, Vorlesung;
select * from ProfessorIn cross join Vorlesung;

Natural join

Nur Tupel aufgehoben die an den gleichen Spalten den gleichen Wert haben

select StudentIn.MatrNr, Name, Titel
from StudentIn, hören, Vorlesung
where StudentIn.MatrNr = hören.MatrNr and hören.VorlNr = Vorlesung.VorlNr;
select MatrNr, Name, Titel
from StudentIn natural join hören natural join Vorlesung;

Inner Join

"Inner" ist optional

Natural join mit zusätzlicher condition.

select Name, Titel
from ProfessorIn, Vorlesung
where PersNr = gelesenVon and Titel = 'Mäeutik';
select Name, Titel
from ProfessorIn join Vorlesung on PersNr = gelesenVon
where Titel = 'Mäeutik';

(Left, right, full) Join

Kann zusätzliche condition haben

Kann null Werte erzeugen

select s.MatrNr, s.Name, p.VorlNr, p.Note
from StudentIn s left outer join prüfen p
on s.MatrNr = p.MatrNr;