2020
SQL

SQL

Datum: September 2020
Lesedauer: 9 Minuten


Dieser Blogpost zeigt die essenziellen Befehle von SQL.

Überblick

SQL ist eine Query Language. Es ist also eine Sprache, um strukturierte Daten von einer Datenbank zu manipulieren und abzufragen.
Z.B. HeidiSQL und MySQL Workbench ermöglichen das schreiben von SQL.

Um das, in diesem Blogpost erlernten Wissen zu testen, empfehle ich den Online-Editor:
https://sqliteonline.com/ (opens in a new tab)

Teilbereiche

SQL wird in fünf Bereiche unterteilt. Hier ein kleiner Überblick:

AbkürzungBezeichnungBeschreibungGrundlegende Befehle
DDLData Definition LanguageDamit können die Daten definiert werden. Man kann die verschiedenen Objekte einer Datenbank erstellen und bearbeiten.CREATE: Datenbanken oder deren Objekte erstellen; ALTER: Struktur ändern; DROP: Objekte löschen; RENAME: Objekte umbenennen; TRUNCATE: Inhalt entfernen
DQLData Query LanguageMan kann damit die benötigten Daten abfragen.SELECT: Abfragen von Daten
DMLData Manipulation LanguageUm die Daten zu manipulieren, benötigt man diese Befehle.INSERT: Daten in eine Tabelle einfügen; UPDATE: Bereits vorhandene Daten ändern; DELETE: Einträge einer Tabelle entfernen; MERGE: INSERT, UPDATE und DELETE mit einem Befehl kombinieren
DCLData Control LanguageWill man Rechte vergeben, benötigt man diese Befehle.GRANT: Rechte erteilen; REVOKE: Rechte entziehen
TCLTransaction Control LanguageMit TCL-Befehlen kann man sichere Änderungen einer Datenbank durchführen.COMMIT: Startet eine Transaktion; ROLLBACK: Beschreibt, was geschieht, falls ein Fehler beim COMMIT entsteht; SAVEPOINT: Es können Punkte gesetzt werden, damit nicht der ganze COMMIT wiederholt werden muss; SET TRANSACTION: Eine Transaktion spezifizieren (nur lesen/lesen und schreiben, ROLLBACK festlegen)

Praxis

Nun zeige ich, wie man die oben genannten Befehle richtig verwendet.

Ich empfehle, das Erlernte jeweils im Online-Editor (https://sqliteonline.com/ (opens in a new tab)) zu testen. Dabei ist noch wichtig, dass die Gross-/Kleinschreibung nicht beachtet wird.

editor

So sieht die Online-IDE aus. Links sieht man die Tabellen. Kappt man diese auf, so sieht man die einzelnen Spalten. Rechts stehen nützliche Befehle. Man kann auch auf History klicken, um die letzten Befehle sichtbar zu machen.
Der mittlere Teil ist am wichtigsten. Oben kann man die Befehle schreiben. Im unteren Bereich sieht man die Ausgabe.

Grundlagen

Kommentare

Kommentare kann man auf zwei Arten schreiben.

-- Kommentar über eine Zeile
/*
Kommentar über mehrere Zeilen
*/

Semikolon

Ein Semikolon wird benötigt, wenn die Anweisung fertig ist.

Datenbank verwenden

Damit man in der gewünschten Datenbank arbeiten kann, muss man diese festlegen.

use baseName;

DDL (Data Definition Language)

DDL Befehle verwendet man dann, wenn man verschiedene Objekte einer Datenbank erstellen oder bearbeiten will.

CREATE

Um etwas zu erstellen, verwendet man CREATE.

DATABASE

CREATE DATABASE baseName;

Beim Erstellen einer Datenbank kann man auch noch den Zeichensatz mitgeben. Dies wird in diesem Beispiel nicht gemacht, um es simple zu halten. Zudem kann man zuerst Datenbanken mit dem selben Namen löschen, um Konflikte zu vermeiden. Dazu kommen wir aber später.

TABLE

Neben Datenbanken können auch Tabellen erstellt werden.

CREATE TABLE kategorie (
    kategorie_id INT PRIMARY KEY AUTO_INCREMENT,
    kategoriename VARCHAR(255)
);

Bei dieser Tabelle werden zwei Attribute hinzugefügt. Eines davon ist ein Primärschlüssel. Dieser ist in Form einer Zahl. Daher wird er als INT deklariert. Dahinter schreibt man noch PRIMARY KEY um zu ihn als Primärschlüssel zu verwenden. Zum Schluss schreibt man AUTO_INCREMENT. Damit sagt man, dass die Zahl automatisch erhöht wird.

Beim Erstellen einer Tabelle gibt man jeweils den verlangten Datentyp an. In dieser Tabelle sind die Grundlegenden dargestellt:

DatentypenBeschreibung
DECIMAL oder NUMERICFinanzbuchhaltung (Exakt); Insgesamt 65 Stellen & 30 Stellen nach Komma (auch im negativen Bereich)
INTEGER oder INTKeine Bruchzahlen; -2’147’483’648 - 2’147’483’647
DATE1000-01-01 - 9999-12-31; Jahr-Monat-Tag
DATETIME1000-01-01 00:00:00 - 9999-12-31 23:59:59
TIME-838:59:59 - 838:59:59
YEAR1901 - 2155
TIMESTAMP1970-01-01 00:00:00 - x im Jahr 2037
CHAR(Anzahl Zeichen)Bis 255 Buchstaben; Nicht angegebene Zeichen werden als Leerzeichen gespeichert
ENUM(‘Herr’, ‘Frau’)Benutzer kann nur bestimmte Begriffe eingeben
VARCHAR(Anzahl Zeichen)Bis 65’535 Buchstaben

Dies sind die wichtigsten. Jedoch gibt es noch viel mehr.

ALTER

Mit ALTER kann man die Struktur einer Tabelle ändern.

Einfügen

Es ist möglich, neue Spalten einzufügen.

ALTER TABLE ort ADD landesbezeichnung CHAR(3);

In diesem Beispiel wurde in der Tabelle Ort eine Landesbezeichnung hinzugefügt.

Umbenennen

Nun könnte man eine auch etwas umbenennen. In diesem Fall ändert man den Namen von Landesbezeichnung auf Bundesland.

ALTER TABLE ort CHANGE landesbezeichnung bundesland char(3);
Default Werte

Auch default Werte können mit ALTER verändert werden.

ALTER TABLE ort ALTER vorwahl SET DEFAULT '00000';
Löschen

Auch des Löschen wird mit ALTER möglich.

ALTER TABLE DROP ort;

DROP

Beim letzten Beispiel hat man DROP bereits verwendet. Mit DROP kann man verschiedenes löschen:

  • Spalten
  • Nutzer
  • Datenbanken
Beispiel

Oft wird vor dem Erstellen einer Datenbank geprüft, ob schon eine mit diesem Namen existiert. Falls dies der Fall ist, wird sie gelöscht.

DROP DATABASE IF EXISTS dataName;
CREATE DATABASE dataName;

RENAME

In Kombination mit ALTER ist es möglich, Tabellen umzubenennen.

ALTER TABLE oldName
RENAME TO newName;

TRUNCATE

Mit TRUNCATE löscht man Daten aus einer Tabelle, ohne dabei die Tabelle zu löschen.

TRUNCATE TABLE kategorien;

DQL (Data Query Language)

DQL wird verwendet, um die benötigten Daten abzufragen.

SELECT

Mit SELECT sagt man, dass man etwas auswählen will. Danach gibt man an, was ausgewählt werden soll. In diesem Beispiel ist das alles (*). Es ist jedoch auch möglich, nur bestimmte Spalten zu selektieren.

Danach muss man angeben, von welcher Tabelle man die Attribute will.

SELECT * FROM "tabellenName";

WHERE

Es kommt oft vor, dass man nur gewisse Spalten benötigt, die eine bestimmte Bedingung erfüllen.

SELECT "spaltenName" FROM "tabellenName" WHERE "Bedingung";

Folgende Tabelle zeigt, wie überprüft werden kann.

OperatorBeispielBeschreibung
>WHERE wins > 9grösser als
<WHERE apples < 230kleiner als
=WHERE name = 'hans'gleich
>=WHERE chairs >= 8grösser gleich
<=WHERE mistakes <= 3kleiner gleich
IS NOT NULLWHERE phone IS NOT NULLdarf nicht keinen Wert besitzen
IS NULLWHERE surname IS NULLmuss keinen Wert beinhalten
BETWEENWHERE runs BETWEEN 100 AND 200zwischen
INWHERE age IN (16,17,18)muss eine der angegebenen sein
NOT INWHERE age NOT IN (1,2,3)darf keine der angegebenen sein
Platzhalter

Platzhalter werden verwendet, wenn man z.B. alle Vornamen will, die mit eine bestimmten Buchstaben beginnen.

ZeichenBeschreibungBeispiel
%null oder mehr Zeichen%pf -> Kopf, Dampf, Strumpf, Napf
_ein Zeichen_itze -> Sitze, Witze, Hitze
[]Ein Zeichen aus den Klammern[kmd]ann -> kann, mann, dann
^Alle Zeichen außer diesesh[^a]t -> hbt, hct, hdt, het (nicht "hat")
-ein Bereich von Zeichenm[a-b]chen -> machen, mbchen, mcchen

Testet man den Wert mit einem Platzhalter, so muss man LIKE anstelle von = verwenden:

SELECT preis FROM produkt WHERE beschreibung LIKE '%cola%';

Aggregate Funktionen

Diese Funktionen werden verwendet, um bestimmte Felder/Werte zu erhalten.

SELECT MIN(feld) FROM Tabelle; -- der kleinste Wert
SELECT MAX(feld) FROM Tabelle; -- der grösste Wert
SELECT SUM(feld) FROM Tabelle; -- sie Summe aller Werte
SELECT AVG(feld) FROM Tabelle; -- der Durchschnitt
SELECT COUNT(feld) FROM Tabelle; -- die Anzahl der Werte

HAVING

Sobald man Aggregate Funktionen verwendet, filtert man nicht mehr mit WHERE, sondern mit HAVING. HAVING ermöglicht es auch, nach dem Gruppieren zu sortieren.

ORDER

Mit Order kann man die Datensätze sortieren.

SELECT "spaltenName" FROM "tabellenName" ORDER BY "spaltenName";

Standardmässig wird aufsteigen (ASC) sortiert. Jedoch kann man die Sortierung mit DESC umkehren.

ORDER BY "spalte1" [ASC, DESC], "spalte2" [ASC, DESC]

GROUP

GROUP BY wird verwendet, um zu gruppieren. Oft macht man das unter Verwendung der Aggregaten Funktionen.

SELECT COUNT(customerID), country
FROM customers
GROUP BY country;

AS

Mit AS kann man den Namen einer Tabelle oder Spalte für die Ausgabe ändern. Der Name wird also nicht überschrieben sondern für die Ausgabe geändert.

SELECT marktwert as preis FROM players;

In diesem Beispiel wird die Spalte "Marktwert" unter dem Namen "Preis" ausgegeben.
Es gibt noch weitere Möglichkeiten zu selektieren. Auf die, meiner Meinung nach, fortgeschritteneren Dinge wie DISTINCT oder UNION gehe ich jetzt aber nicht ein.

DML (Data Manipulation Language)

Um die Daten einer Datenbank zu manipulieren, muss man sich von den DML Befehlen bedienen.

INSERT

Mit einem INSERT kann man Daten in eine Tabelle einfügen.

CREATE table tableName (
	vorname varchar(30),
	nachname varchar(30)
);
INSERT tableName VALUES('john', 'doe');

Man muss die Daten einer Tabelle nicht zwingend manuell einfügen, wenn man sie schon in einer anderen Tabelle hat.

CREATE TABLE person AS
SELECT vorname, nachname
FROM customers;

Es gibt zwei Methoden, um Datensätze in eine Tabelle einzufügen:

Standard Insert

Bei dieser Variante schreibt man auf jeder Zeile einen INSERT Befehl. Dies erfordert mehr Zeit, kann aber übersichtlicher sein.

INSERT INTO customers (customerName, city, country) VALUES ('A', 'Tokio', 'Japan');
INSERT INTO customers (customerName, city, country) VALUES ('B', 'Hongkong', 'China');
Bulk-Insert

Ich bevorzuge den Bulk-Insert, da er schneller geht. Man braucht lediglich ein INSERT Statement zu schreiben. Danach kann man mehrere Datensätze einfügen.

INSERT INTO 'adressen' ('id', 'name', 'fk_plz')
VALUES (1, 'urs', 9000), (2, 'hans', 9000), (3, 'anna', NULL), (4, 'Kurt', 9035);

UPDATE

Mit UPDATE können bestimmte Werte verändert werden.

UPDATE customers
SET contactName = 'Alfred Schmidt', City = 'Frankfurt' WHERE customerID = 1;

DELETE

Mit DELETE kann ich bestimmte Attribute löschen. Wie bei einer SELECT Abfrage kann ich mit WHERE gewisse Daten herausfiltern.

DELETE from klasse WHERE bezeichnung = INA1a;

Manueller Datenimport

Wenn ich die Daten schon in einem File habe, muss ich nicht alle Datensätze von hand in eine Tabelle eintragen. Ich muss nur das File laden.

LOAD DATA INFILE 'abc.csv' INTO TABLE abc

DCL (Data Control Language)

Will man Rechte vergeben, benötigt man diese Befehle.

Um Rechte zu erteilen muss man Benutzer anlegen.

CREATE User mustermann identified BY "1234";

Eine Nutzer kann auch wieder gelöscht werden.

DROP User muster;

Um die Users anzuzeigen schreibt man folgende SELECT Abfrage.

SELECT * from mysql.user;

Hat man Benutzer erstellt, so kann man auch Benutzerrollen erstellen.

Tipp: Man kann auch Gruppen erstellen und dieser die benötigten Rechte verleihen.

GRANT

Mit GRANT kann man Rechte verteilen.

CREATE USER urs@192.168.13.149 IDENTIFIED BY '1234'; -- User mit Passwort 1234 wird erstellt
GRANT SELECT, UPDATE ON artikel.artikel TO urs@192.168.13.149; -- User darf in der Tabelle Artikel SELECT und UPDATE Befehle ausführen

REVOKE

Mit REVOKE kann man Rechte entziehen.

REVOKE SELECT ON artikel.artikel TO urs@'%'; -- Urs darf keine SELECT abfragen ausführen
REVOKE ALL PRIVILEGES ON artikel.artikel TO urs@'%'; -- Urs hat nun keinerlei Rechte

TCL (Transaction Control Language)

Mit TCL Befehlen kann man sichere Änderungen einer Datenbank durchführen. Dies ist z.B. wichtig auf einer Bank. Dass Geld soll immer komplett oder nicht überwiesen werden. Mit TCL Befehlen kann man solche Änderungen sicher durchführen.

Ich gehe hier nicht auf die einzelnen Befehle ein, da dies den Rahmen sprengen würde. Unter diesem Link findet man aber ein gute Beschreibung:
https://www.studytonight.com/dbms/tcl-command.php#:~:text=Commit%2C%20Rollback%20and%20Savepoint%20SQL,grouped%20together%20into%20logical%20transactions (opens in a new tab).

Hilfe!

Die Reihenfolge der einzelnen Befehle muss stimmen. Ansonsten kommt es zu Fehlermeldungen. Diese Grafik kann dabei helfen.

help

Ich hoffe dieser Blogpost hat geholfen. Es ist klar, dass man nicht alles versteht/weiss, wenn man ihn das erste Mal durchliest. Um SQL wirklich auch zu können, muss man üben.

Ich empfehle dazu zwei Quellen: