\documentclass[a4paper, 11pt]{article}
\renewcommand{\familydefault}{\sfdefault}
\usepackage{a4wide}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{color}
\usepackage{graphicx}
\usepackage{setspace}
\usepackage{ulem}
\usepackage{listings}
\usepackage{float}
\usepackage[rflt]{floatflt}
\usepackage{tabularx}
\setlength{\parindent}{0pt}
\title{MySQL, komplexer SELECT}
\usepackage[
pdftitle={MySQL, komplexer SELECT}
pdfsubject={Der SELECT und seine Bestanteile, wie Optionen, JOINS, UNION, Operatoren}
pdfauthor={Udo Schmal}
pdfkeywords={Administration, Optionen, JOINS, UNION, Operatoren}
]{hyperref}
\definecolor{darkblue}{rgb}{0,0,.5}
\hypersetup{pdftex=true, colorlinks=true, breaklinks=true, linkcolor=darkblue, menucolor=darkblue, pagecolor=darkblue, urlcolor=darkblue}
\begin{document}MySQL, komplexer SELECT
\singlespacing
{\LARGE \textbf{\label{sec:title}MySQL, komplexer SELECT}}

\singlespacing
{\Large \textbf{SELECT Bestandteile}}

\begin{tabularx}{0.9\textwidth} { | >{\raggedright\arraybackslash}X | >{\raggedright\arraybackslash}X | }
\hline
Begriff & Beschreibung \\
\hline
\textbf{Optionen zur Beeinflussung der Verarbeitung} \\
\hline
\textbf{ALL} & wird benutzt um alle unterschiedliche Werte zu erhalten (das ist der Standard) \\
\hline
\textbf{DISTINCT} & wird benutzt um lediglich unterschiedliche Werte zu erhalten \\
\hline
\textbf{DISTINCTROW} & wird benutzt um lediglich unterschiedliche Werte zu erhalten auch wenn durch die Verbindung in der Abfrage doppelte Einträge entstehen \\
\hline
\textbf{HIGH\_PRIORITY} & gibt dem SELECT höhere Priorität als eine Anweisung, die eine Tabelle aktualisiert \\
\hline
\textbf{STRAIGHT\_JOIN} & zwingt den Optimierer die Tabellen in der Reihenfolge in der sie in der FROM-Klausel aufgeführt sind einzubinden \\
\hline
\textbf{MAX\_STATEMENT\_TIME = N} & setzt ein Anweisungsausführungs-Timeout abweichend von der System Variable max\_statement\_time \\
\hline
\textbf{\emph{Erweiterungen von MySQL die nicht in Standard-SQL enthalten sind}} \\
\hline
\textbf{SQL\_SMALL\_RESULT / SQL\_BIG\_RESULT} & Optimierung im Zusammenhang mit GROUP BY / DISTINCT unter Verwendung von temporären Tabellen \\
\hline
\textbf{SQL\_BUFFER\_RESULT} & Erzwingt ein zwischenspeichern des Ergebnisses in eine temporäre Tabelle \\
\hline
\textbf{SQL\_CACHE / SQL\_NO\_CACHE} & Zwischenspeichern des Ergebnisses im Abfragecache \\
\hline
\textbf{SQL\_CALC\_FOUND\_ROWS} & ermittelt die Ergebnismenge (Anzahl der Datensätze) \\
\hline
\textbf{Eingrenzung der Ergebnismenge} \\
\hline
\textbf{WHERE} & Eingrenzung durch Vergleiche von Feldwerten \\
\hline
\textbf{GROUP} & Zusammenfassung bei Übereinstimmung von Feldwerten \\
\hline
\textbf{HAVING} & Eingrenzung durch Vergleich der Ergebniswerte, am Ende vor der Übermittlung der Werte (Achtung: ohne Optimierung)) \\
\hline
\textbf{LIMIT} & Beschränkung der Ergebnismenge (Übergabe Start, Anzahl) \\
\hline
\textbf{PARTITION} & Eingrenzungen auf Bereiche die zuvor in der Tabelle definiert werden müssen \\
\hline
\textbf{Sortierung der Ergebnismenge} \\
\hline
\textbf{ORDER BY} & Sortierung nach den angegebenen Feldern unter Angabe der Sortierrichtung (ASC = aufsteigend, DESC = absteigend) \\
\hline
\end{tabularx}
\vspace{1mm}\hrule 
\singlespacing
{\Large \textbf{JOINS}}

\singlespacing
\textbf{Equi-Join, Inner-Join (oder auch nur Join) \&amp; 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.
\begin{lstlisting}[breaklines]SELECT p.title, p.subtitle, a.name, a.image
FROM pages p, author a
WHERE p.authorid = a.uid;\end{lstlisting}
\begin{lstlisting}[breaklines]SELECT p.titel, p.subtitel, a.name, a.image
FROM pages p INNER JOIN author a ON p.authorid = a.uid;\end{lstlisting}
\begin{lstlisting}[breaklines]SELECT p.titel, p.subtitel, a.name, a.image
FROM pages p CROSS JOIN author a
WHERE p.authorid = a.uid;\end{lstlisting}

\singlespacing
\textbf{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
\begin{lstlisting}[breaklines]SELECT p.titel, p.subtitel, a.name, a.image
FROM pages p LEFT JOIN author a ON p.authorid = a.uid;\end{lstlisting}

\singlespacing
\textbf{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
\begin{lstlisting}[breaklines]SELECT p.title, p.subtitle, c.body, c.image
FROM pages p RIGHT JOIN content c ON p.uid = c.pid;\end{lstlisting}

\singlespacing
\textbf{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. 
\begin{lstlisting}[breaklines]SELECT p.title, p.subtitle, c.body, c.image
FROM pages p OUTHER JOIN content c ON p.uid = c.pid;\end{lstlisting}

\singlespacing
\textbf{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.
\begin{lstlisting}[breaklines]SELECT p2.uid, p2.title
FROM pages AS p1, pages AS p2
WHERE p1.pid =0 AND p2.pid = p1.uid;\end{lstlisting}
\vspace{1mm}\hrule 
\singlespacing
{\Large \textbf{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.
\begin{lstlisting}[breaklines](SELECT 'author', a.uid, a.name, a.image FROM author a WHERE age\&gt;65)
UNION
(SELECT 'redakteur', r.uid, r.name, r.image FROM redakteur r WHERE age\&gt;65);\end{lstlisting}
\vspace{1mm}\hrule 
\singlespacing
{\Large \textbf{Operatoren}}

\begin{tabularx}{0.9\textwidth} { | >{\raggedright\arraybackslash}X | >{\raggedright\arraybackslash}X | }
\hline
Name & Beschreibung \\
\hline
AND, \&amp;\&amp; & logisches UND (AND) \\
\hline
= & Weist einen Wert zu, im Zusmenhang mit dem SET / UPDATE statement \\
\hline
:= & Wert zuweisen \\
\hline
BETWEEN ... AND ... & Überprüfen ob ein Wert in einem Bereich von Werten liegt \\
\hline
BINARY & Wandelt eine Zeichenkette in einen Binärzeichenkette \\
\hline
\&amp; & bitweise UND-Verknüpfung \\
\hline
\textasciitilde & bitweise Invert (Umkehrung) \\
\hline
| & bitweise ODER-Verknüpfung \\
\hline
\textasciicircum & bitweise Exclusive-ODER-Verknüpfung \\
\hline
CASE & Fall-Unterscheidungs Operator \\
\hline
DIV & Ganzahlen Teilung (Division) \\
\hline
/ & Division Operator \\
\hline
\&lt;=\&gt; & IS NOT DISTINCT Gleichheits Überprüfung NULL-safe \\
\hline
= & Gleichheits Operator \\
\hline
\&gt;= & größer/gleich Operator \\
\hline
\&gt; & größer als Operator \\
\hline
IS NOT NULL & ist nicht NULL, Wertüberprüfung \\
\hline
IS NOT & ist nicht, boolscher Wertevergleich \\
\hline
IS NULL & ist NULL, Wertüberprüfung \\
\hline
IS & ist, boolscher Wertevergleich \\
\hline
\&lt;\&lt; & bitweise Schiebeoperation nach links (shl) \\
\hline
\&lt;= & kleiner/gleich Operator \\
\hline
\&lt; & kleiner als Operator \\
\hline
LIKE & Bestandteil (Teilzeichenkette), einfache Mustererkennung \\
\hline
- & Minus Operator \\
\hline
MOD, \% & Divisionsrest (Modulo) Operator \\
\hline
NOT BETWEEN ... AND ... & Überprüfen ob ein Wert nicht in einem Bereich von Werten liegt \\
\hline
!=, \&lt;\&gt; & Ungleich Operator \\
\hline
NOT LIKE & kein Bestandteil (Teilzeichenkette), einfache Mustererkennung \\
\hline
NOT REGEXP & entspricht nicht der Regular Expression \\
\hline
NOT, ! & Negation des Wertes \\
\hline
||, OR & logisches ODER (OR) \\
\hline
+ & Addition Operator \\
\hline
REGEXP, RLIKE & entspricht der Regular Expression \\
\hline
\&gt;\&gt; & bitweise Schiebeoperation nach rechts (SHR) \\
\hline
SOUNDS LIKE & Klingt ähnlich, Vergleich des Soundex Strings \\
\hline
* & Multiplikation Operator \\
\hline
- & Change the sign of the argument \\
\hline
XOR & logisches Exklusive-ODER (XOR) \\
\hline
\end{tabularx}
\vspace{1mm}\hrule 
\singlespacing
{\Large \textbf{Funktionen}}

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