SQL-Dialekte im Vergleich: was sich zwischen Datenbanken ändert
SELECT, WHERE, GROUP BY, JOIN und CASE funktionieren in jeder großen Datenbank gleich. Die Unterschiede liegen in den Details drumherum. Die Beispiele laufen in PostgreSQL, das diese Seite verwendet; jeder Abschnitt zeigt, wie die anderen es machen.
Die Anzahl der Zeilen begrenzen
PostgreSQL, MySQL und SQLite verwenden LIMIT (mit OFFSET, um Zeilen zu überspringen). SQL Server verwendet SELECT TOP n oder OFFSET ... FETCH nach ORDER BY. Oracle 12c und neuer sowie PostgreSQL akzeptieren die Standardform FETCH FIRST n ROWS ONLY.
SELECT name, unit_price FROM products ORDER BY unit_price DESC FETCH FIRST 3 ROWS ONLY;
Ergebnis: Die drei teuersten Produkte, in der Standardsyntax, die PostgreSQL und Oracle gemeinsam haben.
Text verbinden
PostgreSQL, SQLite und Oracle verbinden Text mit ||. SQL Server verwendet + (oder CONCAT). In MySQL bedeutet || OR, sofern keine Einstellung geändert wird, daher verwende CONCAT(). CONCAT funktioniert in PostgreSQL, MySQL und SQL Server und ist am besten übertragbar.
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM customers ORDER BY customer_id;
Ergebnis: Der vollständige Name jedes Kunden.
Das heutige Datum
PostgreSQL hat CURRENT_DATE und NOW(). MySQL hat CURDATE() und NOW(). SQL Server hat GETDATE(). SQLite verwendet date('now'). Oracle verwendet SYSDATE. CURRENT_DATE ist Standard-SQL und funktioniert in PostgreSQL, MySQL und Oracle.
SELECT CURRENT_DATE AS today;
Ergebnis: Eine Zeile mit dem heutigen Datum.
Ganzzahlige Division
In PostgreSQL, SQL Server und SQLite ergibt 7 / 2 den Wert 3, wenn beide Zahlen Ganzzahlen sind. In MySQL und Oracle ergibt es 3.5. Um überall dasselbe Ergebnis zu erhalten, wandle zuerst eine Seite in einen Dezimaltyp um.
SELECT 7 / 2 AS integer_division, 7 / 2.0 AS with_decimal;
Ergebnis: 3 und 3.5 in PostgreSQL.
Die Werte einer Gruppe verbinden
STRING_AGG gibt es in PostgreSQL und in SQL Server 2017 und neuer. MySQL und SQLite nennen es GROUP_CONCAT. Oracle nennt es LISTAGG.
SELECT city, STRING_AGG(first_name, ', ' ORDER BY first_name) AS names FROM customers GROUP BY city ORDER BY city;
Ergebnis: Die Kunden jeder Stadt in einem einzigen Text.
Groß- und Kleinschreibung, Anführungszeichen und automatische Nummerierung
Textvergleich: LIKE in PostgreSQL unterscheidet Groß- und Kleinschreibung (für das Gegenteil ILIKE verwenden). MySQL und SQL Server vergleichen Text meist ohne Berücksichtigung der Schreibweise, je nach Collation. LIKE in SQLite ignoriert bei einfachen englischen Buchstaben die Groß- und Kleinschreibung.
Namen in Anführungszeichen setzen: Standard-SQL verwendet doppelte Anführungszeichen, wie PostgreSQL, Oracle und SQLite. MySQL verwendet Backticks, SQL Server eckige Klammern.
Automatische Nummerierung eines Schlüssels: PostgreSQL verwendet GENERATED ... AS IDENTITY (oder serial), MySQL AUTO_INCREMENT, SQL Server IDENTITY(1,1), SQLite INTEGER PRIMARY KEY und Oracle 12c und neuer GENERATED AS IDENTITY.
SELECT name FROM products WHERE name ILIKE 'CROISSANT';
Ergebnis: Das Croissant wird trotz der Großbuchstaben gefunden, weil ILIKE die Schreibweise ignoriert.
Häufige Fragen
- Welche Datenbank sollte ich zuerst lernen?
- Jede davon. Der Kern lässt sich fast vollständig übertragen. PostgreSQL hält sich eng an den Standard, daher ist es eine gute erste Wahl.
- Laufen meine Abfragen von dieser Seite in MySQL oder SQL Server?
- Die meisten einfachen schon. Zu ändern sind die Teile aus diesem Leitfaden: LIMIT, ILIKE, ||, Datumsfunktionen, STRING_AGG und die RETURNING-Klausel.