9.Sélectionner des enregistrements avec WHERE

9.1.Présentation

L'instruction SQL WHERE permet de filtrer les données en précisant les conditions que les enregistrements doivent respecter pour être retournés (dans le cas d'une requête SELECT), modifiés (dans le cas d'une requête UPDATE) ou supprimés dans le cas d'une requête DELETE).
La forme générale est donc
SELECT * FROM matable WHERE condition
UPDATE matable SET blabla WHERE condition
DELETE FROM matable WHERE condition
La condition la plus simple consiste à préciser le nom d'un champ suivi d'un des opérateurs suivants:
  • '=' égal
  • '<>' différent
  • '>' supérieur
  • '<' inférieur
et d'une valeur.
Exemple
... WHERE monchamp='toto'
... WHERE monchamp>10
Un champ peut aussi éventuellement ne contenir aucune valeur. Pour retourner les enregistrements dont un champ donné est vide, vous devrez utiliser la condition
... WHERE monchamp IS NULL
et pour les enregistrements avec un champ donné non vide...
... WHERE monchamp IS NOT NULL
Les champs peuvent également être comparés entre eux
... WHERE monchamp1=monchamp2

9.2.Les caractères joker et l'opérateur LIKE

Les caractères '%' (pourcent) et '_' (underscore) jouent des rôles particuliers lorsqu'ils sont utilisés avec l'opérateur LIKE (l'équivalent de '=' mais tenant compte des caractères joker) ou NOT LIKE (l'équivalent de '<>' mais tenant compte des caractères joker).
  • '%' remplace n'importe quelle combinaison de caractères y compris aucun caractère (c'est l'équivalent du joker * généralement utilisé pour désigner les fichiers)
  • '_' remplace 1 et 1 seul caractère (c'est l'équivalent du joker ? généralement utilisé pour désigner les fichiers)
Exemple
... WHERE monchamp LIKE 'to%tu'
pour retourner les enregistrements dont 'monchamp' commence par 'to' et fini par 'tu'
... WHERE monchamp NOT LIKE 'to_u'
pour retourner les enregistrements dont 'monchamp' s'écrit 'to' suivi d'un caractère quelconque puis 'u'

9.3.Les fonctions

Les conditions peuvent faire appel à des fonctions
... WHERE mafonction(monchamp)=valeur
... WHERE monchamp=mafonction()
ex
... WHERE CHAR_LENGTH(monchamp)=valeur
... WHERE monchamp=PI()

9.4.Combinaison des conditions avec AND et OR (et les parenthèses)

La condition peut également être construite en combinant des conditions simples par les mots clés AND (signifiant que la condition avant ET celle après le mot AND doivent toutes 2 être vérifiées pour la condition soit vraie) et OR (signifiant qu'il suffit que la condition avant OU celle après le mot soit vraie pour que la condition soit remplie). Au besoin des parenthèses peuvent être utilisées pour combiner les conditions. Exemple
... WHERE condition1 AND (condition2 OR condition3)

9.5.En pratique

Imaginons que nous voulons gérer une vidéothèque avec une base de données. Cette base devra alors contenir des noms de films et pour chacun la catégorie de film à laquel ils appartient. En première réflexion, nous serions tenté de créer une table de la façon suivante:
CREATE TABLE films (nom varchar(64), categorie varchar(64))
et que l'on pourrait remplir comme suit:
nom categorie
La cité de la peur Humour
Matrix Science-fiction
West side story Comédie musicale
Men in black Science-fiction
en utilisant les requêtes:
INSERT INTO films (nom,categorie) VALUES ('La cité de la peur','Humour')
INSERT INTO films (nom,categorie) VALUES ('Matrix','Science-fiction')
INSERT INTO films (nom,categorie) VALUES ('West side story','Comédie musicale')
INSERT INTO films (nom,categorie) VALUES ('Men in black','Science-fiction')
Si l'on désire rechercher tous les enregistrements ayant pour catégorie 'Science-fiction' alors on pourra utiliser la requête:
SELECT * FROM films WHERE categorie='Science-fiction'
Ce qui retournera
nom categorie
Matrix Science-fiction
Men in black Science-fiction
Bien que ce soit pour des raisons différentes (les noms commencent par la lettre 'M') la requête suivante retournera le même résultat
SELECT * FROM films WHERE nom LIKE 'M%'
Tandis que la requête
SELECT * FROM films WHERE (categorie='Humour' OR categorie='Science-fiction') AND (nom NOT LIKE '%black')
retournera les films des catégories 'Humour' et 'Science-fiction' ne se terminant pas par 'black'. Soit
nom categorie
La cité de la peur Humour
Matrix Science-fiction
Enfin un appel utilisant la fonction CHAR_LENGTH qui retourne le nombre de caractères dans une chaîne
SELECT * FROM films WHERE CHAR_LENGTH(nom)=6
retournera le seul film dont le nom comporte 6 caractères. Soit
nom categorie
Matrix Science-fiction

9.6.A suivre

Comme nous l'indiquions, nous pourrions être tenté de construire une table tel qu'elle l'a été ci-dessus. Cependant, il faut bien noter qu'il s'agit là d'une mauvaise pratique. Nous allons vous expliquer pourquoi et surtout comment y remédier. Ceci nous conduira à réaliser des jointures entre tables, bien souvent via des champs auto incrémentés.