MySQL, komplexer SELECT
MySQL, komplexer SELECT
SELECT Bestandteile
Begriff	Beschreibung	
Optionen zur Beeinflussung der Verarbeitung	
ALL	wird benutzt um alle unterschiedliche Werte zu erhalten (das ist der Standard)	
DISTINCT	wird benutzt um lediglich unterschiedliche Werte zu erhalten	
DISTINCTROW	wird benutzt um lediglich unterschiedliche Werte zu erhalten auch wenn durch die Verbindung in der Abfrage doppelte Einträge entstehen	
HIGH_PRIORITY	gibt dem SELECT höhere Priorität als eine Anweisung, die eine Tabelle aktualisiert	
STRAIGHT_JOIN	zwingt den Optimierer die Tabellen in der Reihenfolge in der sie in der FROM-Klausel aufgeführt sind einzubinden	
MAX_STATEMENT_TIME = N	setzt ein Anweisungsausführungs-Timeout abweichend von der System Variable max_statement_time	
Erweiterungen von MySQL die nicht in Standard-SQL enthalten sind	
SQL_SMALL_RESULT / SQL_BIG_RESULT	Optimierung im Zusammenhang mit GROUP BY / DISTINCT unter Verwendung von temporären Tabellen	
SQL_BUFFER_RESULT	Erzwingt ein zwischenspeichern des Ergebnisses in eine temporäre Tabelle	
SQL_CACHE / SQL_NO_CACHE	Zwischenspeichern des Ergebnisses im Abfragecache	
SQL_CALC_FOUND_ROWS	ermittelt die Ergebnismenge (Anzahl der Datensätze)	
Eingrenzung der Ergebnismenge	
WHERE	Eingrenzung durch Vergleiche von Feldwerten	
GROUP	Zusammenfassung bei Übereinstimmung von Feldwerten	
HAVING	Eingrenzung durch Vergleich der Ergebniswerte, am Ende vor der Übermittlung der Werte (Achtung: ohne Optimierung))	
LIMIT	Beschränkung der Ergebnismenge (Übergabe Start, Anzahl)	
PARTITION	Eingrenzungen auf Bereiche die zuvor in der Tabelle definiert werden müssen	
Sortierung der Ergebnismenge	
ORDER BY	Sortierung nach den angegebenen Feldern unter Angabe der Sortierrichtung (ASC = aufsteigend, DESC = absteigend)	

JOINS
Equi-Join, Inner-Join (oder auch nur Join) & Cross-Join
Liefert alle Ergebnisse (Werte der selektierten Felder) aus beiden Tabellen wo die Schlüsselfelder der Zuordnung zusammenpassen. z.B. alle Artikel die einem Autor zugeordnet sind und den zugeordneten Autor.
Der Cross-Join liefert ein Ergebnis aus beiden Tabellen es gibt ein kartesische Produkt der verknüpften Tabellen zurück falls keine Where-Bedingung angegeben wird. Ist in der Where-Bedingung die Verknüpfungseigenschaft angegeben entspricht das Ergebnis dem des Inner-Join ohne Where-Bedingung.
SELECT p.title, p.subtitle, a.name, a.imageFROM pages p, author aWHERE p.authorid = a.uid;
SELECT p.titel, p.subtitel, a.name, a.imageFROM pages p INNER JOIN author a ON p.authorid = a.uid;
SELECT p.titel, p.subtitel, a.name, a.imageFROM pages p CROSS JOIN author aWHERE p.authorid = a.uid;
Left-Join
Liefert alle Ergebnisse aus der ersten (links stehenden) Tabelle und die dazu passenden Werte aus der zweiten (rechts stehenden) Tabelle.  z.B. alle Artikel und die falls vorhanden ihre Autoren
SELECT p.titel, p.subtitel, a.name, a.imageFROM pages p LEFT JOIN author a ON p.authorid = a.uid;
Right-Join
Liefert alle Ergebnisse aus der zweiten (rechts stehenden) Tabelle und die dazu passenden Werte aus der ersten (links stehenden) Tabelle.  z.B. alle Autoren (auch mehrfach) mit den Artikeln die dem Autor zugeordnet sind
SELECT p.title, p.subtitle, c.body, c.imageFROM pages p RIGHT JOIN content c ON p.uid = c.pid;
Outher-Join
Lifert alle Ergebnisse aus beiden Tabellen. z.B. alle Autoren (auch mehrfach) mit allen Artikeln, auch Artikel ohne Autor und Autoren ohne Artikel. 
SELECT p.title, p.subtitle, c.body, c.imageFROM pages p OUTHER JOIN content c ON p.uid = c.pid;
Self-Join
Eine Tabelle wird mit sich selbst verknüpft, die folgende Abfrage würde z.B. alle Seiten der zweiten Ebene der Tabelle pages als Ergebnis liefern.
SELECT p2.uid, p2.titleFROM pages AS p1, pages AS p2WHERE p1.pid =0 AND p2.pid = p1.uid;
UNION SELECT
Wird genutzt um mehrere SELECTS zu verbinden zu einem Ergebnis, es ermöglicht also auch Ergebnisse aus unterschiedlichen Tabellen zu kombinieren, z.B. alle Autoren und Redakteure über 65 im Verlag.
(SELECT 'author', a.uid, a.name, a.image FROM author a WHERE age>65)UNION(SELECT 'redakteur', r.uid, r.name, r.image FROM redakteur r WHERE age>65);
Operatoren
Name	Beschreibung	
AND, &&	logisches UND (AND)	
=	Weist einen Wert zu, im Zusmenhang mit dem SET / UPDATE statement	
:=	Wert zuweisen	
BETWEEN ... AND ...	Überprüfen ob ein Wert in einem Bereich von Werten liegt	
BINARY	Wandelt eine Zeichenkette in einen Binärzeichenkette	
&	bitweise UND-Verknüpfung	
~	bitweise Invert (Umkehrung)	
|	bitweise ODER-Verknüpfung	
^	bitweise Exclusive-ODER-Verknüpfung	
CASE	Fall-Unterscheidungs Operator	
DIV	Ganzahlen Teilung (Division)	
/	Division Operator	
<=>	IS NOT DISTINCT Gleichheits Überprüfung NULL-safe	
=	Gleichheits Operator	
>=	größer/gleich Operator	
>	größer als Operator	
IS NOT NULL	ist nicht NULL, Wertüberprüfung	
IS NOT	ist nicht, boolscher Wertevergleich	
IS NULL	ist NULL, Wertüberprüfung	
IS	ist, boolscher Wertevergleich	
<<	bitweise Schiebeoperation nach links (shl)	
<=	kleiner/gleich Operator	
<	kleiner als Operator	
LIKE	Bestandteil (Teilzeichenkette), einfache Mustererkennung	
-	Minus Operator	
MOD, %	Divisionsrest (Modulo) Operator	
NOT BETWEEN ... AND ...	Überprüfen ob ein Wert nicht in einem Bereich von Werten liegt	
!=, <>	Ungleich Operator	
NOT LIKE	kein Bestandteil (Teilzeichenkette), einfache Mustererkennung	
NOT REGEXP	entspricht nicht der Regular Expression	
NOT, !	Negation des Wertes	
||, OR	logisches ODER (OR)	
+	Addition Operator	
REGEXP, RLIKE	entspricht der Regular Expression	
>>	bitweise Schiebeoperation nach rechts (SHR)	
SOUNDS LIKE	Klingt ähnlich, Vergleich des Soundex Strings	
*	Multiplikation Operator	
-	Change the sign of the argument	
XOR	logisches Exklusive-ODER (XOR)	

Funktionen
Name	Beschreibung	
Ablaufsteuerung	
IF()	IF/ELSE Konstrukt auf der Basis einer Überprüfung auf True	
IFNULL()	IF/ELSE Konstrukt auf der Basis einer Überprüfung auf NULL	
NULLIF()	Ergebnis ist NULL wenn der Ausdruck True ist	
Zeichenketten Funktionen	
ASCII()	numerischer Wert des ersten Zeichens einer Zeichenkette. Gibt bei einem Leer-String 0 zurück und NULL wenn der String den Wert NULL hat.	
BIN()	Liefert eine Zeichenkettendarstellung eines Binärwertes (Zahl) zurück	
CHAR()	Umwandlung Zahl in Zeichen	
CHAR_LENGTH(), CHARACTER_LENGTH()	Anzahl der Zeichen einer Zeichenkette	
CONCAT_WS()	Verketten von Zeichenketten mit Separator	
CONCAT()	Verketten von Zeichenketten	
ELT()	Liefert eine Zeichenkette aus einer Liste von Zeichenketten	
ENCODE()	Kodieren einer Zeichenkette	
ENCRYPT()	Verschlüsseln einer Zeichenkette	
FIELD()	Liefert die Position einer Zeichenkette in einer Liste von Zeichenketten	
FROM_BASE64()	dekodiert eine BASE64 kodierte Zeichenkette	
HEX()	hexadezimale Darstellung einer Dezimalzahl oder einer Zeichenkette	
INSERT()	Einfügen einer Zeichenkette in einer Zeichenkette an einer definierten Stelle	
INSTR()	Position des ersten Auftretens einer Zeichenkette in einer Zeichenkette	
LEFT()	Anzahl von Zeichen einer Zeichenkette beginnend von links	
LENGTH(), OCTET_LENGTH()	Länge der Zeichenkette in Bytes	
LOCATE(), POSITION()	Position des ersten Auftreten eines einer Teil-Zeichenkette in einer Zeichenkette	
LOWER(), LCASE()	Zeichekette in Kleinbuchstaben	
LPAD()	Zeichenkette links mit Füllzeichen(kette) auffüllen	
LTRIM()	Führende Leerzeichen entfernen	
MAKE_SET()	Umformen eines Bitwertes in eine Kommaseparierte Zeichenkette	
MID()	Teilzeichenkette aus einer Zeichenkette ab einer Position mit einer definierten Länge	
ORD()	Zeichencode des Ersten Zeichens einer Zeichenkette	
QUOTE()	Zeichenkette codieren um sie in SQL-Syntax benutzen zu können	
REPEAT()	Zeichenkette mehrfach wiederholen	
REPLACE()	Teilzeichenkette in einer Zeichenkette ersetzen	
REVERSE()	Reihenfolge der Zeichen einer Zeichenkette umkehren	
RIGHT()	Anzahl von Zeichen einer Zeichenkette beginnend von rechts	
RPAD()	Zeichenkette rechts mit Füllzeichen(kette) auffüllen	
RTRIM()	Leerzeichen am Ende einer Zeichenkette entfernen	
SOUNDEX()	soundex Zeichenkette	
SPACE()	Zeichenkette mit einer Anzahl von Leerzeichen	
STRCMP()	zwei Zeichenketten vergleichen	
SUBSTR(), SUBSTRING()	Teilzeichenkette aus Zeichenkette extrahieren	
SUBSTRING_INDEX()	Teilzeichenkette aus Zeichenkette extrahieren an Hand des Auftretens eines Trennzeichens	
TO_BASE64()	kodiert eine Zeichenkette BASE64	
TRIM()	Leerzeichen am Anfang und Ende einer Zeichenkette entfernen	
UCASE(), UPPER()	Zeichenkette in Großbuchstaben	
UNHEX()	hexadezimale Darstellung zurück wandeln, Umkehrung der Funktion HEX()	
WEIGHT_STRING()	Gewichtung einer Zeichenkette, ist z.B. unabhängig von Groß-/Kleinschreibung	
mathematische Funktionen	
ABS()	absoluten Wert, also ohne Vorzeichen	
ACOS()	Arkuskosinus	
ASIN()	Arcussinus	
ATAN(), ATAN2()	Arcustangens	
AVG()	Durchschnittswert vom Argument	
CEIL(), CEILING()	Liefert die kleinste ganze Zahl nicht kleiner als das Argument	
CONV()	Wandelt Zahlen zwischen verschiedenen Zahlensystemen	
COS()	Kosinus	
COT()	Kotangens	
DEGREES()	Konvertierung Bogenmaß in Grad	
EXP()	Exponent zur Basis e (die Basis des natürlichen Logarithmus)	
FLOOR()	Liefert die größte ganze Zahl nicht größer als das Argument	
LN()	natürlicher Logarithmus	
LOG()	natürlicher Logarithmus des ersten Argumentes	
LOG10()	Logarithmus zur Basis 10	
LOG2()	Logarithmus zur Basis 2	
MIN()	kleinster Wert einer Werteliste	
MOD()	Divisionsrest	
PI()	Zahl pi (?)	
POW(), POWER()	Potenzrechnung	
RADIANS()	Konvertierung Grad in Bogenmaß	
RAND()	Zufallszahl (Gleitkommazahl)	
ROUND()	mathematisches Runden	
SIGN()	Vorzeichen, - = -1, 0 = 0, + = 1	
SIN()	Sinus	
SQRT()	Quadratwurzel, Wurzel	
SUM()	Summe	
TAN()	Tangens	
TRUNCATE()	Anteil von Nachkommastellen abschneiden	
Datum/Zeit Funktionen	
ADDDATE()	Zeit-/Datum Intervall auf ein Datum aufaddieren	
ADDTIME()	Zeit-Intervall auf eine Zeit aufaddieren	
CONVERT_TZ()	Wandelt Datumszeit-Werte unter Berücksichtigung von Zeit-Zonen	
CURDATE(), CURRENT_DATE(), CURRENT_DATE	aktuelles Datum	
CURTIME(), CURRENT_TIME(), CURRENT_TIME	aktuelle Zeit	
CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP, NOW(), LOCALTIME(), LOCALTIME, LOCALTIMESTAMP, LOCALTIMESTAMP()	aktueller Datum-/Zeit-Stempel in unterschiedlichen Formaten (z.B. 'YYYY-MM-DD HH:MM:SS')	
DATE_ADD()	Zeit-/Datum Intervall auf ein Datum aufaddieren	
DATE_FORMAT()	formatiert den Datenwert entsprechend dem Format-String	
DATE_SUB(), SUBDATE()	Zeit-/Datum Intervall von einem Datum abziehen	
DATE()	Extrahieren des Datum-Teils eines Datum oder Datetime-Ausdruckes	
DATEDIFF()	Zeitdifferent	
DAY(), DAYOFMONTH()	Tag des Monats (0-31)	
DAYNAME()	Name des Wochentages, abhängig von lc_time_names	
DAYOFWEEK()	Wochentag als Index, (1 = Sunday, 2 = Monday, ?, 7 = Saturday)	
DAYOFYEAR()	Tag des Jahres (1-366)	
EXTRACT()	Extrahiert einen Teil eines Datums	
FROM_DAYS()	Tageszahl in Datum konvertieren	
FROM_UNIXTIME()	formatiert UNIX timestamp als Datum	
GET_FORMAT()	ermittelt Format, z.B. in Kombination mit DATE_FORMAT() und STR_TO_DATE() zu gebrauchen	
HOUR()	Extrahiert den Stunden-Wert	
LAST_DAY	Datum des letzten Tages des Monats	
MAKEDATE()	Datum aus Jahr, Monat und Tag	
MAKETIME()	Zeit aus Stunde, Minute und Sekunde	
MICROSECOND()	Mikrosekundenanteil einer Zeitwertes	
MINUTE()	Minutenanteil einer Zeitwertes	
MONTH()	Monatsanteil eines Datumswertes	
MONTHNAME()	Monatsname eines Datumswertes	
PERIOD_ADD()	Monat(e) hinzufügen zu einer Periode (Jahr und Monats Wert)	
PERIOD_DIFF()	Monatsdifferenz einer Periode (Jahr und Monats Wert)	
QUARTER()	Quartal des Jahres	
SEC_TO_TIME()	Sekunden in Uhrzeit wandeln	
SECOND()	Sekundenanteil eines Zeitwertes	
STR_TO_DATE()	konvertiert Zeichenkette in Datum	
SUBTIME()	Zeit-Intervall von einer Zeit abziehen	
TIME_FORMAT()	Formatierung der Datums-/Zeit-Ausgabe	
TIME_TO_SEC()	Zeit in Sekunden wandeln	
TIME()	Zeit aus Datums-/Zeit-Wert	
TIMEDIFF()	Zeitdifferenz	
TIMESTAMP()	Datum in Zeitstempel wandeln	
TIMESTAMPADD()	Zeit-Intervall auf Zeitstempel aufaddieren	
TIMESTAMPDIFF()	Differenz zweier Zeitstempel	
TO_DAYS()	Tage seit 01.01.0000	
TO_SECONDS()	Sekunden seit 01.01.0000 00:00:00	
UNIX_TIMESTAMP()	UNIX Zeitstempel, Sekunden seit 1970-01-01 00:00:00 UTC	
UTC_DATE()	aktuelles UTC Datum	
UTC_TIME()	aktuelle UTC Zeit	
UTC_TIMESTAMP()	aktuelles UTC Datum und Zeit	
WEEK()	Woche des Jahres	
WEEKDAY()	Wochentag als Zahl	
WEEKOFYEAR()	Kalenderwoche (1-53)	
YEAR()	Jahresanteil eines Datums	
YEARWEEK()	Jahr und Monat eines Datums