Diferencias entre dialectos de SQL: qué cambia entre bases de datos

SELECT, WHERE, GROUP BY, JOIN y CASE funcionan igual en las bases de datos principales. Las diferencias están en los detalles que los rodean. Los ejemplos se ejecutan en PostgreSQL, que usa este sitio; cada sección indica cómo lo hacen las demás.

Limitar el número de filas

PostgreSQL, MySQL y SQLite usan LIMIT (con OFFSET para saltar filas). SQL Server usa SELECT TOP n, u OFFSET ... FETCH después de ORDER BY. Oracle 12c y posteriores, y también PostgreSQL, aceptan el estándar FETCH FIRST n ROWS ONLY.

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

Resultado: Los tres productos más caros, con la sintaxis estándar que comparten PostgreSQL y Oracle.

Unir texto

PostgreSQL, SQLite y Oracle unen texto con ||. SQL Server usa + (o CONCAT). En MySQL, || significa OR, salvo que se cambie una configuración, así que usa CONCAT(). CONCAT funciona en PostgreSQL, MySQL y SQL Server, y es la opción más portable.

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

Resultado: El nombre completo de cada cliente.

La fecha de hoy

PostgreSQL tiene CURRENT_DATE y NOW(). MySQL tiene CURDATE() y NOW(). SQL Server tiene GETDATE(). SQLite usa date('now'). Oracle usa SYSDATE. CURRENT_DATE es SQL estándar y funciona en PostgreSQL, MySQL y Oracle.

SELECT CURRENT_DATE AS today;

Resultado: Una fila con la fecha de hoy.

División entera

En PostgreSQL, SQL Server y SQLite, 7 / 2 da 3 cuando ambos números son enteros. En MySQL y Oracle da 3.5. Para obtener el mismo resultado en todas partes, convierte primero un lado a un tipo decimal.

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

Resultado: 3 y 3.5 en PostgreSQL.

Unir los valores de un grupo

STRING_AGG existe en PostgreSQL y en SQL Server 2017 y posteriores. MySQL y SQLite la llaman GROUP_CONCAT. Oracle la llama LISTAGG.

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

Resultado: Los clientes de cada ciudad en un solo texto.

Mayúsculas, comillas y numeración automática

Comparación de texto: el LIKE de PostgreSQL distingue mayúsculas y minúsculas (usa ILIKE para lo contrario); MySQL y SQL Server suelen comparar el texto sin distinguir mayúsculas por defecto, según la intercalación (collation); el LIKE de SQLite ignora las mayúsculas en las letras básicas del inglés.

Entrecomillar un nombre: el SQL estándar usa comillas dobles, como hacen PostgreSQL, Oracle y SQLite. MySQL usa comillas invertidas y SQL Server corchetes.

Numeración automática de una clave: PostgreSQL usa GENERATED ... AS IDENTITY (o serial), MySQL AUTO_INCREMENT, SQL Server IDENTITY(1,1), SQLite INTEGER PRIMARY KEY y Oracle 12c y posteriores GENERATED AS IDENTITY.

SELECT name FROM products WHERE name ILIKE 'CROISSANT';

Resultado: The Croissant, encontrado pese a las mayúsculas, porque ILIKE ignora la diferencia.

Preguntas frecuentes

¿Qué base de datos debería aprender primero?
Cualquiera. El núcleo se transfiere casi por completo. PostgreSQL sigue el estándar de cerca, lo que lo convierte en una buena primera opción.
¿Funcionarán mis consultas de este sitio en MySQL o SQL Server?
La mayoría de las básicas sí. Las partes que hay que cambiar son las de esta guía: LIMIT, ILIKE, ||, las funciones de fecha, STRING_AGG y la cláusula RETURNING.

Practícalo