Tuto écrit par Netsliver et Flyingcow, revu en août 2004 par Molokai et Raf
Comme tous les cours se suivent mais ne se ressemblent pas, nous allons ici comprendre
les mécanismes du WHERE et ses possibilités grâce
à un exemple comprenant deux tables (nous verrons par la suite pourquoi),
une table Livres et une table Genres.
Tout d'abord il faut savoir que le mot clé WHERE peut
être utilisé dans les requêtes SELECT, DELETE
et UPDATE (son utilisation est cumulative grâce au AND
ou OR) mais pas dans le INSERT car on ne peut
pas insérer à un endroit précis de la table, l'insertion
se fait toujours à la fin.
Ce cours ne sera basé que sur l'instruction SELECT.
Livres
IDLivre
Prix
Titre
CodeGenre
1
40
Le glaive magique
BD
3
40
Gaffes en gros
BD
4
40
Lagaffe nous gâte
BD
5
45
QRN sur Bretzelburg
BD
6
80
Tour de manège
RG
7
45
Le spectre aux balles d'or
BD
8
30
La bonne chanson
Po
9
50
La jeune Parque
Po
10
50
Michel Strogoff
Ro
11
50
La Serpe d'or
BD
12
70
Toujours aimer
RG
13
70
Toujours aimante
RG
14
72
Toujours aimé
RG
Genres
CodeGenre
LibelleGenre
BD
Bande Dessinée
Po
Poésie
RG
Roman de gare
Ro
Roman
SF
Science Fiction
1 - Sélection directe par l'ID ou le code
Ce cas vous permet de faire une sélection par exemple sur un livre dont
vous connaissez le numéro, imaginons si vous faites un répertoire
de tous les livres donc avec une instruction de sélection, lorsque le visiteur
clique sur le titre de l'un des livres par exemple "Le spectre aux balles
d'or", le détail de celui-ci apparaît.
SELECT * FROM Livres WHERE IDLivre = 7;
Cette sélection va vous permettre d'avoir les informations concernant le
livre :
Livres
IDLivre
Prix
Titre
CodeGenre
7
45
Le spectre aux balles d'or
BD
SELECT * FROM Livres WHERE IDLivre = 7 OR IDLivre = 8;
Bien sûr ce genre de sélection ne s'applique pas seulement sur les
identifiants des tables. Attention : il faut bien choisir entre le AND
et le OR lorsque vous voulez faire des sélections multiples,
par exemple ici le OR permet de sélectionner deux fois
sur le même champ, le AND est utilisé lorsque vous
faites une sélection sur différent champ de la table.
SELECT * FROM Livres WHERE IDLivre = 7 AND Prix > 50;
La sélection dans cette requête prend le livre avec l'ID égal
à 7 et d'un prix supérieur à 50. Donc aucun enregistrement
ne sera retourné par la requête puisque le livre 7 coûte 45F.
SELECT * FROM Livres WHERE IDLivre = 7 OR Prix > 50;
Ici le livre 7 et tous les autres livres d'un prix supérieur à 50F sont sélectionnés.
2 - Le mot clé LIKE
Le mot clé LIKE avec le WHERE va vous
permettre de faire une sélection "approximative" dans vos tables,
par exemple ici vous voulez tous les livres dont le titre commence par 'tou'.
SELECT * FROM Livres WHERE Titre LIKE 'tou%';
Livres
IDLivre
Prix
Titre
CodeGenre
6
80
Tour de manège
RG
12
70
Toujours aimer
RG
13
70
Toujours aimante
RG
14
72
Toujours aimé
RG
SELECT * FROM Livres WHERE CodeGenre LIKE 'r_';
Livres
IDLivre
Prix
Titre
CodeGenre
6
80
Tour de manège
RG
10
50
Michel Strogoff
Ro
12
70
Toujours aimer
RG
13
70
Toujours aimante
RG
14
72
Toujours aimé
RG
Pour remplacer un seul caractère dans un LIKE il faut
utiliser _, pour remplacer une chaîne de caractère
il faut utiliser %.
Le LIKE ne respecte pas la casse (minuscule - majuscule) contrairement
au égal.
3 - Sélection selon une liste de valeur
Ici nous allons voir un mot clé permettant de faire la sélection
à partir d'une liste de valeur. Le WHERE est ici utilisé
avec un IN.
SELECT * FROM Livres WHERE Prix IN (40, 50, 72);
Le mot clé IN permet de sélectionner les enregistrements
dans la table Livres où le prix est de 40, 50 ou 72.
Livres
IDLivre
Prix
Titre
CodeGenre
1
40
Le glaive magique
BD
3
40
Gaffes en gros
BD
4
40
Lagaffe nous gâte
BD
9
50
La jeune Parque
Po
10
50
Michel Strogoff
Ro
11
50
La Serpe d'or
BD
14
72
Toujours aimé
RG
De la même façon il y a le mot clé contraire au IN
qui est le NOT IN qui va en fait sélectionner les enregistrements
qui n'ont pas l'une des valeurs indiquées sur le champ demandé.
SELECT * FROM Livres WHERE Prix NOT IN (40, 50, 72);
Cette requête sélectionne donc les livres qui ne valent pas 40, 50
ou 72F.
4 - Sélection selon une plage de valeurs
Nous allons lier dans cette partie le WHERE au BETWEEN...AND
qui permet de faire une sélection en précisant une plage de données,
ce mot clé n'est utilisé qu'avec des valeurs "numériques"
(integer, date...).
SELECT * FROM Livres WHERE Prix BETWEEN 40 AND 50;
Livres
IDLivre
Prix
Titre
CodeGenre
1
40
Le glaive magique
BD
3
40
Gaffes en gros
BD
4
40
Lagaffe nous gâte
BD
5
45
QRN sur Bretzelburg
BD
7
45
Le spectre aux balles d'or
BD
9
50
La jeune Parque
Po
10
50
Michel Strogoff
Ro
11
50
La Serpe d'or
BD
S'il on veut par exemple avoir toutes les BD qui ont un prix entre 40 et 50F la requête est la suivante :
SELECT * FROM Livres WHERE (Prix BETWEEN 40 AND 50) AND (CodeGenre = 'BD');
Les parenthèses ne sont bien sûr pas obligatoires mais c'est pour une question
de clarté.
5 - Jointures
Ce système permet de joindre deux tables différentes qui ont un
champ en relation, ici la table Livres et la table Genres
ont le champ CodeGenre en commun, ces deux tables peuvent donc être
jointes grâce au WHERE.
SELECT * FROM Livres, Genres WHERE Livres.CodeGenre = Genres.CodeGenre;
IDLivre
Prix
Titre
Livres.CodeGenre
Genres.CodeGenre
LibelleGenre
1
40
Le glaive magique
BD
BD
Bande Dessinée
3
40
Gaffes en gros
BD
BD
Bande Dessinée
4
40
Lagaffe nous gâte
BD
BD
Bande Dessinée
5
45
QRN sur Bretzelburg
BD
BD
Bande Dessinée
6
80
Tour de manège
RG
RG
Roman de gare
7
45
Le spectre aux balles d'or
BD
BD
Bande Dessinée
8
30
La bonne chanson
Po
Po
Poésie
9
50
La jeune Parque
Po
Po
Poésie
10
50
Michel Strogoff
Ro
Ro
Roman
11
50
La Serpe d'or
BD
BD
Bande Dessinée
12
70
Toujours aimer
RG
RG
Roman de gare
13
70
Toujours aimante
RG
RG
Roman de gare
14
72
Toujours aimé
RG
RG
Roman de gare
Pour joindre deux tables il faut indiquer leur nom dans le FROM
et utiliser la syntaxe avec le nom, le point et le champ de jointure.
Le problème avec cette jointure c'est que l'on se retrouve avec deux fois
la "même" colonne, car elle vient une première fois de
la table Livres et l'autre de la table Genres.
Pour éviter cela et avoir quelque chose de plus sympa, la requête
peut être modifiée comme ceci :
SELECT Titre, Livres.CodeGenre, LibelleGenre, Prix FROM Livres, Genres WHERE Livres.CodeGenre = Genres.CodeGenre;
Titre
Livres.CodeGenre
LibelleGenre
Prix
Le glaive magique
BD
Bande Dessinée
40
Gaffes en gros
BD
Bande Dessinée
40
Lagaffe nous gâte
BD
Bande Dessinée
40
QRN sur Bretzelburg
BD
Bande Dessinée
45
Tour de manège
RG
Roman de gare
80
Le spectre aux balles d'or
BD
Bande Dessinée
45
La bonne chanson
Po
Poésie
30
La jeune Parque
Po
Poésie
50
Michel Strogoff
Ro
Roman
50
La Serpe d'or
BD
Bande Dessinée
50
Toujours aimer
RG
Roman de gare
70
Toujours aimante
RG
Roman de gare
70
Toujours aimé
RG
Roman de gare
72
Pour différencier les deux tables dans le SELECT il faut indiquer
le nom de la table sur les champs à afficher qui sont éventuellement en double
à cause de la jointure.
6 - Application
Une fois n'est pas coutume, une petite application sur le même exemple ne
fait pas de mal pour comprendre encore mieux les tutoriaux.
Nous allons faire une sélection de tous les LibelleGenre et avec
cette sélection, en utilisant le WHERE on affichera les
livres correspondant.
La requête de sélection des libellés est la suivante :
SELECT * FROM Genres;
Le script permettant de créer le liste dans une boîte <select> :
1
<select
name="genre">
2
<?php
3
mysql_connect($server, $user, $pass) or die('Erreur de connexion');
Lorsque le visiteur valide le formulaire on reçoit donc une variable passé
en POST sur la page de résultat où l'on va pouvoir
faire notre requête de sélection avec le WHERE.
Pour l'exemple on va choisir les BD.
SELECT * FROM Livres WHERE CodeGenre = 'BD';
Dans le script voici ce qui peut se passer :
1
<?php
2
mysql_connect($server, $user, $pass) or die('Erreur de connexion');
3
mysql_select_db($db) or die('Base inexistante');
4
$sql = "SELECT
* FROM Livres WHERE CodeGenre = '".$_POST['genre']."';";
5
$query = mysql_query($sql) or die( 'Erreur' );
6
$nb = mysql_num_rows($query);
7
if ( $nb>0 ) {
8
echo 'Aucun livre dans ce genre';
9
} else {
10
while ( $list = mysql_fetch_array( $query ) ) {
11
//traitement du résultat
12
}
13
}
14
mysql_close();
15
?>
Et voilà le résultat :
Livres
IDLivre
Prix
Titre
CodeGenre
1
40
Le glaive magique
BD
3
40
Gaffes en gros
BD
4
40
Lagaffe nous gâte
BD
5
45
QRN sur Bretzelburg
BD
7
45
Le spectre aux balles d'or
BD
11
50
La Serpe d'or
BD
Et bien voilà nous avons fait le tour du WHERE, à
bientôt !!