24/12/2024

Base de données

Faire des requêtes SQL dans une base de données

Sommaire

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 :

MPD

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

req1

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

req2

 

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

req3

 

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

req4

 

E. Combien avons-nous de switchs ?

SELECT COUNT(*)
FROM T_Switchs

req5

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

req6

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

req7

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

req8

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

req9

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

req10

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.

req11

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 :

req12

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'

req13

 

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')

req14

 

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

req15

 

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.

req17

 

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'

req19

 

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')

req18

 

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

req19

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"

author avatar
Florian BURNEL Co-founder of IT-Connect
Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail

2 commentaires sur “Faire des requêtes SQL dans une base de données

  • 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

    Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.