update
This commit is contained in:
259
Writerside/topics/04/Datenbanken/03_sql.md
Normal file
259
Writerside/topics/04/Datenbanken/03_sql.md
Normal file
@ -0,0 +1,259 @@
|
||||
# SQL
|
||||
## Spracharten
|
||||
### DDL (Data Definition Language)
|
||||
### DML (Data Manipulation Language)
|
||||
### DCL (Data Control Language)
|
||||
|
||||
## SQL als DDL
|
||||
- **CREATE**
|
||||
- ```sql
|
||||
CREATE TABLE tabellenname (
|
||||
spaltenname1 datentyp [Einschränkungen],
|
||||
spaltenname2 datentyp [Einschränkungen],
|
||||
...
|
||||
PRIMARY KEY (spaltenname1, spaltenname2)
|
||||
);
|
||||
```
|
||||
- ```sql
|
||||
CREATE INDEX indexname
|
||||
ON tabellenname (spaltenname) ASC;
|
||||
```
|
||||
|
||||
|
||||
- **ALTER**
|
||||
- ```sql
|
||||
ALTER TABLE tabellenname
|
||||
ADD spaltenname datentyp [Einschränkungen];
|
||||
|
||||
ALTER TABLE tabellenname
|
||||
DROP COLUMN spaltenname;
|
||||
|
||||
ALTER TABLE tabellenname
|
||||
ALTER COLUMN spaltenname SET NOT NULL;
|
||||
|
||||
ALTER TABLE tabellenname
|
||||
RENAME COLUMN alter_spaltenname TO neuer_spaltenname;
|
||||
|
||||
ALTER TABLE tabellenname
|
||||
DROP CONSTRAINT constraint_name;
|
||||
```
|
||||
- **DROP**
|
||||
- Löschen einer gesamten Tabelle/Index/View
|
||||
- ```sql
|
||||
DROP TABLE tabellenname;
|
||||
|
||||
DROP INDEX indexname;
|
||||
|
||||
DROP VIEW viewname;
|
||||
```
|
||||
|
||||
### Datentypen
|
||||
- **integer** (oder auch integer4, int),
|
||||
- **smallint** (oder auch integer2),
|
||||
- **real** (vergleichbar zu float),
|
||||
- **decimal**(p,q) und numeric(p,q) mit jeweils p Stellen gesamt und davon q Nachkommastellen,
|
||||
- **character**(n) (oder kurz char(n), bei n = 1 auch char) für Zeichenketten (Strings) fester Länge n,
|
||||
- **character varying**(n) (oder kurz **varchar**(n) für Strings variabler Länge bis zur Maximallänge n,
|
||||
- **bit**(n) oder bit varying(n) analog für Bitfolgen, und
|
||||
- **date**, **time** bzw. **timestamp** für Datums-, Zeit- und kombinierte Datums-Zeit-Angaben
|
||||
- **blob** (binary large object) für sehr große binäre Daten
|
||||
- **text** oder clob für sehr große Strings
|
||||
|
||||
### Constraints
|
||||
- **NOT NULL**: Spalte darf nicht leer sein
|
||||
- **DEFAULT**: Standardwert für die Spalte
|
||||
- **UNIQUE**, bzw. **PRIMARY KEY**: Spalte muss eindeutige Werte haben
|
||||
- **FOREIGN KEY**: Verweis auf eine andere Tabelle
|
||||
- **CHECK**: Bedingung, die für die Spalte gelten muss
|
||||
|
||||
```sql
|
||||
CREATE TABLE person (
|
||||
id SERIAL PRIMARY KEY,
|
||||
name VARCHAR(20) NOT NULL,
|
||||
email VARCHAR(50) UNIQUE,
|
||||
age INT CHECK (age >= 0),
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
FOREIGN KEY (personalId) REFERENCES andere_tabelle(id)
|
||||
);
|
||||
```
|
||||
|
||||
### Referentielle Integrität
|
||||
- **CASCADE**: Operation wird auf alle zugehörigen Datensätze angewendet
|
||||
- **SET DEFAULT**: Fremdschlüssel wird auf den Standardwert gesetzt
|
||||
- **SET NULL**: Fremdschlüssel wird auf NULL gesetzt
|
||||
- **RESTRICT**: Operation wird nur ausgeführt, wenn keine Fremdschlüsselbedingung verletzt wird
|
||||
- **NO ACTION**: Keine Aktion, wenn Fremdschlüsselbedingung verletzt wird (Standardverhalten)
|
||||
|
||||
```sql
|
||||
CREATE TABLE bestellung (
|
||||
id SERIAL PRIMARY KEY,
|
||||
kunde_id INT,
|
||||
produkt_id INT,
|
||||
FOREIGN KEY (kunde_id) REFERENCES kunde(id) ON DELETE CASCADE,
|
||||
FOREIGN KEY (produkt_id) REFERENCES produkt(id) ON DELETE SET NULL
|
||||
);
|
||||
```
|
||||
|
||||
## SQL als DML
|
||||
- **Insert**
|
||||
- ```sql
|
||||
INSERT INTO tabellenname (spaltenname1, spaltenname2, ...)
|
||||
VALUES (wert1, wert2, ...);
|
||||
```
|
||||
- **Update**
|
||||
- ```sql
|
||||
UPDATE tabellenname
|
||||
SET spaltenname1 = wert1, spaltenname2 = wert2, ...
|
||||
WHERE bedingung;
|
||||
```
|
||||
- **Delete**
|
||||
- ```sql
|
||||
DELETE FROM tabellenname
|
||||
WHERE bedingung;
|
||||
```
|
||||
### Alle Tabelleninhalte löschen
|
||||
```sql
|
||||
TRUNCATE TABLE tabellenname;
|
||||
```
|
||||
|
||||
## Relationenalgebra
|
||||
- **SELECT DISTINCT**
|
||||
- Nur einmalige Werte auswählen
|
||||
- ```sql
|
||||
SELECT DISTINCT spaltenname1, spaltenname2
|
||||
FROM tabellenname;
|
||||
```
|
||||
- **WHERE**
|
||||
- ```sql
|
||||
SELECT spaltenname1, spaltenname2
|
||||
FROM tabellenname1, tabellenname2
|
||||
WHERE bedingung;
|
||||
```
|
||||
- **BETWEEN**
|
||||
- ```sql
|
||||
SELECT spaltenname1, spaltenname2
|
||||
FROM tabellenname
|
||||
WHERE spaltenname BETWEEN wert1 AND wert2;
|
||||
```
|
||||
- **AND**
|
||||
- ```sql
|
||||
SELECT spaltenname1, spaltenname2
|
||||
FROM tabellenname
|
||||
WHERE bedingung1 AND bedingung2;
|
||||
```
|
||||
- **OR**
|
||||
- ```sql
|
||||
SELECT spaltenname1, spaltenname2
|
||||
FROM tabellenname
|
||||
WHERE bedingung1 OR bedingung2;
|
||||
```
|
||||
- **LIKE**
|
||||
- ```sql
|
||||
SELECT spaltenname1, spaltenname2
|
||||
FROM tabellenname
|
||||
WHERE spaltenname LIKE 'muster%';
|
||||
```
|
||||
- **IS [NOT] NULL**
|
||||
- ```sql
|
||||
SELECT spaltenname1, spaltenname2
|
||||
FROM tabellenname
|
||||
WHERE spaltenname IS NULL;
|
||||
```
|
||||
- **[NOT] IN**
|
||||
- geschachtelte Anfragen
|
||||
- ```sql
|
||||
SELECT spaltenname1, spaltenname2
|
||||
FROM tabellenname
|
||||
WHERE spaltenname1 IN
|
||||
(SELECT spaltenname1 FROM tabellenname2 WHERE bedingung);
|
||||
```
|
||||
- **FROM**
|
||||
- **JOIN...ON**
|
||||
- ```sql
|
||||
SELECT spaltenname1, spaltenname2
|
||||
FROM tabellenname1
|
||||
JOIN tabellenname2 ON tabellenname1.spaltenname = tabellenname2.spaltenname;
|
||||
```
|
||||
- **LEFT JOIN**
|
||||
- übernimmt alle Zeilen aus der linken Tabelle und die passenden aus der rechten
|
||||
- ```sql
|
||||
SELECT spaltenname1, spaltenname2
|
||||
FROM tabellenname1
|
||||
LEFT JOIN tabellenname2 ON tabellenname1.spaltenname = tabellenname2.spaltenname;
|
||||
```
|
||||
- **RIGHT JOIN**
|
||||
- übernimmt alle Zeilen aus der rechten Tabelle und die passenden aus der linken
|
||||
- ```sql
|
||||
SELECT spaltenname1, spaltenname2
|
||||
FROM tabellenname1
|
||||
RIGHT JOIN tabellenname2 ON tabellenname1.spaltenname = tabellenname2.spaltenname;
|
||||
```
|
||||
- **FULL OUTER JOIN**
|
||||
- übernimmt alle Zeilen aus beiden Tabellen, auch wenn keine Übereinstimmung besteht
|
||||
- ```sql
|
||||
SELECT spaltenname1, spaltenname2
|
||||
FROM tabellenname1
|
||||
FULL OUTER JOIN tabellenname2 ON tabellenname1.spaltenname = tabellenname2.spaltenname;
|
||||
```
|
||||
- **NATURAL JOIN**
|
||||
- gleiche Spaltennamen in beiden Tabellen werden automatisch verbunden (falls auch gleicher Datentyp)
|
||||
- ```sql
|
||||
SELECT spaltenname1, spaltenname2
|
||||
FROM tabellenname1
|
||||
NATURAL JOIN tabellenname2;
|
||||
```
|
||||
- **AS**
|
||||
- Spalten umbenennen
|
||||
- ```sql
|
||||
SELECT spaltenname1 AS aliasname1, spaltenname2 AS aliasname2
|
||||
FROM tabellenname;
|
||||
```
|
||||
- ```sql
|
||||
SELECT spaltenname1+4 AS aliasname
|
||||
FROM tabellenname;
|
||||
```
|
||||
- **EXCEPT**
|
||||
- Tabellen voneinander subtrahieren
|
||||
- 
|
||||
- ```sql
|
||||
SELECT spaltenname1, spaltenname2
|
||||
FROM tabellenname1
|
||||
EXCEPT
|
||||
SELECT spaltenname1, spaltenname2
|
||||
FROM tabellenname2;
|
||||
```
|
||||
- **INTERSECT**
|
||||
- Schnittmenge zweier Tabellen
|
||||
- 
|
||||
- ```sql
|
||||
SELECT spaltenname1, spaltenname2
|
||||
FROM tabellenname1
|
||||
INTERSECT
|
||||
SELECT spaltenname1, spaltenname2
|
||||
FROM tabellenname2;
|
||||
```
|
||||
- **UNION**
|
||||
- Tabellen zusammenführen
|
||||
- 
|
||||
- ```sql
|
||||
SELECT spaltenname1, spaltenname2
|
||||
FROM tabellenname1
|
||||
UNION
|
||||
SELECT spaltenname1, spaltenname2
|
||||
FROM tabellenname2;
|
||||
```
|
||||
- **GROUP BY...[HAVING]**
|
||||
- Gruppierung von Zeilen
|
||||
- ```sql
|
||||
SELECT spaltenname1, COUNT(*)
|
||||
FROM tabellenname
|
||||
GROUP BY spaltenname1;
|
||||
HAVING COUNT(*) > 1;
|
||||
```
|
||||
|
||||
- Aggregatfunktionen
|
||||
- **COUNT**: Anzahl der Zeilen
|
||||
- **SUM**: Summe der Werte
|
||||
- **AVG**: Durchschnitt der Werte
|
||||
- **MIN**: Minimalwert
|
||||
- **MAX**: Maximalwert
|
Reference in New Issue
Block a user