SQL added JOINS, GROUP BY, HAVING etc.

This commit is contained in:
2018-05-12 13:04:21 +02:00
parent 7b42f6b75b
commit 56ccce3d1a
2 changed files with 82 additions and 0 deletions

View File

@@ -122,3 +122,85 @@
\end{lstlisting}
Die Ergebnisse wären dann: 20, 8
\subsection{Werte sortieren}
Eine unsortierte Liste bspw.: 7, 3, 1, 3
\begin{lstlisting}[frame=single]
SELECT werteunsortiert
FROM tabellenname
ORDER BY werteunsortiert ASC;
\end{lstlisting}
Aufsteigend sortiert wird mit \texttt{ASC}. \\
Absteigend sortiert wird mit \texttt{DESC}. \\
Ergibt nach dem sortieren mit ASC: 1, 3, 3, 7 \\
Nach dem sortieren mit DESC: 7, 3, 3, 1 \\
\subsubsection{Werte zufällig anordnen}
Manchmal kann es sinnvoll sein,
Werte in eine zuällige Reihenfolge zu bringen.
\begin{lstlisting}[frame=single]
SELECT werteunsortiert
FROM tabellenname
ORDER BY RAND();
\end{lstlisting}
\subsection{Werte gruppieren}
Angenommen es gibt die Kategorien: 1, 3, 3, 7.
Es sollen die einzelnen Kategorien und ihre Häufigkeit angezeigt werden (optional).
\begin{lstlisting}[frame=single]
SELECT werte, COUNT(werte)
FROM tabellenname
GROUP BY werte;
\end{lstlisting}
Die Ergebnisse: 1 $\Rightarrow$ 1x, 3 $\Rightarrow$ 2x, 7 $\Rightarrow$ 1x
\subsubsection{HAVING bei GROUP BY}
Mit WHERE kann man vor einer Gruppierung filtern.
Soll aber nach einem GROUP BY gefiltert werden
(damit die Gruppierung nicht verfälscht wird)
geht das nicht mit WHERE sondern nur mit HAVING.
Die Syntax für das filtern bleibt dabei die gleiche wie bei WHERE.
\begin{lstlisting}[frame=single]
SELECT werte, COUNT(werte)
FROM tabellenname
GROUP BY werte
HAVING werte > 1;
\end{lstlisting}
\subsection{Die ersten X Zeilen ausgeben}
Wenn bspw. bei einer Highscore Liste nur die ersten
5 Kandidaten relevant sind, können diese mit LIMIT beschränkt werden.
\begin{lstlisting}[frame=single]
SELECT werte
FROM tabellenname
ORDER BY werteunsortiert DESC
LIMIT 5;
\end{lstlisting}
Hiermit werden die 5 größsten Werte ausgegeben.
\subsection{Tabellen miteinander verknüpfen - JOINS}
\subsubsection{INNER JOIN}
Tabelle Person (id, name, fk\_ort) \\
Tabelle Ort (id, name, plz) \\
\begin{lstlisting}[frame=single]
SELECT Person.name, Ort.plz
FROM Person INNER JOIN Ort
ON Person.fk_ort = Ort.id;
\end{lstlisting}
Jetzt werden alle Personen ausgegeben,
die einen Ort zugewiesen haben. Personen die keinen Ort
zugewiesen werden, fallen weg.
\subsubsection{LEFT JOIN}
Funktioniert genau gleich wie INNER JOIN, jedoch wird die linke
Schnittmenge verwendet. Das bedeutet bei FROM Person LEFT JOIN Ort
ist Person die linke Tabelle. Das heißt es werden alle Personen angezeigt,
auch wenn diese keinen Ort eingetragen haben.
\subsubsection{RIGHT JOIN}
Genau das selbe Prinzip wie LEFT JOIN, bloß diesesmal wird die rechte
Schnittmenge verwendet. Es würden in diesem Beispiel also alle Orte angezeigt
werden, auch wenn dazu keine Personen zugeordnet sind (in diesem Beispiel eher
weniger sinnvoll). Jedes RIGHT JOIN kann in ein LEFT JOIN umgeschrieben und umgekehrt.
Es ist nur eine Darstellungssache, wenn man bspw. aus einem ERM Modell die Darstellung
beibehalten möchte.