35
Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 1 4 – Introduction au langage SQL (2) : requêtes Bernard ESPINASSE Professeur à Aix-Marseille Université (AMU) Ecole Polytechnique Universitaire de Marseille (PEIP1) Novembre 2013 • Requêtes mono-tables • Requêtes multi-tables • Imbrication de requêtes : simples, ANY, ALL, EXIST, … • Fonctions de calcul : COUNT, AVG, SUM, MAX, MIN, …

4 – Introduction au langage SQL (2) : requêteserwan.tranvouez.free.fr/cours/peip/PeiP1_InfoBD_S4.pdf · Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage

  • Upload
    domien

  • View
    224

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 4 – Introduction au langage SQL (2) : requêteserwan.tranvouez.free.fr/cours/peip/PeiP1_InfoBD_S4.pdf · Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage

Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 1

4 – Introduction au langage SQL (2) : requêtes

Bernard ESPINASSE Professeur à Aix-Marseille Université (AMU)

Ecole Polytechnique Universitaire de Marseille

(PEIP1) Novembre 2013

• Requêtes mono-tables

• Requêtes multi-tables

• Imbrication de requêtes : simples, ANY, ALL, EXIST, …

• Fonctions de calcul : COUNT, AVG, SUM, MAX, MIN, …

Page 2: 4 – Introduction au langage SQL (2) : requêteserwan.tranvouez.free.fr/cours/peip/PeiP1_InfoBD_S4.pdf · Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage

Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 2

1- Introduction

2- Requêtes mono-tables

3- Requêtes multi-tables

4- Imbrication de requêtes : simples, ANY, ALL, EXIST, …

5- Fonctions de calcul : COUNT, AVG, SUM, MAX, MIN, …

Page 3: 4 – Introduction au langage SQL (2) : requêteserwan.tranvouez.free.fr/cours/peip/PeiP1_InfoBD_S4.pdf · Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage

Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 3

1 – Introduction

Page 4: 4 – Introduction au langage SQL (2) : requêteserwan.tranvouez.free.fr/cours/peip/PeiP1_InfoBD_S4.pdf · Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage

Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 4

• Origine : SQL (Structured Query Language) est un langage de requêtes standard pour les SGBD relationnels

• 3 niveaux de normes : • SQL86 (standard ANSI en 86 puis ISO en 87) : la base puis SQL89 ou SQL1 :

l’intégrité: • SQL91 ou SQL2 : on se situe ici dans le cadre de ce cours • SQL3 (98) : SQL devient un langage de programmation et évolue vers l’objet

• Dans la séance 3, nous avons vu :

- la commande CREATE TABLE permettant de créer les tables de la base de données en langage SQL,

- les commandes INSERT permettant d’insérer et DELETE de supprimer des tuples (enregistrements) dans une base de données créée.

• Dans cette séance 4, nous verrons d’autres commandes du langage SQL (SELECT, UPDATE) permettant d’exploiter la base de données remplie d’enregistrements en consultation et en mise à jour.

Page 5: 4 – Introduction au langage SQL (2) : requêteserwan.tranvouez.free.fr/cours/peip/PeiP1_InfoBD_S4.pdf · Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage

Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 5

Structure de base d'une expression SQL « SELECT » comporte 3 clauses :

SELECT <liste des attributs à garder> : projection de l'algèbre relationnelle désigne la liste des attributs désirés

FROM <liste des tables arguments> : liste des tables à

considérer WHERE <conditions sur un ou plusieurs attributs> : prédicat à

vérifier sur des attributs de tables de la clause FROM

Page 6: 4 – Introduction au langage SQL (2) : requêteserwan.tranvouez.free.fr/cours/peip/PeiP1_InfoBD_S4.pdf · Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage

Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 6

• COMMANDES (CNUM, CNOM, PNOM, QUANTITE) : PNOM = clé étrangère vers PRODUIT

CNUM : N° commande ;CNOM : nom client ; PNUM : N° produit ; QUANTITE : quantité commandée ;

• PRODUIT (PNOM, PRIXV) PNUM : N° produit ; PNOM : nom produit ; PRIXV : prix vente produit

• FOURNISSEUR (FNOM, FNOM, STATUT, VILLE) FNOM : nom fournisseur ; STATUT : statut fournisseur ; VILLE : ville fournisseur,

• FOURNITURE (PNOM, FNOM, PRIXA) : PNOM et FNOM = clés étrangères vers PRODUIT et FOURNISSEUR

PNUM : N° produit ; FNUM : N° fournisseur; PRIXA: prix d’achat;

• DEPT(DEPNO, DNOM, LOC) DEPTNO : N° département ; DNOM : nom département ; LOC: localisation

• EMPLOYE(EMPNO, ENOM, DEPTNO, SAL) : DEPNO = clé étrangère vers DEPT EMPNO : N° employé ; ENOM : nom employé ; DEPTNO : N° département ; SAL : Salaire ;

Page 7: 4 – Introduction au langage SQL (2) : requêteserwan.tranvouez.free.fr/cours/peip/PeiP1_InfoBD_S4.pdf · Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage

Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 7

2 – Requêtes monotables

• Sélection • Sélection avec condition : =, <, >, <>,… • Sélection avec condition : BETWEEN, LIKE • Sélection avec condition : IS NULL, IS NOT NULL, IN, NOT IN

Page 8: 4 – Introduction au langage SQL (2) : requêteserwan.tranvouez.free.fr/cours/peip/PeiP1_InfoBD_S4.pdf · Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage

Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 8

Soit le schéma de table COMMANDES(NUM,CNOM,PNOM,QUANTITE) § Requête: Informations sur toutes les commandes (Num, Cnom, Pnom, Quantité) SQL:

SELECT NUM,CNOM,PNOM,QUANTITE FROM COMMANDES

ou SELECT * FROM COMMANDES

§ Requête: Produits commandés SELECT PNOM FROM COMMANDES

Remarque : SQL n’élimine pas les doublons. Pour les éliminer on utilise DISTINCT :

SELECT DISTINCT PNOM FROM COMMANDES

Le DISTINCT peut être remplacé par la clause UNIQUE dans certains systèmes

Page 9: 4 – Introduction au langage SQL (2) : requêteserwan.tranvouez.free.fr/cours/peip/PeiP1_InfoBD_S4.pdf · Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage

Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 9

Ex1 : CLIENT nocli nom ville 121 BERTRAND PARIS 256 PAGNOL MARSEILLE 542 LANDRY QUEBEC 652 DUPOND PARIS

Sélection des clients où ville = PARIS : SELECT * FROM CLIENT WHERE ville = ‘Paris’ ;

CLIENT-1 nocli nom ville 121 BERTRAND PARIS 652 DUPOND PARIS

Ex2 : LIGNE_DE_COMMANDE nocommande noarticle date quantité 10 121 A 5/5 10 10 253 Z 5/5 1 10 712 H 5/5 3 12 253 Z 5/5 5 13 712 H 6/5 2

Sélection avec projection : lignes de commandes en date du 05/05: SELECT noarticle, date FROM LIGNE WHERE date=5/5;

LIGNE noarticle date 121 A 5/5 253 Z 5/5 712 H 5/5

Page 10: 4 – Introduction au langage SQL (2) : requêteserwan.tranvouez.free.fr/cours/peip/PeiP1_InfoBD_S4.pdf · Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage

Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 10

Conditions de sélection : =, <, >, <>,… Table COMMANDES (NUM, CNOM, PNOM, QUANTITE) § Requête: Produits commandés par Paul

SELECT PNOM FROM COMMANDES WHERE CNOM = ’PAUL’

Table FOURNITURE (PNOM, FNOM, PRIXA) § Requête: Produits de prix supérieur à 2000€

SELECT PNOM FROM FOURNITURE WHERE PRIXA > 2000

§ Requête: Produits dont le nom est celui du fournisseur SELECT PNOM FROM FOURNITURE WHERE PNOM = FNOM

Page 11: 4 – Introduction au langage SQL (2) : requêteserwan.tranvouez.free.fr/cours/peip/PeiP1_InfoBD_S4.pdf · Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage

Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 11

Conditions de sélection : BETWEEN, LIKE Table FOURNITURE (PNOM, FNOM, PRIXA)

§ Requête: Produits avec un coût entre 1000€ et 2000€ SELECT PNOM FROM FOURNITURE WHERE PRIXA BETWEEN 1000 AND 2000

Remarque: La condition y BETWEEN x AND z est équivalente à y <= z AND x <= y

Table COMMANDES (CNUM, CNOM, PNOM, QUANTITE) § Requête: Clients dont le nom commence par "C"

SELECT CNOM FROM COMMANDES WHERE CNOM LIKE ’C%’

Remarque: le littéral qui suit LIKE, pas exprimable avec l’algèbre relationnelle, doit être une chaîne de caractères éventuellement avec des caractères jokers (_, %).

Page 12: 4 – Introduction au langage SQL (2) : requêteserwan.tranvouez.free.fr/cours/peip/PeiP1_InfoBD_S4.pdf · Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage

Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 12

Conditions de sélection : IS NULL, IS NOT NULL, IN, NOT IN Table FOURNISSEUR (FNOM, STATUT, VILLE) § Requête: Fournisseurs dont l’adresse est inconnu.

SELECT FNOM FROM FOURNISSEUR WHERE VILLE IS NULL

Remarque : Le prédicat IS NULL (ou IS NOT NULL) n’est pas exprimable en algèbre relationnelle.

Table FOURNITURE (PNOM, FNOM, PRIXA) § Requête: Produits avec un coût de 100€, de 200€ ou de 300€

SELECT PNOM FROM FOURNITURE WHERE PRIXA IN {100,200,300}

Remarque : La condition x IN {a, b, …, z} est équivalente à a OR x = b OR …OR x = z.

Page 13: 4 – Introduction au langage SQL (2) : requêteserwan.tranvouez.free.fr/cours/peip/PeiP1_InfoBD_S4.pdf · Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage

Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 13

3 – Requêtes multi-tables

• Jointures • Union • Intersection • Différence

Page 14: 4 – Introduction au langage SQL (2) : requêteserwan.tranvouez.free.fr/cours/peip/PeiP1_InfoBD_S4.pdf · Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage

Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 14

Le produit cartésien de 2 tables R et S est une table T ayant pour attributs la concaténation de ceux de R et S et dont les tuples sont toutes les concaténations d'un tuple de R à un tuple de S :

Ex : VINS (num, cru, millésime, degré) ; VITICULTEURS (nom, ville, PNOM, QUANTITE) ;

VINS num cru millésime degré 110 corbière 1974 13 120 macon 1976 14

VITICULTEURS nom ville région nicolas poully bougogne

martin bordeaux bordelais

Produit cartésien VINVIT = VINS X VITICULTEURS VINVIT num cru millésime degré nom ville région

110 corbière 1974 13 nicolas poully bougogne 120 macon 1976 14 martin bordeaux bordelais 110 corbière 1974 13 martin bordeaux bordelais 120 macon 1976 14 nicolas poully bougogne

Page 15: 4 – Introduction au langage SQL (2) : requêteserwan.tranvouez.free.fr/cours/peip/PeiP1_InfoBD_S4.pdf · Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage

Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 15

La jointure de 2 tables R et S est une table T obtenue à partir du produit cartésien des 2 tables R et S dans lequel on ne garde que les tuples qui respectent une condition définie

Ex (équi-jointure) : VINS (num, cru, millésime, degré) ; VITICULTEURS (nom, ville, PNOM, QUANTITE) ;

VINS nun cru millésime degré

120 bordeaux 1975 14 200 macon 1978 12 210 macon 1977 12

VITICULTEUR nom ville région

nicolas bordeaux bordelais bernard saumur loire pierre macon bourgogne

Jointure VINVITI = VINS VITICULTEUR avec condition « cru = ville » : VINVITI n° cru millésime degré nom ville région

120 bordeaux 1975 14 nicolas bordeaux bordelais 200 macon 1978 12 pierre macon bourgogne 210 macon 1977 12 pierre macon bourgogne

Page 16: 4 – Introduction au langage SQL (2) : requêteserwan.tranvouez.free.fr/cours/peip/PeiP1_InfoBD_S4.pdf · Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage

Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 16

Soit les tables : COMMANDES (NUM, CNOM, PNOM, QUANTITE) FOURNITURE (PNOM, FNOM, PRIXA)

§ Requête: Nom, Prix d’achat, Fournisseur des Produits commandés par Paul : En SQL de base :

SELECT COMMANDES.PNOM, PRIXA, FNOM FROM COMMANDES, FOURNITURE WHERE COMMANDES.PNOM = FOURNITURE.PNOM AND CNOM = ’PAUL’

En SQL2 : SELECT COMMANDES.PNOM, PRIXA, FNOM FROM COMMANDES INNER JOINT FOURNITURE ON COMMANDES.PNOM = FOURNITURE.PNOM WHERE CNOM = ’PAUL’

Remarques : INNER est facultatif dans la plupart des SGBDR

Page 17: 4 – Introduction au langage SQL (2) : requêteserwan.tranvouez.free.fr/cours/peip/PeiP1_InfoBD_S4.pdf · Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage

Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 17

Soit les tables : VINS n° cru millés. deg.

120 bordeaux 1975 14 200 macon 1978 12 210 macon 1977 12

VITICULTEUR nom ville région

nicolas bordeaux bordelais bernard saumur loire pierre macon bourgogne

SELECT * FROM VINS INNER JOINT VITICULTEUR ON VINS.cru = VITICULTEUR.ville ;

VINVITI n° cru millés. deg. nom ville région 120 bordeaux 1975 14 nicolas bordeaux bordelais 200 macon 1978 12 pierre macon bourgogne 210 macon 1977 12 pierre macon bourgogne

Page 18: 4 – Introduction au langage SQL (2) : requêteserwan.tranvouez.free.fr/cours/peip/PeiP1_InfoBD_S4.pdf · Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage

Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 18

Tables : COMMANDES (CNUM, CNOM, PNOM, QUANTITE) FOURNITURE (PNOM, FNOM, PRIXA)

§ Requête: nom, prix d’achat, fournisseur des Produits commandés par Paul En SQL de base :

SELECT COMMANDES.PNOM, PRIXA, FNOM FROM COMMANDES, FOURNITURE WHERE CNOM = ’PAUL’ AND COMMANDES.PNOM = FOURNITURE.PNOM

On a une jointure naturelle car les attributs de jointure ont le même nom

En SQL2 : SELECT COMMANDES.PNOM, PRIXA, FNOM FROM COMMANDES NATURAL JOINT FOURNITURE WHERE CNOM = ’PAUL’

Remarque : Il est possible de restreindre ou préciser le ou les attributs de jointure avec USING PNOM

Page 19: 4 – Introduction au langage SQL (2) : requêteserwan.tranvouez.free.fr/cours/peip/PeiP1_InfoBD_S4.pdf · Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage

Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 19

Soit les tables :

CLIENT nocli nom COMMANDE nocde nocli date

121 DUVAL 10 121 5/5 253 LEROY 11 260 5/5 260 LANDRY 12 121 5/5 293 SANCHEZ 15 253 6/5

Jointure naturelle de CLIENT et COMMANDE (nocli de CLIENT = nocli de COMMANDE) :

SELECT * FROM CLIENT NATURAL JOINT COMMANDE ;

CLICDE nocli nom nocde date

121 DUVAL 10 5/5 253 LEROY 15 6/5 121 DUVAL 12 5/5 260 LANDRY 11 5/5

Page 20: 4 – Introduction au langage SQL (2) : requêteserwan.tranvouez.free.fr/cours/peip/PeiP1_InfoBD_S4.pdf · Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage

Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 20

Table EMPLOYE (EMPNO, ENOM, DEPTNO, SAL)

§ Requête: Nom et Salaire des Employés gagnant plus que l’employé de numéro 12546

En SQL de base : SELECT E1.ENOM, E1.SAL FROM EMPLOYE E1, EMPLOYE E2 WHERE E2.EMPNO = 12546 AND E1.SAL > E2.SAL

Remarques :

• E1 et E2 sont 2 instances différentes de EMPLOYE

Page 21: 4 – Introduction au langage SQL (2) : requêteserwan.tranvouez.free.fr/cours/peip/PeiP1_InfoBD_S4.pdf · Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage

Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 21

Table COMMANDES (NUM, CNOM, PNOM, QUANTITE) Table FOURNITURE (PNOM, FNOM, PRIXA) § Requête: Produits qui coûtent plus que 1000€ ou ceux qui sont commandés par

Jules SELECT PNOM FROM FOURNITURE WHERE PRIXA >= 1000 UNION SELECT PNOM FROM COMMANDES WHERE CNOM = ‘Jules’

Remarque: • l’union élimine les doublons • Pour les garder on utilise l’opération UNION ALL : le résultat contient chaque tuple a + b

fois, où a et b est le nombre d’occurrences du tuple dans le 1° et le 2° SELECT.

Page 22: 4 – Introduction au langage SQL (2) : requêteserwan.tranvouez.free.fr/cours/peip/PeiP1_InfoBD_S4.pdf · Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage

Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 22

Table EMPLOYE (EMPNO, ENOM, DEPTNO, SAL) Table DEPARTEMENT (DEPTNO, DNOM, LOC)

§ Requête: Départements sans employés ? SELECT DEPTNO FROM DEPARTEMENT EXCEPT SELECT DEPTNO FROM EMPLOYE

Remarque: • la différence ne fait pas partie du standard • la différence élimine les doublons • pour les garder on utilise l’opération EXCEPT ALL : le résultat contient chaque tuple a - b

fois, où a et b est le nombre d’occurrences du tuple dans la 1° et le 2° SELECT.

Page 23: 4 – Introduction au langage SQL (2) : requêteserwan.tranvouez.free.fr/cours/peip/PeiP1_InfoBD_S4.pdf · Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage

Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 23

Table EMPLOYE (EMPNO, ENOM, DEPTNO, SAL) Table DEPARTEMENT (DEPTNO, DNOM, LOC)

§ Requête: Départements ayant des employés gagnant plus que 20000€ et se trouvant à Paris ?

SELECT DEPTNO FROM DEPARTEMENT WHERE LOC = ’Paris’ INTERSECT SELECT DEPTNO FROM EMPLOYE WHERE SAL > 20000

Remarques : • l’intersection ne fait pas partie du standard • l’intersection élimine les doublons • pour les garder on utilise l’opération INTERSECT ALL : le résultat contient chaque n-uplet

min(a, b) fois où a et b est le nombre d’occurrences du tuple dans la 1° et le 2° SELECT

Page 24: 4 – Introduction au langage SQL (2) : requêteserwan.tranvouez.free.fr/cours/peip/PeiP1_InfoBD_S4.pdf · Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage

Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 24

4 – Imbrication de requêtes

• Cas simples, • ANY • ALL • EXISTS

Page 25: 4 – Introduction au langage SQL (2) : requêteserwan.tranvouez.free.fr/cours/peip/PeiP1_InfoBD_S4.pdf · Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage

Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 25

Table COMMANDES (NUM, CNOM, PNOM, QUANTITE) Table FOURNITURE (PNOM, FNOM, PRIXA) § Requête: Nom, prix et fournisseurs des Produits commandés par Paul ?

SELECT FOURNITURE.PNOM,PRIXA,FNOM FROM FOURNITURE,COMMANDES WHERE FOURNITURE.PNOM = COMMANDES.PNOM AND CNOM = ’PAUL’

la Jointure peut aussi s’exprimer par 2 blocs imbriqués : SELECT PNOM,PRIXA,FNOM FROM FOURNITURE WHERE PNOM IN (SELECT PNOM

FROM COMMANDES WHERE CNOM = ’PAUL’)

Page 26: 4 – Introduction au langage SQL (2) : requêteserwan.tranvouez.free.fr/cours/peip/PeiP1_InfoBD_S4.pdf · Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage

Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 26

Table EMPLOYE (EMPNO, ENOM, DEPTNO, SAL) Table DEPARTEMENT (DEPTNO, DNOM, LOC)

la Différence peut aussi s’exprimer par 2 blocs imbriqués § Requête: Départements sans employés ?

SELECT DEPTNO FROM DEPARTEMENT EXCEPT SELECT DISTINCT DEPTNO FROM EMPLOYE

Equivalent à : FROM DEPARTEMENT WHERE DETPNO NOT IN (SELECT DISTINCT DEPTNO FROM EMPLOYE)

Page 27: 4 – Introduction au langage SQL (2) : requêteserwan.tranvouez.free.fr/cours/peip/PeiP1_InfoBD_S4.pdf · Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage

Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 27

Table COMMANDES (NUM, CNOM, PNOM, QUANTITE) Table FOURNITURE (PNOM, FNOM, PRIXA) § Requête: Fournisseurs des Tuiles à un coût inférieur au coût maximum des

Ardoises ? SELECT FNOM FROM FOURNITURE WHERE PNOM = ’Tuile’ AND PRIX < ANY (SELECT PRIX

FROM FOURNITURE WHERE PNOM = ’Ardoise’)

Remarque: la condition < ANY (SELECT F FROM . . . ) est vraie ssi la comparaison >v est vraie au moins pour une valeur v du résultat du bloc (SELECT F FROM . . . ).

§ Requête: Nom, Coût et Fournisseur des Produits commandés par Paul SELECT PNOM, PRIX, FNOM FROM FOURNITURE WHERE PNOM = ANY (SELECT PNOM

FROM COMMANDE WHERE CNOM = ’PAUL’)

Remarque: les prédicats IN et = ANY sont utilisés de la même façon.

Page 28: 4 – Introduction au langage SQL (2) : requêteserwan.tranvouez.free.fr/cours/peip/PeiP1_InfoBD_S4.pdf · Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage

Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 28

Table COMMANDES (NUM, CNOM, PNOM, QUANTITE) § Requête: Client ayant commandé la plus petite quantité de Tuiles

SELECT CNOM FROM COMMANDE WHERE PNOM = ’Tuile’ AND QUANTITE <= ALL (SELECT QUANTITE

FROM COMMANDE WHERE PNOM = ’Tuile’)

Remarque: la condition <= ALL (SELECT F FROM . . . ) est vraie ssi la comparaison ≤ v est vraie pour toutes les valeurs v du résultat du bloc (SELECT F FROM . . . ).

Table EMPLOYE (EMPNO, ENOM, DEPTNO, SAL) Table DEPARTEMENT (DEPTNO, DNOM, LOC) § Requête: Départements sans employés

SELECT DEPTNO FROM DEPARTEMENT WHERE DETPNO NOT = ALL (SELECT DISTINCT DEPTNO FROM EMPLOYE)

Remarque: les prédicats NOT IN et NOT = ALL sont utilisés de la même façon.

Page 29: 4 – Introduction au langage SQL (2) : requêteserwan.tranvouez.free.fr/cours/peip/PeiP1_InfoBD_S4.pdf · Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage

Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 29

Table FOURNITURE (PNOM, FNOM, PRIXA) Table FOURNISSEUR (FNOM, STATUS, VILLE) § Requête: Fournisseurs qui fournissent au moins un produit

SELECT FNOM FROM FOURNISSEUR WHERE EXISTS (SELECT *

FROM FOURNITURE WHERE FNOM = FOURNISSEUR.FNOM)

Remarque: la condition EXISTS (SELECT * FROM . . . ) est vraie ssi le résultat du bloc (SELECT F FROM . . . ) n’est pas vide.

§ Requête: Fournisseurs qui ne fournissent aucun produit SELECT FNOM FROM FOURNISSEUR WHERE NOT EXISTS (SELECT *

FROM FOURNITURE WHERE FNOM = FOURNISSEUR.FNOM)

Remarque: la condition NOT EXISTS (SELECT * FROM . . . ) est vraie ssi le résultat du bloc (SELECT F FROM . . . ) est vide.

Page 30: 4 – Introduction au langage SQL (2) : requêteserwan.tranvouez.free.fr/cours/peip/PeiP1_InfoBD_S4.pdf · Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage

Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 30

5 – Fonctions de calculs et opérateurs d’agrégation de SQL

• Fonction de calcul : MAX, MIN, AVG, SUM

• Opérations d’Agrégation : GROUP BY, HAVING, ORDER BY

Page 31: 4 – Introduction au langage SQL (2) : requêteserwan.tranvouez.free.fr/cours/peip/PeiP1_InfoBD_S4.pdf · Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage

Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 31

La fonction COUNT(*) compte le nombre des tuples du résultat d’une requête sans élimination des tuples doubles ni vérification des valeurs nulles. Dans le cas contraire on utilise la clause COUNT(UNIQUE…) : § Requête: Nombre de Fournisseurs de Paris

SELECT COUNT(*) FROM FOURNISSEUR WHERE VILLE = ’Paris’

§ Requête: Nombre de Fournisseurs qui fournissent actuellement des produits SELECT COUNT(DISTINCT FNOM) FROM FOURNITURE

§ Requête: Quantité totale de Tuiles commandées SELECT SUM (QUANTITE) FROM COMMANDES WHERE PNOM = ’Tuile’

§ Requête: Le prix des Tuiles qui sont le plus chères. SELECT MAX (PRIXA) FROM FOURNITURE WHERE PNOM = ’Tuiles’;

Page 32: 4 – Introduction au langage SQL (2) : requêteserwan.tranvouez.free.fr/cours/peip/PeiP1_InfoBD_S4.pdf · Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage

Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 32

§ Requête: Prix d’achat moyen de Tuiles fournies SELECT AVG (PRIXA) FROM FOURNITURE WHERE PNOM = ’Tuile’ ou SELECT SUM (PRIXA)/COUNT(PRIX) FROM FOURNITURE WHERE PNOM = ’Tuile’

§ Requête: Fournisseurs des Tuiles au prix d’achat moyen des Tuiles SELECT FNOM FROM FOURNITURE WHERE PNOM = ’Tuile’ AND PRIXA < (SELECT AVG(PRIX)

FROM FOURNITURE WHERE PNOM = ’Tuile’)

Page 33: 4 – Introduction au langage SQL (2) : requêteserwan.tranvouez.free.fr/cours/peip/PeiP1_InfoBD_S4.pdf · Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage

Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 33

La clause GROUP BY permet de préciser les attributs de partitionnement des tables déclarées dans la clause FROM, par exemple un regroupement des fournisseurs par ville : § Requête: Nombre de fournisseurs par ville

SELECT VILLE, COUNT(FNOM) FROM FOURNISSEUR GROUP BY VILLE Base : Résultat :

VILLE FNOM VILLE COUNT(FNOM) Paris DUVAL Paris 2 Paris DURAND Lyon 3 Lyon DUPONT Lyon LAFRANCE Lyon SMITH

Les fonctions de calcul appliquées au résultat de regroupement sont directement indiquées dans la clause SELECT, par exemple le calcul de la moyenne se fait par produit obtenu au résultat après le regroupement : § Requête: Donner pour chaque produit fourni son coût moyen

SELECT PNOM, AVG (PRIX) FROM FOURNITURE GROUP BY PNOM Résultat : PNOM AVG(PRIX) Tuile 10,5

Ardoise 9,8

Page 34: 4 – Introduction au langage SQL (2) : requêteserwan.tranvouez.free.fr/cours/peip/PeiP1_InfoBD_S4.pdf · Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage

Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 34

La clause HAVING permet d’éliminer des partitionnements, comme la clause WHERE élimine des tuples du résultat d’une requête. Ex : on garde les produits dont le nombre des fournisseurs est ≥ 2. Ainsi des conditions de sélection peuvent être appliquées avant le calcul d’agrégat (clause WHERE) mais aussi après (clause HAVING). § Requête: Produits fournis par 2 ou plus fournisseurs avec un coût supérieur

de 100 SELECT PNOM FROM FOURNITURE WHERE PRIXA > 100 GROUP BY PNOM HAVING COUNT(*) >= 2

Avant la clause HAVING : Après la clause HAVING : PNOM FNOM PRIX PNOM FNOM PRIX Tuile Duval 15 Ardoise Durand 20

Ardoise Durand 20 Ardoise Dupont 25 Ardoise Dupont 25

Page 35: 4 – Introduction au langage SQL (2) : requêteserwan.tranvouez.free.fr/cours/peip/PeiP1_InfoBD_S4.pdf · Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage

Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 35

En général, le résultat d’une requête SQL n’est pas trié. Pour trier le résultat par rapport aux valeurs d’un ou de plusieurs attributs, on utilise

la clause ORDER BY :

SELECT VILLE, FNOM, PNOM FROM FOURNITURE, FOURNISSEUR WHERE FOURNITURE.FNOM = FOURNISSEUR.FNOM ORDER BY VILLE, FNOM DESC

=> Le résultat est trié par les villes (ASC) et le nom des fournisseurs dans l’ordre

inverse (DESC).