Voltar para a lista de artigos Artigos
8 minutos de leitura

8 Dicas que os Iniciantes Absolutos podem usar para corrigir consultas SQL

Os erros de código são comuns - e frustrantes. E quando você está apenas aprendendo SQL, pode ser muito desafiador encontrar e corrigir seus erros. Neste post, lhe mostraremos oito maneiras de resolver ou eliminar erros comuns de codificação SQL.

Hoje, vamos falar sobre algumas dicas que o iniciante em SQL pode usar para evitar vários erros comuns. Estas dicas funcionam em qualquer ambiente de banco de dados. À medida que formos avançando, estaremos mostrando algumas mensagens de erro. O texto exato de suas mensagens de erro pode ser um pouco diferente, mas não se preocupe; cada mecanismo de banco de dados tem suas próprias variantes, mas o significado é o mesmo.

Dito isto, não estaremos nos concentrando em mensagens de erro. Em vez disso, identificaremos a verdadeira causa do problema (como esquecer um parêntese ou uma aspas). Desta forma, você aprenderá como contornar o problema em primeiro lugar.

Pronto? Vamos começar!

1. Colocar Parênteses Abertos e Fechados em primeiro lugar

Lembrar o caráter de fechamento é fundamental para eliminar parênteses desequilibrados, aspas, aspas duplas ou colchetes. As melhores práticas sugerem digitar primeiro os dois caracteres (abrir e fechar) e depois digitar o que quer que vá dentro.

O exemplo a seguir mostra um erro quando os parênteses não são 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 ;

Exemplo 1: Parênteses não equilibrados

2. Não coloque uma vírgula no final de uma coluna ou tabela seqüencial

O Commas atua como um separador em SQL. Não deve haver nenhuma vírgula entre FROM e o nome da primeira tabela ou após o nome final da tabela. A mesma idéia se aplica à definição da coluna: quando você criar uma tabela, certifique-se de não digitar uma vírgula extra após o nome final da coluna.

Este é um erro realmente comum.

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

Exemplo 2: Uma vírgula extra

3. Use Partial Query Evaluation to Debug Long SQL Queries (Avaliação Parcial de Consulta para Depurar Consultas Longas SQL)

Muitos clientes SQL como Navicat ou pgAdmin permitem a execução parcial de uma consulta. Você pode fazer isso usando seu mouse para destacar parte do código. Usando esta técnica de dividir e conquistar, você pode facilmente isolar e corrigir erros. Obviamente, a parte marcada deve ser SQL válida.

A próxima consulta tem dois erros. Se executarmos a linha de abertura da consulta, podemos ver o primeiro problema. (Dica: a coluna "llastname" não 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 

Exemplo 3: Um nome de coluna incorreto

Entretanto, se executarmos a declaração SQL completa, obtemos um erro relacionado a parênteses desequilibrados:

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 ;

Exemplo 4: Subconsulta com parênteses errados

Também podemos marcar uma subquisição e executá-la individualmente, como no próximo exemplo:

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

Exemplo 5: Nome da função incorreta

4. Preste atenção aos nomes das colunas e das mesas

Preste muita atenção ao digitar nomes de colunas ou nomes de tabelas. Se possível, tente copiar e colar o nome de um comando que você sabe que está correto - de preferência um que já tenha sido executado corretamente. As melhores práticas sugerem copiar e colar nomes, mesmo se você achar que é mais demorado do que datilografar.

Ter um nome de coluna mal escrito ou se referir a uma coluna em uma tabela que não está na cláusula FROM é de fato muito comum. Sempre procure por erros de digitação no nome da coluna, certifique-se de que a tabela no FROM tenha esta coluna, e certifique-se de que a tabela seja mencionada em FROM.

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

Exemplo 6: Nome incorreto da tabela

Outra boa prática é usar um pseudônimo de tabela ou um nome de tabela como prefixo de coluna. Isto é duplamente importante quando você tem duas ou mais tabelas na cláusula <>FROM. O erro a seguir pode aparecer se você se referir a duas colunas com nomes idênticos em tabelas 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

Exemplo 7: Nomes ambíguos de colunas

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

Exemplo 8: Nomes de colunas prefixadas

Para corrigir esses erros, acrescente o nome da tabela antes do nome da coluna. (No exemplo acima, isso seria employee.depto_id e department.depto_id em vez de apenas depto_id.)

5. Comparar apenas tipos de dados compatíveis

Ao escrever as condições de comparação na cláusula WHERE, certifique-se de que ambos os tipos de dados sejam compatíveis com o operador de comparação e um com o outro. Se isso não for possível, você pode ter que lançar um dos tipos de dados. A regra geral é comparar números contra números, cadeias de caracteres contra cadeias de caracteres, etc.

Alguns sistemas de banco de dados convertem automaticamente os tipos de dados sempre que possível; outros fornecem conversões aprimoradas de tipos de dados (ou seja, um valor TIMESTAMP pode ser convertido automaticamente para uma DATA antes das comparações). Ainda outros serviços de banco de dados não oferecem conversões de forma alguma. Por isso, é melhor você mesmo procurar por esses problemas potenciais.

De qualquer forma, o código SQL a seguir recebe um erro de desajuste de dados porque uma string CHAR está sendo comparada com um valor inteiro:

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

Exemplo 9: Tipos de dados não correspondentes

Nenhum operador corresponde ao nome dado e ao(s) tipo(s) de argumento(s). Talvez seja necessário acrescentar tipos explícitos de fundição para resolver este problema.

6. Uso É Nulo ao comparar os valores NULL

Se você só precisa verificar se uma coluna tem um valor NULL, preste atenção especial a quais expressões você usa. Um erro comum é usar = NULL ou <> NULL, mas estas expressões não são sintaticamente válidas. Use as cláusulas IS NULL e IS NOT NULL em seu lugar.

Vamos ver as amostras incorretas e corretas:

SELECT firstname, lastname
FROM employee
WHERE depto_id = NULL

Exemplo 10: Comparação NULL incorreta

SELECT firstname, lastname
FROM employee
WHERE depto_id is NULL

Exemplo 11: Comparação NULL correta

7. Sempre incluir a condição de união

Há mais de uma maneira válida de fazer uma junção em SQL. A maneira tradicional é listar todas as tabelas a serem unidas na cláusula FROM e colocar as condições de união na cláusula WHERE para construir pares de registros. A outra maneira (mais declarativa) é usar a cláusula de join e listar as condições de join após a cláusula ON. Ambas são sintaticamente equivalentes, mas você deve saber como identificar a condição de junção para ambas.

Aqui temos duas uniões 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

Exemplo 12: Duas uniões equivalentes

No entanto, a dica é: Não se esqueça da condição de união! Toda vez que você juntar duas ou mais mesas, você deve escrever uma condição de junção para ligar as duas mesas. Se você não especificar isto, você não receberá uma mensagem de erro; você só receberá resultados incorretos. Estes estarão errados porque cada registro da primeira tabela será unido a todos os registros da segunda tabela. Este tipo de conjunto de resultados é chamado de um produto cartesiano de duas tabelas, e normalmente não é um resultado esperado.

SELECT lastname, name 
FROM department, employee

Exemplo 13: Um produto cartesiano - geralmente não é o resultado que você deseja

8. Incluir colunas não agregadas da lista SELECT em GROUP BY Colunas

Ao utilizar funções agregadas, há algumas restrições sobre quais colunas podem ser incluídas na lista SELECT (ou seja, os nomes das colunas após a cláusula SELECT ). Você só pode incluir as colunas especificadas na cláusula GROUP BY, mais as funções agregadas e constantes. Se você selecionar apenas colunas agregadas, qualquer outra coluna irá gerar um erro. Você pode ver isto no exemplo a seguir.

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

Exemplo 14: Colunas extras na lista SELECT

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

Exemplo 15: Nenhuma coluna extra na lista SELECT

s vezes precisamos filtrar os dados usando uma função de agregação. Um dos erros mais comuns é colocar uma condição usando a função de agregação na cláusula WHERE. Isto é mostrado abaixo:

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

Exemplo 16: Função de agregação incorreta no WHERE

Lembre-se, se você precisar filtrar usando uma função agregada, a maneira correta é colocar a condição usando o agregado na cláusula HAVING, como no exemplo a seguir:

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

Exemplo 17: A função agregada está na cláusula HAVING

Experimente você mesmo!

LearnSQL é um ótimo lugar para começar a usar SQL. Vários cursos são voltados para alunos iniciantes. Você pode testar as dicas contidas neste artigo sobre os exercícios deste curso SQL.