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.