SQL added JOINS, GROUP BY, HAVING etc.
This commit is contained in:
@@ -122,3 +122,85 @@
|
|||||||
\end{lstlisting}
|
\end{lstlisting}
|
||||||
Die Ergebnisse wären dann: 20, 8
|
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.
|
||||||
|
Binary file not shown.
Reference in New Issue
Block a user