Maîtrise Pratique de SQL
Filtrage et Logique
Affiner vos filtres
Vous savez déjà comment récupérer des données avec SELECT et FROM. Maintenant, affinons la sélection. La clause WHERE est votre outil principal pour filtrer les résultats, mais son potentiel va bien au-delà des simples vérifications d'égalité.
Au lieu de demander "tous les utilisateurs", vous pouvez demander "les utilisateurs qui se sont inscrits le mois dernier et qui vivent à Paris".
Pour cela, nous utilisons des opérateurs de comparaison. Vous connaissez déjà l'opérateur d'égalité (=), mais il en existe d'autres pour gérer les inégalités. Les plus courants sont >, <, >=, <= et <> (ou != dans certains systèmes) pour "différent de".
-- Sélectionner les produits dont le prix est supérieur à 50
SELECT nom_produit, prix
FROM produits
WHERE prix > 50.00;
-- Sélectionner les employés qui ne font pas partie du département 'Ventes'
SELECT nom_employe, departement
FROM employes
WHERE departement <> 'Ventes';
Combiner les conditions
Rarement une seule condition suffit. C'est là que la logique booléenne entre en jeu avec les opérateurs AND, OR et NOT. Ils vous permettent d'enchaîner plusieurs conditions pour créer des filtres très précis.
AND: Toutes les conditions doivent être vraies.OR: Au moins une des conditions doit être vraie.NOT: Inverse la condition qui suit (vrai devient faux, et vice-versa).
L'ordre d'évaluation est crucial. AND est évalué avant OR. Pour contrôler cet ordre, utilisez des parenthèses, tout comme en mathématiques.
-- Clients de Paris OU de Lyon qui ont plus de 30 ans
SELECT nom_client, ville, age
FROM clients
WHERE (ville = 'Paris' OR ville = 'Lyon') AND age > 30;
Sans les parenthèses, la requête aurait renvoyé tous les clients de Lyon (peu importe leur âge) et les clients de Paris de plus de 30 ans. Les parenthèses forcent l'évaluation du OR en premier. Cette maîtrise de la précédence des opérateurs est fondamentale pour éviter des erreurs de logique subtiles mais critiques.
Plages, listes et valeurs inconnues
Pour simplifier vos requêtes, SQL propose des opérateurs pratiques pour gérer les plages et les listes de valeurs. BETWEEN est utilisé pour sélectionner des valeurs dans un intervalle inclusif, que ce soit pour des nombres, des dates ou même du texte.
-- Commandes passées au premier trimestre 2023
SELECT id_commande, date_commande
FROM commandes
WHERE date_commande BETWEEN '2023-01-01' AND '2023-03-31';
L'opérateur IN permet de vérifier si une valeur correspond à l'une des valeurs d'une liste. C'est un raccourci élégant pour une série de conditions OR.
-- Employés des départements Ventes, Marketing ou Support
SELECT nom_employe, departement
FROM employes
WHERE departement IN ('Ventes', 'Marketing', 'Support');
Un cas particulier est la gestion des valeurs NULL. Une valeur NULL représente une absence de donnée, ce n'est ni zéro, ni une chaîne vide. On ne peut pas la comparer avec =. Il faut utiliser IS NULL ou IS NOT NULL.
-- Clients sans numéro de téléphone enregistré
SELECT nom_client
FROM clients
WHERE telephone IS NULL;
Pour gérer NULL dans vos résultats, la fonction COALESCE est très utile. Elle renvoie le premier argument non-NULL d'une liste. C'est parfait pour remplacer une valeur manquante par une valeur par défaut dans l'affichage.
-- Affiche 'Non spécifié' si le département est NULL
SELECT nom_employe, COALESCE(departement, 'Non spécifié') AS departement_affiche
FROM employes;
Recherche par motifs
Lorsque vous ne connaissez pas la valeur exacte, mais seulement une partie, l'opérateur LIKE est la solution. Il permet de rechercher des motifs dans des chaînes de caractères à l'aide de jokers.
%: remplace n'importe quelle séquence de zéro, un ou plusieurs caractères._: remplace un seul caractère.
Par défaut, LIKE est sensible à la casse dans la plupart des systèmes de bases de données. Pour une recherche insensible à la casse, certains systèmes comme PostgreSQL proposent ILIKE.
-- Trouver les produits dont le nom commence par 'Ordi'
SELECT nom_produit FROM produits WHERE nom_produit LIKE 'Ordi%';
-- Trouver les contacts dont le nom de famille a 4 lettres et se termine par 'son'
SELECT nom_contact FROM contacts WHERE nom_contact LIKE '_son';
-- Trouver les livres contenant le mot 'SQL' (insensible à la casse sur PostgreSQL)
SELECT titre FROM livres WHERE titre ILIKE '%sql%';
Pour des recherches de motifs plus complexes, SQL prend en charge les expressions régulières via des opérateurs comme REGEXP, SIMILAR TO ou ~. Elles offrent une puissance de recherche bien supérieure à LIKE.
Quelle requête SQL sélectionne les produits dont le nom commence par "Télé" ?
Comment gère-t-on correctement les valeurs manquantes (NULL) dans une clause WHERE ?
Maîtriser ces techniques de filtrage est une étape essentielle pour passer de la simple lecture de données à une véritable analyse. Vous pouvez désormais formuler des questions complexes et obtenir des réponses précises de votre base de données.