SQL ed

http://www.postgresql.org/files/documentation/books/pghandbuch/html/

Grundlagen ed

alle Datenbanken auflisten
SHOW DATABASES;

Datenbank auswählen
USE datenbank;

Tabellen auflisten
SHOW TABLES;

Tabellen editieren ed

neue Tabelle anlegen ed

einfach
CREATE TABLE tabellenname ( name1 typ1, name2 typ2, ...);

Standartwert
name typ DEFAULT wert

Constraints (einfach)
name typ NOT NULL | NULL | UNIQUE | PRIMARY KEY

PRIMARY KEY := UNIQUE + NOT NULL

Tabelle löschen ed

einfach
DROP TABLE tabellenname;

alle Abhängigkeiten mit löschen
DROP TABLE tabellenname CASCADE;

nur löschen, wenn nichts abhängt
DROP TABLE tabellenname RESTRICT;

Tabelle ändern ed

Tabelle umbenennen
ALTER TABLE alter_tabellenname RENAME TO neuer_tabellenname;

Spalte hinzufügen
ALTER TABLE tabellenname ADD name typ;
ALTER TABLE tabellenname ADD COLUMN name typ;

Spalte löschen
ALTER TABLE tabellenname DROP [COLUMN] name    [CASCADE | RESTRICT];

Spalte umbenennen
ALTER TABLE tabellenname ALTER [COLUMN] alter_name TO neuer_name;

Daten auslesen (select) ed

einzelne Tabelle ed

Ausgabe-Spalten wählen
SELECT * FROM tabelle;
SELECT spalte1, spalte2,... FROM tabelle;
SELECT funktion(spalte)... FROM tabelle;

sortieren
SELECT ... FROM tabelle ORDER BY spalte [ASC | DESC];
SELECT ... FROM tabelle ORDER BY funktion(spalte) [ASC | DESC];

Bedingungen
SELECT ... FROM tabelle WHERE bedingung;

doppelte Einträge entfernen
SELECT DISTINCT ... FROM ....;
SELECT DISTINCT ON (ausdruck1, ausdruck2, ...) ... FROM...;

Zeilennummer einschränken
SELECT ... LIMIT anzahl OFFSET anfang;

Differenz zwischen selects
select_befehl1 EXCEPT select_befehl2
nochmal SELECT? (nicht in MySQL?)

mehrere Tabellen ed

ohne JOIN
SELECT * FROM tabell1, tabelle2 WHERE tabelle1.x = tabelle2.y;
Gibt die Menge aller Zeilenpaare (als lange Zeilen) aus beiden Tabellen aus, für die die Bedingung erfüllt ist. tabelle1.x und tabelle2.y sind somit doppelt.

INNER JOIN
SELECT * FROM tabelle1 INNER JOIN tabelle2 ON (tabelle1.x = tabelle2.y);
Gleiches Verhalten, nur werden die doppelten Spalten entfernt.

OUTER JOIN
SELECT * FROM tabelle1 LEFT OUTER JOIN tabelle2 ON (tabelle1.x = tabelle2.y);
Doppelte Spalten mit ausgeben und von der linken Tabelle auch diejenigen Einträge, die kein Gegenstück in der rechten besitzen (rechte Einträge bleiben leer).

SELECT * FROM tabelle1 RIGHT OUTER JOIN tabelle2 ON (tabelle1.x = tabelle2.y);
SELECT * FROM tabelle1 FULL OUTER JOIN tabelle2 ON (tabelle1.x = tabelle2.y);

Alias ed

Tabellen
SELECT a.x, b.y,... FROM tabelle1 a, tabelle2 b WHERE a.x > b.y;
Bei mehreren Tabellen sinnvoll.

Spalten
SELECT f(x) AS y, ... FROM ...;

Aggregatfunktionen ed

Machen aus vielen Ergebnissen eines. Z.B. count, max, min, avg, sum.

Dürfen NICHT im where stehen!

z.B.

SELECT sum(x) FROM tabelle WHERE y > 7;

Unsinn macht dageben

SELECT sum(x), y FROM ...;

Gruppierung und Reihenfolge ed

Gruppierung
SELECT * FROM tabelle WHERE ... GROUP BY x;
Zeigt von allen Spalten nur jeweils eine pro x-Wert.

SELECT * FROM tabelle WHERE ... GROUP BY x HAVING sum(y) > 10;
Zeigt nur die Gruppen, deren sum(y) > 10 ist.

Reihenfolge

Daten schreiben ed

vorhandere Zeilen ändern ed

UPDATE tabelle SET spalte1 = ausdruck1, ... WHERE bedingung;

neue Zeilen ed

INSERT INTO tabelle (spalte1, spalte2,...) VALUES (wert1, wert2, ...);

Zeilen löschen ed

DELETE FROM tabelle WHERE bedingung;

Views ed

erzeugen
CREATE VIEW name AS anfrage;

z.B.

CREATE VIEW name AS SELECT * FROM tabelle WHERE...;

löschen
DROP VIEW name [CASCADE | RESTRICT];