SQL - Cheat-Sheet

SQL Cheat Sheet

Dieses Cheat-Sheet beinhaltet nicht alle, dafür aber die häufig verwendetsten, SQL Befehle. Ich gebe zu jedem Befehl sowohl die Syntax, eine Beschreibung als auch ein Beispiel an. Am Ende des Post sind wie immer die Quellen gelistet. Relevante Info für Einsteiger:


Übersicht


Basis SQL-Anweisungen


SELECT

Die Select Anweisung wird verwendet um Daten aus der Datenbank auszuwählen. Die SELECT Anweisung kann zudem ergänzt werden.


/* Basis SELECT alles*/
SELECT *
FROM table1

/* Basis SELECT */
SELECT column1, column2, column3
FROM table1

In der ersten Abfrage wird ALLES aus der Tabelle table1 ausgewählt. Die Tabelle wird also 1 zu 1 wieder ausgegeben. Ein * ist gleichzusetzen mit dem Begriff "alles". In der zweiten Abfrage werden nur die Daten aus der Tabelle table1 welche in column1 column2 und column3 sind ausgegeben. column4 oder sonstige Spalten werden nicht ausgegeben.


/* SELECT mit AS*/
SELECT column1 AS name, column2, column3, ...
FROM table1

Spalten können in der Abfrage auch umbenannt werden. So kann später über C#, php, Java über den neuen, einfacheren oder Aussagekräftigeren, Namen zugegriffen werden. In diesem Beispiel wird aus column1 name.


/* SELECT DISTINCT*/
SELECT DISTINCT column1 AS name
FROM table1

Die DISTINCT Anweisung kann nur beim SELECT erfolgen. DISTINCT steht für unterschiedlich. Das bedeutet, dass ein Datensatz immer nur einmal ausgegeben wird. Ist er doppelt vorhanden wird er ignoriert. Würden in diesem Beispiel 3 Leute Peter und 2 Leute Maria heißen würde die Abfrage lediglich einmal Peter und einmal Maria zurückgeben..


INSERT INTO

Der INSERT Befehl fügt einer Tabelle neue Datensätze hinzu. Dies kann teilweise geschehen oder für alle Spalten. Zu beachten ist das die Werte zu den Datentypen in den jeweiligen Spalten passen. SQL wird dies nicht automatisch konvertieren.


/* INSERT für alle Spalten*/
INSERT INTO table1
VALUES (valueColumn1, valueColumn1, valueColumn3)

/* INSERT für bestimmte Spalten*/
INSERT INTO table1 (column1, column2, column4)
VALUES (valueColumn1, valueColumn1, valueColumn4)

In der ersten Abfrage werden die Spalten der Tabelle table1 der Reihe nach mit den Werten aus VALUES befüllt. In der zweiten Abfrage wird beim INSERT hinter der Tabelle bestimmt in welcher Reihenfolge welche Spalten befüllt werden sollen. Es werden die erste, zweite und vierte Spalte gefüllt. Die Dritte wird dabei ausgelassen. Diese wird mit dem in der Tabelle vorher festgelegten Standardwert oder NULL befüllt.


UPDATE

Über UPDATE werden bereits existierende Einträge modifiziert (überschrieben).


/* UPDATE */
UPDATE table1
SET column1=value1, column4=value4, ...
WHERE conditions

Im SET der UPDATE Anweisung wird festgelegt, welche Spalte welchen Wert bekommt. Eine Reihenfolge ist hierbei nicht relevant. Beim UPDATE MUSS beachtet werden das eine Bedingung (WHERE) angegeben wird. Wird keine Bedingung abgegeben werden alle Einträge der Tabelle aktualisiert. Weiteres zu der WHERE Anweisung weiter unten.


DELETE

Die DELETE Anweisung entfernt Einträge aus der angegebenen Tabelle.


/* DELETE */
DELETE FROM table1
WHERE column1 = "PETER"

In dem Beispiel werden alle Einträge aus der Tabelle gelöscht, welche in column1 den String PETER stehen haben. Beim DELETE MUSS beachtet werden das eine Bedingung (WHERE) angegeben wird. Wird keine Bedingung abgegeben werden alle Einträge der Tabelle gelöscht. Weiteres zu der WHERE Anweisung weiter unten.


DROP

Die DROP Anweisung kann sowohl für Datenbanken als auch für Tabellen verwendet werden. Der Befehl löscht die angegebene Datenbank oder Tabelle.

/* DROP Tabelle */
DROP TABLE table1

/* DROP Datenbank */
DROP DATABASE database1

Das Beispiel entfernt zuerst die Tabelle table1 und durch die zweite Anweisung wird die Datenbank database1 gelöscht.


ALTER

Die ALTER Anweisung wird dazu verwendet Spalten in Tabellen hinzuzufügen, zu löschen oder zu verändern. Dies kann bedeuten das eine Text-Spalte in eine Integer-Spalte abgeändert wird oder ganz gelöscht wird.

Das wird normalerweise im Vorhinein gemacht und vom Entwickler per Hand in bspw. PHPmyAdmin oder in Azure SQL eingepflegt. Dies per Script auszuführen kann schnell zu ungewollten Verlust von Daten kommen. Daher rate ich davon ab. Für diejenigen die dennoch ALTER nutzen wollen HIER klicken.


TRUNCATE

Der TRUNCATE Befehle löscht den gesamten Inhalt einer Tabelle. Er bewirkt das gleiche wie der DELETE Befehl ohne Bedingung. Der Unterschied ist die Performance, welche beim TRUNCATE besser ist. Dies liegt am Anweisungs Typ. Mehr zu DDL und DLM HIER.


/* TRUNCATE */
TRUNCATE TABLE table1

Alle Daten aus der Tabelle table1 werden gelöscht.


CREATE

Die CREATE Anweisung erstellt eine Tabelle mit den angegebenen Spalten. Dies wird normalerweise auch bereits im Vorfeld gemacht, kann aber je nach Applikation relevant werden.


/* CREATE */
CREATE TABLE table1 (
	column1 INT PRIMARY KEY,
	column2 TEXT )

In dem Beispiel wird eine Tablle mit dem Namen table1 erstellt, welche die Spalten column1 und column2 hat. Hinter den Spaltennamen werden Der Datentyp und Einschränkungen angegeben.


Aggregatfunktionen (Transact-SQL)

Alle Aggregatfunktionen werden nach einem SELECT verwendet und umklammern eine Spalte. Dies ist bei allen gleich. Dies kann mit Befehlen wie CASE kombiniert werden. Darauf wird hier allerdings nicht eingegangen.

MIN und MAX

MIN und MAX geben entweder den kleinsten Wert oder den Größten Wert der jeweiligen Spalte zurück.


/* MIN */
SELECT MIN(column1)
FROM table1
WHERE 1   /* Immer wahr */

/* MAX */
SELECT MAX(column1)
FROM table1
WHERE 1   /* Immer wahr */

SUM

Die Summe aller Werte wird zurückgegeben. Sollte die Spalte also 3 Einträge mit dem Wert 3 haben, dann wird 9 als Ergebnis zurückgegeben.


/* SUM */
SELECT SUM(column1)
FROM table1
WHERE 1   /* Immer wahr */

AVG

Der Durchschnittswert (Average) wird zurückgegeben. Sollte die SPalte 3 Einträge mit den Werten 6,3,6 besitzen wird 5 als Durchschnitt zurückgegeben.


/* AVG */
SELECT AVG(column1)
FROM table1
WHERE 1   /* Immer wahr */

COUNT

COUNT gibt die Anzahl der Reihen innerhalb der Spalte an.


/* COUNT */
SELECT COUNT(column1)
FROM table1
WHERE column2 = "Price"

Das Beispiel würde alle Reihen von column1 zählen, welche in column2 den String Price stehen haben. Wenn dies in allen Reihen der Fall ist oder keine Bedingung angegeben wurde, würde die Gesamtzahl aller Reihen zurückgegeben werden.



Verarbeitung

Die Verarbeitungsbefehle werden dafür benutzt die ausgewählten Datensätze auszusortieren oder miteinander logisch zu verknüpfen. Um die nachfolgenden Beispiele zu erklären seine 2 Tabellen gegeben.

Tabelle "Bücher"
BuchID BuchName ISBN Preis Lagerbestand
1 Herr der Ringe 3-598-21500-2 12,99 7
2 Informatik Teil 3 3-598-215432-6 10,99 3
3 Kochen im Freien 3-598-723984-9 24,99 55
Tabelle "Kundenbestellung"
KundenID KundenName BuchID Anzahl
1 Alfred Hitch 1 2
2 Angela Merk 2 1
3 Tiffany S. 1 1

WHERE

WHERE ist eine der Basis Befehle in SQL. Sie wird für nahezu alles benötigt. WHERE kann sowohl alleine stehen und mit Operatoren genutzt werden als auch mit weiteren Schlüsselwörtern verwendet werden. Zuerst einmal schauen wir uns ein paar Beispiele mit Operatoren an.

Operator Verwendung Beispiel
= Gleich SELECT * FROM Bücher WHERE Preis = 5
<> oder != Ungleich SELECT * FROM Bücher WHERE Preis != 5
> Größer als SELECT * FROM Bücher WHERE Preis > 5
>= Größer gleich SELECT * FROM Bücher WHERE Preis >= 5
< Kleiner als SELECT * FROM Bücher WHERE Preis < 5
<= Kleiner gleich SELECT * FROM Bücher WHERE Preis <= 5

/* GLEICH - Datensatz für "Herr der Ringe" */
SELECT *
FROM Bücher
WHERE BuchID = 1

/* Größer gleich - Alle Bücher die mehr als 15.00€ kosten */
SELECT *
FROM Bücher
WHERE Preis >= 15,00

/* Ungleich - Alle Bücher außer "Informatik Teil 3" */
SELECT *
FROM Bücher
WHERE BuchName != "Informatik Teil 3"

Das Prinzip für Operatoren ist relativ simple und in der Informatik und Mathematik sowieso weit verbreitet. Nun können weitere Bedingungen aneinander und miteinander Verknüpft werden.

AND, OR, NOT


/* AND */
SELECT *
FROM Bücher
WHERE Preis >= 12,00 AND Lagerbestand >= 5

/* OR */
SELECT *
FROM Bücher
WHERE Preis = 12,99 OR Preis = 24,99

/* NOT */
SELECT *
FROM Bücher
WHERE NOT BuchName = "Informatik Teil 3"

Alle Beispiele geben alle Bücher außer "Informatik Teil 3" zurück. Während bei AND beide Bedingungen erfüllt sein müssen, muss bei OR eine davon erfüllt sein und beim NOT darf diese Bedingung nicht erfüllt werden damit der Datensatz übernommen wird.

IN und BETWEEN


/* IN */
SELECT *
FROM Bücher
WHERE Preis IN (10,99, 12,99)

/* BETWEEN */
SELECT *
FROM Bücher
WHERE Preis BETWEEN 10,00 AND 12,00

Alle Beispiele geben alle Bücher außer "Kochen im Freien" zurück. IN prüft ob einer der Werte gleich ist und BETWEEN prüft ob sich der Wert zwischen den angegebenen Grenzen aufhält. Relevanter wird WHERE mit seinen Operatoren und Schlüsselwörtern wenn man sich größere Tabellen anschaut oder Tabellen miteinander verbinden. Bspw. mit einem Join oder per Hand.


/* mehrfach Selektierung / Cross Join */
SELECT *
FROM Bücher, Kundenbestellung
WHERE Bücher.BuchID = 1 AND Kundenbestellung.Anzahl > 1

Die Abfrage von mehreren Tabellen gleichzeitig wird auch CROSS JOIN genannt und hat eine bessere Schreibweise. Beide Funktionieren aber gleich und erzeugen ein Kreuzprodukt aus den beiden Tabellen. Jeder Datensatz aus Bücher wird mit jedem Datensatz aus Kundenbestellung gemischt. Dann wird die Bedingung geprüft. In unserem Beispiel geben wir uns den Kunden aus, welcher das Buch mit der ID 1 bestellt hat und davon mehr als 2 auf einmal. Wir bekommen also einen Datensatz zurück, welcher die jeweils ersten Datensätze aus beiden Tabellen beinhaltet.

LIKE

LIKE ist ein Suchbefehl und ist relevant sobald es um das Suchen von nur teilweise bekannten Daten geht. Wichtig ist zu beachten das manche Platzhalter, bspw. bei Microsoft, unterschiedlich sein können. W3Schools gibt folgende Beispiele für LIKE Benutzungen an:

Verwendung Beispiel
WHERE KundenName LIKE 'a%' Findet jeden Wert der mit "a" startet.
WHERE KundenName LIKE '%a' Findet jeden Wert der mit "a" aufhört.
WHERE KundenName LIKE '%or%' Findet jeden Wert der ein "or" an irgendeiner Position besitzt.
WHERE KundenName LIKE '_r%' Findet jeden Wert der ein "r" an zweiter Position besitzt.
WHERE KundenName LIKE 'a_%' Findet jeden Wert der mit "a" startet und mindestens 2 Stellen lang ist.
WHERE KundenName LIKE 'a__%' Findet jeden Wert der mit "a" startet und mindestens 3 Stellen lang ist.
WHERE KundenName LIKE 'a%o' Findet jeden Wert der mit einem "a" startet und mit einem "o" endet.

/* LIKE */
SELECT KundenName
FROM Kundenbestellung
WHERE KundenName LIKE 'A%'

Die Abfrage gibt "Alfred Hitch" und "Angela Merk" zurück. Eine Abfrage wie LIKE 'A_%' oder LIKE '%l%' würde genauso funktionieren.


(INNER) JOIN

Der INNER JOIN Liefert ein Kreuzprodukt von 2 oder mehr Tabellen zurück, welche in beiden Tabellen treffende Werte haben. INNER JOIN und JOIN sind gleich zu setzen.


/* INNER JOIN */
SELECT Bücher.BuchID AS BuchID, Kundenbestellung.KundenName AS Kundendetails
FROM Bücher
INNER JOIN Kundenbestellung ON Bücher.BuchID = Kundenbestellung.BuchID

Die Abfrage gibt uns 3 Ergebnisse zurück. Wir können dabei gut sehen das es keinen Eintrag mit dem Buch "Kochen im Freien" gibt. Da niemand das Buch bestellt hat, hat der Eintrag keine Treffer in der Tabelle Kundenbestellung und wird damit aussortiert.

BuchID Kundendetails
1 Alfred Hitch
1 Tiffany S.
2 Angela Merk

Joins können auch über mehr als 2 Tabellen erfolgen. Ich werde dafür ein Beispiel angeben mit einer weiteren fiktiven Tabelle LieferStatus.


/* INNER JOIN von 3 Tabellen*/
SELECT Bücher.BuchID, Kundenbestellung.KundenName, LieferStatus.Status
FROM ((Kundenbestellung
INNER JOIN Bücher ON Bücher.BuchID = Kundenbestellung.BuchID)
INNER JOIN LieferStatus ON Kundenbestellung.KundenID = LieferStatus.KundenID)

LEFT JOIN

Beim LEFT JOIN werden alle Daten aus der linken (ersten) Tabelle genommen und alle Treffer aus der rechten (zweiten) Tabelle. Sollte es keinen Treffer geben ist das Ergebnis NULL.


/* LEFT JOIN*/
SELECT Bücher.BuchName AS Name, Kundenbestellung.KundenName AS Kundendetails
FROM Bücher
LEFT JOIN Kundenbestellung ON Bücher.BuchID = Kundenbestellung.BuchID
Name Kundendetails
Herr der Ringe Alfred Hitch
Herr der Ringe Tiffany S.
Informatik Teil 3 Angela Merk
Kochen im Freien NULL

RIGHT JOIN

Beim RIGHT JOIN werden alle Daten aus der rechten (zweiten) Tabelle genommen und alle Treffer aus der linken (ersten) Tabelle. Sollte es keinen Treffer geben ist das Ergebnis NULL.


/* RIGHT JOIN*/
SELECT Bücher.BuchName AS Name, Kundenbestellung.KundenName AS Kundendetails
FROM Bücher
RIGHT JOIN Kundenbestellung ON Bücher.BuchID = Kundenbestellung.BuchID
Name Kundendetails
Herr der Ringe Alfred Hitch
Informatik Teil 3 Angela Merk
Herr der Ringe Tiffany S.

Die Abfrage war im Vergleich zum LEFT JOIN nahezu gleich. Dennoch bekommen wir kein NULL Ergebnis und auch nur 3 Einträge. Das liegt daran, dass wir in der Kundenbestellung Tabelle 2 Verweise auf den gleichen Eintrag in Bücher haben. Dieser wird im RIGHT JOIN ignoriert.


FULL OUTER JOIN

Der FULL OUTER JOIN ist dem FULL JOIN gleichzusetzen. Der FULL JOIN gibt jeden Eintrag zurück, solange es einen Treffer in der ersten oder zweiten Tabelle gab.


/* RIGHT JOIN*/
SELECT Bücher.BuchName AS Name, Kundenbestellung.KundenName AS Kundendetails
FROM Bücher
FULL JOIN Kundenbestellung ON Bücher.BuchID = Kundenbestellung.BuchID
Name Kundendetails
Herr der Ringe Alfred Hitch
Herr der Ringe Tiffany S.
Informatik Teil 3 Angela Merk
Kochen im Freien NULL

Das wäre also das gleiche Ergebnis wie der LEFT JOIN. Um zu zeigen, was der Unterschied ist, stellen wir uns einen weiteren Eintrag in Kundenbestellungen vor. Einen Kunden Namens "Gerd", welcher das BUch mit der ID 8 bestellt hat, welches aber nichtmehr im Sortiment ist. Er würde hier ebenfalls auftauchen: "NULL, Gerd". Das würde der LEFT JOIN nicht machen.

CROSS JOIN

Der CROSS JOIN ist ein INNER JOIN ohne Bedingung.


/* INNER JOIN */
SELECT Bücher.BuchID AS BuchID, Kundenbestellung.KundenName AS Kundendetails
FROM Bücher
INNER JOIN Kundenbestellung

UNION

Beim UNION werden Spalten aus verschiedenen Tabellen zusammengeführt. Der DISTINCT wird automatisch angewendet. Beim UNION müssen drei Dinge gegeben sein:

Tabelle "Lager"
BuchID Lagerbestand BuchName Lagerplatz
1 120 Herr der Ringe 4TA
4 120 Schrecken der Berge 43A
5 11 Liebe unter freiem Himmel 56D
8 13 Ponsch Wörterbuch Deutsch 7C

/* UNION */
SELECT BuchID FROM Bücher
UNION
SELECT BuchID FROM Lager

Zurück bekommen wir eine Liste von BuchID's => 1,2,3,4,5,8. Wie man sieht gibt es keine doppelten Einträge. Um auch die Doppelten Einträge zu bekommen ändern wir den UNION zum UNION ALL


/* UNION ALL */
SELECT BuchID FROM Bücher
UNION ALL
SELECT BuchID FROM Lager

Sortierung

Mit einigen Anweisungen kann man sich die ausgegebenen Daten auch besser darstellen. Dies kann zum Beispiel auch sinnvoll für einen Blog sein, um Einträge Alphabetisch auszugeben, nach Datum sortiert oder um pro Seite nur 10 Einträge anzuzeigen. Natürlich ist sowas auch für einen Export nach Excel sinnvoll um Diagramme schneller und besser darzustellen. Die hier aufgelisteten Befehle kommen immer zum Schluss nach den Bedingungen.

GROUP BY

Die GROUP BY Anweisung gruppiert Reihen die den gleichen Inhalt haben. Die Anweisung kommt oft mit COUNT da er alleine meist eher weniger Sinn hat.


/* GROUP BY */
SELECT COUNT(KundenName) AS AnzahlBestellungen, BuchID 
FROM Kundenbestellung
GROUP BY BuchID 

Das Ergbeniss würde uns 2 Ausgeben Datensätze ausgeben. 2 AnzahlBestellungen für BuchID 1 und 1 für BuchID 2. Allerdings kann das Ergebniss beim Gruppieren erneut gefiltert werden. Dies geschiet über das HAVING Keyword.


/* GROUP BY mit HAVING*/
SELECT COUNT(KundenName) AS AnzahlBestellungen, BuchID 
FROM Kundenbestellung
GROUP BY BuchID 
HAVING COUNT(KundenName) >= 2 

Das HAVING Keyword wurde hinzugefügt, weil die WHERE Bedingung nicht mit Aggregratefunktionen arbeiten kann. In diesem Beispiel wird uns nur noch ein Datensatz ausgegeben: AnzahlBestellungen 2 für BuchID 1.


ORDER BY

ORDER BY wird zum Sortieren nach Werten genutzt. Entweder kann nach ASC (ascending) Aufsteigen oder DESC (descending) Absteigend sortiert. Wird nichts angegeben wird standardgemäß ASC sortiert.


/* ORDER BY */
SELECT *
FROM Kundenbestellung
ORDER BY BuchID 
Resultat
KundenID KundenName BuchID Anzahl
1 Alfred Hitch 1 2
3 Tiffany S. 1 1
2 Angela Merk 2 1

/* ORDER BY */
SELECT *
FROM Kundenbestellung
ORDER BY BuchID, KundenName DESC
Resultat
KundenID KundenName BuchID Anzahl
2 Angela Merk 2 1
3 Tiffany S. 1 1
1 Alfred Hitch 1 2

Wie im zweiten Beispiel zu sehen ist können auch mehrere ORDERS angegeben werden. Haben zwei oder mehr Einträge den gleichen Wert beim ersten Kriterium wird das zweite angewand. Deswegen ist Alfred hier unter Tiffany.


Limit

Limit wird dafür verwendet nur eine bestimmte Anzahl an Einträgen auszulesen. Unter anderen SQL Systemen kann diese Anweisung auch TOP genannt werden und befindet sich im SELECT. Dies ist bspw. bei Microsoft der Fall.


/* LIMIT - Die ersten 2 Einträge */
SELECT *
FROM Kundenbestellung
LIMIT 2

LIMIT besitzt zudem eine OFFSET Bedingung. Mit der kann bestimmt werden wieviele Einträge am Anfang übersprungen werden sollen.


/* LIMIT - Die ersten 2 Einträge überspringen und dann 1 Einträge */
SELECT *
FROM Kundenbestellung
LIMIT 1 OFFSET 2

/* LIMIT - Die ersten 2 Einträge überspringen und dann 1 Einträge */
SELECT *
FROM Kundenbestellung
LIMIT 2,1

Beide Varianten führen das Selbe aus. Beim Zweiten muss man sich nur merken, dass der OFFSET zuerst gesetzt wird.


Zusatz

CONCAT

Concat führt Strings zusammen. Ähnlich wie unter anderen etablierten Programmen. Interessanter Fakt: Es muss nicht einmal eine Tabelle ausgewählt werden.


/* CONCAT */
SELECT CONCAT (KundenID, ": ", KundenName, " ", Anzahl ) AS KundeDaten
FROM Kundenbestellung

Subquerys


/* Subquery Beispiel */
SELECT BuchID
FROM Kundenbestellung
WHERE  Anzahl BETWEEN  0 AND  (SELECT MIN (Lagerbestand) 
							FROM  Bücher)

Die Subquery würde alle BuchIDs zurück geben, welche weniger Bestellungen haben als der aktuell kleinste Lagerbestand eines Buches. Subquerys können also in einer WHERE Bedingung ausgeführt werden um einen Wert o zu bestimmen. Es gibt noch einige weitere Anweisungen welche hilfreich sein können, bspw. CASES oder INTERSECT. Aber für die alltägliche Arbeit mit einer SQL Datenbank sind dies die wichtigsten Befehle die man benötigt.


Weitere Quellen / Informationen :
SQLtutorial
SQL w3school
Transact-SQL in Bezug auf das OUTER Keyword

Autorbild
Veröffentlicht von Robin Kirch am 07.2020
Web- und Softwareentwickler, Systemadministrator und Bughunter aus Leidenschaft.
#SQL #Cheat-Sheet #Datenbanken
Fandest du den Beitrag hilfreich? Dann teile ihn doch mit anderen

Aufgrund von Artikel 17 (ehemals Artikel 13) der EU ist es nicht weiter effizient die Kommentarsektion zu betreiben. Bei Fragen nutzen Sie bitte das Kontaktformular. Ich werde nach wie vor gerne Fragen beantworten.