Differenze tra dialetti SQL: cosa cambia tra i database

SELECT, WHERE, GROUP BY, JOIN e CASE funzionano allo stesso modo in tutti i principali database. Le differenze stanno nei dettagli intorno a questi. Gli esempi girano in PostgreSQL, che usa questo sito; ogni sezione indica come fanno gli altri.

Limitare il numero di righe

PostgreSQL, MySQL e SQLite usano LIMIT (con OFFSET per saltare righe). SQL Server usa SELECT TOP n, oppure OFFSET ... FETCH dopo ORDER BY. Oracle 12c e successivi, e anche PostgreSQL, accettano lo standard FETCH FIRST n ROWS ONLY.

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

Risultato: I tre prodotti più costosi, usando la sintassi standard che PostgreSQL e Oracle condividono.

Unire testi

PostgreSQL, SQLite e Oracle uniscono i testi con ||. SQL Server usa + (o CONCAT). In MySQL, || significa OR a meno che non si modifichi un'impostazione, quindi usa CONCAT(). CONCAT funziona in PostgreSQL, MySQL e SQL Server ed è la soluzione più portabile.

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

Risultato: Il nome completo di ogni cliente.

La data di oggi

PostgreSQL ha CURRENT_DATE e NOW(). MySQL ha CURDATE() e NOW(). SQL Server ha GETDATE(). SQLite usa date('now'). Oracle usa SYSDATE. CURRENT_DATE è SQL standard e funziona in PostgreSQL, MySQL e Oracle.

SELECT CURRENT_DATE AS today;

Risultato: Una riga con la data di oggi.

Divisione intera

In PostgreSQL, SQL Server e SQLite, 7 / 2 vale 3 quando entrambi i numeri sono interi. In MySQL e Oracle vale 3.5. Per ottenere lo stesso risultato ovunque, converti prima uno dei due lati in un tipo decimale.

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

Risultato: 3 e 3.5 in PostgreSQL.

Unire i valori di un gruppo

STRING_AGG esiste in PostgreSQL e in SQL Server 2017 e successivi. MySQL e SQLite lo chiamano GROUP_CONCAT. Oracle lo chiama LISTAGG.

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

Risultato: I clienti di ogni città in un unico testo.

Maiuscole, virgolette e numerazione automatica

Confronto dei testi: il LIKE di PostgreSQL distingue maiuscole e minuscole (per il contrario usa ILIKE); MySQL e SQL Server di solito confrontano i testi senza distinguere maiuscole e minuscole, a seconda della collation; il LIKE di SQLite ignora le maiuscole per le normali lettere inglesi.

Racchiudere un nome tra virgolette: lo standard SQL usa le virgolette doppie, come fanno PostgreSQL, Oracle e SQLite. MySQL usa gli apici inversi e SQL Server le parentesi quadre.

Numerazione automatica di una chiave: PostgreSQL usa GENERATED ... AS IDENTITY (o serial), MySQL AUTO_INCREMENT, SQL Server IDENTITY(1,1), SQLite INTEGER PRIMARY KEY, e Oracle 12c e successivi GENERATED AS IDENTITY.

SELECT name FROM products WHERE name ILIKE 'CROISSANT';

Risultato: Il Croissant, trovato nonostante le maiuscole, perché ILIKE ignora le maiuscole.

Domande comuni

Quale database conviene imparare per primo?
Uno qualsiasi. Il nucleo si trasferisce quasi completamente. PostgreSQL segue da vicino lo standard, il che lo rende una buona prima scelta.
Le query di questo sito funzioneranno in MySQL o SQL Server?
Le più semplici sì. Le parti da modificare sono quelle di questa guida: LIMIT, ILIKE, ||, funzioni di data, STRING_AGG e la clausola RETURNING.

Esercitati