SQL as DQL
Watn das?
- Structured Query Language als Data Query Language
- Wir schauen uns heute das "normale" SQL, was alle DBMS sharen an
- Leider können wir nicht alles in Tupeln modellieren
- Dementsprechend schauen wir, das wir das anders (mit joins etc.) modellieren können
Queries
- Mit queries können wir logischerweise Daten abfragen bzw. modifizieren
- Identifizieren tun wir die wie gehabt mit
columnrowundtable - Wir müssen heutezutage nicht mehr alles in Shouty-Case machen, aber das ist gut, um zu spezifizieren was daten(typen) und oder Logikanafragen etc. sind
- Logischerweise können wir alles irgendwie stacken und so sehr komplexe Queries bauen
SELECT-FROM-WHERE
- Das ist die "simpelste" sache die du machen kannst
- Hier fragen wir einfach daten anhand einer Condition ab, nichts wildes, sollte einfach zu verstehen sein
SELECT attribute, list FROM table WHERE condition;
Vergleich zu Relationaler Algebra
WHERE Clause
- hier "passiert" die Condition
- Es gibt verschiedene Conditionale Operatoren
- Vergleichsoperatoren (Sprich )
[not] between x and y[not] like patternXis [not] in listYis [not] distinct fromis conditionZis {[not] true | [not] false}
Matching Strings
- Strings sind immer von '' umgeben
- Ebenso sind sie case-sensitiv
- Um zu suchen können wir wildcards verwenden:
%für eine beliebige Anzahl von arbiträren Zeichen_für genau ein Zeichen
- Diese wildcards können mit anderen Wildcards und Zeichen kombiniert werden
- Diese ggf. kombinierten Queries können dann in einer Query wie
SELECT first_name, last_name FROM employee WHERE last_name LIKE %man_;verwendet werden;
Querying Multiple Tables
- Wir können auch mehrere Tabellen gleichzeitig betrachten und Abfragen
- Das machen wir, indem wir mehrere Tabellen zusammenjoinen
- Joins brauchen ja schon eine (oder mehrere) condition(s) um zusammengeklebt zu werden
- Relational ausgedrückt sieht das dann so aus:
- In SQL sieht das dann So aus:
SELECT first_name, last_name, address FROM employee, department WHERE department.name = 'Research' AND department.number = employee.department_number;
Renaming
- Manchmal haben wir das problem, dass mehrere Attribute den gleichen Namen haben
- Damit das nicht zu einem Problem wird, können wir dann Tabellen usw. umbenennen
- Das machen wir mit dem
askeyword - Sprich
SELECT name as employee_name FROM employee WHERE name = 'Friedrich Wilhelm XXVI';
Multi-Set Operatoren

- Diese Operatoren können verschiedene Formen annehmen, die wir schon aus der Mengenlehre kennen.
- So kann man z.b. die
UNIONnehmen, als auchINTERSECTundEXCEPT - Wichtig ist hier, den unterschied im Kopf zu behalten, denn sonst kann es lustig werden
- So kann man z.b. die

Joins
- Mit joins kann man tabellen zusammensetzen
- Das geht mithilfe von Spalten die den gleichen wert haben (sprich Foreign-Key / Primary-Key paare o.ä.)
- Wir können dann so eine RIEEESIIGE Tabelle erschaffen, die dann am ende alles enthält
- Falls man keine Spalte mit den selben Namen und werten hat, kann man mit dem
USINGoperator auch einiges schaffen - Das sieht dann in etwa so aus:
USING (department.number) - Alternativ gibt es auch noch den
ONOperator.- Der sieht dann so aus:
SELECT D.number, E.ssn, E.first_name, E.last_name FROM employee AS E JOIN department AS D ON E.ssn = D.manager_ssn;
- Der sieht dann so aus:
- Diesen Operator kann man auch mit einer Condition verbinden, um dann beim Joinen noch auszusortieren.
- Joins kann man übrigens auch auf sich selber ausführen, wobei man dann auf jeden fall die Attribute umbennen muss
- Es gibt bekanntlich auch noch den outer join, aber wo ist denn da der unterschied?
-
The join between two tables, which returns the values of an inner join and the unmatched rows from the left (or right) table, is called left (or right) outer join
-
The join between two tables, which returns the values of an inner join and the results of a left and right outer join, is called a full outer join
-
- Beim joinen werden leere Werte immer mit
NULLaufgefüllt 


Doppelte Werte Entfernen: DISTINCT
- Normalerweise passiert das öfter, dass wir doppelte werte haben
- Das ist manchmal nicht ganz so passend, wenn das so ist
- Deswegen klnnen wir dann mit dem
DISTINCTOperator identische Tuple bzw. Reihen einfach entfernen - Syntaktisch wird der Operator einfach hinter
SELECTaufgerufen, also:SELECT DISTINCT FROM...
Resultate Sortieren
- Es gibt auch noch den
ORDER BYoperator - Damit können wir sachen (wer hätte es gedacht) Sortieren
- Das machen wir mit den datentypen und ner Richtung (
ASCfür ascending,DESCfür decending)
Verschachtelte Queries
- Um richtig Fucked Up Queries zum (rekursiven) Suchen zu basteln können wir mehrer SQL queries ineinander verschachteln
- So können wir z.b. auf das Resultat von einer Query eine weiter ausführen (denn unterm strich ist das resultat einer query immer eine tabelle, nur manchmal ist da halt nur ein einzelner, alleiner, nutzloser und echt blöder Wert drin)
- Falls das nicht das ist, was wir machen wollen, können wir einfach den
COMPOperator nutzen um etwas zu VERGLEICHEN (BOAH KRANK HAHAHAHAHAHAHAHHAHAHAHAHAHHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHHAHAHAHAHAHHAHAHAHAHAHHAHAHAHAHAHAHAHHAHAHAHAHA) (ja, ich hab keine lust mehr)
EXISTS
- Wir können mit
EXISTSundNOT EXISTSschauen ob was da ist lol
