Exercices d optimisation de requêtes SQL Question 1 Il est toujours mieux de sélectionner les attributs spécifiques que l on veut au niveau de la requête SQL. Vous voulez alors afficher seulement le nom et prénom des étudiants SELECT * FROM TableEtudiant; Question 2 La clause «Having» devrait être utilisée seulement pour filtrer les enregistrements après que ceux-ci aient été sélectionnés. La requête suivante est fonctionnelle mais n est pas optimale. Donner alors une requête équivalente. SELECT TitreCours, count(titrecours) FROM TableEtudiant GROUP BY TitreCours HAVING TitreCours!= 'DevAppWebII' AND TitreCours!= 'DevAppBaseDonnées'; Question 3 Il est toujours mieux d éviter le plus possible ou de diminuer le niveau d imbrication. Optimisez alors la requête suivante : SELECT Nom FROM TableEmployee WHERE Salaire = (SELECT MAX(Salaire) FROM TableDetails) AND Age = (SELECT MAX(Age) FROM TableDetails) AND Departement = 'GenieInformatique'; Question 4 Il faut toujours utiliser les opérateurs EXISTS, IN et les jointures de façon appropriée au niveau d une requête SQL.
a) Habituellement, IN a une performance plus lente b) IN est adéquat quand le critère de filtrage est au niveau de la sous-requête c) EXISTS est adéquat quand la plupart du critère de filtrage est au niveau de la requête principale. Optimiser alors la requite suivante: Select * from Produit where NumeroProduit IN (Select NumeroProduit from Commande) Question 5 Utiliser la clause between autant que possible Select NumeroProduit From TableProduit Where Prix > = 10 and Prix <= 20 Question 6 Les opérations ensemblistes combinées avec les index sont plus performantes que les opérations booléennes. Optimiser alors la requête SQL suivante : Select * from TableEtudiant where attr1 = valeur1 or attr2 = valeur2 Optimiser alors cette requite SQL et dîtes à quel attribut vous pouvez mettre les indexs. Question 7 Lorsque vous tentez d utiliser une fonction sur un attribut indexé au niveau de la clause where en transact-sql, l utilité d avoir un index n a alors plus lieu. Optimiser par exemple la requête : SELECT courriel FROM TablePersonne WHERE left(courriel,2) = 'As' Ici, courriel est indexé mais n a aucune influence puisqu il est encapsulé au niveau de la function left en transact-sql
Question 8 Il ne faudrait pas utiliser d attribut spécifique lorsque l on utilise une clause EXISTS au niveau d une sous-requête imbriquée. Optimiser alors la requête SQL suivante : From tableetudiant Where not exists (select NumeroEtudiant from TableInscription where cours.titre = prog ) Question 9 Lorsque l on peut, il est toujours mieux de remplacer les opérations ensemblistes telles que UNION, EXCEPT et INTERSECT en jointure. Optimiser donc les requêtes SQL suivantes : a) b) From TableEtudiant EXCEPT from TableInscription From TableEtudiant INTERSECT From TableInscription
Solution Question 1 SELECT Prenom, Nom FROM TableEtudiant; Question 2 SELECT TitreCours, count(titrecours) FROM TableEtudiant WHERE TitreCours!= ' DevAppWebII ' AND TitreCours!= ' DevAppBaseDonnées ' GROUP BY TitreCours; Question 3 SELECT Nom FROM TableEmployee WHERE (Salaire, Age ) = (SELECT MAX (Salaire), MAX (Age) FROM TableDetails) AND Departement = 'GenieInformatique'; Question 4 Select * from Produit P where EXISTS (select * from Commande c where c.numeroproduit = p.numeroproduit) Question 5 SELECT NumeroProduit FROM TableProduit WHERE Prix BETWEEN 10 and 20 Question 6
Select * from TableEtudiant where attr1 = valeur1 Union Select * from TableEtudiant where attr2 = valeur2 Les index peuvent être attr1 et attr2 Question 7 SELECT courriel FROM TablePersonne WHERE courriel like 'As%' Question 8 From tableetudiant Where not exists (select * from TableInscription where cours.titre = prog ) Question 9 a) From TableEtudiant E Left outer join TableInscription I ON E.NumeroEtudiant = I.NumeroEtudiant where I.NumeroEtudiant is NULL b) From TableEtudiant E inner join TableInscription I ON E.NumeroEtudiant = I.NumeroEtudiant where