04 sql2
04 sql2
• Exemple :
• Donner pour chaque commande antérieure au 23/12/2009 passée par des
clients de catégorie C1 le numéro de commande, sa date, le numéro du
• Les lignes célibataires sont les lignes qui n’ont aucune correspondance
client, son nom et sa ville dans l’une des tables de la jointure
• Exemple :
SELECT NCOM, NCLI , DATECOM, NOM, LOCALITE • les clients qui n’ont passé aucune commande
FROM COMMANDE, CLIENT • aucune commande n’est célibataire
WHERE COMMANDE. NCLI = CLIENT. NCLI • Il existe une méthode pour obtenir les lignes célibataires appelée la joiture
AND CAT = ’ C1 ’ externe (OUTER JOIN)
AND DATECOM < ’ 23 12 2009 ’
Les opérateurs ensemblistes Les opérateurs ensemblistes
• Un ensemble est une collection d’éléments distincts • L’opérateur UNION produit une collection de lignes distinctes à partir d’un
• Un ensemble de lignes ne peut donc contenir 2 lignes dont les attributs,
ensemble de 2 collections de lignes
considérés 2 à 2, ont la même valeur
• Une collection de lignes dont les éléments ne sont pas distincts constitue • Si une même ligne apparaı̂t dans chacune des 2 collections de lignes en
un multi-ensemble argument de l’opérateur UNION, cette ligne n’apparaı̂tra qu’une seule fois
• Une requête dont la liste d’éléments de la clause SELECT n’inclut pas tous dans l’ensemble résultat
les éléments d’un identifiant renvoie un multi-ensemble
• Remarque : Les arguments de l’opérateur UNION peuvent être des
• Un multi-ensemble peut se réduire si nécessaire à un ensemble par le
modifieur DISTINCT muli-ensembles, auquels cas les doublons sont égalements éliminés
S1 EXCEPT S2 ;
Requête sur des structures de données cycliques Requête sur des structures de données cycliques
p7
Requête sur des structures de données cycliques Requête sur des structures de données cycliques
Requête sur des structures de données cycliques Requête sur des structures de données cycliques
PRODUIT COMPOSITION • Donner les informations relatives aux produits p4 ainsi que sa composition
NPRO LIBELLE PRIX U POIDS U COMPOSE COMPOSANT QTE
p1 A-200 – – p1 p2 2 SELECT [Link], H. LIBELLE , [Link], B. LIBELLE
p2 A-056 – – p1 p3 1
p3 B-661 – – p1 p4 2
FROM PRODUIT H, COMPOSITION C, PRODUIT B
p4 B-122 – – p2 p7 8 WHERE [Link] = [Link]
p5 B-326 – – p2 p8 2 AND [Link] = [Link]
p6 D-822 3.50 0.70 p3 p8 5
p7 D-507 8.00 0.25 p4 p8 4 AND [Link] = ’ p4 ’ ;
p8 G-993 5.00 1.15 p4 p9 5
p9 F-016 – – p4 p10 5 • H et B désigne respectivement le produit composé (haut) et le produit
p10 J-500 – – p5 p4 2 composant (bas)
p11 J-544 0.50 0.90 p5 p6 7
p12 L-009 1.70 2.30 p9 p11 2
p10 p11 4
p10 p12 3
Compléments sur les jointures Compléments sur les jointures
SELECT *
FROM COMMANDE
SELECT NCOM, DATECOM WHERE NCOM IN (SELECT NCOM
FROM COMMANDE FROM DETAIL
WHERE NCLI IN (SELECT NCLI WHERE NPRO = ’ PA60 ’
FROM CLIENT AND QCOM < (SELECT QCOM
WHERE LOCALITE = ’ P o i t i e r s ’ ) ; FROM DETAIL
WHERE NPRO = ’ PA60 ’
peut s’écrire également sous la forme d’une jointure : AND NCOM = ’ 30182 ’ ;
SELECT NCOM, DATECOM
peut s’écrire également sous la forme d’une jointure :
FROM COMMANDE, CLIENT
WHERE COMMANDE. NCLI = CLIENT. NCLI SELECT [Link], DATENCOM, NCLI
AND LOCALITE = ’ P o i t i e r s ’ ; FROM COMMANDE M, DETAIL D1, DETAIL D2
WHERE [Link] = [Link] AND [Link] = ’ 30182 ’
AND [Link] = ’ PA60 ’ AND [Link] < [Link] ;
Compléments sur les jointures Compléments sur les jointures
• Une jointure permet également d’e↵ectuer des calculs sur des quantités
extraites de plusieurs tables
• Le raisonnement est simple : la jointure constitue des lignes fictives dont la
clause SELECT extrait des valeurs comme elle le ferait d’une ligne réelle
issue d’une table
• Par exemple, la requête suivant associe à chaque ligne de DETAIL le
• Les jointures étudiées jusqu’ici étaient fondées sur l’égalité des valeurs
montant à payer :
d’une clé étrangère avec celles d’un identifiant
SELECT NCOM, [Link], QCOM*PRIX • Toutefois, la forme même de la condition de jointure suggère que toute
FROM DETAIL D, PRODUIT P compararison peut servir à indiquer comment associer les lignes des tables
WHERE [Link] = [Link] ; concernées
SELECT *
FROM TA, TB
• Qu’en est il pour cette requête ? WHERE TA. IA = [Link] ;
SELECT [Link], DATECOM, NCLI est constitué des colonnes de l’identifiant primaire de TB (soit IB)
FROM COMMANDE, DETAIL • Si l’identifiant primaire de TB n’est pas répris dans la clause SELECT, le
WHERE [Link] = [Link] ; résultat n’a pas d’identifiant :
• Réponse : les lignes sont celles de la table DETAIL SELECT LOCALITE, LIBELLE
FROM CLIENT CLI , COMMANDE COM, DETAIL D, PRODUIT P
WHERE CLI . NCLI = COM. NCLI
AND [Link] [Link]
AND [Link] = [Link] ;
Extraction de données groupées Extraction de données groupées
CLIENT
• Les requêtes examinées jusqu’à maintenant produisent des lignes qui sont NCLI NOM LOCALITE COMPTE
généralement une correspondance une pour une avec les lignes d’une table F400 JACOB Bruxelle 0
• Par exemple, la requête suivante donne, pour chaque groupe de clients • Des conditions de sélection peuvent être imposées aux groupes à
classés ou regroupés par localité, le nom de celle-ci, le nombre de clients sélectionner
dans le groupe et la valeur moyenne des comptes des clients du groupe
• Elles sont exprimées dans une clause HAVING pour éviter toute confusion
SELECT LOCALITE, avec la clause WHERE
COUNT(*) AS NOMBRE CLIENT, • Par exemple, la requête suivante donne le montant moyen des comptes des
AVG(COMPTE) AS MOYENNE COMPTE clients des villes en comptant au moins 3 :
FROM CLIENT
GROUP BY LOCALITE ; SELECT LOCALITE, COUNT(*) , AVG(COMPTE)
FROM CLIENT
• Le résultat est le suivant : GROUP BY LOCALITE
LOCALITE NOMBRE CLIENTS MOYENNE COMPTE HAVING count (*) >= 3 ;
Bruxelles 1 0.00
Genève 1 0.00
• Le résultat est le suivant :
Lille 1 720.00
Namur 4 -2520.00 LOCALITE COUNT(*) AVG(COMTE)
Paris 1 0.00 Poitiers 3 533.33
Poitiers 3 533.33 Namur 4 -2520.00
Toulouse 5 -2530.00 Toulouse 5 -2530.00
Extraction de données groupées Extraction de données groupées
• Un regroupement très intéressant serait de regrouper les clients selon leurs • L’extraction de données groupées est à définir avec précaution avec des
valeurs de COMPTE par intervalle de 1.000 jointures
SELECT ’ de ’ , i n t (COMPTE/1000)*1000 AS MIN, • Exemple : Donner pour chaque localité, la somme des comptes des clients
’ a ’ , i n t (COMPTE/1000)*1000 + 999 AS MAX, et le nombre de commandes. On serait tenté d’écrire :
COUNT(*) AS N SELECT LOCALITE, SUM(COMPTE) , COUNT(*)
FROM CLIENT C FROM CLIENT C, COMMANDE M
GROUP BY i n t (COMPTE/1000) ; WHERE C. NCLI = M. NCLI
GROUP BY LOCALITE ;
• Le résultat est le suivant :
de Min a Max N LOCALITE SUM(COMPTE) COUNT(*)
de -9000 a -8001 1 Lille 720.00 1
de -5000 a -4001 1 • Ce qui donnerait : Namur -4580.00 1
de -4000 a -3001 1 Poitiers 1050.00 3
de -3000 a -2001 2 Toulouse -8700.00 2
de -2000 a -1001 1
de 0 a 999 9 • Ce résultat, en apparence correct, est pourtant erroné (indépendemment
de 1000 a 1999 1 du fait que les clients sans commande ne sont pas repris)
• Donner la liste ordonnée par localité des clients (numéro, nom et localité)
de catégorie C1 et C2
Les clients vont apparaı̂tre classés par localité, puis dans chaque localité
classés par catégorie. Attention l’ordre à une importance.
Ordre des lignes d’un résultat Ordre des lignes d’un résultat
• Si une expression apparaı̂t dans le SELECT, elle sera spécifiée par son nom
• Il est possible de modifier l’ordre utilisé pour le tri
• La clause ASC pour le tri ascendant • S’il s’agit d’une colonne avec un alias, elle sera spécifié par celui-ci
• La clause DESC pour le trie descendant • Exemple : Donner les localités par valeurs décroissantes de leur population
• Par défaut, le tri est ascendant de clients
• Par exemple : SELECT LOCALITE,
SELECT * COUNT(*) AS POPULATION,
FROM PRODUIT SUM(COMPTE)
WHERE LIBELLE LIKE ’%SAPIN% ’ FROM CLIENT
ORDER BY QSTOCK DESC ; GROUP BY LOCALITE
ORDER BY POPULATION DESC ;
Ordre des lignes d’un résultat Interprétation d’une requête
• Il est possible d’utiliser des critères qui ne sont pas dans la clause SELECT • Pour une requête monotable :
1. On considère la table spécifiée dans la clause FROM
• Exemple : 2. On sélectionne les lignes sur la base de la clause WHERE
SELECT NCOM, NPRO, QCOM 3. On classe ces lignes en groupes comme spécifié dans la clause GROUP BY
4. On ne retient que les lignes qui vérifient la clause HAVING
FROM DETAIL D, PRODUIT P 5. Les lignes des groupes sont ordonnées selon la clause ORDER BY
WHERE [Link] = [Link] éventuellement
ORDER BY NCOM, QCOM*PRIX DESC ; 6. De chacune des lignes, on extrait les valeurs demandées dans la clause
SELECT
• Exprimer les requêtes suivantes en SQL : 2. Calculer le montant commandé des produits en sapin
1. Calculer le montant de chaque détail de commande du client ’C400’ SELECT SUM(QCOM*PRIX) AS MONTANT
2. Calculer le montant commandé des produits en sapin FROM DETAIL D, PRODUIT P
3. Afficher le total et la moyenne des comptes clients, ainsi que le nombre de WHERE [Link] = [Link] AND P. LIBELLE LIKE ’%SAPIN% ’ ;
clients, selon chacune des classifications suivantes : (1) par catégorie, (2)
3. Afficher le total et la moyenne des comptes clients, ainsi que le nombre de clients, selon
par localité, (3) par catégorie dans chaque localité
chacune des classifications suivantes : (1) par catégorie, (2) par localité, (3) par catégorie
dans chaque localité
Exercice 2 Exercice 2
2. Calculer le montant dû par chaque client. Dans le calcul, on ne prendra en compte que le
• Exprimer les requêtes suivantes en SQL : montant des commandes.
1. Combien y a-t-il de commandes spécifiant un (ou plusieurs) produit(s) en
SELECT NCLI , SUM(QCOM*PRIX) FROM COMMANDE M, DETAIL D, PRODUIT P
acier ? WHERE [Link] = [Link] AND [Link] = [Link] GROUP BY NCLI
2. Calculer le montant dû par chaque client. Dans le calcul, on ne prendra en UNION
compte que le montant des commandes SELECT NCLI , 0 FROM CLIENT C
3. Afficher pour chaque localité, les libellés des produits qui y sont commandés WHERE NOT EXISTS (SELECT * FROM COMMANDE WHERE NCLI = C. NCLI ) ;
3. Afficher pour chaque localité, les libellés des produits qui y sont commandés