1. Einleitung
1In SQL ist es anders als in Programmen wie Microsoft Word, dass man etwas immer rückgängig bearbeiten kann. Wenn man z.B. eine Zeile versehentlich in SQL gelöscht hat, verliert man einfach die Daten in der Zeile und kann sie nicht mehr zurückfinden. Deshalb wird in der folgenden Arbeit ganz am Anfang das Exportieren von Datenbank und Tabelle vorgestellt, mit dem man rechtzeitig Sicherheitskopien erstellen kann. Anschließend werden die sog. "Column Attributes" erklärt, die die Struktur einer Tabelle zeigen. Danach werden das "insert statement", "update statement", "delete statement" und "create/alter table " in SQL mit Beispielen erläutert, die alle in unserer eigenen Datenbank namens "labuser_" durchgeführt werden sollen (weil wir in unserer Kurs-Datenbank "lab_korplingma" kein Recht für Datenmanipulation haben). Zum Schluss wird "Index" in Tabelle vorgestellt.
2. Exportieren
2.1. Exportieren einer ganzen Datenbank/Tabelle
2Beim Exportieren benutzen wir in der Regel die Exportmethode "Schnell - nur notwendige Optionen anzeigen". Wenn wir die Methode "Angepasst - zeige alle möglichen Optionen an" wählen, werden z.B. formatspezifische Optionen, Objekterstellungsoptionen, Datenerstellungsoptionen etc. zur Verfügung gestellt.

Exportieren einer Datenbank (am Beispiel von "labuser_jlu")

Exportieren einer Tabelle (am Beispiel von Tabelle "beispiel_tokens_neu")
2.2. Formate
3Beim Exportieren gibt es verschiedene Formate wie SQL, CSV, Microsoft Word 2000 usw. Meistens werden die Formate SQL und CSV benutzt.
4Mit dem Format CSV kann man die exportierte Tabelle durch z.B. Vim weiter bearbeiten:

Exportieren einer Tabelle mit dem Format SQL (am Beispiel von Tabelle "beispiel_tokens_neu")
5Die exportierte Tabelle mit dem Format CSV sieht wie eine "normale" Tabelle aus:

Exportieren einer Tabelle (Ausschnitt) mit dem Format CSV (am Beispiel von Tabelle "beispiel_tokens_neu")
3. Column Attributes
6Bevor wir eine oder mehrere Zeilen in eine Tabelle einfügen, müssen wir die Struktur dieser Tabelle kennen, d.h. an welcher Stelle sollen wir welchen Typ von Daten einsetzen.

Struktur einer Tabelle (am Beispiel von Tabelle beispiel_tokens_neu)
7Oder: DESC tabelle_name
8Erklärung:
9• Die erste Spalte zeigt alle sieben Spalten in der Tabellen „beispiel_tokens_neu“.
10• Die zweite Spalte zeigt den Datentyp der jeweiligen Spalte in dieser Tabelle:
11int(11): „integer value“, keine Dezimale. „11“ bedeutet, dass man maximal 11 Ziffern eingeben darf.
12varchar(50): „varchar“ steht für „variable character“. “50” bedeutet, dass der Wert an dieser Stelle maximal 50 Charakters/Zeichen haben darf, sonst werden die überschüssigen Charakters bei der Speicherung einfach weggelassen. Im Vergleich zu CHAR kann man durch VARCHAR mehr Platz sparen beim Speichern: z.B. wenn man den Wert mit nur 5 Zeichen speichert, werden die überschüssigen 45 Zeichenplätze in varchar(50) einfach leer gelassen, während sie in char(50) gespeichert werden.
13• Die „NULL“-Spalte bezeichnet, ob eine Spalte keinen Wert beinhalten darf.
14• Die „Standard“-Spalte zeigt, wenn eine Spalte keinen Wert hat, was MySQL automatisch anzeigen wird.
15• Der golden Schlüssel steht für „primary key“. Alle Werte in dieser Spalte sind natürlich einzig/“unique“.
16• Das „AUTO_INCREMENT“ kommt i.d.R. zusammen mit dem „primary key“: „automatic increment by 1“.
4. Das Insert-Statement
4.1. Insert innerhalb einer Tabelle
- Insert eine Zeile mit allen Spalten:
INSERT INTO tabelle_name VALUES (wert_spalte1, wert_spalte 2, …, wert_spalten)

Insert einer Zeile in eine Tabelle_beispiel 1
- Insert eine Zeile mit bestimmten Spalten:
INSERT INTO tabelle_name (spalte1, spalte2) VALUES (wert_spalte1, wert_spalte 2)

Insert einer Zeile in eine Tabelle_beispiel 2
- Insert mehrere Zeilen in einer Tabelle:
INSERT INTO tabelle_name (spalte1, spalte2) VALUES (wert_spalte1, wert_spalte 2), (wert_spalte1, wert_spalte 2)

Insert mehrerer Zeilen in eine Tabelle_beispiel 3
- Erklärungen
171) DEFAULT: Wenn wir eine Nummer als id_token einfügen, die es aber schon in der Tabelle gibt, wird es misslingen (weil id_token mit dem golden Schlüssel markiert ist). Aber wenn wir den DEFAULT-Wert eingeben, übergeben wir MySQL das Recht, automatisch einen anderen einzigen Wert zu produzieren.
182) Wenn man in eine Spalte keinen bestimmten Wert („leeren Wert“; NULL – KEINEN Wert) einfügen will, die aber NICHT NULL markiert ist, soll man „empty string“ ('') für string-Typ, 0 für numerischen Typ, „zero“ für Datum- und Zeit-Typ einfügen.
4.2. Insert zwischen mehreren Tabellen
19Wenn man Zeile(n) in einer Tabelle in eine andere Tabelle einfügen will, muss die Struktur der zwei Tabellen gleich sein.
- Fügen alle Zeilen in Tabelle 1 in die Tabelle 2:
INSERT INTO tabelle2 (spalte1, spalte2, spalte3, … spalten) SELECT spalte1,spalte2, spalte3, …, spalten FROM tabelle1

Insert aller Zeilen einer Tabelle in eine andere Tabelle_1
-- oder INSERT INTO tabelle2 SELECT * FROM tabelle1

Insert aller Zeilen einer Tabelle in eine andere Tabelle_2
- Fügen bestimmte Spalten in Tabelle 1 in die Tabelle 2:
INSERT INTO tabelle2 (spalte1, spalte2) VALUES spalte1, spalte2 FROM tabelle1

Insert bestimmter Zeilen einer Tabelle in eine andere Tabelle
-
Fügen bestimmte Spalten in Tabelle 1 in die Tabelle 2 unter bestimmten Bedingungen:
INSERT INTO tabelle2 (spalte1, spalte2) SELECT spalte1, spalte2 FROM tabelle1 WHERE … ORDER BY …

Insert bestimmter Zeilen einer Tabelle in eine andere Tabelle unter bestimmten Bedingungen
- Vorschlag:
20Wie am Anfang schon erwähnt, kann man in SQL nicht rückgängig arbeiten. Deshalb kann man zuerst das SELECT ... durchführen, und erst wenn man die erwünschten Ergebnisse bekommt, schreibt man vor dem SELECT-Statement dann das INSERT-Statement.
4.3. Eine Frage
21Wie kann man zwischen zwei Zeilen eine neue Zeile einfügen?
22Zum Beispiel möchten wir in Beispieltabelle "beispiel_tokens_neu" eine neue Zeile 5 (nämlich "id_token = 5") mit dem token "netten" einfügen, in der es aber schon eine Zeile mit "id_token" 5 gibt. Wenn man folgende Kommandos ausführen lässt,
INSERT INTO beispiel_tokens_neu (id_token, token, wortart, lemma) VALUES (5, 'netten', '', '') -- ERROR
23zeigt SQL einen Fehler, weil id_token mit "primary key" markiert ist. Deshalb muss man zuerst die eigentliche id_token 5 in 6 und id_token 6 in 7 usw. setzen, für das man das update-statement braucht. Deshalb wird diese Frage erst nach der Erklärung des update-Statements beantwortet.
5. Das Update-Statement
5.1. UPDATE ... SET ...
- update eine Zeile in einer Tabelle unter bestimmten Bedingungen:
UPDATE tabelle_name SET … WHERE … -- z.B. UPDATE queries SET titel = 'Guten Morgen' WHERE id_query = 3
- update mehrere Zeile in einer Tabelle mit dem gleichen Wert:
z.B. UPDATE queries
SET titel = 'Schönen Tag'
WHERE id_query IN (4,5)
24Exkurs: IN-Operator
SELECT * FROM beispiel_tokens_neu WHERE wortart = 'NN' OR wortart = 'ART' OR wortart = 'APPR' -- WHERE wortart IN ('NN', 'ART', 'APPR') -- WHERE wortart NOT IN ('NN', 'ART', 'APPR')

IN-Operator und REPLACE-Funktion
- Kurzer Weg: Doppelklick >> Einfügen
5.2. Fragebeantwortung
UPDATE beispiel_tokens_neu SET id_token = id_token + 1 WHERE id_token >= 5 ORDER BY id_token DESC; INSERT INTO beispiel_tokens_neu (id_token, token, wortart, lemma) VALUES (5, 'netten', '', '') -- UPDATE-Statement und INSERT-Statement werden durch Strichpunkt getrennt.
25Wenn wir eine neue Zeile 5 einfügen möchten, müssen die Zeilen ab der eigentlichen 5. Zeile eine Zeile nach unten rutschen, d.h. man soll id_token ab 5 plus 1 machen. Aber z.B. wenn man die eigentliche 5. Zeile (mit id_token 5) plus 1 macht, bekommt man die neue id_token 6, die es aber schon in der Tabelle gibt (nämlich die eigentliche 6. Zeile mit id_token 6). Aber wenn man die id_token absteigend plus 1 macht, nämlich von der letzte id_token 393 an plus 1 machen, und dann 392 + 1, 391 + 1, ... 5 + 1, taucht kein Problem auf. Deshalb benutzen wir ORDER BY id_token DESC.
6. Das Delete_Statement
- Löschen Zeile(n) in einer Tabelle:
DELETE FROM tabelle_name WHERE ...

Delete Zeilen in einer Tabelle unter bestimmten Bedingungen
- Kurzer Weg

Delete_kurzer Weg
7. Create/Alter Table
7.1. Kopieren einer Tabelle
261) Nur Struktur, Struktur und Daten, Nur Daten (Wie oben schon erwähnt, ist die Struktur einer Tabelle sehr wichtig, wenn man eine Zeile in Tabelle 1 in die Tabelle 2 einfügen möchte.)

Kopieren einer Tabelle
272) durch:
CREATE TABLE tabelle_kopie AS SELECT * FROM tabelle_name
28Achtung!: nicht alle „column attributes“ werden wie original korpiert.
293) CREATE TABLE … LIKE-Statement:
30Eine leere Tabelle wird erzeugt, deren Spalten, Spaltenattribute und Indizes gleich wie in der originalen Tabelle.
CREATE TABLE tabelle_kopie LIKE original_tabelle
314) CREATE TABLE … SELECT-Statement: kopieren bestimmter Spalten in einer Tabelle in die neue Tabelle:
CREATE TABLE tabelle_kopie AS SELECT spalte_x, spalte_y, spalte_z FROM original_tabelle [WHERE … ORDER BY … LIMIT …]
7.2. Erzeugen einer neuen Tabelle
321) Datenbank (siehe Abb. 17) >> Operationen >> Erzeuge Tabelle (Name, Anzahl der Spalten) >> OK (siehe Abb. 18) >> Abb. 19

Erzeugen einer neuen Tabelle in einer Datenbank_Schritt 1

Schritt 2

Schritt 3
332) CREATE TABLE -Statement:
CREATE TABLE tabelle_name ( spalte1 dateityp NOT NUll AUTO_INCREMENT, spalte2 dateityp … , spalte3 dateityp … , … spaltex dateityp … , PRIMARY KEY (spalte_name) ) -- siehe Abb. 3
34Oder:
CREATE TABLE tabelle_name ( spalte1 dateityp PRIMARY KEY, spalte2 dateityp, spalte3 dateityp, … spaltex dateityp)
7.3. Umbenennt einer oder mehrerer Tabellen
RENAME TABLE tabelle1_name TO tabelle1_name_2, tabelle2_name TO tabelle2_name_2
7.4. Löschen einer Tabelle
DROP TABLE tabelle_name
35Oder: ein kurzer Weg

Löschen einer Tabelle
7.5. VIEW oder Table?
36Ein View zu erzeugen ist ganz analog zu „create table“.
CREATE VIEW tabelle_view AS SELECT * FROM tabelle [WHERE …]
37Der Unterschied zwischen View und Tabelle:
38View ist eine virtuelle und temporal generierte Tabelle. Man kann unterschiedliche Daten aus verschiedenen Tabellen in ein View zusammenstellen, und wenn Daten in den entsprechenden Tabellen verändert sind, werden die entsprechenden Daten im View auch automatisch aktualisiert, auch umgekehrt. Man kann kein Indiz (engl. "index") in ein View setzen.
8. Index
39Index in SQL funktioniert ähnlich wie ein Index in einem Buch. Wenn man etwa bestimmtes in einem Buch durchsucht, braucht man nicht das ganze Buch durchzulesen, stattdessen kann man in einem Index schneller suchen. Mithilfe von Index wird die Suche in SQL sehr beschleunigt, wenn man eine große Menge von Daten bearbeiten muss. Im folgenden werden drei grundlegende Indizes vorgestellt:
- primary key (Primärschlüssel): ein Identifikator, natürlich unique markiert.
- key: ein normales Indiz.
- Unique:

Indizes in Tabelle "beispiel_tokens_neu"
40In der Tabelle "beispiel_tokens_neu" gibt es insgesamt zwei Indizes: eines ist Primärschlüssel in der Spalte "id_token", das andere ist ein normales Indiz in der Spalte "token".
9. Mehr Erklärungen unter
41insert: https://dev.mysql.com/doc/refman/8.0/en/insert.html
42update: https://dev.mysql.com/doc/refman/8.0/en/update.html
43delete: https://dev.mysql.com/doc/refman/8.0/en/delete.html
44allgemeines: https://dev.mysql.com/doc/refman/8.0/en/sql-data-definition-statements.html