David Schirrmeister 8fc91f469f update
2025-06-12 13:22:57 +02:00

259 lines
7.2 KiB
Markdown

# 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
- ![image_899.png](image_899.png)
- ```sql
SELECT spaltenname1, spaltenname2
FROM tabellenname1
EXCEPT
SELECT spaltenname1, spaltenname2
FROM tabellenname2;
```
- **INTERSECT**
- Schnittmenge zweier Tabellen
- ![image_900.png](image_900.png)
- ```sql
SELECT spaltenname1, spaltenname2
FROM tabellenname1
INTERSECT
SELECT spaltenname1, spaltenname2
FROM tabellenname2;
```
- **UNION**
- Tabellen zusammenführen
- ![image_898.png](image_898.png)
- ```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