Retour à la liste des articles Articles
9 minutes de lecture

8 conseils que les débutants absolus peuvent utiliser pour corriger les requêtes SQL

Les erreurs de code sont fréquentes - et frustrantes. Et lorsque vous venez d'apprendre le langage SQL, il peut être très difficile de trouver et de corriger vos erreurs. Dans cet article, nous allons vous montrer huit façons de résoudre ou d'éliminer les erreurs de codage SQL les plus courantes.

Aujourd'hui, nous allons parler de quelques astuces que le débutant en SQL peut utiliser pour éviter plusieurs erreurs courantes. Ces astuces fonctionnent dans n'importe quel environnement de base de données. Au fur et à mesure, nous vous montrerons des messages d'erreur. La formulation exacte de vos messages d'erreur peut être un peu différente, mais ne vous inquiétez pas ; chaque moteur de base de données a ses propres variantes, mais la signification est la même.

Ceci étant dit, nous ne nous concentrerons pas sur les messages d'erreur. Nous allons plutôt mettre le doigt sur la cause réelle du problème (comme l'oubli d'une parenthèse ou d'un guillemet). Ainsi, vous apprendrez à contourner le problème dès le départ.

Vous êtes prêt ? C'est parti !

1. Placez d'abord les parenthèses ouvertes et fermées

Se souvenir du caractère de fermeture est essentiel pour éliminer les parenthèses, guillemets, doubles guillemets ou crochets déséquilibrés. Les meilleures pratiques suggèrent de taper les deux caractères en premier (ouverture et fermeture), puis de taper ce qui se trouve à l'intérieur.

L'exemple suivant montre une erreur lorsque les parenthèses ne sont pas équilibrées :

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 ;

Exemple 1 : Parenthèses non équilibrées

2. Ne pas mettre de virgule à la fin d'une colonne ou d'une séquence de tableau

Les virgules servent de séparateur en SQL. Il ne doit pas y avoir de virgule entre FROM et le premier nom de table ou après le dernier nom de table. La même idée s'applique à la définition des colonnes : lorsque vous créez une table, veillez à ne pas saisir de virgule supplémentaire après le nom final de la colonne.

Il s'agit d'une erreur très courante.

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

Exemple 2 : Une virgule supplémentaire

3. Utiliser l'évaluation partielle des requêtes pour déboguer les longues requêtes SQL

De nombreux clients SQL comme Navicat ou pgAdmin permettent l'exécution partielle d'une requête. Vous pouvez le faire en utilisant votre souris pour mettre en évidence une partie du code. En utilisant cette technique de division et de reconquête, vous pouvez facilement isoler et corriger les erreurs. Évidemment, la partie marquée doit être du SQL valide.

La requête suivante comporte deux erreurs. Si nous exécutons la première ligne de la requête, nous pouvons voir le premier problème. (Indice : la colonne "llastname" n'existe pas).

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 

Exemple 3 : Un nom de colonne incorrect

Cependant, si nous exécutons l'instruction SQL complète, nous obtenons une erreur liée à des parenthèses non équilibrées :

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 ;

Exemple 4 : Sous-requête avec des parenthèses incorrectes

Nous pouvons également marquer une sous-requête et l'exécuter individuellement, comme dans l'exemple suivant :

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

Exemple 5 : Nom de fonction incorrect

4. Faites attention aux noms de colonnes et de tables

Faites très attention lorsque vous tapez les noms de colonnes ou de tables. Si possible, essayez de copier et de coller le nom d'une commande que vous savez correcte, de préférence une commande qui a déjà été exécutée correctement. Les meilleures pratiques suggèrent de copier et coller les noms même si vous pensez que cela prend plus de temps que de les taper.

Il est très courant d'avoir un nom de colonne mal orthographié ou de se référer à une colonne dans une table qui ne figure pas dans la clause FROM. Vérifiez toujours les fautes de frappe dans le nom de la colonne, assurez-vous que la table dans le FROM a cette colonne, et assurez-vous que la table est mentionnée dans le FROM.

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

Exemple 6 : Nom de table incorrect

Une autre bonne pratique consiste à utiliser un alias de table ou un nom de table comme préfixe de colonne. Ceci est doublement important lorsque vous avez deux tables ou plus dans la clause <>FROM. L'erreur suivante peut apparaître si vous faites référence à deux colonnes au nom identique dans des tables différentes :

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

Exemple 7 : noms de colonnes ambigus

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

Exemple 8 : noms de colonnes préfixés

Pour corriger ces erreurs, ajoutez le nom de la table avant le nom de la colonne. (Dans l'exemple ci-dessus, ce serait employee.depto_id et department.depto_id au lieu de seulement depto_id.)

5. Comparez uniquement les types de données compatibles

Lorsque vous écrivez des conditions de comparaison dans la clause WHERE, assurez-vous que les deux types de données sont compatibles avec l'opérateur de comparaison et entre eux. Si ce n'est pas possible, vous devrez peut-être convertir l'un des types de données. La règle générale est de comparer des nombres avec des nombres, des chaînes de caractères avec des chaînes de caractères, etc.

Certains systèmes de bases de données convertissent automatiquement les types de données lorsque cela est possible ; d'autres proposent des conversions de type de données améliorées (par exemple, une valeur TIMESTAMP peut être automatiquement convertie en DATE avant les comparaisons). D'autres services de bases de données encore ne proposent aucune conversion. Il est donc préférable de rechercher vous-même ces problèmes potentiels.

Quoi qu'il en soit, le code SQL suivant obtient une erreur de non-concordance des données car une chaîne CHAR est comparée à une valeur entière :

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

Exemple 9 : Types de données non concordants

Aucun opérateur ne correspond au nom et au(x) type(s) d'arguments donnés. Vous devrez peut-être ajouter des casts de type explicites pour résoudre cette erreur.

6. Utilisez IS NULL lorsque vous comparez des valeurs NULL

Si vous avez seulement besoin de vérifier si une colonne a une valeur NULL, faites attention aux expressions que vous utilisez. Une erreur courante consiste à utiliser = NULL ou <> NULL, mais ces expressions ne sont pas syntaxiquement valides. Utilisez plutôt les clauses IS NULL et IS NOT NULL.

Voyons les exemples incorrects et corrects :

SELECT firstname, lastname
FROM employee
WHERE depto_id = NULL

Exemple 10 : Comparaison NULL incorrecte

SELECT firstname, lastname
FROM employee
WHERE depto_id is NULL

Exemple 11 : Comparaison correcte de NULL

7. Incluez toujours la condition JOIN

Il existe plus d'une façon valide de faire une jointure en SQL. La méthode traditionnelle consiste à énumérer toutes les tables à joindre dans la clause FROM et à placer les conditions de jointure dans la clause WHERE pour créer des paires d'enregistrements. L'autre méthode (plus déclarative) consiste à utiliser la clause JOIN et à énumérer les conditions de jointure après la clause ON. Ces deux méthodes sont syntaxiquement équivalentes, mais vous devez savoir comment identifier la condition de jointure dans les deux cas.

Ici, nous avons deux jointures valides :

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

Exemple 12 : Deux jointures équivalentes

Cependant, le conseil est le suivant : N'oubliez pas la condition de jointure ! Chaque fois que vous joignez deux tables ou plus, vous devez écrire une condition de jointure pour lier les deux tables. Si vous ne la spécifiez pas, vous n'obtiendrez pas de message d'erreur, mais des résultats incorrects. Ceux-ci seront erronés car chaque enregistrement de la première table sera joint à tous les enregistrements de la deuxième table. Ce type d'ensemble de résultats est appelé produit cartésien de deux tables, et n'est généralement pas un résultat attendu.

SELECT lastname, name 
FROM department, employee

Exemple 13 : Un produit cartésien - généralement pas le résultat souhaité

8. Inclure les colonnes non agrégées de la liste SELECT dans les colonnes GROUP BY

Lorsque vous utilisez des fonctions d'agrégation, il existe certaines restrictions quant aux colonnes qui peuvent être incluses dans la liste SELECT (c'est-à-dire les noms de colonnes après la clause SELECT ). Vous ne pouvez inclure que les colonnes spécifiées dans la clause GROUP BY, plus les fonctions d'agrégation et les constantes. Si vous ne sélectionnez que les colonnes d'agrégation, toute autre colonne générera une erreur. Vous pouvez le constater dans l'exemple suivant.

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

Exemple 14 : colonnes supplémentaires dans la liste SELECT

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

Exemple 15 : Aucune colonne supplémentaire dans la liste SELECT

Il est parfois nécessaire de filtrer les données à l'aide d'une fonction d'agrégation. L'une des erreurs les plus courantes consiste à placer une condition utilisant la fonction d'agrégation dans la clause WHERE. Cette erreur est illustrée ci-dessous :

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

Exemple 16 : Fonction d'agrégation incorrecte dans la clause WHERE

N'oubliez pas que si vous devez filtrer à l'aide d'une fonction d'agrégation, la bonne méthode consiste à placer la condition utilisant l'agrégation dans la clause HAVING, comme dans l'exemple suivant :

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

Exemple 17 : La fonction d'agrégation est dans la clause HAVING

Essayez vous-même !

LearnSQL est un excellent endroit pour s'initier à SQL. Plusieurs cours sont destinés aux apprenants débutants. Vous pouvez tester les conseils de cet article sur les exercices de ce cours SQL.