%Schriftgröße, Layout, Papierformat, Art des Dokumentes
\documentclass[10pt,oneside,a4paper]{scrartcl}

%Einstellungen der Seitenränder
\usepackage[left=2cm,right=2cm,top=1.5cm,bottom=1.5cm,includeheadfoot]{geometry}

%neue Rechtschreibung
\usepackage[ngerman]{babel}

%Umlaute ermöglichen
\usepackage[utf8]{inputenc}

%Gesamtseitenzahl
\usepackage{lastpage}

% Kopf- und Fußzeile
\usepackage[automark]{scrpage2}

%Quellcode-Listings
\usepackage{listings}

% Hyperlinks
\usepackage{hyperref}

% Bilder
\usepackage{graphicx}

%Kopfzeile
\ihead{Datenbanken}
\chead{}
\ohead{https://kohnlehome.de/datenbanken/sql-select.pdf}
\setheadsepline{0.5pt}

%Fußzeile
\setfootsepline{0.5pt}
\ifoot{Franz Kohnle}
\cfoot{Seite \thepage\ von  \pageref{LastPage}}
\ofoot{\today}

\pagestyle{scrheadings}

\begin{document}

% Überschrift 
\begin{center}
  \LARGE % Schriftgröße
  \bfseries % Fettdruck
  \sffamily % Serifenlose Schrift
  SQL: SELECT
\end{center}

\section*{1. Einfache Abfragen mit einer Tabelle}
\begin{verbatim}
SELECT
  <projection: spalten>
FROM
  <tabelle>
WHERE
  <filter, selection>
ORDER BY
  <sortierkriterien, und -reihenfolge>  
LIMIT
  <anzahl>
OFFSET
  <offset>
\end{verbatim}

\subsection*{a) Projection: Welche Spalten}
\begin{verbatim}
SELECT * FROM tabelle;
SELECT spalte1, spalte2, ... FROM tabelle;
\end{verbatim}

\subsection*{b) Selection, Filter: Welche Zeilen?}
\begin{verbatim}
SELECT * FROM tabelle WHERE spalte = wert;

-- Vergleichsoperatoren: = > < >= <= <>
-- BETWEEN wert1 AND wert2
-- LIKE 'a_b%'    -- _ genau 1 beliebiges Zeichen, % beliebig viele beliebige Zeichen
-- IN (wert1, wert2, ...)
-- logische Operatoren: AND OR NOT
-- IS NULL / IS NOT NULL
\end{verbatim}

\subsection*{c) Sortieren}
\begin{verbatim}
SELECT * FROM tabelle ORDER BY spalte;      --- aufsteigend (ASC)
SELECT * FROM tabelle ORDER BY spalte DESC; --- absteigend

-- Sortierreihenfolge: DESC ASC
\end{verbatim}

\subsection*{d) Anzahl der Zeilen begrenzen}
\begin{verbatim}
SELECT * FROM tabelle LIMIT 10;          -- Die Zeilen 1 bis 10
SELECT * FROM tabelle LIMIT 10 OFFSET 5; -- Die Zeilen 6 bis 15
\end{verbatim}

\newpage

\section*{2. Komplexere Abfragen mit einer Tabelle}
\begin{verbatim}
SELECT <projection: spalten, expression>
FROM <tabelle>
WHERE <1. bedingung für Zeilen>
GROUP BY <gruppierung: spalte>
HAVING <2. bedingung für Gruppen>
ORDER BY <sortierreihenfolge: spalten, auf- absteigend>  
LIMIT <anzahl> OFFSET <offset>
\end{verbatim}

\subsection*{a) Aggregatfunktionen, DISTINCT}
\begin{verbatim}
SELECT COUNT(*) FROM tabelle;     --- Anzahl der Zeilen
SELECT MIN(spalte) FROM tabelle;  --- Minimum aller Werte der spalte
SELECT MAX(spalte) FROM tabelle;  --- Maximum aller Werte der spalte
SELECT SUM(spalte) FROM tabelle;  --- Summe aller Werte der spalte
SELECT AVG(spalte) FROM tabelle;  --- Mittelwert aller Werte der spalte

SELECT DISTINCT spalte FROM tabelle;        --- Alle unterschiedlichen Werte der spalte
SELECT COUNT(DISTINCT spalte) FROM tabelle; --- Anzahl der unterschiedlichen Werte der spalte
\end{verbatim}

\subsection*{b) Gruppieren}
\begin{verbatim}
SELECT COUNT(*), spalte FROM tabelle GROUP BY spalte;
SELECT AVG(spalte1), spalte2 FROM tabelle GROUP BY spalte2;

SELECT COUNT(*), spalte
FROM tabelle
GROUP BY spalte
HAVING COUNT(*) > 5;  --- Nur Gruppen anzeigen, die die Bedingung erfüllen

SELECT COUNT(*), spalte
FROM tabelle
WHERE spalte < 7      --- 1. Nur Zeilen verwenden, die die Bedingung erfüllen
GROUP BY spalte
HAVING COUNT(*) > 5;  --- 2. Nur Gruppen anzeigen, die die Bedingung erfüllen 
\end{verbatim}

\section*{3. Mehrere Tabellen}
\begin{verbatim}
SELECT
  tabelle1.spalte1,
  tabelle2.spalte2
FROM 
  tabelle1
  JOIN tabelle2 ON tabelle1.id = tabelle2.tabelle1_id;

SELECT
  tabelle1.spalte1,
  tabelle2.spalte2
FROM
  tabelle1
  JOIN tabelle2 ON tabelle1.id = tabelle2.tabelle1_id
  JOIN tabelle3 ON tabelle2.id = tabelle3.tabelle2_id;
\end{verbatim}





\end{document}
