Réfs : Chap 4.7, 4.8, 4.9 p 109-118. Requêtes sur un seul tableau I/ Requêtes sans restrictions =...
43
SQL Partie 3 : (LID : Langage d'interrogation de données) Réfs : Chap 4.7, 4.8, 4.9 p 109-118
Réfs : Chap 4.7, 4.8, 4.9 p 109-118. Requêtes sur un seul tableau I/ Requêtes sans restrictions = Projection Dans ce cas, on affichera tous les enregistrements,
Requtes sur un seul tableau I/ Requtes sans restrictions =
Projection Dans ce cas, on affichera tous les enregistrements,
c'est-dire toutes les lignes du tableau. L'instruction Select
permet de prciser les colonnes du tableau que l'on souhaite
afficher Select colonne1, colonne2, Ex : select nom, prenom On peut
rencontrer galement l'criture suivante (plus longue) : Select
nomTableau.colonne1, nomTableau.colonne2, Ex : select client.nom,
client.prenom Il est parfois indispensable d'y avoir recours
lorsqu'une colonne porte le mme nom dans deux tableaux diffrents de
la base de donnes.
Page 3
Si on souhaite afficher toutes les colonnes du tableau, on peut
utiliser : Select *
Page 4
Exemple 1 : Afficher toutes les informations sur les employs de
l'entreprise Select * From employe Exemple 2 : Afficher le nom des
diffrents services et leur lieu d'implantation Select
nomService,lieu From service
Page 5
L'instruction select distinct Cette instruction s'utilise la
place de select lorsqu'on ne souhaite pas afficher plusieurs fois
des valeurs identiques. Exemple 3 : Afficher les diffrentes
fonctions occupes dans l'entreprise Select distinct fonction From
employe
Page 6
II/ Requtes avec restrictions = Selection Dans ce cas, seules
les lignes vrifiant une ou plusieurs conditions seront affiches.
C'est l'instruction where qui permet de prciser la premire
condition respecter. En cas de plusieurs conditions, on complte
avec l'instruction and Ex : where condition 1 and condition 2 and
condition 3
Page 7
Exemple 4 : Afficher les noms des salaris qui occupent la
fonction de commercial Select nomEmploye From employe Where
fonction="commercial" Exemple 5 : Afficher les noms des salaris
embauchs avant 1990 Select nomEmploye From employe Where
dateEmbauche40000
Page 9
Lorsqu'une condition porte sur un intervalle de dates ou de
valeur, on peut utiliser l'instruction Between borneInf and
borneSup Exemple 7 : Afficher le nom des salaris embauchs au cours
de l'anne 2005 Select nomEmploye From employe Where dateEmbauche
between "2005/01/01" and "2005/12/31" Ou Select nomEmploye From
employe Where year(dateEmbauche)=2005
Page 10
Une condition peut comporter un calcul sur une ou plusieurs
colonnes Exemple 8 : Afficher les noms des salaris dont la
commission reprsente plus de la moiti du salaire Select nomEmploye
From employe Where commission>salaire/2
Page 11
Une condition peut tester si la valeur d'une colonne prend des
valeurs isoles. Dans ce cas, on utilise l'instruction IN (valeur1,
valeur2,) Exemple 9 : Afficher les noms et fonctions des salaris
qui sont soit commercial soit ingnieur Select nomEmploye, fonction
From employe Where fonction in ("commercial","ingnieur")
Page 12
Condition avec l'instruction like Cette instruction peut
s'utiliser dans le cas suivant : Exemple 10 : Afficher les noms des
salaris dont le nom commence par la lettre M Select nomEmploye From
employe Where nomEmploye like "M%"
Page 13
Requtes avec plusieurs conditions (And ou OR) Si plusieurs
condition doivent tre vrifies simultanment, on utilise AND Si
au-moins une des deux conditions doivent tre vrifies, on utilise OR
Exemple 11 : Afficher les noms des salaris du service 30, ayant un
salaire brut annuel d'au-moins 25 000 Select nomEmploye From
employe Where numServEmploye=30 And salaire>=25000
Page 14
Exemple 12 : Afficher les noms des salaris qui sont soit
commercial travaillant dans le service 20, soit ingnieur Select
nomEmploye From employe Where (fonction="commercial" and
numServEmploye=20) Or fonction="ingnieur" Exemple 13 : Afficher les
noms des salaris qui sont soit commercial ou ingnieur, et
travaillant dans le service 20 Select nomEmploye From employe Where
(fonction="commercial" or fonction="ingnieur") And
numServEmploye=20
Page 15
Conditions avec is null ou is not null Cette condition
s'utilise lorsque certaines lignes d'une colonne ne comportent
aucune valeur. Attention : zro est considr comme une valeur. Dans
quel tableau et colonne de la base support, existe-il des lignes
non renseignes ?
Page 16
Exemple 14 : Afficher les noms des salaris qui ont un suprieur
hirarchique. Select nomEmploye From employe Where matSuprieur is
not null
Page 17
III/ Requtes avec tris (ORDER BY) Les rsultats d'une requte
peuvent tre affichs selon un ordre croissant ou dcroissant sur un
ou plusieurs critres. Les critres de tri doivent tre prciss dans
l'instruction ORDER BY suivi de la mention DESC si le tri est dans
l'ordre dcroissant.
Page 18
Exemple 15 : Afficher la liste des salaris, classs par fonction
et pour chaque fonction, par salaire dcroissant Select nomEmploye,
fonction,salaire From employe Order by salaire desc
Page 19
Tri des rsultats sur une colonne calcule Exemple 16 : Afficher
la liste des salaris touchant une commission, classe par rmunration
brute dcroissante Select nomEmploye, fonction,salaire+commission
From employe Where commission is not null Order by 3 desc
Page 20
Requtes sur plusieurs tableaux Exemple 17 : Afficher toutes les
informations sur les salaris avec le lieu de travail Analyse : Le
lieu de travail figure dans la table "Service" ; il est donc
ncessaire d'utiliser les deux tableaux de la base. Rgle : dans le
cas o plusieurs tableaux doivent tre utiliss, il faut
obligatoirement dfinir une ou plusieurs jointures, c'est--dire
prciser ce qui permet de relier les tableaux entre eux (voir modle
relationnel).
Page 21
Pour relier un ou plusieurs tableaux, on utilise la clause
Where, comme si il s'agissait d'une condition. Dans l'exemple,
c'est le numro de service qui permet de relier les deux tableaux
utiliss. On aura donc : Where
employe.NumServEmploye=service.NumService Rmq : le nom du tableau
prcde le nom de la colonne Select employe.*,lieu From
employe,service Where
employe.NumServEmploye=service.NumService
Page 22
Cas particulier : tableau reli avec lui-mme Exemple : Indiquer
pour chaque salari, le nom de son suprieur Analyse : toutes les
informations sont dans la table Employe, mais le nom du suprieur
n'apparait pas directement. Dans ce cas, il faut crer un deuxime
tableau employe qu'on utilisera pour rcuprer le nom du suprieur. Il
faudra donner un nom (alias) ce deuxime tableau pour le distinguer
du premier, par exemple sup Les deux tableaux employe et sup seront
relis par le numro de matricule. La jointure sera donc :
employe.matSuperieur=sup.mat
Page 23
Requtes imbriques Une condition peut faire appel une sous
requte, condition que cette sous requte renvoie un rsultat unique.
Exemple 18 : Donner la liste des employs occupant la mme fonction
que le salari nomm "dupond" Mthode : il faut d'abord crer la sous
requte et la tester, puis complter la requte principale. Ici la
sous-requte consiste afficher la fonction du salari "dupond"
Page 24
Select nomEmploye, fonction From employe Where fonction=(Select
fonction From employe Where nomEmploye="dupont")
Page 25
Les fonctions statistiques du SQL Ces fonctions sont prvues
pour s'appliquer sur l'une des colonnes d'un tableau l'exception de
la fonction count(*) qui permet de compter les lignes d'un tableau.
Le rsultat renvoy est toujours une valeur unique. Il existe 5
fonctions statistiques en SQL : Sum(nomColonne) : effectue la somme
des valeurs d'une colonne Avg(nomColonne) : calcule la moyenne des
valeurs d'une colonne Min(nomColonne) : renvoie la valeur minimale
d'une colonne Max(nomColonne) : renvoie la valeur maximale d'une
colonne Count(*) : compte le nombre de lignes ou d'enregistrements
d'un tableau Count(nomColonne) : compte le nombre de lignes non
vides d'une Colonne.
Page 26
Ralisez les exemples suivants : Exemple 1 : calculer le salaire
moyen des employs. Select avg(salaire) From employe Exemple 2 :
trouver la date dembauche du salari le plus ancien. Select
min(year(dateEmbauche)) From employe Exemple 3: Calculer lanciennet
du salari le plus ancien. select
max(year(curdate())-year(dateEmbauche)) from employe
Page 27
Exemple 4: Calculer la masse salariale de cette entreprise.(=
somme de tous les salaires annuels de lentreprise) Select
sum(salaire) From employe Exemple 5: Calculer leffectif du service
20. Select count(*) From employe Where numServEmploye=20
Page 28
Exemple 6: Trouver le nom de lemploy qui a le salaire le plus
lev. Select nomEmploye From employe Where salaire=(Select
max(salaire) From employe)
Page 29
L'instruction group by Cette instruction permet de raliser en
une seule requte, ce qui ncessiterait plusieurs requtes sans
utilisation de group by. Exemple : On souhaite afficher le nombre
de salaris par service
Page 30
Sans instruction group by, il faudrait raliser plusieurs
requtes du mme type que la suivante : Select count(*) From employe
Where numServEmploye=20
Page 31
Group by va permettre de parcourir le tableau "employe" en
regroupant chaque ligne ou enregistrement par numro de service si
on dcide de faire un regroupement par numro de service. Group by
ralise en quelque sortes des paquets d'enregistrements regroups
l'aide d'un critre ; il suffira alors de compter le nombre
d'enregistrements de chaque paquet grce l'instruction
count(*).
Page 32
Essayer : Select count(*) From employe Group by numServEmploye
Cette requte fonctionne, mais on ne sait pas quels services
correspondent les nombres affichs. Il est possible de placer dans
l'instruction select, le nom de la colonne ou des colonnes ayant
servi au regroupement l'exclusion de toute autre.
Page 33
Ce qui nous donne : Select numServEmploye, count(*) From
employe Group by numServEmploye Exercice 1 : Amliorons encore en
donnant un intitul appropri la deuxime colonne du tableau rsultat.
Select numServEmploye, count(*) as "effectif" From employe Group by
numServEmploye
Page 34
Exercice 2 : Afin d'amliorer encore le rsultat, on souhaiterait
afficher galement le nom du service en plus du numro pour une
meilleure interprtation. Cette fois, il faudra galement utiliser le
tableau "service" car lui seul contient le nom des services. Select
numServEmploye, nomService, count(*) as "effectif" From employe,
service where numServemploye=numService Group by numServEmploye,
nomService
Page 35
Exercice 3 : Afficher le nombre de salaris par lieu gographique
Select numServEmploye,nomService, count(*) as "effectif" From
employe, service where numServemploye=numService Group by
numServEmploye,nomService Exercice 4 : Afficher le salaire moyen
par service On utilisera la fonction avg(NomColonne) et la fonction
round() pour arrondir deux dcimales le salaire moyen Exercice 5 :
Trier le tableau prcdent par salaire moyen croissant Astuce : il
faut utiliser comme critre de tri l'intitul cre avec l'instruction
AS
Page 36 20 000">
L'instruction Having L'instruction Having complte l'instruction
group by en offrant la possibilit d'introduire une condition
portant sur chaque paquet d'enregistrements, une fois ceux ci dj
raliss par le group by. L'instruction having est suivie d'une
condition formule uniquement grce une fonction statistique ou
portant sur un champ de regroupement utilis dans le group by ou sur
l'intitul du champ cre l'aide de AS dans le select. Exemples de
conditions : having count(*)>=2 having NomService like "*v"
having Salaire_moyen>20 000
Page 37 =2 Cette requte affiche l'effectif des services ayant
au moins deux salaris.">
Exemple 1 : Que va afficher la requte suivante ? Select
nomService, count(*) as "Nombre de salaris" From employe, service
Where numServEmploye=numservice Group by nomService, numServEmploye
Having count(*)>=2 Cette requte affiche l'effectif des services
ayant au moins deux salaris.
Page 38
Exemple 2 : Que va afficher la requte suivante ? Select
nomService, count(*) as "Nombre de salaris" From employe, service
Where numServEmploye=numservice Group by nomService, numServEmploye
Having NomService like "v*" Cette requte affiche l'effectif des
services dont l'intitul commence par la lettre v.
Page 39
Exemple 3 : Complter la requte pour qu'elle affiche le salaire
moyen de chaque service lorsqu'il dpasse 20 000. Select nomService,
round(avg(salaire),2) as "Salaire_moyen" From employe, service
Where numServEmploye=numService Group by numServEmploye,
nomService
Page 40
Comment savoir si il faut utiliser l'instruction having ? Si la
condition porte sur chaque paquet dj regroup, il faut utiliser
having. Si la condition porte sur les lignes d'enregistrements d'un
tableau avant d'effectuer les regroupements, il faut toujours
utiliser where.
Page 41 20000 Group by numService, nomService Elle calcule par
service, la moyenne des salaires suprieurs 20 000 (Moyenne des
hauts salaires)">
Exemple : Que fait la requte suivante ? Select nomService,
round(avg(salaire),2) as "Moyenne des hauts salaires" From employe,
service Where numServEmploye=numService And salaire>20000 Group
by numService, nomService Elle calcule par service, la moyenne des
salaires suprieurs 20 000 (Moyenne des hauts salaires)
Page 42
Requtes avec group by dans une instruction from Modifier la
requte suivante pour obtenir le nombre moyen de salaris par service
: Select NumServEmploye, count(*) as "effectif" From employe Group
by numServEmploye
Page 43
Corrig : select avg(effectif) as effectif_moyen from (Select
count(*) as effectif From employe Group by numServEmploye)