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.