Różnice dialektów SQL: co zmienia się między bazami

SELECT, WHERE, GROUP BY, JOIN i CASE działają tak samo we wszystkich popularnych bazach. Różnice leżą w szczegółach wokół nich. Przykłady działają w PostgreSQL, z którego korzysta ta strona; każda sekcja pokazuje, jak robią to pozostałe.

Ograniczanie liczby wierszy

PostgreSQL, MySQL i SQLite używają LIMIT (z OFFSET, aby pominąć wiersze). SQL Server używa SELECT TOP n albo OFFSET ... FETCH po ORDER BY. Oracle 12c i nowsze oraz PostgreSQL akceptują standardowe FETCH FIRST n ROWS ONLY.

SELECT name, unit_price
FROM products
ORDER BY unit_price DESC
FETCH FIRST 3 ROWS ONLY;

Wynik: Trzy najdroższe produkty, w standardowej składni, którą współdzielą PostgreSQL i Oracle.

Łączenie tekstu

PostgreSQL, SQLite i Oracle łączą tekst za pomocą ||. SQL Server używa + (lub CONCAT). W MySQL || oznacza OR, chyba że zmieniono ustawienie, więc użyj CONCAT(). CONCAT działa w PostgreSQL, MySQL i SQL Server i jest najbardziej przenośny.

SELECT CONCAT(first_name, ' ', last_name) AS full_name
FROM customers
ORDER BY customer_id;

Wynik: Pełne imię i nazwisko każdego klienta.

Dzisiejsza data

PostgreSQL ma CURRENT_DATE i NOW(). MySQL ma CURDATE() i NOW(). SQL Server ma GETDATE(). SQLite używa date('now'). Oracle używa SYSDATE. CURRENT_DATE to standard SQL i działa w PostgreSQL, MySQL i Oracle.

SELECT CURRENT_DATE AS today;

Wynik: Jeden wiersz z dzisiejszą datą.

Dzielenie całkowitoliczbowe

W PostgreSQL, SQL Server i SQLite 7 / 2 daje 3, gdy obie liczby są całkowite. W MySQL i Oracle wynik to 3.5. Aby mieć ten sam wynik wszędzie, najpierw rzutuj jedną stronę na typ dziesiętny.

SELECT 7 / 2 AS integer_division, 7 / 2.0 AS with_decimal;

Wynik: 3 i 3.5 w PostgreSQL.

Łączenie wartości grupy

STRING_AGG istnieje w PostgreSQL i w SQL Server 2017 i nowszych. MySQL i SQLite nazywają to GROUP_CONCAT. Oracle nazywa to LISTAGG.

SELECT city, STRING_AGG(first_name, ', ' ORDER BY first_name) AS names
FROM customers
GROUP BY city
ORDER BY city;

Wynik: Klienci z każdego miasta w jednym tekście.

Wielkość liter, cudzysłowy i automatyczna numeracja

Porównywanie tekstu: LIKE w PostgreSQL rozróżnia wielkość liter (dla odwrotności użyj ILIKE); MySQL i SQL Server zwykle porównują tekst bez względu na wielkość liter, zależnie od porównania (collation); LIKE w SQLite ignoruje wielkość liter dla zwykłych angielskich liter.

Cytowanie nazwy: standardowy SQL używa podwójnych cudzysłowów, tak jak PostgreSQL, Oracle i SQLite. MySQL używa odwrotnych apostrofów, a SQL Server nawiasów kwadratowych.

Automatyczna numeracja klucza: PostgreSQL używa GENERATED ... AS IDENTITY (lub serial), MySQL AUTO_INCREMENT, SQL Server IDENTITY(1,1), SQLite INTEGER PRIMARY KEY, a Oracle 12c i nowsze GENERATED AS IDENTITY.

SELECT name FROM products WHERE name ILIKE 'CROISSANT';

Wynik: Croissant, znaleziony mimo wielkich liter, bo ILIKE ignoruje wielkość liter.

Częste pytania

Od której bazy powinienem zacząć naukę?
Od dowolnej. Rdzeń przenosi się niemal w całości. PostgreSQL ściśle trzyma się standardu, co czyni go dobrym pierwszym wyborem.
Czy moje zapytania z tej strony będą działać w MySQL lub SQL Server?
Większość podstawowych tak. Trzeba zmienić części opisane w tym przewodniku: LIMIT, ILIKE, ||, funkcje dat, STRING_AGG i klauzulę RETURNING.

Ćwicz to