Selbsttest

Fundamentals oder Engineer Training?

Zwölf Fragen zu SQL und PostgreSQL, vier zu deiner Arbeitsumgebung, zwei zu dir. Dauer: etwa zehn Minuten. Rate nicht: Wenn du eine Antwort nicht weißt, wähle „Weiß ich nicht“. Das Ergebnis ist nur so gut wie deine Ehrlichkeit.

Die Empfehlung siehst du sofort. Die ausführliche Auswertung mit Erklärungen schicken wir dir auf Wunsch per E-Mail.

Die Beispieldaten

Die Fragen 1 bis 9 beziehen sich auf diese drei Tabellen. Leere Zellen sind NULL, die Tabelle produkte ist zu Beginn leer.

CREATE TABLE kunden (
    id    int PRIMARY KEY,
    name  text NOT NULL,
    email text
);

CREATE TABLE bestellungen (
    id       int PRIMARY KEY,
    kunde_id int NOT NULL REFERENCES kunden,
    status   text NOT NULL
);

CREATE TABLE produkte (
    sku      text PRIMARY KEY,
    preis    numeric(10,2) CHECK (preis > 0),
    bestand  int NOT NULL DEFAULT 0
);
kunden.idnameemail
1Annaanna@example.com
2Ben
3Cemcem@example.com
4Dana
5Evaeva@example.com
bestellungen.idkunde_idstatus
11offen
21versandt
31offen
43versandt

Teil A: SQL und PostgreSQL

1. Was liefert diese Abfrage?
SELECT count(*), count(email) FROM kunden;
2. Du willst alle Kunden mit mehr als einer Bestellung. Welche Abfrage ist richtig?
3. Welche Zahl liefert diese Abfrage?
WITH zahlen AS (SELECT generate_series(1, 6) AS n)
SELECT sum(n) FROM zahlen WHERE n % 2 = 0;
4. Wie viele Zeilen liefert diese Abfrage?
SELECT k.name, b.id
FROM kunden k
LEFT JOIN bestellungen b ON b.kunde_id = k.id
WHERE b.status = 'offen';
5. Du willst die Namen aller Kunden, die mindestens eine Bestellung haben, jeden Namen einmal. Was stimmt?
-- Variante 1
SELECT k.name FROM kunden k JOIN bestellungen b ON b.kunde_id = k.id;

-- Variante 2
SELECT k.name FROM kunden k
WHERE EXISTS (SELECT 1 FROM bestellungen b WHERE b.kunde_id = k.id);
6. Eine Tabelle gesperrt enthält die Werte 1, 2 und NULL in der Spalte kunde_id. Was liefert diese Abfrage?
SELECT count(*)
FROM generate_series(1, 5) AS g(id)
WHERE id NOT IN (SELECT kunde_id FROM gesperrt);
7. Was passiert bei diesem INSERT?
INSERT INTO produkte (sku, preis) VALUES ('A-1', NULL);
8. Was passiert hier?
DELETE FROM kunden WHERE id = 1;
9. Das Produkt A-1 hat einen Bestand von 5. Wie hoch ist der Bestand danach?
INSERT INTO produkte (sku, preis, bestand) VALUES ('A-1', 9.90, 3)
ON CONFLICT (sku) DO UPDATE SET bestand = produkte.bestand + EXCLUDED.bestand;
10. Die Tabelle t ist leer. Du führst in psql nacheinander diese Befehle aus. Wie viele Zeilen hat t danach?
BEGIN;
INSERT INTO t VALUES (1);
SELECT 1/0;
INSERT INTO t VALUES (2);
COMMIT;
11. Eine Abfrage auf eine Tabelle mit 100.000 Zeilen zeigt diesen Plan. Was hilft am meisten?
Seq Scan on auftraege (actual rows=10.00 loops=1)
  Filter: (kunde_id = 42)
  Rows Removed by Filter: 99990
12. Was stimmt über EXPLAIN ANALYZE DELETE FROM t;?

Teil B: Deine Arbeitsumgebung

13. Ich arbeite mit psql: Tabellen mit \d ansehen, ein Skript mit \i ausführen, breite Ergebnisse mit \x lesen.
14. Ich bewege mich in einer Linux-Shell: Dateien und Rechte, Prozesse, Logs mit tail oder journalctl lesen.
15. Ich starte Docker-Container, sehe mir ihre Logs an und öffne eine Shell darin.
16. Ich kann eine YAML-Datei lesen und anpassen, zum Beispiel eine compose.yaml.

Teil C: Über dich

17. Was beschreibt deine Rolle am besten?