SQL - Affichage 1. Le SELECT
1. 1. Préambule
Voici le schema de la base que nous allons utiliser dans nos exemples :
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; La liste des opérateurs est : +----+-----------+---------------------------+-------+-------+ |Id |Nom_Disque |Commentaires |IdPays |NbSong | +----+-----------+---------------------------+-------+-------+ | 2 |Disk2 |Deuxième disque | 1 | 15 | | 3 |Disk3 |La, c'est pour le test | 3 | 20 | +----+-----------+---------------------------+-------+-------+
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 :
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 : 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; 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.+-----------+-----+ |NPays |Nb | +-----------+-----+ | Francais | 2 | | Japonais | 1 | +-----------+-----+ 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 :
|