Faire des requêtes SQL dans une base de données
Sommaire
- I. Présentation
- II. Qu'elle est la structure de base d'une requête SQL ?
- III. Requêtes sur une seule table (table T_Switchs)
- A. Afficher le modèle de chaque switch (champ Sw_Modele de la table T_Switchs)
- B. Afficher le modèle de chaque switch avec son nombre de ports Mbit/s (champs Sw_Modele et Sw_NbPortsMb)
- C. Afficher le modèle de chaque switch avec son nombre de ports Mbit/s et les trier par ordre croissant
- D. Afficher le modèle de chaque switch avec son nombre de ports Mbit/s et les trier par ordre décroissant
- E. Combien avons-nous de switchs ?
- F. Combien de switchs de chacun de nos modèles avons-nous ?
- G. Combien avons-nous de ports Mbit/s au total ?
- H. Quel est le nombre de ports Mbit/s en moyenne par switch ?
- I. Quel est le nombre de ports Mbit/s maximal contenu par ces switchs ?
- J. Quel est le nombre de ports Mbit/s minimal contenu par ces switchs ?
- IV. Requêtes sur deux tables (table T_Switchs et T_Fabricants)
- V. Requêtes sur trois tables (table T_Switchs, T_Fabricants et T_Batiments)
- A. Afficher les switchs (modèle et fabricant) implanté dans les différents bâtiments
- B. Afficher les switchs HP implantés dans le bâtiment B et qui ont 44 ports Mbit/s
- C. Afficher les switchs implantés dans les différents bâtiments sauf le Bâtiment C
- D. Afficher les switchs du bâtiment B qui ont plus de 24 ports Mbit/s
I. Présentation
Dans ce tutoriel nous allons voir comment effectuer des requêtes SQL dans une base de données pour obtenir des informations sur ce que contiennent les tables qui la compose. Nous commencerons par des requêtes très simples pour ensuite les complexifier.
Les requêtes seront effectuées dans la base de données utilisée pour l'ensemble des tutoriels SQL, c'est à dire celle-ci : lien. Vous trouverez le tutoriel pour créer le script SQL de cette BDD en cliquant sur ce lien, et le tutoriel pour ajouter des valeurs à cette base de données à cette adresse : lien
Pour rappel, voici le MPD de cette base de données :
Pour exécuter les requêtes accédez à PhpMyAdmin puis à gauche dans l'arborescence cliquez sur la base de données (dans notre cas "implementation_switchs") et ensuite dans le menu cliquez sur "SQL".
II. Qu'elle est la structure de base d'une requête SQL ?
SELECT champ1 , champ2 FROM table1 WHERE champ1 = 0
- SELECT : on sélectionne le nom des champs correspondant aux informations à afficher.
- FROM : on indique à partir de qu'elle(s) table(s) on affiche ces informations.
- WHERE : on indique les conditions à respecter pour retourner les résultats, séparé par "and" ou "or" lorsqu'il y en a plusieurs.
III. Requêtes sur une seule table (table T_Switchs)
A. Afficher le modèle de chaque switch (champ Sw_Modele de la table T_Switchs)
SELECT Sw_Modele FROM T_Switchs
B. Afficher le modèle de chaque switch avec son nombre de ports Mbit/s (champs Sw_Modele et Sw_NbPortsMb)
SELECT Sw_Modele , Sw_NbPortsMb FROM T_Switchs
C. Afficher le modèle de chaque switch avec son nombre de ports Mbit/s et les trier par ordre croissant
SELECT Sw_Modele , Sw_NbPortsMb FROM T_Switchs ORDER BY Sw_NbPortsMb
D. Afficher le modèle de chaque switch avec son nombre de ports Mbit/s et les trier par ordre décroissant
SELECT Sw_Modele , Sw_NbPortsMb FROM T_Switchs ORDER BY Sw_NbPortsMb DESC
E. Combien avons-nous de switchs ?
SELECT COUNT(*) FROM T_Switchs
COUNT(*) permet de retourner le nombre de résultat (non NULL) dans une table.
F. Combien de switchs de chacun de nos modèles avons-nous ?
SELECT Sw_Modele , COUNT(*) FROM T_Switchs GROUP BY Sw_Modele
GROUP BY permet de "trier" les résultats retournés par le COUNT() selon un champ de la table. Dans notre cas cela permet de retourner le nombre de résultat pour chaque modèle.
G. Combien avons-nous de ports Mbit/s au total ?
SELECT SUM(Sw_NbPortsMb) FROM T_Switchs
SUM() permet de faire la somme de toutes les valeurs pour un champ. A l'inverse de COUNT(), il ne retourne pas le nombre de résultat mais bien la somme de toutes les valeurs du champ indiqué.
H. Quel est le nombre de ports Mbit/s en moyenne par switch ?
SELECT AVG(Sw_NbPortsMb) FROM T_Switchs
AVG() permet de retourner en résultat la valeur moyenne du champ sélectionné. Cela revient à faire la somme de toutes les valeurs de ce champ à diviser par le nombre de valeur.
I. Quel est le nombre de ports Mbit/s maximal contenu par ces switchs ?
SELECT MAX(Sw_NbPortsMb) FROM T_Switchs
MAX() permet de retourner en résultat la valeur maximal trouvée pour le champ précisé entre parenthèses.
J. Quel est le nombre de ports Mbit/s minimal contenu par ces switchs ?
SELECT MIN(Sw_NbPortsMb) FROM T_Switchs
MIN() permet de retourner en résultat la valeur minimal trouvée pour le champ précisé entre parenthèses.
IV. Requêtes sur deux tables (table T_Switchs et T_Fabricants)
En SQL, lorsque l'on fait une requête SQL sur plusieurs tables en même temps il est obligatoire de faire des jointures entre les tables pour les mettre en relation. Cette jointure se fait en comparant l'égalité des valeurs d'un champ d'une table au champ d'une autre table.
Au cas où on ne ferait pas cette jointure, il y aurait un produit cartésien entre ces deux tables c'est à dire que le résultat d'une requête sans jointure aboutirait à un résultat qui comprendrait l'ensemble de tous les couples possibles entre ces deux tables.
Par exemple si nous prenons un modèle de switch "Catalyst 2960" contenant 24 ports et un autre modèle "DES 1008D" contenant 8 ports, cela donnera, si on fait une requête SQL entre deux tables sans jointure :
Sw_Modele Sw_NbPortMb
Catalyst 2690 24
Catalyst 2960 8
DES 1008D 24
DES 1008D 8
On peut voir que l'ensemble des couples possibles sont formés, ce qui retourne des résultats incorrect.
A. Afficher le modèle de chaque switch et son fabricant
SELECT F_Nom , Sw_Modele FROM T_Fabricants , T_Switchs WHERE T_Fabricants.F_Num = T_Switchs.Sw_NumFabr
La jointure se fait par la comparaison entre les deux champs formant la clé étrangère entre ces tables.
Le fait d'avoir le nom du constructeur est plus agréable que d'avoir uniquement le modèle du switch comme c'est le cas lorsque l'on fait la requête sur une seule table uniquement.
Si on ne fait pas jointure entre les deux tables c'est à dire que l'on ne met pas "WHERE T_Fabricants.F_Num = T_Switchs.Sw_NumFabr" dans la requête, cela donne :
B. Afficher le modèle et le fabricant uniquement des switchs Cisco
SELECT F_Nom , Sw_Modele FROM T_Fabricants , T_Switchs WHERE T_Fabricants.F_Num = T_Switchs.Sw_NumFabr and T_Fabricants.F_Nom = 'Cisco'
C. Afficher le modèle et le fabricant uniquement des switchs Cisco ou HP
SELECT F_Nom , Sw_Modele FROM T_Fabricants , T_Switchs WHERE T_Fabricants.F_Num = T_Switchs.Sw_NumFabr and (T_Fabricants.F_Nom = 'Cisco' or T_Fabricants.F_Nom = 'HP')
Remarque : la présence des parenthèses à cet endroit est très important.
D. Combien y a t-il de switchs de chaque fabricants ?
SELECT F_Nom , count(*) FROM T_Fabricants , T_Switchs WHERE T_Fabricants.F_Num = T_Switchs.Sw_NumFabr GROUP BY T_Fabricants.F_Nom
V. Requêtes sur trois tables (table T_Switchs, T_Fabricants et T_Batiments)
La réalisation de requêtes sur trois tables se fait de la même manière que pour deux tables c'est à dire qu'il faut effectuer une jointure entre ses différents tables en utilisant les clés étrangères.
A. Afficher les switchs (modèle et fabricant) implanté dans les différents bâtiments
SELECT F_Nom , Sw_Modele , Bat_Nom FROM T_Fabricants , T_Switchs , T_Batiments WHERE T_Fabricants.F_Num = T_Switchs.Sw_NumFabr and T_Batiments.Bat_Num = T_Switchs.Sw_NumBat
Il y a deux jointures à effectuer, réalisées grâce au clés étrangères entre la table T_Switchs et chacune des deux autres tables.
B. Afficher les switchs HP implantés dans le bâtiment B et qui ont 44 ports Mbit/s
SELECT F_Nom , Sw_Modele , Bat_Nom FROM T_Fabricants , T_Switchs , T_Batiments WHERE T_Fabricants.F_Num = T_Switchs.Sw_NumFabr and T_Batiments.Bat_Num = T_Switchs.Sw_NumBat and T_Fabricants.F_Nom = 'HP' and T_Switchs.Sw_NbPortsMb = 44 and T_Batiments.Bat_Nom = 'Batiment B'
C. Afficher les switchs implantés dans les différents bâtiments sauf le Bâtiment C
SELECT F_Nom , Sw_Modele , Bat_Nom FROM T_Fabricants , T_Switchs , T_Batiments WHERE T_Fabricants.F_Num = T_Switchs.Sw_NumFabr and T_Batiments.Bat_Num = T_Switchs.Sw_NumBat and T_Batiments.Bat_Nom NOT IN ('Batiment C')
NOT IN permet de dire que la valeur d'un champ ne doit pas être égal à ce qui est entre les parenthèses.
D. Afficher les switchs du bâtiment B qui ont plus de 24 ports Mbit/s
SELECT F_Nom , Sw_Modele , Bat_Nom FROM T_Fabricants , T_Switchs , T_Batiments WHERE T_Fabricants.F_Num = T_Switchs.Sw_NumFabr and T_Batiments.Bat_Num = T_Switchs.Sw_NumBat and T_Batiments.Bat_Nom = 'Batiment B' and T_Switchs.Sw_NbPortsMb > 24
Le fait d'utiliser "<", ">" permet de filtrer les résultats selon si il sont supérieurs ou inférieurs au nombre indiqué après le signe. Il est possible aussi d'utiliser "<>" qui signifie dans "différent de"
Bonjour
Professeur je trouve votre page très didactique puis-je la référencer sur mon site ?
merci de me répondre en privé
bien à vous
je souhaite créer une requête d’un client Annecy