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

7.2 KiB

SQL

Spracharten

DDL (Data Definition Language)

DML (Data Manipulation Language)

DCL (Data Control Language)

SQL als DDL

  • CREATE

    • CREATE TABLE tabellenname (
        spaltenname1 datentyp [Einschränkungen],
        spaltenname2 datentyp [Einschränkungen],
        ...
        PRIMARY KEY (spaltenname1, spaltenname2)
      );
      
    • CREATE INDEX indexname 
          ON tabellenname (spaltenname) ASC;
      
  • ALTER

    • 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
    • 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
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)
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
    •   INSERT INTO tabellenname (spaltenname1, spaltenname2, ...)
            VALUES (wert1, wert2, ...);
      
  • Update
    •   UPDATE tabellenname
            SET spaltenname1 = wert1, spaltenname2 = wert2, ...
            WHERE bedingung;
      
  • Delete
    •   DELETE FROM tabellenname
            WHERE bedingung;
      

Alle Tabelleninhalte löschen

TRUNCATE TABLE tabellenname;

Relationenalgebra

  • SELECT DISTINCT

    • Nur einmalige Werte auswählen
    • SELECT DISTINCT spaltenname1, spaltenname2
      FROM tabellenname;
      
  • WHERE

    •   SELECT spaltenname1, spaltenname2
        FROM tabellenname1, tabellenname2
        WHERE bedingung;
      
    • BETWEEN
      •   SELECT spaltenname1, spaltenname2
          FROM tabellenname
          WHERE spaltenname BETWEEN wert1 AND wert2;
        
    • AND
      •   SELECT spaltenname1, spaltenname2
          FROM tabellenname
          WHERE bedingung1 AND bedingung2;
        
    • OR
      •   SELECT spaltenname1, spaltenname2
          FROM tabellenname
          WHERE bedingung1 OR bedingung2;
        
    • LIKE
      •   SELECT spaltenname1, spaltenname2
          FROM tabellenname
          WHERE spaltenname LIKE 'muster%';
        
    • IS [NOT] NULL
      •   SELECT spaltenname1, spaltenname2
          FROM tabellenname
          WHERE spaltenname IS NULL;
        
  • [NOT] IN

    • geschachtelte Anfragen
    • SELECT spaltenname1, spaltenname2
      FROM tabellenname
      WHERE spaltenname1 IN 
          (SELECT spaltenname1 FROM tabellenname2 WHERE bedingung);
      
  • FROM

    • JOIN...ON
      • 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
        • 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
        • 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
        • 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)
        • SELECT spaltenname1, spaltenname2
          FROM tabellenname1
          NATURAL JOIN tabellenname2;
          
  • AS

    • Spalten umbenennen
    • SELECT spaltenname1 AS aliasname1, spaltenname2 AS aliasname2
      FROM tabellenname;
      
    • SELECT spaltenname1+4 AS aliasname
      FROM tabellenname;
      
  • EXCEPT

    • Tabellen voneinander subtrahieren
    • image_899.png
    • SELECT spaltenname1, spaltenname2
      FROM tabellenname1
      EXCEPT
      SELECT spaltenname1, spaltenname2
      FROM tabellenname2;
      
  • INTERSECT

    • Schnittmenge zweier Tabellen
    • image_900.png
    • SELECT spaltenname1, spaltenname2
      FROM tabellenname1
      INTERSECT
      SELECT spaltenname1, spaltenname2
      FROM tabellenname2;
      
  • UNION

    • Tabellen zusammenführen
    • image_898.png
    • SELECT spaltenname1, spaltenname2
      FROM tabellenname1
      UNION
      SELECT spaltenname1, spaltenname2
      FROM tabellenname2;
      
  • GROUP BY...[HAVING]

    • Gruppierung von Zeilen
    • 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