43
SQL Partie 3 : (LID : Langage d'interrogation de données) Réfs : Chap 4.7, 4.8, 4.9 p 109-118

SQL Partie 3 : (LID : Langage d'interrogation de données)

  • Upload
    malana

  • View
    49

  • Download
    0

Embed Size (px)

DESCRIPTION

SQL Partie 3 : (LID : Langage d'interrogation de données). 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, c'est-dire toutes les lignes du tableau. - PowerPoint PPT Presentation

Citation preview

Notions de SQL (LID : Langage d'interrogation de donnes)

SQL Partie 3 :(LID : Langage d'interrogation de donnes)Rfs : Chap 4.7, 4.8, 4.9 p 109-1181Requtes sur un seul tableauI/ Requtes sans restrictions = ProjectionDans 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 afficherSelect 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.prenomIl est parfois indispensable d'y avoir recours lorsqu'une colonne porte le mme nom dans deux tableaux diffrents de la base de donnes.

2Si on souhaite afficher toutes les colonnes du tableau, on peut utiliser :

Select *

3Exemple 1 : Afficher toutes les informations sur les employs de l'entrepriseSelect *From employe

Exemple 2 : Afficher le nom des diffrents services et leur lieu d'implantationSelect nomService,lieuFrom service

4L'instruction select distinctCette 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'entrepriseSelect distinct fonctionFrom employe 5II/ 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 andEx : where condition 1and condition 2and condition 3 6Exemple 4 : Afficher les noms des salaris qui occupent la fonction de commercialSelect nomEmployeFrom employeWhere fonction="commercial"

Exemple 5 : Afficher les noms des salaris embauchs avant 1990 Select nomEmployeFrom employeWhere dateEmbauche=2500013Exemple 12 : Afficher les noms des salaris qui sont soit commercial travaillant dans le service 20, soit ingnieurSelect nomEmployeFrom employeWhere (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 20Select nomEmployeFrom employeWhere (fonction="commercial" or fonction="ingnieur")And numServEmploye=20

14Conditions 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 ?

15Exemple 14 :Afficher les noms des salaris qui ont un suprieur hirarchique. Select nomEmployeFrom employeWhere matSuprieur is not null

16III/ 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.

17Exemple 15 : Afficher la liste des salaris, classs par fonction et pour chaque fonction, par salaire dcroissant Select nomEmploye, fonction,salaireFrom employeOrder by salaire desc

18Tri 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+commissionFrom employeWhere commission is not nullOrder by 3 desc

19Requtes sur plusieurs tableauxExemple 17 : Afficher toutes les informations sur les salaris avec le lieu de travailAnalyse : 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). 20Pour 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.NumServiceRmq : le nom du tableau prcde le nom de la colonneSelect employe.*,lieuFrom employe,serviceWhere employe.NumServEmploye=service.NumService

21Cas 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.mat22Requtes imbriquesUne 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"23Select nomEmploye, fonctionFrom employeWhere fonction=(Select fonctionFrom employeWhere nomEmploye="dupont")Les fonctions statistiques du SQLCes fonctions sont prvues pour s'appliquer sur l'une des colonnes d'untableau l'exception de la fonction count(*) qui permet de compter leslignes 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 colonneAvg(nomColonne) : calcule la moyenne des valeurs d'une colonneMin(nomColonne) : renvoie la valeur minimale d'une colonneMax(nomColonne) : renvoie la valeur maximale d'une colonneCount(*) : compte le nombre de lignes ou d'enregistrements d'un tableauCount(nomColonne) : compte le nombre de lignes non vides d'uneColonne.25Ralisez 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 employeExemple 3: Calculer lanciennet du salari le plus ancien. select max(year(curdate())-year(dateEmbauche))from employe

26Exemple 4: Calculer la masse salariale de cette entreprise.(= somme de tous les salaires annuels de lentreprise)Select sum(salaire)From employeExemple 5: Calculer leffectif du service 20.Select count(*)From employeWhere numServEmploye=20Exemple 6: Trouver le nom de lemploy qui a le salaire le plus lev.Select nomEmployeFrom employeWhere salaire=(Select max(salaire) From employe)

L'instruction group byCette 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

29Sans instruction group by, il faudrait raliser plusieurs requtes du mme type que la suivante :

Select count(*)From employeWhere numServEmploye=20

30Group 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(*).31Essayer : Select count(*)From employeGroup 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.32Ce qui nous donne :Select numServEmploye, count(*)From employeGroup by numServEmploye Exercice 1 :Amliorons encore en donnant un intitul appropri la deuxime colonne du tableau rsultat.Select numServEmploye, count(*) as "effectif"From employeGroup by numServEmploye33Exercice 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, servicewhere numServemploye=numServiceGroup by numServEmploye, nomService

Exercice 3 : Afficher le nombre de salaris par lieu gographiqueSelect numServEmploye,nomService, count(*) as "effectif"From employe, servicewhere numServemploye=numServiceGroup by numServEmploye,nomService

Exercice 4 : Afficher le salaire moyen par serviceOn 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 croissantAstuce : il faut utiliser comme critre de tri l'intitul cre avec l'instruction AS35L'instruction HavingL'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(*)>=2having NomService like "*v"having Salaire_moyen>20 000

36Exemple 1 : Que va afficher la requte suivante ?Select nomService, count(*) as "Nombre de salaris"From employe, serviceWhere numServEmploye=numserviceGroup by nomService, numServEmployeHaving count(*)>=2

Cette requte affiche l'effectif des services ayant au moins deux salaris.37Exemple 2 : Que va afficher la requte suivante ?Select nomService, count(*) as "Nombre de salaris"From employe, serviceWhere numServEmploye=numserviceGroup by nomService, numServEmployeHaving NomService like "v*"

Cette requte affiche l'effectif des services dont l'intitul commence par la lettre v.

38Exemple 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, serviceWhere numServEmploye=numServiceGroup by numServEmploye, nomService 39Comment 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.

40Exemple : Que fait la requte suivante ?Select nomService, round(avg(salaire),2) as "Moyenne des hauts salaires"From employe, serviceWhere numServEmploye=numServiceAnd salaire>20000Group by numService, nomService

Elle calcule par service, la moyenne des salaires suprieurs 20 000 (Moyenne des hauts salaires)41Requtes 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 employeGroup by numServEmploye

42Corrig :select avg(effectif) as effectif_moyenfrom (Select count(*) as effectifFrom employeGroup by numServEmploye)