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
FROM
erstellt Kreuzprodukt
WHERE
checkt Bedingung
ORDER BY
ändert die beliebige Reihenfolge die beim Ausführen entstanden ist
SELECT
wählt gewählte Attribute
Dehalb kann man auf Spalten zugreifen die man am Ende nicht ausgewählt hat.
Mengenoperationen
Ohne Duplikate
UNION
INTERSECT
EXCEPT
(MINUS
in Oracle)
Mit Duplikate
UNION ALL
INTERSECT ALL
EXCEPT 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>
-
Alle Attribute aus
SELECT
müssen auch inGROUP 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
?
-
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

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;