Chapitres 1 et 2 Langage d`interrogation des données - Partie 1 -

Transcription

Chapitres 1 et 2 Langage d`interrogation des données - Partie 1 -
ALSI
BTS Informatique de gestion 1€re ann•e
Chapitres 1 et 2
Langage d’interrogation des donn•es
- Partie 1 -
1.
Introduction................................................................................................................ 2
2.
Les bases de donn•es ................................................................................................. 2
2.1. D€finition .............................................................................................................. 2
2.2. Utilit€.................................................................................................................... 3
2.3. SGBD et SGBDR ..................................................................................................... 3
2.4. Les contraintes d’int€grit€ ....................................................................................... 4
3.
Le langage SQL ........................................................................................................... 8
4.
D•finition du LID......................................................................................................... 9
5.
Interrogation simple d’une table .............................................................................. 10
5.1. Projection............................................................................................................ 10
5.2. Restriction de lignes ............................................................................................. 11
5.3. Trier le r€sultat d’une interrogation......................................................................... 17
6.
Interrogation de plusieurs tables : les jointures ....................................................... 18
6.1. Equi-jointure........................................................................................................ 19
6.2. Jointure r€flexive ou auto-jointure ..........................................................................
6.3. Jointure externe ...................................................................................................
6.3.1. Jointure externe gauche ...........................................................................
6.3.2. Jointure externe droite .............................................................................
6.3.3. Jointure externe compl€te.........................................................................
6.4. Jointure multi tables .............................................................................................
7.
22
26
27
28
28
29
Exercices................................................................................................................... 32
ALSI_IG1_C02 - SQL LID Partie 1
1
ALSI
BTS Informatique de gestion 1€re ann•e
1. Introduction
Toute organisation a besoin d'informations pour coordonner ses actions en vue d'atteindre ses
objectifs.
Exemples : - Une biblioth€que maintient une liste de membres, de livres, …
- Une soci‚t‚ maintient des informations sur ses salari‚s, ses services...
Ces informations sont €labor€es ‚ partir de donn•es qui, pour ƒtre utilisables ais€ment, sont
stock•es de faƒon structur•e et ordonn•e.
Elles peuvent ƒtre stock€es sur diff€rents types de support et format comme : des fiches papiers,
des tableaux €labor€s avec un tableur (tel que Microsoft Excel) ou des bases de donn€es.
EMPLOYES
SERVICE
NumService
10
20
30
40
50
A
B
C
D
NomService
Recherche
Vente
Direction
Fabrication
SAV
matricule
26691
17574
26691
Lieu
35155
Rennes
36000
Metz
Paris
Toulon
Metz
NomEmploye
DUPOND
GARDARIN
MARTIN
DUPONT
fonction
commercial
ing€nieur
pr€sident
adminsitratif
E
1
2
3
4
5
6
7
8
9
Tableau Excel
Fiches papier
Base de donn•es
2. Les bases de donn•es
2.1. D•finition
Le terme de base de donn€es (en anglais „ DB … signifie data base) correspond ‚ une entit• dans
laquelle il est possible de stocker des donn•es de faƒon structur•e et avec le moins de
redondance possible (c’est-„-dire •viter de retrouver les m…mes valeurs dans diff•rentes
tables). Ces donn€es doivent pouvoir ƒtre utilis€es par des programmes, par des utilisateurs
diff€rents.
Ainsi, la notion de base de donn€es est g€n€ralement coupl€e ‚ celle de r€seau, afin de pouvoir
mettre en commun ces informations, d'o† le nom de base. On parle g€n€ralement de syst‡me
d'information pour d€signer toute la structure regroupant les moyens mis en place pour pouvoir
partager des donn€es.
ALSI_IG1_C02 - SQL LID Partie 1
2
ALSI
BTS Informatique de gestion 1€re ann•e
2.2. Utilit•
L’utilit• d’une base de donn•es est de mettre des donn€es ‚ la disposition d'utilisateurs pour une
consultation, une saisie ou bien une mise ‚ jour, tout en s'assurant des droits accord€s ‚ ces
derniers. Cela est d'autant plus utile que les donn€es informatiques sont de plus en plus
nombreuses.
Une base de donn€es peut ƒtre locale, c'est-‚-dire utilisable sur une machine par un utilisateur, ou
bien r•partie, c'est-‚-dire que les informations sont stock€es sur des machines distantes et
accessibles par r€seau. L'avantage majeur de l'utilisation de bases de donn€es est la possibilit€ de
pouvoir ƒtre acc€d€es par plusieurs utilisateurs simultan€ment.
2.3. SGBD et SGBDR
Afin de pouvoir contrˆler les donn€es ainsi que les utilisateurs, un syst‡me de gestion est
n€cessaire. La gestion de la base de donn€es se fait gr‰ce ‚ un syst‡me appel€ SGBD (syst‡me de
gestion de bases de donn€es) ou en anglais DBMS (Data base management system).
Le SGBD est un ensemble de services (applications logicielles) permettant de g€rer les bases de
donn€es, c'est-‚-dire :
 permettre l'acc‡s aux donn€es de faŠon simple,
 autoriser un acc‡s aux informations ‚ de multiples utilisateurs
 manipuler les donn€es pr€sentes dans la base de donn€es (insertion, suppression,
modification).
Le SGBD assure la coh•rence et l'acc€s aux informations stock€es dans un mod‡le physique de
donn€es particulier : hi€rarchique, r€seau, relationnel, objet...
Exemple
IDS est un SGBD de type r‚seau qui a ‚t‚ utilis‚ pour la conquƒte spatiale am‚ricaine (programme
Apollo).
Il existe diff€rents mod‡les de bases de donn€es : les BD hi€rarchiques, les BD r€seaux, les BD
objets et les BD relationnelles.
Un SGBDR (Syst‡me de Gestion de Base de Donn€es Relationnel) est un SGBD assurant la
coh€rence et l'acc‡s aux informations stock€es dans un mod€le physique de donn•es de type
relationnel
Exemple
Paradox, MySQL, Oracle, DB2, Ingres, Informix, Sybase, SQL Server...
ALSI_IG1_C02 - SQL LID Partie 1
3
ALSI
BTS Informatique de gestion 1€re ann•e
2.4. Les contraintes d’int•grit•
Ces contraintes, g•r•es en tant que s•curit• par les SGBDR, d€finissent les r‡gles ‚ respecter
sur les donn€es. Ces r‡gles permettent de garantir l'int•grit• et la coh•rence des donn€es.
Si l’on tente d’ins€rer des donn€es qui ne respectent pas les contraintes d’int€grit€ d€finies, le
SGBDR retourne un message d’erreur et la mise ‚ jour des donn€es est interrompue. On parle alors
de violation des contraintes d’int•grit•.
Certaines de ces contraintes sont li€es aux r‡gles de gestion du syst‡me d’information repr€sent€.
Par exemple, le stock actuel d’un article ne doit pas ƒtre inf€rieur ‚ son stock de s€curit€. Elles
seront d€finies dans le SGBDR ‚ l’aide de triggers (vous €tudierez les triggers en 2‡me ann€e).
D’autres contraintes sont li€es au mod‡le relationnel :
 La contrainte de relation ou contrainte d’entit•
La contrainte d'entit• pr•cise qu’il n’y a pas de doublon de la cl• primaire, que la cl•
primaire est toujours renseign•e et qu’elle ne peut pas changer de valeur au cours du
temps
Pour chaque tuple d’une relation, la valeur de la cl• primaire doit …tre :
 La contrainte de domaine
La contrainte de domaine permet de restreindre l'ensemble des valeurs que peut
prendre un attribut dans une relation :
Exemple : pour un album, le m‚dia est „ Audio CD …, „ DVD …, „ K7 … ou „ Vinyle …. Cette
contrainte est prise en charge par le SGBD par une contrainte de domaine. Il n’est pas possible
d’associer ‡ un album une valeur qui n’appartient pas au domaine de d‚finition.
ALSI_IG1_C02 - SQL LID Partie 1
4
ALSI
BTS Informatique de gestion 1€re ann•e


 Les contraintes d’int•grit• r•f•rentielle (ou de cl• •trang€re)
La contrainte d'int•grit• r•f•rentielle indique que la valeur d'un attribut d•fini comme
cl• •trang€re doit exister comme valeur de cl• primaire d'une autre relation.
Une relation peut avoir de aucune ‚ plusieurs cl€s €trang‡res.
Exemple :
SERVICE (numero, nomService, lieu)
numero : cl€ primaire
EMPLOYE (matricule, nomEmploye, fonction, dateEmbauche, salaire, numService)
matricule : cl€ primaire
numService : cl€ €trang‡re en r€f€rence ‚ numero de la relation SERVICE
numService dans la relation EMPLOYE fait r‚f‚rence ‡ numero de la relation SERVICE.
Cela signifie que la valeur de l’attribut numService de la relation EMPLOYE doit pr‚alablement
exister comme valeur de cl‚ primaire d'une ligne de la table SERVICE.
Il est n‚cessaire de cr‚er le service avant de cr‚er l’employ‚ rattach‚ ‡ ce service.
La contrainte d’int€grit€ r€f€rentielle implique que :


A NOTER : Certaines cl•s •trang€res peuvent …tre autoris•es „ admettre des valeurs
NULL. Dans ce cas, la contrainte d'int•grit• r•f•rentielle n'est pas v•rifi•e par le
SGBDR.
ATTENTION, il ne faut pas confondre NULL et cha†ne vide (simple quotes) !
La cha‹ne vide est une cha‹ne ne contenant aucun caract‡re. La valeur NULL indique la pr€sence
de donn€es manquantes dans un champ.
ALSI_IG1_C02 - SQL LID Partie 1
5
ALSI
BTS Informatique de gestion 1€re ann•e
Exemple :
On pr‚cise que chaque employ€ a un et un seul sup€rieur hi€rarchique parmi les autres
employ‚s, sauf pour le dirigeant qui n’en a pas.
Cette nouvelle d‚pendance fonctionnelle (la connaissance du matricule d’un salari‚ d‚termine le
matricule unique de son sup‚rieur hi‚rarchique) entraˆne la cr‚ation d’une cl‚ ‚trang€re.
SERVICE (numero, nomService, lieu)
numero : cl€ primaire
EMPLOYE (matricule, nomEmploye, fonction, dateEmbauche, salaire, numService,
matrSuperieur)
matricule : cl€ primaire
numService : cl€ €trang‡re en r€f€rence ‚ numero de la relation SERVICE
matrSuperieur : cl• •trang€re en r•f•rence „ matricule de la relation EMPLOYE
A titre indicatif le mod‡le conceptuel €tait le suivant
ALSI_IG1_C02 - SQL LID Partie 1
6
ALSI
BTS Informatique de gestion 1€re ann•e
Extrait de la table EMPLOYE
matricule
26691
15155
16712
17574
...
nom
Employe
DUPONT
GARDARIN
MARTIN
DUPOND
...
fonction
Commercial
Ing€nieur
Pr€sident
Adminsitratif
...
date
Embauche
14/04/1992
07/08/1998
23/05/1990
03/05/1995
...
salaire
numService
25 000
24 000
40 000
9 000
...
20
10
30
30
...
matr
Superieur
27047
24533
NULL
16712
...
DUPOND fait partie du service n‰ 30 c'est-‡-dire la Direction
MARTIN n’a pas
de sup‚rieur
hi‚rarchique
Extrait de la table SERVICE
numero
10
20
30
40
50
nomService
Recherche
Vente
Direction
Fabrication
SAV
lieu
Rennes
Metz
Nancy
Toulon
Metz
Le sup‚rieur hi‚rarchique de DUPOND est le matricule 16712, ‡ savoir MARTIN
Cons•quence : il est important, lorsque l'on cr€e une base de donn€es, de bien r€fl€chir si un
attribut doit ou non autoriser les valeurs NULL car cela a des cons€quences non n€gligeables.
A noter que la cl• primaire d’une relation n’admet pas de valeur nulle : elle doit toujours
ƒtre renseign€e.
ALSI_IG1_C02 - SQL LID Partie 1
7
ALSI
BTS Informatique de gestion 1€re ann•e
3. Le langage SQL
Le mod‡le relationnel, invent€ par A.F. Codd (Directeur de recherche du centre IBM de San Jos€)
en 1970 a donn€ naissance au langage SQL, normalis€ en 1986 par l’ANSI (institut am€ricain de
normalisation) pour donner SQL-86.
Depuis, plusieurs versions ont vu le jour : SQL-89, SQL-92 nomm€e SQL2, SQL-99 nomm€e SQL3,
puis SQL:2003 et enfin SQL:2008.
Le SQL (Structured Query Language : langage de requƒte structur€) est un langage de
communication avec les bases de donn€es relationnelles. Il pr€sente plusieurs subdivisions.
Subdivision
Sigle
Langage d’interrogation des donn€es
(Data Query Language)
LID
(DQL)
Langage de manipulation des donn€es
(Data Manipulation Language)
LMD
(DML)
Modification du contenu de la base de donn€es :
ajout, modification et suppression de donn€es
Langage de d€finition des donn€es
(Data Definition Language)
LDD
(DDL)
Modification de la structure de la base de donn€es :
ajout, modification et suppression des tables et de
leurs relations (contraintes d’int€grit€ r€f€rentielles)
Langage de contrˆle des donn€es
(Data Controle Language)
LCD
Acquisition et r€vocation des privil‡ges d’acc‡s aux
donn€es.
(DCL)
Description
Extraction de donn€es r€pondant ‚ un besoin d€fini
‚ l’aide de crit‡res de restriction, d’op€rations et de
tris.
Il est possible d’inclure des requƒtes SQL dans un programme €crit dans un autre langage (en C# ou
en PHP par exemple).
ALSI_IG1_C02 - SQL LID Partie 1
8
ALSI
BTS Informatique de gestion 1€re ann•e
4. D•finition du LID
Le langage d’interrogation des donn€es (LID) permet, comme son nom l’indique, d’interroger une
base de donn€es. Il sert ‚ rechercher, extraire, trier, mettre en forme des donn€es et calculer de
nouvelles donn€es ‚ partir de donn€es existantes.
Dans ce cours, nous utiliserons le mod‡le relationnel suivant.
Mod€le relationnel
SERVICE(numero, nomService, lieu)
numero : cl‚ primaire
EMPLOYE (matricule, nomEmploye, fonction, dateEmbauche, salaire, commission, numService,
matrSuperieur)
matricule: cl‚ primaire
numService : cl‚ ‚trang€re en r‚f‚rence ‡ numero de la relation SERVICE
matrSuperieur : cl‚ ‚trang€re en r‚f‚rence ‡ matricule de la relation EMPLOYE
Mod€le physique
Employe
Service
matricule
nomEmploye
fonction
dateEmbauche
salaire
commission
numService
matrSuperieur
numService = numero
numero
numService
lieu
matrSuperieur = matricule
Extraits des tables
Extrait de la table Employe
Extrait de la table Service
ALSI_IG1_C02 - SQL LID Partie 1
9
ALSI
BTS Informatique de gestion 1€re ann•e
Avec le langage SQL, c’est la commande SELECT qui constitue le langage d’interrogation de la base.
Le r€sultat d’une requƒte d’interrogation sur des tables est lui-mƒme une table dont l’existence est
temporaire (le temps de la requƒte).
5. Interrogation simple d’une table
5.1. Projection
L’instruction SELECT permet de d€terminer les colonnes „ projeter (afficher) ‚ partir de tables
pr€cis€es dans la clause FROM.
 La version la plus simple d’une requƒte d’interrogation est la suivante :
SELECT *
FROM nom_table
* signifie que tous les champs de la table sont projet‚s
 Il est possible de limiter la projection ‚ certains champs en pr€cisant leur nom apr‡s l’instruction
SELECT et en les s€parant par des virgules.
SELECT nom_champ1, nom_champ2, …
FROM nom_table
Exemple 1 : Afficher toutes les informations sur les employ•s de l’entreprise.
SELEC T *
FROM Employe
* se rapporte ‡ tous les champs de la table Employe puisque
c’est la seule table sp‚cifi‚e dans la clause FROM
Exemple 2 : Quels sont les diff•rents services (nom) de l’entreprise et oˆ sont-ils
implant•s ?
SELEC T nomService, lieu
FROM Service
ALSI_IG1_C02 - SQL LID Partie 1
10
ALSI
BTS Informatique de gestion 1€re ann•e
Par d€faut, l’instruction SELECT est associ€e au mot-cl€ ALL. Ainsi, mƒme s’il n’est pas sp€cifi€,
l’ex€cution correspond ‚ SELECT ALL ce qui signifie que tous les enregistrements correspondant
‚ la demande seront affich€s, y compris ceux qui sont identiques.
Ainsi les deux requƒtes ci-dessous produisent le mƒme r€sultat :
SELECT fonction
FROM Employe
ou
SELECT ALL fonction
FROM Employe
La clause DISTINCT (‚ sp€cifier puisqu’elle n’est pas ex€cut€e par d€faut), permet de ne projeter
que les enregistrements diff€rents.
Exemple 3 : Quelles sont les fonctions occup•es dans l’entreprise ?
SELEC T DISTIN CT fonction
FROM Employe
Plusieurs employ‚s pouvant occuper la mƒme
fonction, la clause distinct permet de n’afficher
qu’une seule fois chaque fonction
5.2. Restriction de lignes
La clause WHERE permet de sp€cifier des crit‡res de restriction.
Cette clause est suivie d’une condition qui sera €valu€e pour chaque ligne de la table. Seules les
lignes pour lesquelles le r€sultat de la condition est VRAI seront projet€es.
SELECT *
FROM nom_table
WHERE condition
ALSI_IG1_C02 - SQL LID Partie 1
11
ALSI
BTS Informatique de gestion 1€re ann•e
Les conditions sont construites ‚ partir :

d’expressions constitu€es de noms de champs ou de valeur (de type num€rique, texte ou
date) et €ventuellement d’op€rateurs arithm€tiques (+, -, /, *) ou de fonctions pr€d€finies.

d’op€rateurs de comparaison : =, >, <, >=, <=, <>

ou d’op€rateurs SQL
expr BETWEEN val1 AND val2
Renvoie VRAI si la valeur d’expr est comprise entre les valeurs
de val1 et val2 incluses
expr IN (val1, val2, ...)
Renvoie VRAI si la valeur d’expr est €gale ‚ l’une des valeurs
de la liste entre parenth‡ses
expr LIKE uneChaine
Renvoie VRAI si la valeur d’expr est €gale ‚ la valeur de
uneChaine qui est une cha‹ne de caract‡res pouvant contenir
des caract‡res jokers („ _ … pour un caract‡re quelconque,
„ % … pour plusieurs caract‡res quelconques)
ATTENTION : toute valeur alphanum•rique ou de type date doit …tre plac•e entre simples
quotes (ex : 'hello')
Exemple 4 : Quels sont les noms des salari•s qui occupent la fonction de commercial ?


On ne souhaite des r€sultats que sur les seuls employ€s dont la fonction est commercial : on
effectue une restriction sur les lignes v•rifiant la condition fonction = 'commercial'
matricule
nom
Employe
fonction
date
Embauche
salaire
comm
ission
num
Service
matr
Superieur
15155
16712
17574
17899
18444
19654
20000
24533
25381
25382
26691
27047
GARDARIN
MARTIN
DUPOND
BULLE
ANABEL
ROUX
PAPILOU
JACOBI
AMIN
PERNOT
DUPONT
RAMARA
Ing€nieur
Pr€sident
Administratif
Commercial
Commercial
Chef de service
Commercial
Chef de service
comptable
comptable
Commercial
Chef de service
07/08/1998
23/05/1990
03/05/1995
03/01/2000
16/06/1990
30/05/1990
15/10/2004
30/03/1997
15/10/2006
15/10/2006
14/04/1992
18/08/2001
24000
40000
9000
18000
29000
35000
15000
30000
25000
25000
25000
28000
0
0
0
0
4000
0
2050
0
0
0
2500
0
10
30
30
10
20
20
20
10
30
30
20
20
24533
NULL
16712
24533
27047
16712
27047
16712
17574
17574
27047
16712
On veut seulement le nom de ces employ€s : donc r€alise une projection sur la colonne
nomEmploye pour les seules lignes s€lectionn€es
matricule
17899
18444
26691
20000
nom
Employe
fonction
BULLE
ANABEL
DUPONT
PAPILOU
Commercial
Commercial
Commercial
Commercial
date
Embauche
salaire
comm
isssion
num
Service
matr
Superieur
03/01/2000
16/06/1990
14/04/1992
15/10/2004
18000
29000
25000
15000
0
4000
2500
2050
10
20
20
20
24533
27047
27047
27047
Requƒte permettant d'obtenir les noms des salari€s qui occupent la fonction de commercial :
SELEC T nomEmploye
FROM Employe
WHERE fonction = 'Commercial'
ALSI_IG1_C02 - SQL LID Partie 1
12
ALSI
BTS Informatique de gestion 1€re ann•e
Exemple 5 : Afficher les noms des salari•s embauch•s avant 2000
SELEC T nomEmploye
FROM Employe
WHERE dateEmbauche < '01/01/2000'
matricule
nom
Employe
15155
16712
17574
17899
18444
19654
20000
24533
25381
25382
26691
27047
GARDARIN
MARTIN
DUPOND
BULLE
ANABEL
ROUX
PAPILOU
JACOBI
AMIN
PERNOT
DUPONT
RAMARA
fonction
Ing€nieur
Pr€sident
Administratif
Commercial
Commercial
Chef de service
Commercial
Chef de service
comptable
comptable
Commercial
Chef de service
2. Projection sur la
colonne nomEmploye
Le crit€re "avant 2000" est exprim‚ sous
forme de date (certains SGBDR peuvent
coder les dates au format yyyy/mm/jj).
Un crit€re de restriction de type date
est plac‚ entre quotes (apostrophes).
date
Embauche
salaire
Comm
ission
num
Service
matr
Superieur
07/08/1998
23/05/1990
03/05/1995
03/01/2000
16/06/1990
30/05/1990
15/10/2004
30/03/1997
15/10/2006
15/10/2006
14/04/1992
18/08/2001
24000
40000
9000
18000
29000
35000
15000
30000
25000
25000
25000
28000
0
0
0
0
4000
0
2050
0
0
0
2500
0
10
30
30
10
20
20
20
10
30
30
20
20
24533
NULL
16712
24533
27047
16712
27047
16712
17574
17574
27047
16712
1. Restriction sur la
date d'embauche
La restriction peut porter sur un champ calcul• (r€sultat d'une op€ration sur des champs)
Exemple 6 : Afficher les noms des salari•s dont la r•mun•ration annuelle brute (salaire
et commission) d•passe 30 000 €
matricule
15155
16712
17574
17899
18444
19654
20000
24533
25381
25382
26691
27047
Nom
Employe
GARDARIN
MARTIN
DUPOND
BULLE
ANABEL
ROUX
PAPILOU
JACOBI
AMIN
PERNOT
DUPONT
RAMARA
Fonction
Ing€nieur
Pr€sident
Administratif
Commercial
Commercial
Chef service
Commercial
Chef service
comptable
comptable
Commercial
Chef service
Date
Embauche
salaire
comm
ission
num
Service
matr
Superieur
champ
calcul•
07/08/1998
23/05/1990
03/05/1995
03/01/2000
16/06/1990
30/05/1990
15/10/2004
30/03/1997
15/10/2006
15/10/2006
14/04/1992
18/08/2001
24000
40000
9000
18000
29000
35000
15000
30000
25000
25000
25000
28000
0
0
0
0
4000
0
2050
0
0
0
2500
0
10
30
30
10
20
20
20
10
30
30
20
20
24533
NULL
16712
24533
27047
16712
27047
16712
17574
17574
27047
16712
24000
40000
9000
18000
33000
35000
17050
30000
25000
25000
27500
28000
Pour chaque ligne de la table, le SGBDR d€termine le champ calcul€ puis teste la condition. La
projection sur les colonnes choisies est ensuite r€alis€e.
SELEC T nomEmploye
FROM Employe
WHERE salaire + commission > 30000
ALSI_IG1_C02 - SQL LID Partie 1
13
ALSI
BTS Informatique de gestion 1€re ann•e
Exemple 7 : Afficher les noms des salari•s embauch•s en 2004
SELEC T nomEmploye
FROM Employe
WHERE dateEmbauche BETWEEN ' 01/01/2004' AND '31/12/2004'
Ou bien
SELEC T nomEmploye
FROM Employe
WHERE YEAR(dateEmbauche) = 2004
La fonction pr‚d‚finie
YEAR extrait l'ann‚e
d'une date
Notez que la fonction YEAR utilis‚e ici est une fonction propre au SGBDR Microsoft SQL Server.
Chaque SGBDR propose une biblioth€que de fonctions. Lors de l'‚tude de cas, si l'on ne vous
propose pas explicitement une fonction dans l'‚nonc‚ il est recommand‚ d'utiliser la premi€re
syntaxe.
Exemple 8 : Afficher les noms des salari•s dont la commission repr•sente plus de la
moiti• du salaire
SELEC T nomEmploye
FROM Employe
WHERE commission > salaire/2
Exemple 9 : Afficher les noms et fonctions des salari•s qui sont soit commercial, soit
ing•nieur
SELEC T nomEmploye, fonction
FROM Employe
WHERE fonction IN ('commercial', 'ing•nieur')
Exemple 10 : Afficher les noms des salari•s dont le nom commence par M
SELEC T nomEmploye
FROM Employe
WHERE nomEmploye LIKE 'M%'
Exemple 11 : Afficher les noms des salari•s dont le nom se termine par T
SELEC T nomEmploye
FROM Employe
WHERE nomEmploye LIKE '%T'
Exemple 12 : Afficher les noms des salari•s dont le nom contient LA
SELEC T nomEmploye
FROM Employe
WHERE nomEmploye LIKE '%LA%'
ALSI_IG1_C02 - SQL LID Partie 1
14
ALSI
BTS Informatique de gestion 1€re ann•e
Exemple 13 : Afficher les noms des salari•s et leur r•mun•ration brute annuelle
SELECT nomEmploye, salaire+commission
FROM Employe
Le r€sultat de cette requƒte n'est pas tr‡s explicite pour celui qui visualise les r€sultats.
Il est possible de renommer le nom d'une colonne du r€sultat d'une requƒte en d€finissant un alias
‚ l'aide de la clause AS (des guillemets sont n€cessaires si l'alias comporte des espaces).
SELEC T nomEmploye, salaire+commission AS "R•mun•ration brute"
FROM Employe
 Exercice 1
ALSI_IG1_C02 - SQL LID Partie 1
15
ALSI
BTS Informatique de gestion 1€re ann•e
Par opposition aux conditions simples illustr€es pr€c€demment, il existe des conditions compos€es,
form€es de plusieurs conditions simples combin€es gr‰ce aux op€rateurs logiques : AND (et), OR
(l'un ou l'autre ou les deux), XOR (ou exclusif : l'un ou l'autre mais pas les deux).
L'op€rateur NOT plac€ devant une condition en inverse le sens.
L'op€rateur AND est prioritaire par rapport „ l'op•rateur OR. Des parenth‡ses peuvent ƒtre
utilis€es pour imposer une priorit€ dans l'€valuation de la condition, ou simplement pour rendre
l'expression plus claire.
Exemple 14 : Afficher les noms des salari€s du service 30 ayant un salaire annuel d'au moins
25 000 €.
SELEC T nomEmploye
FROM Employe
WHERE numServEmploye=30
AND salaire > 25000
Exemple 15 : Afficher les noms des salari€s qui sont commercial ou ing€nieur, et travaillant dans
le service 20.
SELEC T nomEmploye
FROM Employe
WHERE fonction IN ('commercial', 'ing•nieur')
AND numServEmploye=20
Rappel : une valeur NULL est une valeur non renseign€e (ind€finie) pour un champ o† cela est
autoris€.

Attention, la valeur NULL est diff€rente de la valeur z€ro ou d'une chaine vide ('') qui sont des
valeurs d€finies.
L'op€rateur IS NULL permet de tester la valeur NULL.
expr IS NULL
renvoie VRAI si l'expression expr est vide.
expr = NULL
provoque une erreur de syntaxe
Exemple 16 : Afficher les noms des salari•s qui n'ont pas de sup•rieur hi•rarchique.
SELEC T nomEmploye
FROM Employe
WHERE MatrSuperieur IS NULL
Exemple 17 : Afficher les noms des salari•s qui ont un sup•rieur hi•rarchique.
SELEC T nomEmploye
FROM Employe
WHERE MatrSuperieur IS NOT NULL
 Exercice 2
ALSI_IG1_C02 - SQL LID Partie 1
16
ALSI
BTS Informatique de gestion 1€re ann•e
5.3. Trier le r•sultat d’une interrogation
Les enregistrements projet€s ‚ l'aide de l'instruction SELECT ne sont pas tri€s par d€faut. On peut
sp€cifier jusqu'‚ 16 crit‡res de tris gr‰ce ‚ la clause ORDER BY plac€e apr‡s la clause WHERE.
SELECT *
FROM nom_table
[WHERE condition]
ORDER BY nom_champ1 [DESC], nom_champ2 [DESC], ...
L'ordre des tris a lieu selon l'ordre des champs (ou des alias) sp€cifi€ dans la clause ORDER BY ou
selon leur num€ro d'ordre dans la clause SELECT.
Il est possible de sp€cifier un tri sur un champ non projet€ (absent de la clause SELECT).
Pour chaque crit‡re de tri sp€cifi€, le tri peut ƒtre ascendant (ASC par d€faut) ou descendant (DESC
‚ sp€cifier).
Si le tri porte sur un attribut contenant des valeurs NULL, ces valeurs sont toujours en t…te quel
que soit l'ordre du classement (ascendant ou descendant).
Exemple 18 : Afficher la liste des salari•s (nom, fonction, salaire), class•e par fonction,
et pour chaque fonction, par salaire d•croissant.
SELECT nomEmploye, fonction, salaire
FROM Employe
ORDER BY fonction, salaire DESC
DESC ne s'applique qu'‡ salaire.
fonction est ASC par d‚faut.
Dans la clause ORDER BY on peut €galement utiliser le num€ro d'ordre du champ dans la liste
SELECT ou l'alias
Exemple 19 : Afficher la liste des salari•s (nom et r•mun•ration annuelle brute), tri•e
par r•mun•ration d•croissante.
SELECT nomEmploye, salaire+commission as R€mun€ration
FROM Employe
ORDER BY 2 DESC
Le
champ
calcul‚
salaire+commission est
le 2‚me de la liste des
champs pr‚cis‚s dans le
SELECT
ou encore
SELECT nomEmploye, salaire+commission as R€mun€ration
FROM Employe
ORDSC
On utilise cette fois-ci
l'alias pour d‚finir le
crit€re de tri.
 Exercice 3
ALSI_IG1_C02 - SQL LID Partie 1
17
ALSI
BTS Informatique de gestion 1€re ann•e
6. Interrogation de plusieurs tables : les jointures
La jointure est une op€ration qui permet de combiner des informations venant de plusieurs tables. Il
est possible de joindre jusqu'‚ 256 tables.
Une jointure est obligatoire d‡s lors que plusieurs tables sont pr€sentes dans la clause FROM,
c'est-‚-dire lorsque les projections, restrictions et/ou crit‡res de tris concernent les donn€es issues
de plusieurs tables.

Attention, en l'absence de jointure, le r€sultat renvoy€ par la requƒte correspond au
produit cart•sien des enregistrements des deux tables (chaque enregistrement de la
premi‡re table est associ€ ‚ tous les enregistrements de la seconde table). En effet, d‡s lors
que le SGBDR rencontre plusieurs tables dans une requƒte, il r€alise un produit cart€sien.
Exemple :
On lance la requƒte suivante :
SELECT nomEmploye, numService, SERVICE.*
FROM EMPLOYE, SERVICE
Cette requƒte va retourner toutes les combinaisons possibles : chaque service sera associ€ ‚
l’ensemble des employ€s.
Lorsque plusieurs tables sont utilis€es, il est obligatoire de pr•fixer par le nom de la table :
- les champs pour lesquels une ambigŠit• existe (deux champs portant le mƒme nom dans
deux tables diff€rentes)
- le caract€re * pour pr€ciser quelle table doit voir tous ses champs projet€s
ALSI_IG1_C02 - SQL LID Partie 1
18
ALSI
BTS Informatique de gestion 1€re ann•e
6.1. Equi-jointure
Une €qui-jointure rapproche deux tables gr‰ce ‚ deux champs ayant un mƒme sens.
Il s’agit g€n€ralement de lier la cl€ primaire d’une table avec la cl€ €trang‡re qui y fait r€f€rence
dans l’autre table. On parle alors de jointure naturelle.
La condition de jointure s'exprime ‚ l'aide de la clause WHERE (il s'agit bien d'une restriction)
Exemple 20 : Afficher le nom des salari•s avec leur lieu de travail
A chaque enregistrement de la table
Employe on associe l’enregistrement de
la table service v‚rifiant :
numService=numServEmploye
SELEC T nomEmploye, lieu
FROM Employe, Service
WHERE numService=numero
Comment fonctionne le SGBDR pour r€pondre ‚ cette requƒte ?

Il r€alise tout d'abord le produit cart•sien des deux tables (il associe chaque ligne de la table
EMPLOYE avec chaque ligne de la table SERVICE)
table EMPLOYE
nom
Employe
15155
GARDARIN
Ing€nieur
07/08/1998
24000
0
10
24533
10
Recherche
Rennes
16712
MARTIN
Pr€sident
23/05/1990
40000
0
30
NULL
10
Recherche
Rennes
17574
DUPOND
Administratif
03/05/1995
9000
0
30
16712
10
Recherche
Rennes
17899
BULLE
Commercial
03/01/2000
18000
0
10
24533
10
Recherche
Rennes
18444
ANABEL
Commercial
16/06/1990
29000
4000
20
27047
10
Recherche
Rennes
19654
ROUX
Chef de service
30/05/1990
35000
0
20
16712
10
Recherche
Rennes
20000
PAPILOU
Commercial
15/10/2004
15000
2050
20
27047
10
Recherche
Rennes
24533
JACOBI
Chef de service
30/03/1997
30000
0
10
16712
10
Recherche
Rennes
25381
AMIN
comptable
15/10/2006
25000
0
30
17574
10
Recherche
Rennes
25382
PERNOT
comptable
15/10/2006
25000
0
30
17574
10
Recherche
Rennes
26691
DUPONT
Commercial
14/04/1992
25000
2500
20
27047
10
Recherche
Rennes
27047
RAMARA
Chef de service
18/08/2001
28000
0
20
16712
10
Recherche
Rennes
15155
GARDARIN
Ing€nieur
07/08/1998
24000
0
10
24533
20
Vente
Metz
16712
MARTIN
Pr€sident
23/05/1990
40000
0
30
NULL
20
Vente
Metz
17574
DUPOND
Administratif
03/05/1995
9000
0
30
16712
20
Vente
Metz
17899
BULLE
Commercial
03/01/2000
18000
0
10
24533
20
Vente
Metz
18444
ANABEL
Commercial
16/06/1990
29000
4000
20
27047
20
Vente
Metz
17574
DUPOND
Administratif
03/05/1995
9000
0
30
16712
50
SAV
Metz
17899
BULLE
Commercial
03/01/2000
18000
0
10
24533
50
SAV
Metz
18444
ANABEL
Commercial
16/06/1990
29000
4000
20
27047
50
SAV
Metz
19654
ROUX
Chef de service
30/05/1990
35000
0
20
16712
50
SAV
Metz
20000
PAPILOU
Commercial
15/10/2004
15000
2050
20
27047
50
SAV
Metz
24533
JACOBI
Chef de service
30/03/1997
30000
0
10
16712
50
SAV
Metz
25381
AMIN
comptable
15/10/2006
25000
0
30
17574
50
SAV
Metz
25382
PERNOT
comptable
15/10/2006
25000
0
30
17574
50
SAV
Metz
26691
DUPONT
Commercial
14/04/1992
25000
2500
20
27047
50
SAV
Metz
27047
RAMARA
Chef de service
18/08/2001
28000
0
20
16712
50
SAV
Metz
fonction
date
Embauche
table SERVICE
matri
cule
ALSI_IG1_C02 - SQL LID Partie 1
comm
num
matr
salaire
ission Service Superieur
num
ero
nomService
lieu
19
ALSI

BTS Informatique de gestion 1€re ann•e
Ensuite il applique la condition de jointure (la restriction) : seules les lignes v€rifiant
numService=numero sont s€lectionn€es
table EMPLOYE
matri
cule
nom
Employe
date
Embauche
15155
GARDARIN
16712
MARTIN
Ing€nieur
Pr€sident
17574
17899
DUPOND
Administratif
BULLE
Commercial
18444
ANABEL
19654
20000
table SERVICE
salaire
comm
ission
num
Service
matr
Superieur
07/08/1998
24000
0
10
24533
10
Recherche
Rennes
23/05/1990
40000
0
30
NULL
30
Direction
Nancy
03/05/1995
9000
0
30
16712
30
Direction
Nancy
03/01/2000
18000
0
10
24533
10
Recherche
Rennes
Commercial
16/06/1990
29000
4000
20
27047
20
Vente
Metz
ROUX
Chef de service
30/05/1990
35000
0
20
16712
20
Vente
Metz
PAPILOU
Commercial
15/10/2004
15000
2050
20
27047
20
Vente
Metz
24533
JACOBI
Chef de service
30/03/1997
30000
0
10
16712
10
Recherche
Rennes
25381
AMIN
comptable
15/10/2006
25000
0
30
17574
30
Direction
Nancy
25382
PERNOT
comptable
15/10/2006
25000
0
30
17574
30
Direction
Nancy
26691
DUPONT
Commercial
14/04/1992
25000
2500
20
27047
20
Vente
Metz
27047
RAMARA
Chef de service
18/08/2001
28000
0
20
16712
20
Vente
Metz
fonction
num
nomService
ero
lieu
Condition de s€lection
numService = numero

Enfin, il effectue la projection : seules les colonnes nomEmploye et lieu sont retenues
nomEmploye
lieu
GARDARIN
Rennes
MARTIN
Nancy
DUPOND
Nancy
BULLE
Rennes
ANABEL
Metz
ROUX
Metz
PAPILOU
Metz
JACOBI
Rennes
AMIN
Nancy
PERNOT
Nancy
DUPONT
Metz
RAMARA
Metz
Une autre syntaxe existe pour exprimer la jointure (norme SQL 2):
SELEC T nomEmploye, lieu
FROM Employe
INNER JOIN Service ON numService = numero
ou encore
SELECT nomEmp loye, lieu
FROM Employ e
JO IN Serv ic e O N numServ ice= num ero
ALSI_IG1_C02 - SQL LID Partie 1
20
ALSI
BTS Informatique de gestion 1€re ann•e
Il est possible, bien entendu, d'appliquer des restrictions au r€sultat d'une jointure entre tables.
Dans ce cas les restrictions sont ajout€es ‚ la clause WHERE, apr‡s la condition de jointure. Les
diff€rentes conditions sont s€par€es par AND.
SELECT liste_des_colonnes
FROM table1, table2
WHERE condition_jointure
AND condition_restriction
AND autre_condition_restriction
…
Exemple 21 : Afficher le nom des salari•s embauch•s avant 2000 et travaillant „ Metz
SELEC T nomEmploye
FROM Employe, Service
WHERE numService = numero
AND dateEmbauche < '01/01/2000'
AND lieu = 'Metz'

Le SGBDR r€alise d'abord le produit cart•sien puis applique la condition de jointure
matri
cule
nom
Employe
date
Embauche
salaire
comm
ission
num
Service
matr
Superieur
15155
GARDARIN
Ing€nieur
07/08/1998
24000
0
10
24533
10
Recherche
Rennes
16712
17574
MARTIN
Pr€sident
23/05/1990
40000
0
30
NULL
30
Direction
Nancy
DUPOND
Administratif
03/05/1995
9000
0
30
16712
30
Direction
Nancy
17899
BULLE
Commercial
03/01/2000
18000
0
10
24533
10
Recherche
Rennes
18444
ANABEL
Commercial
16/06/1990
29000
4000
20
27047
20
Vente
Metz
19654
ROUX
Chef de service
30/05/1990
35000
0
20
16712
20
Vente
Metz
20000
PAPILOU
Commercial
15/10/2004
15000
2050
20
27047
20
Vente
Metz
24533
JACOBI
Chef de service
30/03/1997
30000
0
10
16712
10
Recherche
Rennes
25381
AMIN
comptable
15/10/2006
25000
0
30
17574
30
Direction
Nancy
25382
PERNOT
comptable
15/10/2006
25000
0
30
17574
30
Direction
Nancy
26691
DUPONT
Commercial
14/04/1992
25000
2500
20
27047
20
Vente
Metz
27047
RAMARA
Chef de service
18/08/2001
28000
0
20
16712
20
Vente
Metz

fonction
num
nomService
ero
lieu
Le SGBDR effectue ensuite les restrictions demand€es.
matri
cule
nom
Employe
fonction
date
Embauche
salaire
comm
ission
num
Service
matr
Superieur
num
nomService
ero
4000
20
27047
20
Vente
Metz
lieu
18444
ANABEL
Commercial
16/06/1990
29000
19654
ROUX
Chef de service
30/05/1990
35000
0
20
16712
20
Vente
Metz
26691
DUPONT
Commercial
14/04/1992
25000
2500
20
27047
20
Vente
Metz

Le SGBDR effectue enfin la projection des colonnes demand€es
nomEmploye
ANABEL
ROUX
DUPONT
 Exercice 4
ALSI_IG1_C02 - SQL LID Partie 1
21
ALSI
BTS Informatique de gestion 1€re ann•e
6.2. Jointure r•flexive ou auto-jointure
Il peut ƒtre parfois n€cessaire de lier les informations d’une ligne d’une table avec les informations
d’une autre ligne de la mƒme table.
Pour cela il est n€cessaire de r€f€rencer deux fois la table dans la requƒte et l'on raisonne comme si
l'on avait deux tables diff€rentes. Toutefois, il faut ƒtre capable de diff€rencier ces deux versions
d'une mƒme table.
Comment faire pour utiliser deux versions d'une m…me table dans une requ…te ?
Nous avons vu qu'il €tait possible de d€finir un alias pour un nom de colonne gr‰ce ‚ la clause AS.
De la mƒme mani‡re, il est possible de d€finir un alias sur un nom de table (cela est pratique pour
€crire la requƒte plus rapidement).
Exemple d'utilisation d'un alias
Consid€rons le mod‡le relationnel suivant :
CLASSE(numero, nom, prenom)
numero : cl€ primaire
ELEVE(numero, nom, idClasse)
numero : cl€ primaire
idClasse : cl€ €trang‡re en r€f€rence ‚ numero de la relation CLASSE
La requƒte permettant d'obtenir la liste des €l‡ves ainsi que le nom de leur classe est la suivante :
SELECT ELEVE.numero, ELEVE.nom, CLASSE.nom
FROM ELEVE, CLASSE
WHERE idClasse = CLASSE.numero
Les colonnes numero et nom doivent obligatoirement ƒtre pr‚c‚d‚es du nom de la table car
il y a ambigŠit‚ sur les noms des colonnes.
Pour aller plus vite, on peut utiliser des alias pour les tables :
SELECT E.numero, E.nom, C.nom
FROM ELEVE AS E, CLASSE AS C
WHERE idClasse = C.numero
A noter que pour les tables, il n'est pas n€cessaire d'utiliser la clause AS pour d€finir un alias. On
aurait pu €crire :
SELECT E.numero, E.nom, C.nom
FROM ELEVE E, CLASSE C
WHERE idClasse = C.numero
Pour utiliser deux fois une mƒme table dans une requƒte, il suffit d'utiliser des ALIAS.
Exemple : FROM EMPLOYE, EMPLOYE AS CHEF
ALSI_IG1_C02 - SQL LID Partie 1
22
ALSI
BTS Informatique de gestion 1€re ann•e
Exemple 22 : Indiquer pour chaque salari• le nom de son sup•rieur hi•rarchique
Dans cette requƒte on a besoin de :
 une version de la table EMPLOYE pour obtenir les informations de chacun des employ€s
table EMPLOYE
 une autre version de cette mƒme table pour obtenir les informations sur les sup€rieurs
hi€rarchiques (qui sont aussi des employ€s). Nous appellerons cette deuxi‡me version CHEF
table CHEF
La lecture de ces deux tables nous permet de voir, par exemple, que le sup€rieur hi€rarchique de
BULLE est JACOBI
Une jointure est n€cessaire entre la colonne matrSuperieur de la table EMPLOYE et la colonne
matricule de la table CHEF.
ALSI_IG1_C02 - SQL LID Partie 1
23
ALSI

BTS Informatique de gestion 1€re ann•e
Le SGBDR doit tout d'abord r€aliser le produit cart•sien des deux tables (il associe chaque
ligne de la table EMPLOYE avec chaque ligne de la table CHEF)
table EMPLOYE
matricule
nom
Employe
fonction
table CHEF
…
matr
Superieur
matricule
nom
Employe
fonction
15155
GARDARIN
Ing€nieur
24533
15155
GARDARIN
Ing€nieur
15155
GARDARIN
Ing€nieur
24533
16712
MARTIN
Pr€sident
15155
GARDARIN
Ing€nieur
24533
17574
DUPOND
Administratif
15155
GARDARIN
Ing€nieur
24533
17899
BULLE
Commercial
15155
GARDARIN
Ing€nieur
24533
18444
ANABEL
Commercial
15155
GARDARIN
Ing€nieur
24533
19654
ROUX
Chef de service
15155
GARDARIN
Ing€nieur
24533
20000
PAPILOU
Commercial
15155
GARDARIN
Ing€nieur
24533
24533
JACOBI
Chef de service
15155
GARDARIN
Ing€nieur
24533
25381
AMIN
comptable
15155
GARDARIN
Ing€nieur
24533
25382
PERNOT
comptable
15155
GARDARIN
Ing€nieur
24533
26691
DUPONT
Commercial
15155
GARDARIN
Ing€nieur
24533
27047
RAMARA
Chef de service
16712
MARTIN
Pr€sident
NULL
15155
GARDARIN
Ing€nieur
16712
MARTIN
Pr€sident
NULL
16712
MARTIN
Pr€sident
16712
MARTIN
Pr€sident
NULL
17574
DUPOND
Administratif
16712
MARTIN
Pr€sident
NULL
17899
BULLE
Commercial
26691
DUPONT
Commercial
27047
25382
PERNOT
comptable
26691
DUPONT
Commercial
27047
26691
DUPONT
Commercial
26691
DUPONT
Commercial
27047
27047
RAMARA
Chef de service
27047
RAMARA
Chef de service
16712
15155
GARDARIN
Ing€nieur
27047
RAMARA
Chef de service
16712
16712
MARTIN
Pr€sident
27047
RAMARA
Chef de service
16712
17574
DUPOND
Administratif
27047
RAMARA
Chef de service
16712
17899
BULLE
Commercial
27047
RAMARA
Chef de service
16712
18444
ANABEL
Commercial
27047
RAMARA
Chef de service
16712
19654
ROUX
Chef de service
27047
RAMARA
Chef de service
16712
20000
PAPILOU
Commercial
27047
RAMARA
Chef de service
16712
24533
JACOBI
Chef de service
27047
RAMARA
Chef de service
16712
25381
AMIN
comptable
27047
RAMARA
Chef de service
16712
25382
PERNOT
comptable
27047
RAMARA
Chef de service
16712
26691
DUPONT
Commercial
27047
RAMARA
Chef de service
16712
27047
RAMARA
Chef de service
ALSI_IG1_C02 - SQL LID Partie 1
…
24
ALSI

BTS Informatique de gestion 1€re ann•e
Ensuite, il applique la condition de jointure (restriction) : seules les lignes telles que
matrSuperieur de la table EMPLOYE = matricule de la table CHEF sont s€lectionn€es
table EMPLOYE
matricule

nom
Employe
fonction
table temporaire CHEF
…
matr
Superieur
matricule
nom
Employe
fonction
15155
GARDARIN
Ing€nieur
24533
24533
JACOBI
Chef de service
17574
DUPOND
Administratif
16712
16712
MARTIN
Pr€sident
17899
BULLE
Commercial
24533
24533
JACOBI
Chef de service
18444
ANABEL
Commercial
27047
27047
RAMARA
Chef de service
19654
ROUX
Chef de service
16712
16712
MARTIN
Pr€sident
20000
PAPILOU
Commercial
27047
27047
RAMARA
Chef de service
24533
JACOBI
Chef de service
16712
16712
MARTIN
Pr€sident
25381
AMIN
comptable
17574
17574
DUPOND
Administratif
25382
PERNOT
comptable
17574
17574
DUPOND
Administratif
26691
DUPONT
Commercial
27047
27047
RAMARA
Chef de service
27047
RAMARA
Chef de service
16712
16712
MARTIN
Pr€sident
…
Enfin, il effectue la projection : seules les colonnes nomEmploye des tables EMPLOYE et CHEF
sont retenues
table EMPLOYE
table CHEF
nomEmploye
nomEmploye
GARDARIN
JACOBI
DUPOND
MARTIN
BULLE
JACOBI
ANABEL
RAMARA
ROUX
MARTIN
PAPILOU
RAMARA
JACOBI
MARTIN
AMIN
DUPOND
PERNOT
DUPOND
DUPONT
RAMARA
RAMARA
MARTIN
On peut constater que le r€sultat n'est pas tr‡s explicite : on utilisera donc un alias pour renommer
la deuxi‡me colonne.
table EMPLOYE
table CHEF
nomEmploye
ALSI_IG1_C02 - SQL LID Partie 1
Sup. hi•rarchique
GARDARIN
JACOBI
DUPOND
MARTIN
BULLE
JACOBI
ANABEL
RAMARA
ROUX
MARTIN
PAPILOU
RAMARA
JACOBI
MARTIN
AMIN
DUPOND
PERNOT
DUPOND
DUPONT
RAMARA
RAMARA
MARTIN
25
ALSI
BTS Informatique de gestion 1€re ann•e
Requƒte permettant d'obtenir pour chaque salari€ le nom de son sup€rieur hi€rarchique :
SELEC T Employe.nomEmploye, Chef.nomEmploye AS 'Sup. hi•rarchique'
FROM Employe, Employe AS Chef
WHERE Employe.matrSuperieur = Chef.matricule
6.3. Jointure externe
Lorsque la condition de jointure n’est pas satisfaite, aucune des lignes n’appara‹t dans le r€sultat.
Les jointures externes permettent d’extraire des lignes d’une des 2 tables concern€es, mƒme si la
condition est fausse. Dans ce cas, les donn€es de la seconde table ont la valeur NULL.
SELECT champ1, champ2, …
FROM table1
[WHERE condition]
{LEFT|RIGHT|FULL} OUTER JOIN table2 ON table1.champ3=table2.champ4
Il existe 3 types de jointures externes : la jointure externe gauche (mot-cl€ LEFT), la jointure
externe droite (mot cl€ RIGHT) et la jointure externe compl€te (mot cl€ FULL).
Pour comprendre le principe des jointures externes, nous allons ajouter une table ‚ notre mod‡le
relationnel : la table Affectation qui pr€cise les employ€s affect€s ‚ une affaire chez un client.
Extrait de la table Employe
Extrait de la table Service
ALSI_IG1_C02 - SQL LID Partie 1
Extrait de la table Affectation
26
ALSI
BTS Informatique de gestion 1€re ann•e
Supposons que l’on souhaite obtenir pour chaque employ‚ la liste des affaires auxquelles il est
affect‚.
Le r€sultat :
nomEmploye
DUPONT
DUPOND
BULLE
ROUX
PAPILOU
GARDARIN
PAPILOU
fonction
Commercial
Administratif
Commercial
Chef de service
Commercial
Ing€nieur
Commercial
numAffaire
1001
1002
1002
1003
1003
1005
1005
est obtenu par la requƒte suivante :
SELECT nomEmploye, fonction, numAffaire
FROM Employe, Affectation
WHERE Employe.matricule = Affectation.matrEmplAffecte
Toutefois, avec cette requƒte, on perd certaines informations :
- le fait que certaines affaires ne sont pas encore affect•es „ un employ• (ex : affaire 1004)
- le fait que certains employ•s ne sont affect•s „ aucune affaire (ex : ANABEL)
Il est parfois important de disposer de ces informations. C'est ce que permettent les jointures
externes.
Pour faire simple, les jointures externes permettent d'obtenir les lignes d'une table qui sont li€es aux
lignes d'une autre table (€qui-jointure) ainsi que celles qui ne sont pas li€es (condition de jointure
non v€rifi€e).
6.3.1. Jointure externe gauche
Une jointure externe gauche permet d’inclure dans le r•sultat les lignes de la table sp•cifi•e „
gauche de la jointure m…me s’il n’y a pas de ligne v•rifiant la condition dans la table
sp•cifi•e „ droite de la jointure.
Exemple 23 : D•tail des affectations pour l'ensemble des employ•s (y compris les
employ•s sans affectation)
SELEC T nomEmploye, fonction, numAffaire
FROM Employe
LEFT O UTER JOIN Affectation ON matricule = matrEmplAffecte
donne le r€sultat suivant :
nomEmploye
GARDARIN
MARTIN
DUPOND
BULLE
ANABEL
ROUX
PAPILOU
PAPILOU
JACOBI
DUPONT
RAMARA
fonction
Ing€nieur
Pr•sident
Administratif
Commercial
Commercial
Chef de service
Commercial
Commercial
Chef de service
Commercial
Chef de service
numAffaire
1005
NULL
1002
1002
NULL
1003
1003
1005
NULL
1001
NULL
On retrouve cette fois, dans le
r‚sultat de la requƒte, les employ‚s
qui ne sont affect‚s ‡ aucune affaire.
Le num‚ro d'affaire (table de droite)
prend la valeur NULL lorsque la
condition de jointure n'est pas
r‚alis‚e.
Toutes les lignes de la table sp€cifi€e ‚ gauche de la clause OUTER JOIN (Employe dans l’exemple)
seront affich€es, que la condition de jointure soit r€alis€e ou non avec la table situ€e ‚ droite.
ALSI_IG1_C02 - SQL LID Partie 1
27
ALSI
BTS Informatique de gestion 1€re ann•e
6.3.2. Jointure externe droite
Une jointure externe droite permet d’inclure dans le r•sultat les lignes de la table sp•cifi•e „
droite de la jointure m…me s’il n’y a pas de ligne v•rifiant la condition dans la table
sp•cifi•e „ gauche.
Exemple 24 : D•tail des affectations nom des employ•s et fonction) par affaire (y
compris les affaires sans affectation)
SELEC T nomEmploye, fonction, numAffaire
FROM Employe
RIGHT OUT ER JOIN Affectation ON matricule = matrEmplAffecte
donne le r€sultat suivant :
nomEmploye
DUPONT
DUPOND
BULLE
ROUX
PAPILOU
NULL
GARDARIN
PAPILOU
fonction
Commercial
Administratif
Commercial
Chef de service
Commercial
NULL
Ing€nieur
Commercial
numAffaire
1001
1002
1002
1003
1003
1004
1005
1005
On retrouve cette fois, dans le r‚sultat
de la requƒte, les affaires qui ne sont
affect‚es ‡ personne.
Lorsque la condition de jointure n'est pas
v‚rifi‚e, les champs de la table de
gauche prennent la valeur NULL.
Toutes les lignes de la table sp€cifi€e ‚ droite de la clause OUTER JOIN (Affaire dans l’exemple)
seront affich€es, que la condition de jointure soit r€alis€e ou non dans la table situ€e ‚ gauche.
6.3.3. Jointure externe compl€te
La jointure externe compl‡te permet de combiner une jointure externe gauche avec une jointure
externe droite.
Exemple 25 : D•tail des affectations y compris les affaires non encore affect•es et les
employ•s affect•s „ aucune affaire
SELEC T nomEmploye, fonction, numAffaire
FROM Employe
FULL OU TER JOIN Affectation ON matricule = matrEmplAffecte
donne le r€sultat suivant :
nomEmploye
NULL
GARDARIN
MARTIN
DUPOND
BULLE
ANABEL
ROUX
PAPILOU
PAPILOU
JACOBI
DUPONT
RAMARA
fonction
NULL
Ing€nieur
Pr•sident
Administratif
Commercial
Commercial
Chef service
Commercial
Commercial
Chef de service
Commercial
Chef de service
ALSI_IG1_C02 - SQL LID Partie 1
numAffaire
1004
1005
NULL
1002
1002
NULL
1003
1005
1003
NULL
1001
NULL
On retrouve cette fois, dans le r‚sultat
de la requƒte, les affaires qui ne sont
affect‚es ‡ personne ainsi que les
employ‚s qui ne sont affect‚s ‡ aucune
affaire
28
ALSI
BTS Informatique de gestion 1€re ann•e
Toutes les lignes des deux tables seront affich€es et les colonnes pour lesquelles il n'y a pas de
correspondance sont remplies avec la valeur NULL.
6.4. Jointure multi tables
Il est possible de r€aliser la jointure de plus de 2 tables.
Dans ce cas, pour chaque paire de tables de la jointure, il suffit d’indiquer une condition d€crivant la
relation entre les colonnes.
 Pour n tables „ joindre, il faut d•crire n-1 conditions de jointure.
D•marche pour construire les requ…tes multi-tables
Une mƒme d€marche doit ƒtre appliqu€e pour construire vos requƒtes :
 Rep€rer les tables dont on a besoin c'est-‚-dire :
o Pour lesquelles un champ doit ƒtre affich€ (SELECT)
o Sur lesquelles une restriction doit ƒtre effectu€e (WHERE hors jointure)
 Rep€rer sur le mod‡le physique (‚ construire rapidement au brouillon s'il n'est pas fourni) les
jointures (liens) ‚ r€aliser pour "passer d'une table ‡ une autre"
 Ecrire la requƒte
o Projection : quels champs afficher ? (clause SELECT)
o Liste des tables n€cessaires ‚ la requƒte (clause FROM) pour les champs ‚ afficher, les
conditions de restrictions, les jointures
o Jointures (WHERE ou JOIN)
o Restrictions €ventuelles : quelles lignes doit-on s€lectionner ? (WHERE)
Exemple 26 : liste des affectations (matricule et nom de l'employ•, num•ro et nom du
service, num•ro d'affaire) des employ•s travaillant „ Metz
L€gende
Colonnes ‚ afficher dans la table r€sultat
Colonnes sur lesquels une restriction est r€alis€e
Jointures n€cessaires
ALSI_IG1_C02 - SQL LID Partie 1
29
ALSI
BTS Informatique de gestion 1€re ann•e
Utilisation d'une clause WHERE
SELEC T matricule, nomEmploye, numService, nomService, numAffaire
FROM Employe, Affectation, Service
WHERE numero = numService
AND MatrEmplAffecte = matricule
AND lieu = 'Metz'
Utilisation d'une clause JOIN (norme SQL92)
SELEC T matricule, nomEmploye, numService, nomService, numAffaire
FROM Employe
JOIN Affectation ON MatrEmplAffecte = matricule
JOIN Service ON numero = numService
WHERE lieu = 'Metz'
Exemple 27 : liste des affectations (matricule et nom employ•, num•ro de service,
num•ro d'affaire) pour les employ•s embauch•s avant le 06/10/2000
ATTENTION : on peut noter au travers de cet exemple, que contrairement ‚ ce que l'on pourrait
penser au d€part, la table Service n'est pas indispensable ‚ la requƒte.
R€gle : ne pas utiliser les tables qui ne sont pas indispensables „ l'obtention du r•sultat
Utilisation d'une clause WHERE
SELEC T matricule, nomEmploye, numService, numAffaire
FROM Employe, Affectation
WHERE MatrEmplAffecte = matricule
AND dateEmbauche < '06/10/2000'
ALSI_IG1_C02 - SQL LID Partie 1
30
ALSI
BTS Informatique de gestion 1€re ann•e
Utilisation d'une clause JOIN (norme SQL2)
SELEC T matricule, nomEmploye, numService, numAffaire
FROM Employe
JOIN Affectation ON MatrEmplAffecte = matricule
WHERE dateEmbauche < '06/10/2000'
Exemple 28 : liste des affaires (num•ro affaire) affect•es aux employ•s travaillant „
Metz
On notera ici, que pour utiliser des informations de la table Affectation (num€ro d'affaire) et de la
table Service (lieu), il est n€cessaire de „ passer … par la table Employ€ afin d'€tablir les jointures
n€cessaires, cela mƒme si aucun champ de cette table n'est a priori n€cessaire.
Utilisation d'une clause WHERE
SELEC T numAffaire
FROM Employe, Affectation, Service
WHERE numero = numService
AND matricule = MatrEmplAffecte
AND lieu = 'Metz'
Utilisation d'une clause JOIN (norme SQL92)
SELEC T numAffaire
FROM Employe
JOIN Affectation ON MatrEmplAffecte = matricule
JOIN Service ON numero = numService
WHERE lieu = 'Metz'
ALSI_IG1_C02 - SQL LID Partie 1
31
ALSI
BTS Informatique de gestion 1€re ann•e
7. Exercices
L'ensemble des exercices qui suivent se rapportent au mod‡le relationnel ci-dessous :
Adherent (numAdh, sexeAdh, civiliteAdh, nomAdh, prenomAdh, adrAdh, cpAdh, villeAdh)
Cl€ primaire : numAdh
Lecon (numLecon, niveauLecon, jourLecon, debutLecon, finLecon)
Cl€ primaire : numLecon
Cotisation (numCot, anneeCot, montantCot, dateReglement, numAdh)
Cl€ primaire : numCot
Cl€ €trang‡re : numAdh en r€f€rence ‚ numAdh de Adherent
Inscription (numeroAdherent , numeroLecon)
Cl€ primaire : numeroAdherent, numeroLecon
Cl€s €trang‡res : numeroAdherent en r€f€rence ‚ numAdh de Adherent
numeroLecon en r€f€rence ‚ numLecon de Lecon
Remarques :
Les champs debutLecon et finLecon correspondent respectivement aux heures de d‚but et de
fin d'une le‹on. Les heures sont toujours pr‚cis‚es dans ces champs sont des nombres entiers.
Le champ dateReglement contient la date du r€glement au format jj/mm/aaaa. Tant que le
r€glement n'a pas ‚t‚ effectu‚, ce champ reste vide
Le champ sexeAdh contient les valeurs "f‚minin" ou "masculin"
Exercice 1
R•alisez les requ…tes suivantes en langage SQL
1. Pr€sentez la liste des adh€rents (nom et pr€nom).
2. Pr€sentez la liste des adh€rents (nom et pr€nom) de sexe "masculin".
3. Donnez la liste des leŠons (num€ro, heure d€but et heure fin de leŠon) ayant lieu le 29 avril
2007
4. Donnez la dur€e de la leŠon n• 31.
5. Cherchez les adh€rents (num€ro) ayant r€gl€ une cotisation en 2006
6. Donnez la liste des adh€rents (nom et pr€nom) dont le nom contient "epi".
Exercice 2
En reprenant le mod€le relationnel de l'exercice pr•c•dent, r•alisez les requ…tes
suivantes en langage SQL :
1. Cherchez les heures de d€but et de fin des leŠons de niveau "d€butant" ayant eu lieu le
10/12/2006, le 17/12/2006 ou le 14/01/2007.
2. Fournir la liste des cotisations non r€gl€es.
3. On souhaite obtenir la liste des adh€rents
- habitant "Gouvieux"
- ou qui habitent les villes commenŠant par S et dont le code postal commence par "60".
ALSI_IG1_C02 - SQL LID Partie 1
32
ALSI
BTS Informatique de gestion 1€re ann•e
Exercice 3
En reprenant le mod€le relationnel de l'exercice 1, r•alisez les requ…tes suivantes en
langage SQL :
1. Donnez la liste des adh€rents de sexe f€minin tri€e par ville puis par nom d'adh€rent
2. Pr€senter la liste des leŠons donn€es au mois d'avril 2007. Cette liste sera tri€e par jour puis
heure de d€but de la leŠon.
Exercice 4
En reprenant le mod€le relationnel de l'exercice 1, r•alisez les requ…tes suivantes en
langage SQL :
1. Cherchez les noms et pr€noms des adh€rents ayant cotis€ (r‡glement effectu€ ou non) en 2006.
2. Indiquez le niveau des leŠons auxquelles s'est inscrit Jean LABALLE (on suppose qu'il n'y a pas
d'homonyme).
3. D€terminez les noms et pr€noms des adh€rents n'habitant pas Gouvieux et ayant suivi une leŠon
le 17 d€cembre 2006.
4. Triez par ordre alphab€tique les adh€rents (nom et pr€nom) ayant r€gl€ leur cotisation pour la
saison 2007 et s'€tant inscrit ‚ une leŠon pour le mois de janvier 2008.
ALSI_IG1_C02 - SQL LID Partie 1
33

Documents pareils