13
SQL: Requêtes, Programmation et Triggers Chapitre 5, Sections 5.5—5.9

SQL: Requêtes, Programmation et Triggers

  • Upload
    unity

  • View
    25

  • Download
    6

Embed Size (px)

DESCRIPTION

SQL: Requêtes, Programmation et Triggers. Chapitre 5, Sections 5.5—5.9. COUNT (*) COUNT ( [ DISTINCT ] A) SUM ( [ DISTINCT ] A) AVG ( [ DISTINCT ] A) MAX (A) MIN (A). Opérateurs d’Agrégat. Ces opérateurs sont une extension très significative de l’algèbre relationnelle. - PowerPoint PPT Presentation

Citation preview

Page 1: SQL:  Requêtes, Programmation et Triggers

1

SQL: Requêtes, Programmation et Triggers

Chapitre 5, Sections 5.5—5.9

Page 2: SQL:  Requêtes, Programmation et Triggers

2

Opérateurs d’Agrégat Ces opérateurs sont une

extension très significative de l’algèbre relationnelle.

COUNT (*)COUNT ( [DISTINCT] A)SUM ( [DISTINCT] A)AVG ( [DISTINCT] A)MAX (A)MIN (A)

SELECT AVG (S.age)FROM Sailors SWHERE S.rating=10

SELECT COUNT (*)FROM Sailors S

SELECT AVG ( DISTINCT S.age)FROM Sailors SWHERE S.rating=10

SELECT S.snameFROM Sailors SWHERE S.rating= (SELECT MAX(S2.rating) FROM Sailors S2)

Une seule colonne

SELECT COUNT (DISTINCT S.rating)FROM Sailors SWHERE S.sname=‘Bob’

Page 3: SQL:  Requêtes, Programmation et Triggers

3

Trouver le nom et l’age du (des) navigateur(s) le(s) plus vieux

La première requête est illégale!

La troisième requête est équivalente à la seconde et est permise dans SQL/92, mais n’est pas supportée dans certains systèmes.

SELECT S.sname, MAX (S.age)FROM Sailors S

SELECT S.sname, S.ageFROM Sailors SWHERE S.age = (SELECT MAX (S2.age) FROM Sailors S2)

SELECT S.sname, S.ageFROM Sailors SWHERE (SELECT MAX (S2.age) FROM Sailors S2) = S.age

Page 4: SQL:  Requêtes, Programmation et Triggers

4

GROUP BY et HAVING Jusqu’à maintenant, nous avons appliqué des opérateurs

d’agrégat à tous les tuples qualifiés. Parfois, nous voulons les appliquer seulement à chacun parmi plusieurs groupes de tuples. Le nombre de groupes varie en fonction d’instances.

Considérez par exemple la requête: Trouver l’âge du plus jeune navigateur de chaque

niveau. En général, nous ne savons pas à l’avance combien de

niveaux existent et ce que sont les valeurs de ces niveaux! Supposez que nous savons que les valeurs des niveaux

varient de 1 à 10; nous pouvons écrire 10 requêtes de la forme suivante:

SELECT MIN (S.age)FROM Sailors SWHERE S.rating = i

Pour i = 1, 2, ... , 10:

Page 5: SQL:  Requêtes, Programmation et Triggers

5

GROUP BY et HAVING (Suite)

target-list contient (i) une liste d’attributs et (ii) les termes avec opérations d’agrégat (p.ex., MIN (S.age)). La liste d’attributs (i) doit être un sous-ensemble de la liste

grouping-list. Intuitivement, chaque tuple de la réponse correspond à un groupe, et un groupe est un ensemble de tuples qui ont la même valeur pour tous les attributs dans grouping-list.

Si un attribut de target-list n’est pas dans grouping-list, plusieurs lignes d’un même groupe peuvent avoir différentes valeurs pour de tels attributs et il sera difficile de choisir les quelles parmi ces valeurs pour inclusion dans la réponse de la requête.

SELECT [DISTINCT] target-listFROM relation-listWHERE qualificationGROUP BY grouping-listHAVING group-qualification

Page 6: SQL:  Requêtes, Programmation et Triggers

6

GROUP BY et HAVING (Suite)

group-qualification contient une liste d’attributs. La liste group-qualification doit contenir un attribut

apparaissant comme argument d’un opérateur d’agrégat dans target-list. Cela garantit que les expressions qui apparaissent dans group-qualification auront une même valeur par groupe.

SQL/99 contient 2 nouvelles fonctions: EVERY et ANY applicables à chaque tuple dans un groupe. (Leur sémantique est claire.)

SELECT [DISTINCT] target-listFROM relation-listWHERE qualificationGROUP BY grouping-listHAVING group-qualification

Page 7: SQL:  Requêtes, Programmation et Triggers

7

Trouver l’age du plus jeune navigateur en age de voter (i.e. âgé d’au moins 18 ans) pour chaque niveau ayant au moins 2 tels navigateurs

Seul S.rating et S.age sont mentionnés dans les clauses SELECT, GROUP BY ou HAVING; d’autres attributs sont `nonnécessaires’.

La 2ème colonne du résultat reste sans nom par défaut. (Utiliser AS pour la nommer.)

SELECT S.rating, MIN (S.age) AS mageFROM Sailors SWHERE S.age >= 18GROUP BY S.ratingHAVING COUNT (*) > 1

sid sname rating age22 dustin 7 45.031 lubber 8 55.571 zorba 10 16.064 horatio 7 35.029 brutus 1 33.058 rusty 10 35.0

rating age1 33.07 45.07 35.08 55.510 35.0

rating mage 7 35.0

Réponse

Page 8: SQL:  Requêtes, Programmation et Triggers

8

Évaluation Conceptuelle Le produit Cartésien de relation-list est calculé, les tuples qui

ne passent pas la qualification sont éliminés, les attributs `nonnecessaires’ (i.e. non mentionnés dans SELECT, GROUP BY ou HAVING) sont effacés et le reste des tuples est reparti en groupes selon la valeur des attributs dans grouping-list.

group-qualification est enfin appliqué pour éliminer quelques groupes. Les expressions dans group-qualification doivent avoir une seule valeur par groupe!

En effet, un attribut de group-qualification qui n’est pas un argument d’un opérateur d’agrégat apparaît aussi dans grouping-list. (La sémantique des clés primaires est ignorée ici!)

Un tuple réponse est généré par groupe qualifié.

Page 9: SQL:  Requêtes, Programmation et Triggers

9

Trouver le nombre de réservations faites pour chaque bateau rouge

Grouping utilisant le join de 3 relations. Qu’obtenons nous si nous enlevons

‘B.color=‘red’ de la clause WHERE et ajoutons une clause HAVING avec cette condition?

SELECT B.bid, COUNT (*) AS scountFROM Sailors S, Boats B, Reserves RWHERE S.sid=R.sid AND R.bid=B.bid AND B.color=‘red’GROUP BY B.bid

Page 10: SQL:  Requêtes, Programmation et Triggers

10

Trouver l’age du plus jeune navigateur âgé de plus de 18 ans pour chaque niveau avec au moins deux navigateurs

Ceci montre que la clause HAVING peut aussi contenir une sousrequête.

Et si nous remplaçons la clause HAVING par: HAVING COUNT(*) >1

SELECT S.rating, MIN (S.age)FROM Sailors SWHERE S.age > 18GROUP BY S.ratingHAVING 1 < (SELECT COUNT (*) FROM Sailors S2 WHERE S.rating=S2.rating)

Page 11: SQL:  Requêtes, Programmation et Triggers

11

Trouver les niveaux pour lesquels l’age moyen est le minimum de tous les niveaux On ne peut pas imbriquer des opérations d’agrégats! La requête suivante est incorrecte:

SELECT S.ratingFROM Sailors SWHERE S.age = (SELECT MIN (AVG (S2.age)) FROM Sailors S2)

SELECT Temp.rating, Temp.avgageFROM (SELECT S.rating, AVG (S.age) AS avgage FROM Sailors S GROUP BY S.rating) AS TempWHERE Temp.avgage = (SELECT MIN (Temp.avgage) FROM Temp)

Solution correcte (en SQL/92):

Page 12: SQL:  Requêtes, Programmation et Triggers

12

Valeurs Nulles Les valeurs des attributs dans un tuple sont parfois

inconnues (p.ex., un niveau non assigné) ou inapplicables (p.ex., aucun nom d’épouse). SQL a une valeur spéciale null pour de telles situations.

La présence de null complique bien de choses! P.ex.: Besoin d’operateurs speciaux pour contrôler si une valeur est ou

n’est pas nulle. L’affirmation rating>8 est-elle vraie ou fausse lorsque rating est

null? Et la signification de AND, OR et NOT? Besoin d’une logique à 3 valeurs (vrai, faux et inconnu). La signification des clauses doit être définie soigneusement.

(p.ex., WHERE élimine des lignes n’évaluant pas à vrai.) Nouveaux opérateurs (p.ex. «outer joins») possibles.

Page 13: SQL:  Requêtes, Programmation et Triggers

13

Résumé SQL fut un facteur qui a joué un rôle important dans

l’acceptation rapide du modèle relationnel; car il est plus naturel que les premiers langages de requêtes procéduraux.

SQL jouit de la complétude relationnelle; en fait il est même plus expressif que l’algèbre relationnel.

même les requêtes exprimables en algèbre relationnelle peuvent être exprimées de manière plus naturelle en SQL.

Beaucoup de voies alternatives d’écrire une requête existent; un optimisateur devrait chercher le plan d’évaluation le plus performant. En pratique, les utilisateurs ont besoin d’être conscients de la

manière dont les requêtes sont optimisées et évaluées pour de meilleurs résultats.

NULL est utilisé pour les valeurs d’attributs inconnues et comportent beaucoup de complications.