 |
Voici le schema de la base que nous allons utiliser dans nos exemples :
| Table_Generale |
Nom_Disque CHAR(50) Commentaires LONGTEXT NomPays CHAR(50) |
|
| Pays |
pId INT AUTO_INCREMENT NPays CHAR(50) |
|
| Disque |
dId INT AUTO_INCREMENT Nom_Disque CHAR(50) Commentaires LONGTEXT IdPays INT NbSong INT |
|
Une requête de type SELECT se présente toujours de la même façon, c'est-à-dire :
SELECT [champs] FROM [nom_table] [WHERE [CLAUSE] [OPTION]];
Dans toute cette page, on illustrera les résultats des requêtes avec le contenu des tables suivants :
Disque :
SELECT * FROM Disque;
+----+-----------+---------------------------+-------+-------+
|Id |Nom_Disque |Commentaires |IdPays |NbSong |
+----+-----------+---------------------------+-------+-------+
| 1 |Disk1 |Très bon disque de test | 1 | 10 |
| 2 |Disk2 |Deuxième disque | 1 | 15 |
| 3 |Disk3 |La, c'est pour le test | 3 | 20 |
| 4 |Disk4 |Dernier Element | NULL | 13 |
+----+-----------+---------------------------+-------+-------+
Pays :
SELECT * FROM pays;
+----+--------------+
|Id |NPays |
+----+--------------+
| 1 | Francais |
| 2 | Anglophone |
| 3 | Japonais |
+----+--------------+
| | | | | | | | | 1.2.1. Requêtes sur une seule table
|  |  |  |
|
Voici une requête de base qui permet de lister le contenu de la table Disque :
SELECT * FROM Disque;
Le "*" comme nom de champs signifie simplement que l'on souhaite afficher tous les champs résultat. En l'occurence tous les champs
de la table Disque, et tous les enregistrements. Le résultat est ce qu'il y a juste au-dessus dans le cadre !
Ensuite, il est possible de définir les champs que l'on souhaite afficher. Si on ne veut afficher que les noms des disques :
SELECT Nom_Disque FROM Disque;
"Nom_Disque" sera donc le seul champs affiché !
Le résultat de cette requête sera :
Disque :
SELECT Nom_Disque FROM Disque;
+-----------+
|Nom_Disque |
+-----------+
|Disk1 |
|Disk2 |
|Disk3 |
|Disk4 |
+-----------+
On peut également n'afficher que les enregistrements pour lequel un champ correspond au critère :
SELECT * FROM Disque WHERE NbSong > 13;
Tous les champs seront affichés, mais seulement les enregistrements pour lesquels le nombre "NbSong" sera
supérieur à 13.
Le résultat de cette requête sera :
Disque :
SELECT * FROM Disque WHERE NbSong > 13;
+----+-----------+---------------------------+-------+-------+
|Id |Nom_Disque |Commentaires |IdPays |NbSong |
+----+-----------+---------------------------+-------+-------+
| 2 |Disk2 |Deuxième disque | 1 | 15 |
| 3 |Disk3 |La, c'est pour le test | 3 | 20 |
+----+-----------+---------------------------+-------+-------+
La liste des opérateurs est :
| Opérateurs |
Fonction |
Exemple d'utilisation |
| = | Egal | NbSong = 13 |
| > | Supérieur | NbSong > 13 |
| < | Inférieur | NbSong < 13 |
| >= | Supérieur ou égal | NbSong >= 13 |
| <= | Inférieur ou égal | NbSong <= 13 |
| <> | Différent | NbSong >< 13 |
| LIKE | Correspond à l'expression avec un critère
Utilisé "%" pour mysql, "&" pour Oracle | Nom_Disque LIKE '%te%' |
| IN | Appartient à la liste | NbSong IN (10,11,12,13,14,15) |
| BETWEEN ... AND | Différent | NbSong BETWEEN 13 and 18 |
Pour le détail sur les opérations possibles sur des champs, voir la page sur les calculs
| | | | | | | | | 1.2.2. Requêtes sur plusieurs tables
|  |  |  |
|
Maintenant, on peut vouloir afficher le nom du disque et son pays d'origine. Ceci est l'intérêt majeur des bases de données,
c'est-à-dire croiser les informations entre les tables !
SELECT * FROM Disque, Pays WHERE Disque.IdPays=Pays.pId;
La, on retrouve 2 choses importantes :
la séparation entre les noms de tables se fait par une virgule
il y a une clause Where
La clause Where permet de définir comment se fait le rapport entre les tables. En l'occurence, la valeur "IdPays" correspond
à la valeur du champs "pId" de la table "Pays".
Le résultat de la requête sera quelque chose comme ca :
SELECT * FROM Disque, Pays WHERE Disque.IdPays=Pays.pId;
+----+-----------+-------------------------+-------+-------+-----+-----------+
|Id |Nom_Disque |Commentaires |IdPays |NbSong |pId |NPays |
+----+-----------+-------------------------+-------+-------+-----+-----------+
| 1 |Disk1 |Très bon disque de test | 1 | 10 | 1 | Francais |
| 2 |Disk2 |Deuxième disque | 1 | 15 | 1 | Francais |
| 3 |Disk3 |La, c'est pour le test | 3 | 20 | 3 | Japonais |
+----+-----------+-------------------------+-------+-------+-----+-----------+
Dans le cas qui nous intéresse, il n'y a pas 2 champs portant le même nom, on peut donc simplifier la requête en ne mettant pas le
nom des tables. La requête devient alors :
SELECT * FROM Disque, Pays WHERE IdPays=pId;
Par contre, à ne pas oublier :
On peut ne pas mettre les noms des tables que à condition que le nom du champs ne soit présent que dans une seule des tables
Ceci explique le nom de mes champs : pId, IdPays... afin de simplifier la lecture des requêtes.
Il est possible de faire des calculs dans les noms des champs, et même de mettre des conditions.
Par exemple, vous pourriez avoir envie de connaître le nombre de disque, mais avec le détail par pays. Cela consiste donc dans
le fait de compter tous les disques ayant le même IdPays. Cette requête est très simple :
SELECT NPays, sum(*) as Nb FROM Disque, Pays WHERE IdPays=pId Group By pId;
+-----------+-----+
|NPays |Nb |
+-----------+-----+
| Francais | 2 |
| Japonais | 1 |
+-----------+-----+
Le défaut, comme vous le constatez, est que seul les disques ayant un IdPays fixé sont listés ici. Pour un exemple traitant tous
les cas, reportez-vous à la partie avec des exemples.
Pour le détail sur les opérations possibles sur des champs, voir la page sur les calculs
Il existe bien sur des options pour le select, qui vont des regroupements au simple classement.
En voici une liste :
| Option |
Fonction |
Exemple d'utilisation |
| GROUP By | Regroupe les enregistrements par rapport à un ou plusieurs champs | Group By pId |
| ORDER By | Classe les | Order By pId Desc Order By pId Asc |
| HAVING | N'affiche que ceux correspond au critère | Having MIN(NbSong) > 13 |
| LIMIT | Permet d'afficher un nombre précis d'enregistrement | LIMIT 0,30 (renvoit les trentes premiers)
LIMIT 40,10 (renvoit du 41ème au 50ème)
LIMIT 40,-1 (renvoit du 41ème au dernier) |
|