Volver a la lista de artículos Artículos
Lectura de 8 minutos

8 consejos que los principiantes absolutos pueden utilizar para arreglar las consultas SQL

Los errores de código son comunes y frustrantes. Y cuando apenas estás aprendiendo SQL, puede ser muy desafiante encontrar y arreglar tus errores. En este post, te mostraremos ocho formas de resolver o eliminar errores comunes de codificación SQL.

Hoy hablaremos de algunos consejos que el principiante de SQL puede utilizar para evitar varios errores comunes. Estos consejos funcionan en cualquier entorno de base de datos. A medida que avancemos, mostraremos algunos mensajes de error. La redacción exacta de los mensajes de error puede ser un poco diferente, pero no te preocupes; cada motor de base de datos tiene sus propias variantes, pero el significado es el mismo.

Dicho esto, no nos centraremos en los mensajes de error. En su lugar, señalaremos la causa real del problema (como olvidar un paréntesis o una comilla). De este modo, aprenderás a eludir el problema desde el principio.

¿Preparado? Comencemos.

1. Coloca primero los paréntesis de apertura y cierre

Recordar el carácter de cierre es la clave para eliminar los paréntesis, las comillas, las dobles comillas o los corchetes desequilibrados. Las mejores prácticas sugieren escribir primero ambos caracteres (apertura y cierre) y luego escribir lo que va dentro.

El siguiente ejemplo muestra un error cuando los paréntesis no están equilibrados:

SELECT lastname, firstname FROM employee 
WHERE salary >= (select AVG(salary) from employee ;
ERROR:  syntax error at or near ";"
LINE 2: WHERE salary >= (select AVG(salary) from employee ;

Ejemplo 1: Paréntesis no equilibrados

2. No ponga una coma al final de una columna o secuencia de tabla

Las comas actúan como separadores en SQL. No debe haber comas entre FROM y el primer nombre de la tabla o después del nombre final de la tabla. La misma idea se aplica a la definición de las columnas: cuando crees una tabla, asegúrate de no escribir una coma extra después del nombre final de la columna.

Este es un error muy común.

SELECT * FROM employee, department,
ERROR:  syntax error at or near ","
LINE 1: SELECT * FROM employee, department

Ejemplo 2: Una coma de más

3. Utilice la evaluación parcial de consultas para depurar consultas SQL largas

Muchos clientes SQL como Navicat o pgAdmin permiten la ejecución parcial de una consulta. Puede hacerlo utilizando el ratón para resaltar parte del código. Usando esta técnica de "divide y vencerás", puedes aislar y corregir errores fácilmente. Obviamente, la parte marcada debe ser un SQL válido.

La siguiente consulta tiene dos errores. Si ejecutamos la línea inicial de la consulta, podemos ver el primer problema. (Pista: la columna "llastname" no existe).

SELECT llastname, firstname FROM employee 
WHERE salary >= (select MAXI(salary) from employee ;
ERROR:  column "llastname" does not exist
LINE 1: SELECT llastname, firstname FROM employee 

Ejemplo 3: Un nombre de columna incorrecto

Sin embargo, si ejecutamos la sentencia SQL completa, obtenemos un error relacionado con paréntesis no balanceados:

SELECT llastname, firstname FROM employee 
WHERE salary >= (select MAXI(salary) from employee;
ERROR:  syntax error at or near ";"
LINE 2: WHERE salary >= (select MAX(salary) from employee ;

Ejemplo 4: Subconsulta con paréntesis incorrectos

También podemos marcar una subconsulta y ejecutarla individualmente, como en el siguiente ejemplo:

SELECT llastname, firstname FROM employee 
WHERE salary >= (select MAXI(salary) from employee;
ERROR:  function maxi(numeric) does not exist
LINE 1: select MAXI(salary) from employee

Ejemplo 5: Nombre de función incorrecto

4. Preste atención a los nombres de columnas y tablas

Preste mucha atención cuando escriba los nombres de las columnas o de las tablas. Si es posible, intente copiar y pegar el nombre de un comando que sepa que es correcto, preferiblemente uno que ya se haya ejecutado correctamente. Las mejores prácticas sugieren copiar y pegar los nombres incluso si crees que es más lento que escribirlos.

Tener un nombre de columna mal escrito o referirse a una columna en una tabla que no está en la cláusula FROM es muy común. Busque siempre los errores tipográficos en el nombre de la columna, asegúrese de que la tabla en el FROM tiene esta columna, y asegúrese de que la tabla se menciona en FROM.

SELECT llastname, firstname FROM employees
ERROR:  table "employees" does not exist
LÍNEA 1: SELECT llastname, firstname FROM employees

Ejemplo 6: Nombre de tabla incorrecto

Otra buena práctica es utilizar un alias de tabla o un nombre de tabla como prefijo de columna. Esto es doblemente importante cuando se tienen dos o más tablas en la cláusula <>FROM. El siguiente error puede aparecer si se hace referencia a dos columnas con nombres idénticos en tablas diferentes:

SELECT lastname, name 
FROM department, employee
WHERE depto_id = depto_id
ERROR:  column reference "depto_id" is ambiguous
LINE 3: WHERE depto_id = depto_id

Ejemplo 7: Nombres de columna ambiguos

SELECT lastname, name 
FROM department, employee
WHERE department.depto_id = employee.depto_id

Ejemplo 8: Nombres de columna prefijados

Para solucionar estos errores, añada el nombre de la tabla antes del nombre de la columna. (En el ejemplo anterior, sería employee.depto_id y department.depto_id en lugar de sólo depto_id.)

5. Comparar sólo tipos de datos compatibles

Cuando escriba condiciones de comparación en la cláusula WHERE, asegúrese de que ambos tipos de datos son compatibles con el operador de comparación y entre sí. Si esto no es posible, es posible que tenga que fundir uno de los tipos de datos. La regla general es comparar números con números, cadenas de caracteres con cadenas de caracteres, etc.

Algunos sistemas de bases de datos convierten automáticamente los tipos de datos cuando es posible; otros ofrecen conversiones de tipos de datos mejoradas (por ejemplo, un valor TIMESTAMP puede convertirse automáticamente en DATE antes de las comparaciones). Otros servicios de bases de datos no ofrecen ningún tipo de conversión. Por lo tanto, lo mejor es que busques tú mismo estos posibles problemas.

De todos modos, el siguiente código SQL obtiene un error de incompatibilidad de datos porque se está comparando una cadena CHAR con un valor entero:

SELECT lastname, salary 
FROM employee
WHERE depto_id = firstname
ERROR:  operator does not exist: integer = character varying
LINE 3: WHERE depto_id = firstname

Ejemplo 9: Tipos de datos no coincidentes

Ningún operador coincide con el nombre y el tipo de argumento dados. Es posible que tengas que añadir fundiciones de tipo explícitas para resolver esto.

6. Utilice IS NULL cuando compare valores nulos

Si sólo necesita verificar si una columna tiene un valor NULL, preste especial atención a las expresiones que utiliza. Un error común es utilizar = NULL o <> NULL, pero estas expresiones no son válidas sintácticamente. Utilice en su lugar las cláusulas IS NULL y IS NOT NULL.

Veamos los ejemplos incorrectos y correctos:

SELECT firstname, lastname
FROM employee
WHERE depto_id = NULL

Ejemplo 10: Comparación NULL incorrecta

SELECT firstname, lastname
FROM employee
WHERE depto_id is NULL

Ejemplo 11: Comparación NULL correcta

7. Incluya siempre la condición JOIN

Hay más de una forma válida de hacer una unión en SQL. La forma tradicional es listar todas las tablas a unir en la cláusula FROM y poner las condiciones de unión en la cláusula WHERE para construir pares de registros. La otra forma (más declarativa) es utilizar la cláusula JOIN y enumerar las condiciones de unión después de la cláusula ON. Ambas son sintácticamente equivalentes, pero debe saber cómo identificar la condición de unión para ambas.

Aquí tenemos dos uniones válidas:

SELECT lastname, name 
FROM department, employee
WHERE department.depto_id = employee.depto_id
SELECT lastname, name 
FROM department JOIN employee ON department.depto_id = employee.depto_id

Ejemplo 12: Dos uniones equivalentes

Sin embargo, el consejo es: No olvide la condición de unión. Cada vez que une dos o más tablas, debe escribir una condición de unión para enlazar ambas tablas. Si no la especifica, no recibirá un mensaje de error, sino que obtendrá resultados incorrectos. Estos serán incorrectos porque cada registro de la primera tabla se unirá con todos los registros de la segunda tabla. Este tipo de conjunto de resultados se llama producto cartesiano de dos tablas, y normalmente no es un resultado esperado.

SELECT lastname, name 
FROM department, employee

Ejemplo 13: Un producto cartesiano - normalmente no es el resultado que se desea

8. Incluir columnas no agregadas de la lista SELECT en columnas GROUP BY

Cuando se utilizan funciones de agregación, existen algunas restricciones sobre las columnas que pueden incluirse en la lista SELECT (es decir, los nombres de las columnas después de la cláusula SELECT ). Sólo puede incluir las columnas especificadas en la cláusula GROUP BY, además de las funciones de agregación y las constantes. Si selecciona sólo columnas agregadas, cualquier otra columna generará un error. Puede ver esto en el siguiente ejemplo.

SELECT  department.depto_id, name , count(*) employees
FROM department, employee
WHERE department.depto_id = employee.depto_id
GROUP BY department.depto_id
ERROR:  column "department.name" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: SELECT  department.depto_id, name , count(*) employees

Ejemplo 14: Columnas extra en la lista SELECT

SELECT  department.depto_id, name , count(*) employees
FROM department, employee
WHERE department.depto_id = employee.depto_id
GROUP BY department.depto_id

Ejemplo 15: No hay columnas extra en la lista SELECT

A veces necesitamos filtrar los datos utilizando una función de agregación. Uno de los errores más comunes es poner una condición usando la función de agregación en la cláusula WHERE. Esto se muestra a continuación:

SELECT  department.depto_id, name , count(*) employees
FROM department, employee
WHERE department.depto_id = employee.depto_id
AND count(*) > 1
GROUP BY department.depto_id
ERROR:  aggregate functions are not allowed in WHERE
LÍNEA 4: AND count(*) > 1

Ejemplo 16: Función de agregación incorrecta en el WHERE

Recuerde que si necesita filtrar utilizando una función de agregado, la forma correcta es poner la condición utilizando el agregado en la cláusula HAVING, como en el siguiente ejemplo:

SELECT  department.depto_id, name , count(*) employees
FROM department, employee
WHERE department.depto_id = employee.depto_id
HAVING count(*) > 1
GROUP BY department.depto_id

Ejemplo 17: La función agregada está en la cláusula HAVING

¡Pruebe usted mismo!

LearnSQL es un gran lugar para empezar con SQL. Hay varios cursos orientados a los principiantes. Puedes probar los consejos de este artículo en los ejercicios de este curso de SQL.