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.