SQL - Affichage




  1. Le SELECT



  1. 1. Préambule

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. Les bases



  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
=EgalNbSong = 13
>SupérieurNbSong > 13
<InférieurNbSong < 13
>=Supérieur ou égalNbSong >= 13
<=Inférieur ou égalNbSong <= 13
<>DifférentNbSong >< 13
LIKECorrespond à l'expression avec un critère
Utilisé "%" pour mysql, "&" pour Oracle
Nom_Disque LIKE '%te%'
INAppartient à la listeNbSong IN (10,11,12,13,14,15)
BETWEEN ... ANDDifférentNbSong 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.



  1. 3. Les Champs

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


  2. Les Options du SELECT

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 ByRegroupe les enregistrements par rapport à un ou plusieurs champsGroup By pId
ORDER ByClasse les Order By pId Desc
Order By pId Asc
HAVINGN'affiche que ceux correspond au critèreHaving MIN(NbSong) > 13
LIMITPermet d'afficher un nombre précis d'enregistrementLIMIT 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)





Page modifiée le : 01/10/2024


Valid XHTML 1.0 Transitional