Vous êtes sur la page 1sur 20

30-773-01 Conception de bases de donnes

Sance 3 : Rdaction de requtes SQL (partie 2)


ORDER BY

Permet de trier un rsultat


ORDER BY noms de colonnes [ASC / DESC]

Une ou plusieurs colonnes


Caractristique ascendante ou descendante propre chacune des
colonnes
On peut remplacer le nom des colonnes par un nombre
reprsentant leur position dans la clause SELECT

Conception de bases de donnes (30-773-01)


Sylvain Leclerc, HEC Montral, 2011.
Sance 3, page 2
DISTINCT

Permet d'liminer les ranges en double


SELECT DISTINCT ....
FROM table

Bien comprendre qu'il s'agit de toute la range.


S'applique sur les valeurs visibles.
N'importe quelle requte qui ne prsente pas dans le rsultat la cl
primaire a un problme de doublon.

Conception de bases de donnes (30-773-01)


Sylvain Leclerc, HEC Montral, 2011.
Sance 3, page 3
Exercices

Donnez la liste des produits (code_produit,


description, cot) dont le cot unitaire est au moins
$120.00, trie d'abord par ordre dcroissant de cot,
puis par ordre alphabtique de description.

Quels sont les projets (code seulement) qui ont t


imputs d'au moins une sortie d'inventaire?

Conception de bases de donnes (30-773-01)


Sylvain Leclerc, HEC Montral, 2011.
Sance 3, page 4
SELECT CODE_PRODUIT, DESC_PRODUIT, COUT
FROM PRODUIT
WHERE COUT >= 120
ORDER BY COUT DESC, DESC_PRODUIT DESC;
--------
SELECT CODE_PROJET, QUANTITE
FROM SORTIE
WHERE QUANTITE >= 1;
---------------

Conception de bases de donnes (30-773-01)


Sylvain Leclerc, HEC Montral, 2011.
Sance 3, page 5
Type de jointures

C'est la faon dans le monde relationnel de faire des


liens entre diffrentes tables.

Deux types de jointures


INNER (condition stricte)
OUTER (condition non essentielle jointure ouverte)
RIGHT
LEFT
FULL

Conception de bases de donnes (30-773-01)


Sylvain Leclerc, HEC Montral, 2011.
Sance 3, page 6
Produit cartsien

Produit cartsien sur lequel on applique une


restriction.
SQL permet de faire un produit cartsien sans
restriction.

a 1 (a1) (b1) (c1)


b X 2 (a2) (b2) (c2)
c 3 (a3) (b3) (c3)

Conception de bases de donnes (30-773-01)


Sylvain Leclerc, HEC Montral, 2011.
Sance 3, page 7
Nom explicite des colonnes

Table.colonne produit.code_produit

limine l'ambigut lorsque dans le contexte d'une


requte, il y a deux colonnes portant le mme nom.

Comme les cls lointaines portent souvent le mme


nom que leur cl primaire d'origine, une jointure
donne gnralement toujours lieu une ambigut
possible.

Conception de bases de donnes (30-773-01)


Sylvain Leclerc, HEC Montral, 2011.
Sance 3, page 8
INNER

Pour faire un lien entre deux tables

SQL86
SELECT *
FROM table1, table2
WHERE table1.colonne = table2.colonne

SQL92
SELECT *
FROM table1 INNER JOIN table2
ON table1.colonne = table2.colonne

Conception de bases de donnes (30-773-01)


Sylvain Leclerc, HEC Montral, 2011.
Sance 3, page 9
INNER - Exercices

Donnez la liste des projets en incluant le nom du chef


de projet (code_projet, matricule, nom).

Fournissez une liste des sorties d'inventaire o le


code du produit et le code du projet soient
remplacs, respectivement, par la description du
produit et par le nom du chef de projet.
Variante de SELECT * FROM sortie

Conception de bases de donnes (30-773-01)


Sylvain Leclerc, HEC Montral, 2011.
Sance 3, page 10
SELECT CODE_PROJET, PROJET.MATRICULE, NOM
FROM PROJET, CHEF
WHERE PROJET.MATRICULE = CHEF.MATRICULE
-----------------
SELECT CODE_PROJET, PROJET.MATRICULE, NOM
FROM PROJET INNER JOIN CHEF
ON PROJET.MATRICULE = CHEF.MATRICULE;
----------------

Conception de bases de donnes (30-773-01)


Sylvain Leclerc, HEC Montral, 2011.
Sance 3, page 11
OUTER - Pourquoi ?

Pour faire un lien o la condition de jointure n'est pas


toujours respecte.

La cl lointaine n'est pas obligatoire dans la table enfant, ou


certaines occurrences n'ont pas d'enfant dans la table parent.

Attention, c'est la partie de la syntaxe SQL o on


retrouve le plus de diffrences entre les SGBD.

Conception de bases de donnes (30-773-01)


Sylvain Leclerc, HEC Montral, 2011.
Sance 3, page 12
OUTER - Syntaxe

Trois types de jointure OUTER

SELECT *
FROM table1 LEFT OUTER JOIN table2
ON table1.colonne = table2.colonne

SELECT *
FROM table1 RIGHT OUTER JOIN table2
ON table1.colonne = table2.colonne

SELECT *
FROM table1 FULL OUTER JOIN table2
ON table1.colonne = table2.colonne

Conception de bases de donnes (30-773-01)


Sylvain Leclerc, HEC Montral, 2011.
Sance 3, page 13
OUTER - Exercice

Prsentez la liste des matricules des chefs de projet.

(1) D'abord, rpondre la question telle quelle.


(2) Maintenant qu'arrive-t-il si on doit associer les chefs aux projets
qu'ils ont dirigs ? (vrifiez le nombre de chefs prsents)
(3) Est-ce que la mme chose survient si on associe les sorties aux
projets concerns ? (vrifiez toujours le nombre de chefs prsents)
(4) Maintenant, on veut associer les produits aux sorties
concernes (n'oublions pas que le produit est obligatoire dans la
sortie).
(5) Finalement, qu'arrive-t-il si on ajoute une condition sur les
produits ? (unite = 'UN' par exemple)

Conception de bases de donnes (30-773-01)


Sylvain Leclerc, HEC Montral, 2011.
Sance 3, page 14
Solution-Exercice
select distinct chef.matricule
from chef
LEFT OUTER JOIN projet ON projet.matricule = chef.matricule
ORDER BY chef.matricule
--------------------------------------------------------------------------------------
select distinct chef.matricule
from chef
LEFT OUTER JOIN projet ON projet.matricule = chef.matricule
left outer JOIN sortie ON sortie.code_projet = projet.code_projet
ORDER BY chef.matricule
-----------------------------------------------------------------------------------
select distinct chef.matricule
from chef
LEFT OUTER JOIN projet ON projet.matricule = chef.matricule
LEFT OUTER JOIN sortie ON sortie.code_projet = projet.code_projet
LEFT OUTER JOIN produit ON produit.code_produit = sortie.code_produit
ORDER BY chef.matricule
------------------------------------------------------------------------------
select distinct chef.matricule
from chef
LEFT OUTER JOIN projet ON projet.matricule = chef.matricule
LEFT OUTER JOIN sortie ON sortie.code_projet = projet.code_projet
LEFT OUTER JOIN produit
ON produit.code_produit = sortie.code_produit
AND unite='UN'
--WHERE unite='UN'
ORDER BY chef.matricule

Conception de bases de donnes (30-773-01)


Sylvain Leclerc, HEC Montral, 2011.
Sance 3, page 15
Jointures - Chanes

inner outer

inner

inner

outer

outer
outer

Conception de bases de donnes (30-773-01)


Sylvain Leclerc, HEC Montral, 2011.
Sance 3, page 16
Jointure rcursive - Pourquoi ?

Faire une jointure d'une table elle-mme.


Les ranges d'une table font rfrence d'autres
ranges de la mme table.

Cas typique : la chane hirarchique.

matricule nom patron


100 Paul
101 Michel 100
102 Carl 100

Conception de bases de donnes (30-773-01)


Sylvain Leclerc, HEC Montral, 2011.
Sance 3, page 17
Exemple
SELECT T1.nom, T2.nom, T3.nom, T4.nom
FROM emp AS T1
LEFT OUTER JOIN emp AS T2 ON T1.patron= T2.no_emp
LEFT OUTER JOIN emp AS T3 ON T2.patron= T3.no_emp
LEFT OUTER JOIN emp AS T4 ON T3.patron= T4.no_emp;

Conception de bases de donnes (30-773-01)


Sylvain Leclerc, HEC Montral, 2011.
Sance 3, page 18
Alias de table

Permet de donner un alias une table dans le


contexte d'une requte.

FROM table1 AS nom_alias (le mot cl AS est optionnel)

FROM produit AS toto

Conception de bases de donnes (30-773-01)


Sylvain Leclerc, HEC Montral, 2011.
Sance 3, page 19
Jointure rcursive - Exercices

Prsentez le nom de l'employ avec le nom de son


suprieur immdiat.
Prsentez le nom de l'employ, le nom de son
suprieur immdiat, et le nom du patron du suprieur.
Prsentez le nom de l'employ, le nom de son
suprieur immdiat, le nom du patron du suprieur,
ainsi que le nom du chef du patron du suprieur.

Conception de bases de donnes (30-773-01)


Sylvain Leclerc, HEC Montral, 2011.
Sance 3, page 20