[SGBD_SQL] [2019-2020] Lesson 1: SELECT * family_members id name 1 Dave 2 Mary 3 Pickles gender male female male species num_books_read human 200 human 180 dog 0 SELECT * FROM family_members; Result: id name 1 Dave 2 Mary 3 Pickles gender male female male species num_books_read human 200 human 180 dog 0 Lesson 2: SELECT specific columns Current tables: family_members id name 1 Dave 2 Mary 3 Pickles gender male female male species human human dog num_books_read 200 180 0 SELECT * FROM family_members WHERE num_books_read > 0 Result: id name gender species num_books_read 1 Dave male human 200 2 Mary female human 180 SELECT*FROM family_members WHERE num_books_read >=180; Result: SELECT name, num_books_read FROM family_members; Result: name num_books_read Dave 200 Mary 180 Pickles 0 Lesson 3: WHERE ... =, <, <=….AND, OR … SELECT * FROM family_members WHERE species = 'human'; Result: id name gender species num_books_read 1 Dave male human 200 2 Mary female human 180 [Circuits à diodes] id name gender species num_books_read 1 Dave male human 200 2 Mary female human 180 Current tables: friends_of_pickles id 1 2 3 4 5 6 7 name Dave Mary Fry Leela Odie Jumpy Sneakers gender male female male female male male male species human human cat cat dog dog dog height_cm 180 160 30 25 40 35 55 Page 1 [SGBD_SQL] [2019-2020] SELECT * FROM friends_of_pickles WHERE height_cm > 25 AND species = 'cat'; Result: id name gender species height_cm 3 Fry male cat 30 SELECT * FROM friends_of_pickles WHERE height_cm > 25 OR species = 'cat'; Result: id 1 2 3 4 5 6 7 name Dave Mary Fry Leela Odie Jumpy Sneakers gender male female male female male male male species human human cat cat dog dog dog height_cm 180 160 30 25 40 35 55 Lesson 4: IN SELECT * FROM friends_of_pickles WHERE species IN ('cat', 'human'); Result: id name gender species height_cm 1 Dave male human 180 2 Mary female human 160 3 Fry male cat 30 4 Leela female cat 25 SELECT * FROM friends_of_pickles WHERE species NOT IN ('cat', 'dog'); Result: id name gender species height_cm 1 Dave male human 180 2 Mary female human 160 [Circuits à diodes] Lesson 9: DISTINCT SELECT DISTINCT gender, species FROM friends_of_pickles WHERE height_cm < 100; Result: gender male female male species cat cat dog Lesson 10: ORDER BY SELECT * FROM friends_of_pickles ORDER BY name; Result: id 1 3 6 4 2 5 7 name Dave Fry Jumpy Leela Mary Odie Sneakers gender male male male female female male male species human cat dog cat human dog dog height_cm 180 30 35 25 160 40 55 SELECT * FROM friends_of_pickles ORDER BY height_cm; Result: id 4 3 6 5 7 2 1 name Leela Fry Jumpy Odie Sneakers Mary Dave gender female male male male male female male species cat cat dog dog dog human human height_cm 25 30 35 40 55 160 180 Page 2 [SGBD_SQL] [2019-2020] SELECT * FROM friends_of_pickles ORDER BY height_cm DESC; Result: id 1 2 7 5 6 3 4 name Dave Mary Sneakers Odie Jumpy Fry Leela gender male female male male male male female species human human dog dog dog cat cat height_cm 180 160 55 40 35 30 25 Lesson 11: LIMIT # of returned rows SELECT * FROM friends_of_pickles ORDER BY height_cm LIMIT 2; Result: id name gender species height_cm 4 Leela female cat 25 3 Fry male cat 30 SELECT * FROM friends_of_pickles ORDER BY height_cm DESC LIMIT 3; Result: id name 1 Dave 2 Mary 7 Sneakers gender male female male species human human dog height_cm 180 160 55 Lesson 12: COUNT(*) SELECT COUNT(*) FROM friends_of_pickles; Result: Lesson 14: SUM: somme SELECT SUM(num_legs) FROM family_members; Result: SUM(num_legs) 8 Lesson 15: AVG : moyenne SELECT AVG(num_legs) FROM family_members; Result: AVG(num_legs) 2.6666666666666665 Lesson 16: MAX and MIN SELECT MIN(num_legs) FROM family_members; Result: MIN(num_legs) 2 Lesson 17: GROUP BY SELECT COUNT(*), species FROM friends_of_pickles GROUP BY species; Result: COUNT(*) species 2 cat 3 dog 2 human COUNT(*) 7 Lesson 13: COUNT(*) ... WHERE SELECT COUNT(*) FROM friends_of_pickles WHERE species = 'human'; Result: COUNT(*) 2 [Circuits à diodes] Page 3 EXERCICE 1 : Les requêtes SELECT - Base de données ETUDIANT Objectif: Écrire des requêtes SELECT comportant la projection, le filtrage et le regroupement des données. Soit le schéma relationnel suivant: Travail à faire: Écrire les requêtes suivantes en SQL : 1. Afficher la liste des étudiants triés par ordre croissant de date de naissance. 2. Afficher tous les étudiants inscrits à M1 et tous les étudiants inscrits à M2. 3. Afficher les matricules des étudiants qui ont passé l'examen du cours 002. 4. Afficher les matricules de tous les étudiants qui ont passé l'examen du cours 001 et de tous les étudiants qui ont passé l'examen du cours 002. 5. Afficher le matricule, code, note /20 et note /40 de tous les examens classés par ordre croissant de matricule et de code. 6. Trouver la moyenne de notes de cours 002. 7. Compter les examens passés par un étudiant (exemple avec matricule 'e1') 8. Compter le nombre d'étudiants qui ont passé l'examen du cours 002. 9. Calculer la moyenne des notes d'un étudiant (exemple avec matricule 'e1'). 10. Compter les examens passés par chaque étudiant. 11. Calculer la moyenne des notes pour chaque étudiant. 12. La même au dessus, mais afficher seulement les étudiants (et leurs moyennes) dont la moyenne est >= 15. 13. Trouver la moyenne de notes de chaque cours. Correction : /Auteur: CHAOULID //Copyright: Exelib.net use ETUDIANTS go [Circuits à diodes] Page 4 --Q1 select *from Etudiant order by DateNaissance --Q2 select * from Etudiant where Niveau='M1' or Niveau='M2' --Q3 select Matricule from Examen where Code='002' --Q4 select Matricule from Examen where Code='001' or Code='002' --Q5 select Matricule,Code,Note as "Note sur 20",Note*2 as "Note sur 40" from Examen order by Matricule,Code --Q6 select AVG(Note) as "Moyenne de notes" from Examen where Code='002' --Q7 select COUNT(Code) as "Nombre d'examens" from Examen where Matricule='e1' --Q8 select COUNT(Matricule) as "Nombre d'étudiants" from Examen where Code='002' --Q9 select AVG(Note) as "Moyenne de notes" from Examen where Matricule='e1' --Q10 select Matricule,COUNT(Code) as "Nombre d'examens" from Examen group by Matricule --Q11 select Matricule,AVG(Note) as "Moyenne de notes" from Examen group by Matricule --Q12 select Matricule,AVG(Note) as "Moyenne de notes" from Examen group by Matricule having AVG(Note)>=15 --Q13 select Code,AVG(Note) as "Moyenne de notes" from Examen group by Code EXERCICE 2 : STAGIAIRE L’objectif de cet exercice est d’interroger une base de données de gestion des notes en utilisant des requêtes SELECT Mono-Table. Les éléments à traiter sont : les sélections, les projections, le tri, les groupements, les fonctions d’agrégats et les opérateurs. Avant de commencer Pour cet exercice, utilisez la base de données gestion-notes-stagiaires dont le schéma relationnel est le suivant : [Circuits à diodes] Page 5 Schéma Base de données Stagiaires Travail à faire: Écrivez les requêtes permettant d'afficher : 1. La liste des stagiaires ; 2. La liste des examens ; 3. Les numéros de tous les stagiaires ; 4. Les numéros des examens munis de la date de réalisation ; 5. La liste des stagiaires triée par nom dans un ordre décroissant ; 6. La liste des examens réalisés dans les salles 'A2' ou 'A3'; 7. La liste des examens pratiques ; 8. La liste précédente triée par date de passation de l'examen ; 9. La liste des examens triée par salle dans un ordre croissant et par date dans un ordre décroissant ; 10. Les numéros et les notes des examens passé par le stagiaire 'S01'; 11. Les numéros et les notes des examens passé par le stagiaire 'S01' et dont la note est supérieure ou égale à 15 ; 12. Les stagiaires dont le nom contient la lettre 'u' ; 13. Les prénoms des stagiaires dont le prénom se termine par la lettre 'm' ; 14. Les prénoms des stagiaires dont le prénom se termine par la lettre 'm' ou 'd' ; [Circuits à diodes] Page 6 15. Les noms et prénoms des stagiaires dont le nom se termine par la lettre 'i' et le prénom par 'm' ; 16. Les noms des stagiaires dont la deuxième lettre est 'a' ; 17. [3 méthodes] Les noms des stagiaires dont la deuxième lettre n'est pas 'a' ; 18. La liste des examens pratiques réalisés dans une salle commençant par la lettre 'A'; 19. Toutes les salles dont on a réalisé au moins un examen ; 20. La liste précédentes sans doublons ; 21. Pour chaque examen, la première et la dernière note ; 22. Pour l'examen 'E05', la première et la dernière note ; 23. Pour chaque examens, l'écart entre la première et la dernière note ; 24. Le nombre d'examens pratiques ; 25. La date du premier examen effectué ; 26. Le nombre de stagiaires dont le nom contient 'b' ou 's' ; 27. Pour chaque stagiaires la meilleure note dans tous les examens ; 28. Pour chaque date enregistrée dans la base de données le nombre d'examens ; 29. Pour chaque salle le nombre d'examens réalisés ; 30. Le nombre d'examens réalisés dans la salle 'B5'; 31. Toutes les salles dont on a effectué au moins deux examens ; 32. Toutes les salles dont on a effectué exactement 3 examens ; 33. Le nombre d'examens réalisés dans les salle commençant par la lettre 'A' ; 34. Pour chaque salle commençant par la lettre 'A', le nombre d'examens ; 35. Les salles qui commence par 'A' et dont on a effectué deux examens. Correction exercice 2 //Q1 select * from Stagiaires; //Q5 select * from Stagiaires order by NumS DESC; //Q6 select * from Examens where Salle='A2' or Salle='A3'; select * from Examens where Salle in ('A2', 'A3'); //Q7 select * from Examens where TypeE='P'; //Q8 select * from Examens where TypeE='P' order by Date; //Q9 select * from Examens order by Salle, Date DESC; //Q11 select NumS, NumE, Note from PasserExamen where NumS='S01' and Note >= 15; //Q12 select * from Stagiaires where NomS like '%u%'; //Q13 select distinct PrenomS from Stagiaires where PrenomS like '%m'; [Circuits à diodes] Page 7 //Q14 select PrenomS from Stagiaires where PrenomS like '%m' or PrenomS like '%d' ; select PrenomS from Stagiaires where PrenomS like '%[dm]' ; //Q16 select NomS from Stagiaires where NomS like '_a%'; //Q17 select NomS from Stagiaires where NomS not like '_a%'; select NomS from Stagiaires where NomS like '_[b-zB-Z ]%'; select NomS from Stagiaires where NomS like '_[^a]%'; //Q19 select Salle from Examens //Q20 select distinct Salle from Examens //Q21 select NumE, max(Note) 'Premiere Note', min(Note) 'Derniere Note' from PasserExamen group by NumE; //Q22 select NumE, max(Note) as 'Premiere Note', min(Note) 'Derniere Note' from PasserExamen where NumE='E05' group by NumE ; //Q23 select by NumE; NumE, max(Note) - //Q24 select count(*) TypeE='P'; min(Note) 'Ecart' from PasserExamen group [Nombre Examen Pratique] from Examens where //Q25 select min(Date) as 'Date 1er Examen' from Examens; //Q26 select count(*) 'Nb stagiaire..' from Stagiaires where NomS like '%[bs]%'; //Q27 select NumS, max(Note) from PasserExamen group by NumS; //Q28 select Date, count(*) as 'Nb Examen' from Examens group by Date; //Q29 select Salle, count(*) as 'Nb Examen' from Examens group by Salle; //Q30 select count(*) as 'Nb Examen' from Examens where Salle='B5'; //Q31 select Salle, count(*) as 'Nb Examen' from Examens group by Salle having count(*) > 1; //Q32 select Salle, count(*) as 'Nb Examen' from Examens group by Salle having count(*) = 3; //Q33 select count(*) as 'Nb Examen' from Examens where Salle like 'A%'; //Q34 select Salle, count(*) as 'Nb Examen' from Examens where Salle like 'A%' group by Salle; [Circuits à diodes] Page 8 //Q35 select Salle, count(*) as 'Nb Examen' from Examens where Salle like 'A%' group by Salle having count(*) = 2 ; EXERCICE 3 : VUE SQL Objectif: Créer et utiliser des Vues SQL. Soit le modèle relationnel suivant : Modèle Relationnel : ELEVES Travail à faire: 1. Créer les tables en précisant les clés primaires et étrangères. 2. Créer les contraintes qui imposent que l’âge de l’élève soit entre 17 et 23 et que la note du contrôle soit entre 0 et 20. 3. Insérer des lignes dans les tables. 4. Afficher le nombre de contrôles passés par élève en mathématiques. 5. Créer une vue V_Moyenne_Matière qui permet d’afficher la moyenne de chaque élève (Id,Nom,Prénom) Par matière (NomMat, Coef). 6. Créer une vue V_Moyenne_Générale qui permet d’afficher la moyenne générale de chaque élève (Id,Nom,Prénom). Correction EXERCICE 3 //Q1 create database ELEVES Go use ELEVES create table Eleve(Id_Eleve int primary key,Nom varchar(30),Prenom varchar(30),Age int) create table Matiere(Code_Matiere varchar(30) primary key,Nom_Matiere varchar(30),Coef_Matiere int) create table Controle(Id_Eleve int foreign key references Eleve(Id_Eleve),Code_Matiere varchar(30) foreign key references [Circuits à diodes] Page 9 Matiere(Code_Matiere),Date_Controle Date,Note float,primary key (Id_Eleve,Code_Matiere,Date_Controle)) drop table Controle //Q2 alter table Eleve add constraint age_eleve check(Age between 17 and 23) alter table Controle add constraint note_eleve check(Note between 0 and 20) //Q3 insert into Eleve values(1,'NOM1','PRENOM1',18) insert into Eleve values(2,'NOM2','PRENOM2',18) insert into Eleve values(3,'NOM3','PRENOM3',20) insert into Matiere values('M1','MATIERE1',2) insert into Matiere values('M2','MATIERE2',3) insert into Matiere values('M3','MATIERE3',4) insert into Controle values(1,'M1','1/2/2016',15) insert into Controle values(1,'M2','1/2/2016',14) insert into Controle values(1,'M3','1/2/2016',9) insert into Controle values(1,'M1','1/5/2016',13) insert into Controle values(2,'M1','1/5/2016',13) //Q4 select c.Id_Eleve,COUNT(m.Code_Matiere) as "Nombre de controles" from Controle c inner join Matiere m on c.Code_Matiere=m.Code_Matiere where m.Nom_Matiere='MATH' group by Id_Eleve //Q5 create view V_Moyenne_Matiere as select e.Id_Eleve,e.Nom,e.Prenom,m.Nom_Matiere,m.Coef_Matiere,SUM(c.Note)/COUNT(c. Note) as "Moyenne_Matiere" from Controle c inner join Eleve e on c.Id_Eleve=e.Id_Eleve inner join Matiere m on c.Code_Matiere=m.Code_Matiere group by Id_Eleve,e.Nom,e.Prenom,m.Nom_Matiere,m.Coef_Matiere select * from V_Moyenne_Matiere //Q6 create view V_Moyenne_Genrale as select Id_Eleve,Nom,Prenom,SUM(Coef_Matiere*Moyenne_Matiere)/(select [Circuits à diodes] Page 10 SUM(Coef_Matiere) from Matiere) as "Moyenne Générale" from V_Moyenne_Matiere group by Id_Eleve,Nom,Prenom select * from V_Moyenne_Genrale EXERCICE 4 : Objectif: Créer et utiliser des Vues SQL. Soit le schéma relationnel : Modèle Relationnel : EMPLOYES 1. Créer la base de données EMPLOYES. 2. Créez une vue V_EMP contenant : le matricule, le nom, le numéro de département, la somme de la commission et du salaire nommé GAINS, le lieu du département. 3. Sélectionnez les lignes de V_EMP dont le salaire total est supérieur à 10.000 4. Essayez de mettre à jour le nom de l'employé de matricule 1 à travers la vue V_EMP. 5. Créez une vue V_EMP10 qui ne contienne que les employés du département 10 de la table EMP (n'utilisez pas l'option CHECK pour cette création). Insérez dans cette vue un employé qui appartient au département 20. Essayez ensuite de retrouver cet employé au moyen de la vue V_EMP10 puis au moyen de la table EMP. 6. Détruisez cette vue VEMP10 et recréez-la avec l'option CHECK. 7. Essayez d'insérer un employé pour le département 30. Que se passe-t-il ? Essayez de modifier le département d'un employé visualisé à l'aide de cette vue. 8. Afficher la liste des matricules, noms et salaires des employés avec le pourcentage par rapport au total des salaires de leur département (utilisez une vue qui fournira le total des salaires). Correction EXERCICE 4 //Q1 create database EMPLOYES [Circuits à diodes] Page 11 Go use EMPLOYES create table EMP(matricule varchar(30) primary key,Nom varchar(30),Prenom varchar(30),Salaire float,Commission float, Num_Dept int foreign key references DEPT(Num_Dept)) create table DEPT(Num_Dept int primary key,Nom_Dept varchar(30),Ville_Dept varchar(30)) //Q2 create view V_EMP as select e.matricule,e.Nom,e.Prenom,e.Num_Dept,e.Salaire+ISNULL(e.Commission,0) as "GAINS",d.Ville_Dept from EMP e inner join DEPT d on e.Num_Dept=d.Num_Dept select * from V_EMP //Q3 select * from V_EMP where GAINS>10000 //Q4 update V_EMP set Nom='NOM11' where matricule=1 //Q5 create view V_EMP10 as select * from EMP where Num_Dept=10 insert into V_EMP10 values(6,'NOM6','PRENOM6',6000,400,20) select * from V_EMP10 select * from EMP //Q6 drop view V_EMP10 create view V_EMP10 as select * from EMP where Num_Dept=1 with check option //Q7 select * from V_EMP10 insert into V_EMP10 values(7,'NOM7','PRENOM7',7000,400,30) update V_EMP10 set Num_Dept=20 where matricule=2 //Q8 create view V_SOMME_SALAIRES_DEPT as select Num_Dept,SUM(Salaire) as "Somme_Salaires" from EMP group by Num_Dept select * from V_SOMME_SALAIRES_DEPT select e.matricule,e.Nom,e.Prenom,e.Salaire,cast((e.Salaire*100)/s.Somme_Salaires as varchar) +'%' as "Pourcentage" from EMP e inner join V_SOMME_SALAIRES_DEPT s on e.Num_Dept=s.Num_Dept [Circuits à diodes] Page 12