Vous êtes sur la page 1sur 11

Fonction d’agrégation - clause group by

La fonction d’agrégation agrège des « morceaux de colonnes », on


utilise la clause group by pour définir ces morceaux.

R4 ’ La somme des quantités commandées pour chaque pièce

SELECT nop, SUM(quantité)


From Ordre
Group by nop;

Autrement dit : on groupe les commandes par pièce et on fait la somme par paquet

Nop Nos Quantité Nop Nos Quantité


112 S1 120 112 S1 120
Nop Nos Quantité
255 S3 150
GROUP 112 S2 70
SUM 112 S1 202
112 S2 70 112 S4 12
255 S3 950
314 S1 95 255 S3 150
314 S1 1145
314 S8 1050 255 S7 800
112 S4 12 314 S1 95
255 S7 800 314 S8 1050

Obligation : le critère de découpage en morceaux doit être dans la clause SELECT


20
Jointure interne

R5 La liste des pièces commandées par le service 'S1' avec libellé et poids

SELECT nos, Ordre.nop, désignation, poids


FROM Ordre, Pièce
WHERE Ordre.nop = Pièce.nop AND nos ='S1'
ORDER BY Ordre.nop;

De manière logique, on récupère le « bon» couple, {Orde, Piece}


PIECE ORDRE
=
Nop Nop
Designation Nos
Couleur Quantité
Poids

Le Nop de PIECE doit être égal au Nop d’ORDRE


pour faire le lien entre PIECE et ORDRE
21
En machine, c’est d’abord un produit cartésien…

PIECE ORDRE
Nop Désignation Couleur Poids Nop (Ordre) Nos(Ordre) Quantité

112 Carter Noir 5 112 S1 120

255 Pignon Gris 0,75 255 S3 150

314 Cardan Noir 0,25 112 S2 70

314 S1 95

PRODUIT CARTESIEN

Nop Désignation Couleur Poids Nop (Ordre) Nos(Ordre) Quantité


112 Carter Noir 5 112 S1 120
255 Pignon Gris 0,75 112 S1 120
314 Cardan Noir 0,25 112 S1 120
112 Carter Noir 5 255 S3 150
255 Pignon Gris 0,75 255 S3 150
314 Cardan Noir 0,25 255 S3 150
112 Carter Noir 5 112 S2 70
255 Pignon Gris 0,75 112 S2 70
314 Cardan Noir 0,25 112 S2 70
112 Carter Noir 5 314 S1 95
255 Pignon Gris 0,75 314 S1 95
314 Cardan Noir 0,25 314 S1 22 95
… puis on conserve les lignes satisfaisant le WHERE …

Nop Désignation Couleur Poids Nop (Ordre) Nos(Ordre) Quantité

OK 112 Carter Noir 5 112 S1 120

255 Pignon Gris 0,75 112 S1 120

314 Cardan Noir 0,25 112 S1 120

112 Carter Noir 5 255 S3 150

255 Pignon Gris 0,75 255 S3 150

314 Cardan Noir 0,25 255 S3 150

112 Carter Noir 5 112 S2 70

255 Pignon Gris 0,75 112 S2 70

314 Cardan Noir 0,25 112 S2 70

112 Carter Noir 5 314 S1 95

255 Pignon Gris 0,75 314 S1 95

OK 314 Cardan Noir 0,25 314 S1 95

23
… on conserve les colonnes satisfaisant le SELECT…

Nop Désignation Couleur Poids Nop (Ordre) Nos(Ordre) Quantité


112 Carter Noir 5 112 S1 120
314 Cardan Noir 0,25 314 S1 95

24
… et finalement on met les colonnes dans l’ordre du SELECT

SELECT nos, Ordre.nop, désignation, poids


FROM Ordre, Pièce
WHERE Ordre.nop = Pièce.nop AND nos ='S1'
ORDER BY Ordre.nop;

Nos(Ordre) Nop Désignation Poids

S1 112 Carter 5

S1 314 Cardan 0,25

Remarque : En pratique, si dans le résultat vous avez beaucoup trop de lignes


(et qui en plus ne ressemblant à rien) c’est sans doute parce que vous avez
oubliez des clauses dans le WHERE !

25
Jointure interne allègement de l’écriture

Pour alléger l'écriture, on va utiliser un synonyme local à la requête;


donc pour la même :

SELECT nos, Ordre.nop, désignation, poids


FROM Ordre, Pièce
WHERE Ordre.nop = Pièce.nop AND nos ='S1'
ORDER BY Ordre.nop;

Devient

SELECT nos, R.nop,désignation, poids


FROM Ordre R, Pièce P //Ordre sera appelé R et Pièce P
WHERE R.nop = P.nop and nos ='S1'
ORDER BY R.nop;

26
Auto -jointure

Ce mécanisme de synonymie va permettre des jointures sur une même table


-> auto-jointure

R6 Les numéros de service qui ont commandé P1 et P2 en même quantité.

SELECT A1.nos
FROM Ordre A1, Ordre A2
WHERE A1.nop='P1' AND A2.nop ='P3' AND A1.nos = A2.nos
AND A1.quantité = A2.quantité;

Opérations ensemblistes

R7 Les numéros des pièces qui ont un poids inférieur à 50 ou qui ont été
commandées par le service S2

SELECT nop FROM Pièce WHERE poids < 50


UNION
SELECT nop FROM Ordre WHERE nos ='S2';

27
Prédicat IS NULL (ou IS NOT NULL)

R8 Les numéros des services qui n'ont pas valué leur commande

SELECT nos FROM Ordre


WHERE quantité IS NULL;

Prédicat IS LIKE (IS NOT LIKE)

Si une forme particulière est présente dans une chaîne de caractères


(% = joker)
R9 Le numéro des pièces dont la désignation se termine par 'ON'

SELECT nos FROM Pièce


WHERE désignation IS LIKE'%ON';

Prédicat IN (NOT IN)

Détermine si une valeur appartient (ou pas) à une liste du même type
R10 Désignation des pièces de couleur rouge ou noire

SELECT désignation FROM Pièce


WHERE couleur IN ('rouge','noire');
28
SELECT imbriqué

C'est là que le langage exprime sa puissance. Le résultat d'un SELECT


est une table (ou une valeur), on va donc pouvoir refaire un SELECT sur ce retour
d'information.

R11 Les numéros des services qui ont commandé P3 avec une quantité inférieure
à la quantité moyenne commandée pour cette pièce

SELECT nop, nos, quantité FROM Ordre


WHERE nop ='P3' AND quantité <
(SELECT AVG(quantité) FROM Ordre
WHERE nop ='P3');

Corrélation d'appel entre deux SELECT

R12 Les caractéristiques de chaque pièce ayant un poids inférieur à la moyenne


des poids des pièces de leur couleur

SELECT * FROM Pièce P


WHERE poids <
(SELECT AVG (poids) FROM Pièce
Couleur de celle-ci Couleur de celle-là
WHERE couleur = P.couleur)
ORDER BY nop;
On remarquera le passage de la table P (Pièce) dans le deuxième 29
SELECT.
Emploi du IN

R13 Le numéro et la désignation des pièces commandées par 'S1'

SELECT nop, désignation FROM Pièce


WHERE nop IN
(SELECT nop FROM Ordre
WHERE nos = 'S1')
ORDER BY nop;

R14 Le numéro et la désignation des pièces commandées par un service de


diffusion

SELECT nop, désignation FROM Pièce


WHERE NOP IN
(SELECT nop FROM Ordre
WHERE nos IN
(SELECT NOS FROM Service
WHERE intitulé IS LIKE'diffusion%'))
ORDER BY nop;

30