259 lines
7.2 KiB
Markdown
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
|
|
- 
|
|
- ```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 |