Vous êtes sur la page 1sur 9

4 – Introduction au langage SQL (2) :

requêtes 1- Introduction
Bernard ESPINASSE
Professeur à Aix-Marseille Université (AMU) 2- Requêtes mono-tables
Ecole Polytechnique Universitaire de Marseille

3- Requêtes multi-tables
(PEIP1)
Novembre 2013
4- Imbrication de requêtes : simples, ANY, ALL, EXIST, …
• Requêtes mono-tables
5- Fonctions de calcul : COUNT, AVG, SUM, MAX, MIN, …
• Requêtes multi-tables
• Imbrication de requêtes : simples, ANY, ALL, EXIST, …
• Fonctions de calcul : COUNT, AVG, SUM, MAX, MIN, …

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

• 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é:
1 – Introduction • 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.

Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 3 Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 4
• COMMANDES (CNUM, CNOM, PNOM, QUANTITE) : PNOM = clé étrangère vers
PRODUIT
Structure de base d'une expression SQL « SELECT » comporte 3 CNUM : N° commande ;CNOM : nom client ; PNOM : Nom du produit ;
QUANTITE : quantité commandée ;
clauses : • PRODUIT (PNOM, PRIXV)
SELECT <liste des attributs à garder> : désigne la liste des PNOM : nom produit ; PRIXV : prix vente produit
• FOURNISSEUR (FNOM, FNOM, STATUT, VILLE)
attributs des tables désirés (à afficher)
FNOM : nom fournisseur ; STATUT : statut fournisseur ; VILLE : ville fournisseur,
• FOURNITURE (PNOM, FNOM, PRIXA) : PNOM et FNOM = clés étrangères vers PRODUIT
et FOURNISSEUR
FROM <liste des tables arguments> : liste des tables à
PNUM : N° produit ; FNUM : N° fournisseur; PRIXA: prix dʼachat;
considérer

WHERE <conditions sur un ou plusieurs attributs> : condition à • DEPT(DEPNO, DNOM, LOC)


DEPTNO : N° département ; DNOM : nom département ; LOC: localisation
vérifier sur des attributs de tables de la clause FROM • EMPLOYE(EMPNO, ENOM, DEPTNO, SAL) : DEPNO = clé étrangère vers DEPT
EMPNO : N° employé ; ENOM : nom employé ; DEPTNO : N° département ;
SAL : Salaire ;

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

Soit le schéma de table COMMANDES(NUM,CNOM,PNOM,QUANTITE)


! Requête: Informations sur toutes les commandes (Num, Cnom, Pnom, Quantité)
SQL:
2 – Requêtes monotables SELECT NUM,CNOM,PNOM,QUANTITE
FROM COMMANDES
ou
SELECT *
• Sélection FROM COMMANDES
• Sélection avec condition : =, <, >, <>,… ! Requête: Produits commandés
SELECT PNOM
• Sélection avec condition : BETWEEN, LIKE FROM COMMANDES
• Sélection avec condition : IS NULL, IS NOT NULL, IN, NOT IN 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

Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 7 Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 8
Ex1 : Conditions de sélection : =, <, >, <>,…
CLIENT nocli nom ville
121 BERTRAND PARIS
256 PAGNOL MARSEILLE
542 LANDRY QUEBEC Table COMMANDES (NUM, CNOM, PNOM, QUANTITE)
652 DUPOND PARIS
Sélection des clients où ville = PARIS : ! Requête: Produits commandés par Paul
SELECT * FROM CLIENT WHERE ville = ‘Paris’ ; SELECT PNOM
FROM COMMANDES
CLIENT-1 nocli nom ville WHERE CNOM = ’PAUL’
121 BERTRAND PARIS
652 DUPOND PARIS
Ex2 : Table FOURNITURE (PNOM, FNOM, PRIXA)
LIGNE_DE_COMMANDE nocommande noarticle date quantité
10 121 A 5/5 10 ! Requête: Produits de prix supérieur à 2000€
10 253 Z 5/5 1
10 712 H 5/5 3
SELECT PNOM
12 253 Z 5/5 5 FROM FOURNITURE
13 712 H 6/5 2 WHERE PRIXA > 2000
Sélection avec projection : lignes de commandes en date du 05/05:
! Requête: Produits dont le nom est celui du fournisseur
SELECT noarticle, date FROM LIGNE WHERE date=5/5;
LIGNE noarticle date SELECT PNOM
121 A 5/5
253 Z 5/5
FROM FOURNITURE
712 H 5/5 WHERE PNOM = FNOM

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

Conditions de sélection : BETWEEN, LIKE


Conditions de sélection : IS NULL, IS NOT NULL, IN, NOT IN
Table FOURNITURE (PNOM, FNOM, PRIXA)
! Requête: Produits avec un coût entre 1000€ et 2000€ Table FOURNISSEUR (FNOM, STATUT, VILLE)
SELECT PNOM ! Requête: Fournisseurs dont lʼadresse est inconnu.
FROM FOURNITURE SELECT FNOM
WHERE PRIXA BETWEEN 1000 AND 2000 FROM FOURNISSEUR
Remarque: La condition y BETWEEN x AND z est équivalente à y <= z AND x <= y WHERE VILLE IS NULL

Table COMMANDES (CNUM, CNOM, PNOM, QUANTITE) Table FOURNITURE (PNOM, FNOM, PRIXA)
! Requête: Clients dont le nom commence par "C" ! Requête: Produits avec un coût de 100€, de 200€ ou de 300€
SELECT CNOM SELECT PNOM
FROM COMMANDES FROM FOURNITURE
WHERE CNOM LIKE ’C%’ WHERE PRIXA IN {100,200,300}
Remarque:
le littéral qui suit LIKE, doit être une chaîne de caractères éventuellement avec des Remarque : La condition x IN {a, b, …, z} est équivalente à a OR x = b OR …OR x = z.
caractères jokers (_, %).

Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 11 Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 12
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 enregistrements (tuples) sont
toutes les concaténations d'un tuple de R à un tuple de S :
Ex :
3 – Requêtes multi-tables 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

• Jointures VITICULTEURS nom ville région


nicolas poully bougogne
• Union martin bordeaux bordelais

• Intersection Produit cartésien VINVIT = VINS X VITICULTEURS


VINVIT num cru millésime degré nom ville région
• Différence 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

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

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 Soit les tables :
Ex (équi-jointure) : COMMANDES (NUM, CNOM, PNOM, QUANTITE)
VINS (num, cru, millésime, degré) ; VITICULTEURS (nom, ville, PNOM, QUANTITE) ; FOURNITURE (PNOM, FNOM, PRIXA)
VINS nun cru millésime degré
! Requête: Nom, Prix dʼachat, Fournisseur des Produits commandés par Paul :
120 bordeaux 1975 14
200 macon 1978 12 En SQL de base :
210 macon 1977 12
SELECT COMMANDES.PNOM, PRIXA, FNOM
VITICULTEUR nom ville région FROM COMMANDES, FOURNITURE
nicolas bordeaux bordelais
WHERE COMMANDES.PNOM = FOURNITURE.PNOM AND CNOM = ’PAUL’
bernard saumur loire
pierre macon bourgogne En SQL2 :
Jointure VINVITI = VINS VITICULTEUR avec condition « cru = ville » : SELECT COMMANDES.PNOM, PRIXA, FNOM
FROM COMMANDES INNER JOINT FOURNITURE
VINVITI n° cru millésime degré nom ville région
120 bordeaux 1975 14 nicolas bordeaux bordelais ON COMMANDES.PNOM = FOURNITURE.PNOM
200 macon 1978 12 pierre macon bourgogne WHERE CNOM = ’PAUL’
210 macon 1977 12 pierre macon bourgogne

Remarques : INNER est facultatif dans la plupart des SGBDR

Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 15 Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 16
Soit les tables : Tables :
VINS n° cru millés. deg.
COMMANDES (CNUM, CNOM, PNOM, QUANTITE)
120 bordeaux 1975 14
200 macon 1978 12 FOURNITURE (PNOM, FNOM, PRIXA)
210 macon 1977 12

VITICULTEUR nom région


! Requête: nom, prix dʼachat, fournisseur des Produits commandés par Paul
ville
nicolas bordeaux bordelais En SQL de base :
bernard saumur loire SELECT COMMANDES.PNOM, PRIXA, FNOM
pierre macon bourgogne
FROM COMMANDES, FOURNITURE
WHERE CNOM = ’PAUL’ AND COMMANDES.PNOM = FOURNITURE.PNOM
SELECT * FROM VINS INNER JOINT VITICULTEUR On a une jointure naturelle car les attributs de jointure ont le même nom
ON VINS.cru = VITICULTEUR.ville ;
En SQL2 :
SELECT COMMANDES.PNOM, PRIXA, FNOM
VINVITI n° cru millés. deg. nom ville région FROM COMMANDES NATURAL JOINT FOURNITURE
120 bordeaux 1975 14 nicolas bordeaux bordelais
200 macon 1978 12 pierre macon bourgogne
WHERE CNOM = ’PAUL’
210 macon 1977 12 pierre macon bourgogne Remarque : Il est possible de restreindre ou préciser le ou les attributs de jointure avec
USING PNOM

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

Soit les tables : Table EMPLOYE (EMPNO, ENOM, DEPTNO, SAL)

CLIENT nocli nom COMMANDE nocde nocli date


! Requête: Nom et Salaire des Employés gagnant plus que lʼemployé de numéro 12546
121 DUVAL 10 121 5/5
253 LEROY 11 260 5/5
260 LANDRY 12 121 5/5
En SQL de base :
293 SANCHEZ 15 253 6/5

SELECT E1.ENOM, E1.SAL


Jointure naturelle de CLIENT et COMMANDE (nocli de CLIENT = nocli de COMMANDE) : FROM EMPLOYE E1, EMPLOYE E2
WHERE E2.EMPNO = 12546 AND
E1.SAL > E2.SAL
SELECT * FROM CLIENT NATURAL JOINT COMMANDE ;

CLICDE nocli nom nocde date Remarques :


121 DUVAL 10 5/5
253 LEROY 15 6/5
121 DUVAL 12 5/5 • E1 et E2 sont 2 instances différentes de EMPLOYE
260 LANDRY 11 5/5

Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 19 Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 20
Table COMMANDES (NUM, CNOM, PNOM, QUANTITE) Table EMPLOYE (EMPNO, ENOM, DEPTNO, SAL)
Table FOURNITURE (PNOM, FNOM, PRIXA) Table DEPARTEMENT (DEPTNO, DNOM, LOC)

! Requête: Produits qui coûtent plus que 1000€ ou ceux qui sont commandés par ! Requête: Départements sans employés ?
Jules
SELECT DEPTNO
SELECT PNOM FROM DEPARTEMENT
FROM FOURNITURE EXCEPT
WHERE PRIXA >= 1000 SELECT DEPTNO
UNION FROM EMPLOYE
SELECT PNOM
FROM COMMANDES
WHERE CNOM = ‘Jules’ Remarque:
• la différence ne fait pas partie du standard
Remarque: • la différence élimine les doublons
• lʼunion élimine les doublons • pour les garder on utilise lʼopération EXCEPT ALL : le résultat contient chaque tuple a - b
• 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 la 1° et le 2° SELECT.
fois, où a et b est le nombre dʼoccurrences du tuple dans le 1° et le 2° SELECT.

Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 21 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 ayant des employés gagnant plus que 20000€ et se trouvant
à Paris ?
4 – Imbrication de requêtes
SELECT DEPTNO
FROM DEPARTEMENT
WHERE LOC = ’Paris’ • Cas simples
INTERSECT
SELECT DEPTNO • ANY
FROM EMPLOYE • ALL
WHERE SAL > 20000
• EXISTS
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ʼenregistrements dans le 1° et le 2° SELECT

Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 23 Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 24
Table COMMANDES (NUM, CNOM, PNOM, QUANTITE) Table EMPLOYE (EMPNO, ENOM, DEPTNO, SAL)
Table FOURNITURE (PNOM, FNOM, PRIXA) Table DEPARTEMENT (DEPTNO, DNOM, LOC)

! Requête: Nom, prix et fournisseurs des Produits commandés par Paul ? la Différence peut aussi sʼexprimer par 2 blocs imbriqués
SELECT FOURNITURE.PNOM,PRIXA,FNOM ! Requête: Départements sans employés ?
FROM FOURNITURE,COMMANDES
WHERE FOURNITURE.PNOM = COMMANDES.PNOM AND CNOM = ’PAUL’ SELECT DEPTNO
FROM DEPARTEMENT
EXCEPT
la Jointure peut aussi sʼexprimer par 2 blocs imbriqués : SELECT DISTINCT DEPTNO
SELECT PNOM,PRIXA,FNOM FROM EMPLOYE
FROM FOURNITURE
WHERE PNOM IN (SELECT PNOM Equivalent à :
FROM COMMANDES FROM DEPARTEMENT
WHERE CNOM = ’PAUL’) WHERE DETPNO NOT IN (SELECT DISTINCT DEPTNO FROM EMPLOYE)

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

Table COMMANDES (NUM, CNOM, PNOM, QUANTITE) Table COMMANDES (NUM, CNOM, PNOM, QUANTITE)
Table FOURNITURE (PNOM, FNOM, PRIXA) ! Requête: Client ayant commandé la plus petite quantité de Tuiles
! Requête: Fournisseurs des Tuiles à un coût inférieur au coût maximum des SELECT CNOM
Ardoises ? FROM COMMANDE
SELECT FNOM
WHERE PNOM = ’Tuile’ AND
FROM FOURNITURE
QUANTITE <= ALL (SELECT QUANTITE
WHERE PNOM = ’Tuile’
AND PRIX < ANY (SELECT PRIX FROM COMMANDE WHERE PNOM = ’Tuile’)
FROM FOURNITURE Remarque: la condition <= ALL (SELECT F FROM . . . ) est vraie ssi la comparaison ≤ v est
WHERE PNOM = ’Ardoise’) vraie pour toutes les valeurs v du résultat du bloc (SELECT F FROM . . . ).
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 . . . ).
Table EMPLOYE (EMPNO, ENOM, DEPTNO, SAL)
! Requête: Nom, Coût et Fournisseur des Produits commandés par Paul Table DEPARTEMENT (DEPTNO, DNOM, LOC)
SELECT PNOM, PRIX, FNOM
FROM FOURNITURE ! Requête: Départements sans employés
WHERE PNOM = ANY (SELECT PNOM SELECT DEPTNO
FROM COMMANDE FROM DEPARTEMENT
WHERE CNOM = ’PAUL’) WHERE DETPNO NOT = ALL (SELECT DISTINCT DEPTNO FROM EMPLOYE)
Remarque: les prédicats IN et = ANY sont utilisés de la même façon. Remarque: les prédicats NOT IN et NOT = ALL sont utilisés de la même façon.

Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 27 Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 28
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 * 5 – Fonctions de calculs et opérateurs
FROM FOURNITURE
WHERE FNOM = FOURNISSEUR.FNOM) dʼagrégation de SQL
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
• Fonction de calcul : MAX, MIN, AVG, SUM
SELECT FNOM
FROM FOURNISSEUR
WHERE NOT EXISTS (SELECT *
FROM FOURNITURE • Opérations dʼAgrégation : GROUP BY, HAVING, ORDER BY
WHERE FNOM = FOURNISSEUR.FNOM)
Remarque: la condition NOT EXISTS (SELECT * FROM . . . ) est vraie ssi le résultat du bloc
(SELECT F FROM . . . ) est vide.

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

La fonction COUNT(*) compte le nombre des tuples du résultat dʼune requête sans ! Requête: Prix dʼachat moyen de Tuiles fournies
élimination des tuples doubles ni vérification des valeurs nulles. Dans le cas contraire on SELECT AVG (PRIXA)
utilise la clause COUNT(UNIQUE…) : FROM FOURNITURE
! Requête: Nombre de Fournisseurs de Paris WHERE PNOM = ’Tuile’
SELECT COUNT(*) FROM FOURNISSEUR ou
WHERE VILLE = ’Paris’ SELECT SUM (PRIXA)/COUNT(PRIX)
FROM FOURNITURE
! Requête: Nombre de Fournisseurs qui fournissent actuellement des produits WHERE PNOM = ’Tuile’
SELECT COUNT(DISTINCT FNOM) FROM FOURNITURE
! Requête: Fournisseurs des Tuiles au prix dʼachat moyen des Tuiles
! Requête: Quantité totale de Tuiles commandées
SELECT FNOM
SELECT SUM (QUANTITE)
FROM COMMANDES FROM FOURNITURE
WHERE PNOM = ’Tuile’ WHERE PNOM = ’Tuile’ AND PRIXA < (SELECT AVG(PRIX)
FROM FOURNITURE
! Requête: Le prix des Tuiles qui sont le plus chères.
WHERE PNOM = ’Tuile’)
SELECT MAX (PRIXA)
FROM FOURNITURE
WHERE PNOM = ’Tuiles’;

Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 31 Bernard ESPINASSE – PEIP 2013 – Séance 4 : Introduction au langage SQL 32
La clause GROUP BY permet de préciser les attributs de partitionnement des tables déclarées La clause HAVING permet dʼéliminer des partitionnements, comme la clause
dans la clause FROM, par exemple un regroupement des fournisseurs par ville :
WHERE élimine des tuples du résultat dʼune requête.
! Requête: Nombre de fournisseurs par ville
Ex : on garde les produits dont le nombre des fournisseurs est ≥ 2. Ainsi des
SELECT VILLE, COUNT(FNOM) FROM FOURNISSEUR GROUP BY VILLE
Base : Résultat :
conditions de sélection peuvent être appliquées avant le calcul dʼagrégat (clause
VILLE FNOM VILLE COUNT(FNOM) WHERE) mais aussi après (clause HAVING).
Paris DUVAL Paris 2
Paris DURAND Lyon 3
Lyon DUPONT ! Requête: Produits fournis par 2 ou plus fournisseurs avec un coût supérieur
Lyon LAFRANCE
Lyon SMITH
de 100
SELECT PNOM FROM FOURNITURE WHERE PRIXA > 100 GROUP BY PNOM
Les fonctions de calcul appliquées au résultat de regroupement sont directement
HAVING COUNT(*) >= 2
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 Avant la clause HAVING : Après la clause HAVING :
PNOM FNOM PRIX PNOM FNOM PRIX
SELECT PNOM, AVG (PRIX) FROM FOURNITURE GROUP BY PNOM Résultat :
Tuile Duval 15 Ardoise Durand 20
PNOM AVG(PRIX) Ardoise Durand 20 Ardoise Dupont 25
Tuile 10,5 Ardoise Dupont 25
Ardoise 9,8

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

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).

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