Vous êtes sur la page 1sur 130

Le langage SQL ne présente intentionnellement qu'un nombre limité de

verbes ou mots-clés, qui se répartissent en trois familles


fonctionnellement distinctes :

- Le DDL (Data Definition Language) permet la description de la


structure de la base de données (tables, vues, attributs, index...). Les mots
clés utilisés sont: CREATE, DROP et ALTER.

- Le DML (Data Manipulation Language) permet la manipulation des


tables et des vues avec ses quatre verbes correspondant aux opérations
fondamentales sur les données: SELECT, INSERT, DELETE et
UPDATE.

- Le DCL (Data Control Language) contient les primitives de gestion des


transactions (COMMIT et ROLLBACK) et des privilèges d'accès aux
données (GRANT et REVOKE).

2
Le Langage SQL
(SQL 2,3)

• Le langage SQL est basé sur un ensemble


d’opérations à effectuer sur des tables.

• Ces opérations constituent d’une part l’algèbre


relationnelle et d ’autre part des opérateurs très
utiles tels que le tri et les calculs (agrégats).

3
1. La définition des données

1.1. Création des tables

La création de la Base de Données (BD) se fait simplement en créant les tables


qui la composent.

Il n’est pas nécessaire d’attribuer un nom à un ensemble de tables.

Le rôle de l’administrateur de la BD (DBA) est de créer :


- l’espace physique nécessaire pour stocker toutes les tables de tous les utilisateurs ;
- tous les utilisateurs avec la commande CREATE USER …

4
1.1. Création des tables (suite)

La création de la structure de nouvelles tables se fait par l'ordre suivant :

Sans la définition de la clé primaire !!!


CREATE TABLE <Nom_de_la_table>
(
<Nom_de_l'attribut1> <Domaine_de_définition> [<Contrainte>] [<Valeur_par_défault>]
[ ,(<Nom_de_l'attribut2> <Domaine_de_définition> [<Contrainte>] [<Valeur_par_défault>]
... <Nom_de_l'attributn> <Domaine_de_définition> [<Contrainte>] [<Valeur_par_défault>]
]);

Les domaines (les types de données) les plus utilisés sont :

INTEGER/NUMBER(x) pour les entiers


DECIMAL(x,y)/NUMBER(x,y) x pour la longueur totale dont y décimales
CHAR(n)/VARCHAR(n) pour les chaînes de caractères de longueur n
DATE de la forme jj/mm/aa ou jj-MMM-aa

5
1.1. Création des tables (suite)
Le contrôle de la validité des données se fait par la définition de contraintes :

CHECK ( <expression booléenne> )


Ou
CONSTRAINT <Nom_de_la_contrainte> CHECK ( <expression booléenne> )

CHECK ( <Nom_d’attribut> BETWEEN <Borne_Inf> AND <Borne_Sup>)


CHECK ( <Nom_d’attribut> IN (<Valeur1> , <Valeur2>, … <Valeurn>)

DEFAULT <valeur_par_défaut>
NOT NULL

6
1.1. Création des tables (suite)
La création de la structure de nouvelles tables se fait par l'ordre suivant, avec la
définition de la clé étrangère :
CREATE TABLE <Nom_de_la_table> (
<Nom_de_l'attribut1> <Domaine_de_définition> [<Contrainte>] [<Valeur_par_défault>]
[ ... <Nom_de_l'attributn> <Domaine_de_définition> [<Contrainte>] [<Valeur_par_défault>] ],
PRIMARY KEY (<Le_ou_les_attributs_de_la_clé_primaire>) ,
FOREIGN KEY (<Le_ou_les_attributs_de_la_clé_étrangère>) REFERENCES <Nom_table> );

CREATE TABLE <Nom_de_la_table> (


<Nom_de_l'attribut1> <Domaine_de_définition> [<Contrainte>] [<Valeur_par_défault>]
[ ,(<Nom_de_l'attribut2> <Domaine_de_définition> [<Contrainte>] [<Valeur_par_défault>]
... <Nom_de_l'attributn> <Domaine_de_définition> [<Contrainte>] [<Valeur_par_défault>] ]
CONSTRAINT PK_Table PRIMARY KEY (<Le_ou_les_attributs_de_la_clé_primaire>) ,
CONSTRAINT FK_Table1_Attribut_Table2 FOREIGN KEY
(<Le_ou_les_attributs_de_la_clé_étrangère>) REFERENCES <Nom_table> );

7
1.1. Création des tables (suite)
Notation utilisée concernant les noms des contraintes :

- la contrainte clé primaire d’une table se nomme


pk_table
- la contrainte clé étrangère d’une table se nomme
fk_table1_colonne_table2
- la contrainte de validité d’une colonne se nomme
ck_ table_colonne
- la contrainte de type non nulle sur une colonne se nomme
nn_ table_colonne
- la contrainte de type unique sur une colonne se nomme
unique_ table_colonne

8
Exemple 1 : BD ‘Sport Activities’
SPORACT
 Les tables de la Base de Données sont décrites par les
schémas des relations ci-dessous :
 BD SporAct
CEN  CENTRE ( NUMC, NOMC, VILC, COUTINSC )

PRO  PROPOSE ( NUMC*, SPORT )

ACT  ACTEUR ( NUMA, PRENA, NOMA, VILA )

EST  ESTMEMBRE ( NUMA, NUMC, DATEINSC )

PRA  PRATIQUE ( NUMA, SPORT, NUMC )

MAT  MATERIEL ( NUMM, LIBM, PRAM, DTAM )

INS  INSTALLATION ( NUMM, NUMC, DTIM )

9
Exemple 1 : BD ‘Sport Activities’
SPORACT

10
Exemple 1 : BD ‘Sport Activities’
SPORACT

11
Exemple 1 : Définition des tables de la BD SPORACT
Exemples : CREATE TABLE
Création de la table pour les centres sportifs : CENTRE

CREATE TABLE CENTRE


( NUMC VARCHAR(3),
NOMC VARCHAR(15),
VILC VARCHAR(15),
COUTINSC NUMBER(7,2) CHECK (COUTINSC > 0),
PRIMARY KEY (NUMC) );

CREATE TABLE CENTRE NON !


( NUMC VARCHAR(3) PRIMARY KEY,
NOMC VARCHAR(15),
VILC VARCHAR(15),
COUTINSC NUMBER(7,2) CHECK (COUTINSC > 0),);

12
Exemple 1 : Définition des tables de la BD SPORACT

Exemples : CREATE TABLE


Création de la table (structure des données) pour les centres sportifs : CENTRE

CREATE TABLE CENTRE


( NUMC VARCHAR(3),
NOMC VARCHAR(15), OUI !
VILC VARCHAR(15),
COUTINSC NUMBER(7,2),
CONSTRAINT CK_CEN_COUTINSC CHECK (COUTINSC > 0),
CONSTRAINT PK_CEN PRIMARY KEY (NUMC) );

13
1.2. Structure d’une table

DESC (raccourci de DESCRIBE est une commande


SQL*Plus qui permet d’extraire la structure brute d’une table.
Elle peut aussi s’appliquer à une vue ou un synonyme.

DESC[RIBE] nom_objet

Nom_objet est le nom de la table, de la vue ou du synonyme.

14
Exemple

SQL> DESC ACTEUR


Nom NULL ? Type
-----------------------------------------------------------------------
( NUMA NOT NULL VARCHAR(3)
PRENA VARCHAR(10)
NOMA VARCHAR(10)
VILA VARCHAR(15)

15
1.3. Renommer une table

L’instruction RENAME renomme une table.


On peut l’utiliser pour renommer une séquence, une
vue ou un synonyme.
Il faut être propriétaire de l’objet pour que l’on
renomme.

RENAME OldName TO NewName

16
1.3. Renommer une table
Attention !!!
• Les contraintes d’intégrité et les index associés à
l’ancienne table sont automatiquement transférés
sur la nouvelle.
• Les vues, synonymes et procédures cataloguées
sont invalides.
• Il est aussi possible d’utiliser la directive
RENAME TO de l’instruction ALTER TABLE
pour renommer une table existante.

ALTER TABLE Acteur RENAME TO Star

17
1.4. Modification de la structure des tables
La commande ALTER TABLE permet de modifier la structure d’une
table. Elle permet de :

• Ajouter une ou plusieurs colonnes à une tables existante;


• Renommer une ou plusieurs colonnes dans une tables existante;
• Modifier le type d’une ou plusieurs colonnes dans une tables existante;
• Supprimer une ou plusieurs colonnes dans une tables existante;

18
1.4. Modification de la structure des tables
Ajout de colonnes
La directive ADD permet d'ajouter une ou plusieurs colonnes à une
tables existante.
• Ces colonnes sont initialisées à NULL.
• La contrainte NOT NULL de doit pas être utilisée sans la contrainte
DEFAULT.

ALTER TABLE Acteur ADD
( Département VARCHAR2(20),
NumDept VARCHAR2(5) DEFAULT ‘00000’ NOT NULL);

19
1.4. Modification de la structure des tables
Renommer des colonnes
Il faut utiliser la directive RENAME COLUMN de l'instruction ALTER
TABLE pour renommer une colonne existante.

Le nom de la nouvelle colonne ne doit pas être déjà utilisé par une colonne de
la table.

ALTER TABLE Acteur RENAME COLUMN Département TO DeptAct;

20
1.4. Modification de la structure des tables
Modifier le type des colonnes
La directive MODIFY permet de modifier le type d’une colonne existante si
celle-ci est vide.
Les contraintes en ligne peuvent être aussi modifiées par cette instruction
(DEFAULT, NOT NULL? UNIQUE, PRIMARY KEY, …)

ALTER TABLE Acteur MODIFY DeptAct VARCHAR2(12);


ALTER TABLE Acteur
MODIFY DeptAct CHAR(12)
DEFAULT ‘XXXXX’;

21
1.4. Modification de la structure des tables
Supprimer des colonnes
La directive DROP COLUMN permet de supprimer une colonne existante.
Il n’est pas possibilité de supprimer avec cette instruction:
• Des clés primaires référencées par des clés étrangères;
• Toutes les colonnes d’une table.

ALTER TABLE Acteur DROP COLUMN DeptAct;

22
1.5. Création et Destruction d'index

Retrouver une information enregistrée est certainement l'une des fonctions


les plus importantes de tout système de gestion de base de données
(SGBD).

Les index sont un des outils mis en oeuvre, par les SGBD pour localiser et
extraire rapidement les données.

L'utilisateur précise les index à créer mais n'indique pas lequel doit
être utilisé lors d'une extraction des données.
Le SGBD sélectionne lui même l'index le mieux adapté.

23
1.5. Création et Destruction d'index (suite)
Les index sont créés à l'aide de la commande suivante :

CREATE [UNIQUE] INDEX <nom_de_l'index>


ON <nom_de_la_table>
( <nom_de_l'attribut-1> [ordre]);
[,( <nom_de_l'attribut-2> [ordre]), ...( <nom_de_l'attribut-n> [ordre]]);

avec ordre : ASCending: croissant par défaut


DESCending décroissant

La destruction d'un index se fait par l'ordre :


DROP INDEX <nom_de_l'index>;

24
Exemple : création d’index

CREATE UNIQUE INDEX NDX_CENTRE


ON CENTRE (NUMC);

Remarque :
On n'autorise pas deux fois la même valeur pour le numéro du
centre NUMC. Il est clé primaire.

25
1.6. Destruction des tables

La commande DROP TABLE permet de supprimer une table inutilisée,


si l'utilisateur en question a le droit de suppression de
cette table.

Lors de sa destruction, les données qu'elle contient sont perdues et ne


peuvent être restaurées.

L'ensemble des objets (index, vues, synonymes, etc…) associés à cette


table sont également supprimés.

La destruction d'une table se fait ainsi :

DROP TABLE <nom_de_la_table>;

26
2. La mise à jour des données
(insertion, modification, suppression)

2.1. Création des données (insertion)


L'insertion des tuples dans la BD peut se faire en utilisant la
commande ci-dessous :

INSERT INTO <nom_de_la_table>


(<nom_de_l'attribut1>, <nom_de_l'attribut2>, ... <nom_de_l'attributn>)

VALUES (valeur1, valeur2,........, valeurn);

27
Exemples : INSERT INTO

INSERT INTO CENTRE (NUMC, NOMC, VILC, COUTINSC)


VALUES ( ‘103’,’Pleine Forme’, ‘PARIS’, 400);

INSERT INTO CENTRE


VALUES ( ‘107’,’Pleine Forme’, ‘PARIS’, 420);

INSERT INTO CENTRE (NUMC, NOMC, COUTINSC)


VALUES ( ‘111’,’Le nouveau’, 400);

INSERT INTO PROPOSE (NUMC, SPORT)


VALUES ( ‘103’,’FOOTBALL’);

28
2.2. Modification des données

La modification des tuples dans la BD peut se faire en utilisant la


commande ci-dessous :

UPDATE <nom_de_la_table>
SET <nom_de_l'attribut-1> = <expression-1>
[,<nom_de_l'attribut-2> = <expression-2>
, ... <nom_de_l'attribut-n> = <expression-n>]
[WHERE <condition>] ;

29
Exemples : UPDATE
Augmenter le coût d' inscription, pour tous les centres, de 5% :
UPDATE CENTRE
SET COUTINSC = COUTINSC * 105%;

Baisser le coût d' inscription, dans le centre 101, de 20% :


UPDATE CENTRE
SET COUTINSC = COUTINSC * 80%
WHERE NUMC = ‘101’;

30
2.3. Suppression des données

La suppression des tuples dans la BD peut se faire en utilisant la


commande ci-dessous :

DELETE FROM <nom_de_la_table>


[WHERE <condition>] ;

31
Exemples : DELETE

Supprimer de la BD les coordonnées de l'acteur de numéro 003

DELETE FROM ACTEUR


WHERE NUMA = ‘003’ ;

32
3. L'interrogation des données

Une requête SQL s'écrit sous la forme :

SELECT Colonne(s)
FROM Table(s) | Requête(s)
[ [ WHERE Condition(s) ]
[ GROUP BY Colonne(s)
[ HAVING Condition(s) ] ]
[ ORDER BY Colonne(s) ] ] ;

33
Une requête SQL peut donc être formulée comme suit :

Ces deux commandes sont


SELECT ……… obligatoires

FROM ………… N’est nécessaire que s’il y a des


conditions à exprimer :
des conditions de sélections et/ou
WHERE ………. des conditions de jointures

N’est nécessaire que s’il y


ORDER BY …… a un classement à
effectuer.
GROUP BY ……
N’est nécessaire que s’il y
a un groupement à
HAVING …….. effectuer.
Le HAVING ne peut exister
qu’avec GROUP BY

34
2004 /
3.1. Expression des projections

SELECT [ DISTINCT | UNIQUE] expression(s)


FROM table ;

L'élimination des doubles dans le résultat se fait par le mot clé DISTINCT ou
UNIQUE.
Les expressions peuvent être du type :
- le caractère * (étoile) désigne la liste de toutes les colonnes de la table,
- une ou plusieurs colonnes de la table, séparées par une virgule,
- une expression arithmétique (composée avec les opérateurs binaires , +, -, *, /)
- une expression arithmétique suivie par un titre

35
2004 /
3.2. Expression des sélections (avec ou sans projection)

SELECT [ DISTINCT ] expression(s)


FROM table
WHERE condition_de_sélection ;

Le mot clé WHERE permet de spécifier une ou plusieurs conditions de sélection.


La condition de sélection est une expression logique composée d'une suite de
conditions, prenant chacune la valeur 'vrai' ou 'faux'.
Ces conditions sont combinées entre elles par les opérateurs logique AND, OR ou
NOT.
Si la valeur de l'expression logique est 'vrai' pour chaque tuple considéré, celui-ci
fera partie du résultat.

36
2004 /
Les opérateurs de comparaison utilisés sont :

comparaison à une valeur =, <, >, <=, >=, <>


comparaison à une fourchette de valeurs BETWEEN / NOT BETWEEN
comparaison à une liste de valeurs IN / NOT IN
comparaison à un filtre LIKE / NOT LIKE
test sur l'indétermination d'une valeur IS NULL / IS NOT NULL
test 'TOUS' ALL
test 'AU MOINS UN‘ ANY
test existentiel EXISTS / NOT EXISTS

37
2004 /
Une expression logique contient un nombre quelconque d'opérateurs
NOT (la négation NON), AND (le ET logique) et OR (le OU
logique) :

l'opérateur NOT inverse la valeur du résultat,


le résultat de deux conditions logiques combinées par un AND est
'vrai' si les deux le sont, et 'faux' si une des deux est fausse,
le résultat de deux conditions logiques, combinées par un OR, est
'vrai' si une des deux conditions est 'vraie', et 'faux' si les deux sont
fausses.

38
2004 /
3.3. Expression du produit cartésien (avec ou sans projection)

SELECT [ DISTINCT ] expression(s)


FROM table1 , table2 ;

SELECT [ DISTINCT ] expression(s)


FROM table1 variable1, table2 variable2 ;

39
2004 /
3.4. Expression de la jointure (avec ou sans projection)

SELECT [ DISTINCT ] expression(s)


FROM table1 , table2
WHERE condition_de_jointure ;

SELECT [ DISTINCT ] expression(s)


FROM table1 variable1, table2 variable2
WHERE condition_de_jointure ;

40
2004 /
3.5. Expression de l'union

SELECT ... FROM ... [WHERE ... ]

UNION Compatibilité entre les colonnes

SELECT ... FROM ... [WHERE ... ] ;

41
2004 /
3.6. Expression de l’intersection

SELECT ... FROM ... [WHERE ... ]

INTERSECT Compatibilité entre les colonnes

SELECT ... FROM ... [WHERE ... ] ;

42
3.6. Expression de l’intersection (suite)

SELECT colonne(s)
FROM …
WHERE [… AND]
colonne IN
Compatibilité entre les colonnes

( SELECT colonne
FROM ...
[WHERE ...] );

43
3.7. Expression de la différence

SELECT ... FROM ... [WHERE ... ]

MINUS Compatibilité entre les colonnes

SELECT ... FROM ... [WHERE ... ] ;

44
3.7. Expression de la différence (suite)

SELECT colonne(s)
FROM …
WHERE [… AND]
colonne NOT IN
Compatibilité entre les colonnes

( SELECT colonne
FROM ...
[WHERE ...] );

45
2004 /
3.8. Expressions des calculs
Le partitionnement horizontal d'une table en fonction des valeurs d'un ou plusieurs
attributs de partitionnement, suivi de l'application d'une fonction de calcul
s'exprime en SQL comme suit :

SELECT fonction ( colonne) ...


FROM ...
[WHERE ...] ;

Fonction : SUM, AVG, MIN, MAX, COUNT

46
2004 /
3.9. Expressions des calculs de type agrégats

Le partitionnement horizontal d'une table en fonction des valeurs d'un ou plusieurs


attributs de partitionnement, suivi de l'application d'une fonction de calcul
s'exprime en SQL comme suit :

SELECT ... FROM ... [WHERE ...]


GROUP BY Attribut_de_partitionnement
[HAVING Condition_de_séléction_sur_le_calcul_effectué ] ;

47
2004 /
3.10. Expression du tri (classement)

Le tri des données dans une table se fait par la clause ORDER BY :

SELECT ... FROM ... [WHERE ...]


[GROUP BY Attribut_de_partitionnement
[HAVING Condition_de_séléction ] ]
ORDER BY Attribut(s)_de_tri (ou N° d’ordre de la colonne de tri) [Ordre] ;

L’ordre est par défaut croissant.

Ordre croisant : ASCending Ordre décroisant : DESCending

48
2004 /
4. Le concept de vue

Une vue est une table virtuelle dont le schéma et le contenu sont dérivés de la base
réelle par un ensemble de questions :

CREATE VIEW <nom_de_la_vue> [ (liste_des attributs) ]


AS <requête> [ WITH CHECK OPTION ] ;

DROP VIEW <nom_de_la_vue> ;

CREATE OR REPLACE VIEW


<nom_de_la_vue> [ (liste_des attributs) ] AS <requête> ;

49
2004 /
4. Le concept de vue (suite)

Une vue est une table virtuelle dont le schéma et le contenu sont
dérivés de la base réelle par un ensemble de questions :

CREATE TABLE <nom_de_la_table_copie>


AS <requête> ;

50
2004 /
Exemple 1 : Définition des tables de la BD SPORACT

Exemples : CREATE TABLE


Création de la table pour y stocker les sports proposés par les centres sportifs :
PROPOSE

CREATE TABLE PROPOSE


( NUMC VARCHAR(3),
SPORT VARCHAR(15),
CONSTRAINT PK_PRO PRIMARY KEY (NUMC, SPORT),
CONSTRAINT FK_PRO_NUMC_CEN FOREIGN KEY (NUMC)
REFERENCES CENTRE (NUMC)) ;

51
Exemple 1 : Définition des tables de la BD SPORACT

Exemples : CREATE TABLE


Création de la table qui contiendra les adhérents des centres sportifs qui sont
des acteurs de cinéma : ACTEUR

CREATE TABLE ACTEUR


( NUMA VARCHAR(3),
PRENA VARCHAR(10),
NOMA VARCHAR(10),
VILA VARCHAR(15),
CONSTRAINT PK_ACT PRIMARY KEY (NUMA) ) ;

52
Exemple 1 : Définition des tables de la BD SPORACT
Exemples : CREATE TABLE
Création de la table des adhérents avec comme contrainte supplémentaire :
Le nom doit être en majuscule

CREATE TABLE ACTEUR


( NUMA VARCHAR(3),
PRENA VARCHAR(10),
NOMA VARCHAR(10),
VILA VARCHAR(15),
CONSTRAINT PK_ACT PRIMARY KEY (NUMA),
CONSTRAINT CK_ACT_NOMA CHECK (NOMA = UPPER(NOMA)),

53
Exemple 1 : Définition des tables de la BD SPORACT
Exemples : CREATE TABLE
Création de la table pour les membres d'un centre sportif : ESTMEMBRE

CREATE TABLE ESTMEMBRE


( NUMA VARCHAR(3),
NUMC VARCHAR(3),
DATEINSC DATE DEFAULT SYSDATE NOT NULL,
PRIMARY KEY ( ??? ),
FOREIGN KEY ( ?? ) REFERENCES ( ??) );

Quelle est la clé primaire ? Quelle est la clé étrangère ?


Un même acteur peut s’inscrire dans plusieurs centre en même temps
On veut garder un historique de toutes les inscriptions.

54
Exemple 1 : Définition des tables de la BD SPORACT

Exemples : CREATE TABLE


Création de la table pour les sports pratiqués par les acteurs membres d'un centre
sportif : PRATIQUE

CREATE TABLE PRATIQUE


(NUMA VARCHAR(3),
SPORT VARCHAR(15),
NUMC VARCHAR(3),
CONSTRAINT PK_PRA PRIMARY KEY ( ??? ),
CONSTRAINT FK_PRA_PRO FOREIGN KEY ( ?? ) REFERENCES ( ??) ) );

Quelle est la clé primaire ? Quelle est la clé étrangère ?


Les sports pratiqués doivent être proposés

55
5. Exemples de requêtes SQL

Les différentes possibilités de traduction des


opérations de l’algèbre relationnelle sont
exposées ci-dessous.

Requêtes effectuées sur la BD SPORACT

56
2004 /
5. Exemples de requêtes SQL

Requête A1 : Projection
Afficher la liste des sports proposés.

Sans élimination des doubles


SELECT SPORT
FROM PROPOSE ;

Avec élimination des doubles

SELECT DISTINCT SPORT


FROM PROPOSE ;

57
2004 /
5. Exemples de requêtes SQL

Requête A2 : Projection
Afficher la liste des noms des centres sportifs et
les villes où ils se trouvent.

SELECT NOMC, VILC


FROM CENTRE ;

58
2004 /
5. Exemples de requêtes SQL
Requête B1 : Sélection
Afficher la liste des centres sportifs de Paris.

SELECT *
FROM CENTRE
WHERE UPPER(VILC) = ‘PARIS’ ;

SELECT *
FROM CENTRE
WHERE LOWER (VILC) = ‘paris’ ;

SELECT *
FROM CENTRE
WHERE VILC = "PARIS" ; sous access

59
2004 /
5. Exemples de requêtes SQL

Requête B2 : Sélection + Projection


Afficher la liste des noms des centres sportifs de Paris.

SELECT NOMC
FROM CENTRE
WHERE UPPER(VILC) = ‘PARIS’ ;

60
2004 /
5. Exemples de requêtes SQL

Requête B3 : Sélection + Projection


Afficher la liste des noms des centres sportifs de Paris ou de Nice.

SELECT NOMC
FROM CENTRE
WHERE UPPER(VILC) = ‘PARIS’
OR UPPER(VILC) = ‘NICE’;

SELECT NOMC
FROM CENTRE
WHERE UPPER(VILC) IN (‘PARIS’ , ‘NICE’);

61
2004 /
5. Exemples de requêtes SQL

Requête B4 : Sélection + Projection


Afficher la liste des noms des centres sportifs
dont le nom de la ville où ils se trouvent ne commence pas par MA

SELECT NOMC
FROM CENTRE
WHERE UPPER(VILC) NOT LIKE ‘MA%’ ;

62
2004 /
5. Exemples de requêtes SQL

Requête B5 : Sélection + Projection


Afficher la liste des numéros des acteurs membres d'un centre sportif
à partir du début de juin 2003 jusqu'en mars 2004

SELECT NUMA
FROM ESTMEMBRE
WHERE DATEINSC >= ’01-JUN-03’ AND DATEINSC <= ’31-MAR-04’ ;

La date est donnée entre quotes sous oracle

SELECT NUMA La date est donnée entre dièses sous access

FROM ESTMEMBRE
WHERE DATEINSC >= #03/06/01# AND DATEINSC <= #04/03/31# ;

63
2004 /
5. Exemples de requêtes SQL

Requête B5 : Sélection + Projection


Afficher la liste des numéros des acteurs membres d'un centre
sportif à partir du début de juin 2003 jusqu'en mars 2004

SELECT NUMA
FROM ESTMEMBRE
WHERE DATEINSC BETWEEN ’01-JUN-03’ AND ’31-MAR-04’ ;

64
2004 /
5. Exemples de requêtes SQL

Requête C : Produit cartésien


Afficher toutes les coordonnées des centres sportifs
avec la liste des sports qu'ils proposent.

SELECT *
FROM CENTRE, PROPOSE ;

65
2004 /
5. Exemples de requêtes SQL
Requête D : Jointure
Afficher la liste des numéros, des noms et des villes des centres sportifs
qui proposent le Karting.

SELECT CENTRE.NUMC, CENTRE.NOMC, CENTRE.VILC


FROM CENTRE, PROPOSE
WHERE UPPER(PROPOSE.SPORT) = ‘KARTING’
AND CENTRE.NUMC = PROPOSE.NUMC ;

SELECT C.NUMC, C.NOMC, C.VILC


FROM CENTRE C, PROPOSE P
WHERE UPPER(P.SPORT) = ‘KARTING’ AND C.NUMC = P.NUMC ;

SELECT C.NUMC, NOMC, VILC


FROM CENTRE C, PROPOSE P
WHERE UPPER(P.SPORT) = ‘KARTING’ AND C.NUMC = P.NUMC ;

66
2004 /
5. Exemples de requêtes SQL

Requête D : Jointure
Afficher la liste des numéros, des noms et des villes des centres sportifs
qui proposent le Karting.

SELECT CENTRE.NUMC, CENTRE.NOMC, CENTRE.VILC


FROM CENTRE, PROPOSE
WHERE UPPER(PROPOSE.SPORT) = "KARTING"
AND CENTRE.NUMC = PROPOSE.NUMC ;

SELECT NOMC, VILC


FROM CENTRE
WHERE NUMC
IN (SELECT NUMC
FROM PROPOSE
WHERE SPORT = "KARTING") ;

67
2004 /
5. Exemples de requêtes SQL
Requête D : Jointure
Afficher la liste des numéros, des noms et des villes des centres sportifs
qui proposent le Karting.

SELECT NOMC, VILC


FROM CENTRE
WHERE NUMC
= ANY (SELECT NUMC
FROMPROPOSE
WHERE UPPER(SPORT) = ‘KARTING’) ;

SELECT NOMC, VILC


FROM CENTRE
WHERE EXISTS
(SELECT *
FROMPROPOSE
WHERE UPPER(SPORT) = ‘KARTING’
AND CENTRE.NUMC = PROPOSE.NUMC) ;
68
2004 /
5. Exemples de requêtes SQL

Requête D : Jointure
Afficher la liste des numéros, des noms et des villes des centres
sportifs qui proposent le Karting.

SELECT NOMC, VILC


FROM CENTRE
WHERE 0<
(SELECT COUNT(*)
FROM PROPOSE
WHERE UPPER(SPORT) = ‘KARTING’)
AND CENTRE.NUMC = PROPOSE.NUMC) ;

69
2004 /
5. Exemples de requêtes SQL
Requête E : Union
Afficher la liste des numéros des centres sportifs qui proposent
le football ou le handball ou ceux qui se trouvent à villetaneuse.

SELECT NUMC
FROM PROPOSE
WHERE UPPER(SPORT) IN (‘FOOTBALL’, ‘HANDBALL’)

UNION

SELECT NUMC
FROM CENTRE
WHERE UPPER(VILC) = ‘VILLETANEUSE’ ;

70
2004 /
5. Exemples de requêtes SQL

Requête F : Intersection
Afficher la liste des numéros des centres sportifs qui
proposent à la fois le Golf et le Tennis.

SELECT NUMC
FROM PROPOSE
WHERE UPPER(SPORT) = ‘GOLF’

INTERSECT

SELECT NUMC
FROM PROPOSE
WHERE UPPER(SPORT) = ‘TENNIS’ ;

71
2004 /
5. Exemples de requêtes SQL
Requête F : Intersection
Afficher la liste des numéros des centres sportifs qui proposent
à la fois le Golf et le Tennis.

SELECT NUMC
FROM PROPOSE
WHERE UPPER(SPORT) = ‘GOLF’

AND NUMC IN

(SELECT NUMC
FROM PROPOSE
WHERE UPPER(SPORT) = ‘TENNIS’ ) ;

72
2004 /
5. Exemples de requêtes SQL
Requête F : Intersection
Afficher la liste des numéros des centres sportifs qui proposent
à la fois le Golf et le Tennis.

SELECT P1.NUMC
FROM PROPOSE P1
WHERE UPPER(P1.SPORT) = ‘GOLF’

AND EXISTS

(SELECT *
FROM PROPOSE P2
WHERE UPPER(P2.SPORT) = ‘TENNIS’
AND P1.NUMC = P2.NUMC ) ;

73
2004 /
5. Exemples de requêtes SQL
Requête F : Intersection
Afficher la liste des numéros des centres sportifs qui proposent
à la fois le Golf et le Tennis.

SELECT P1.NUMC
FROM PROPOSE P1, PROPOSE P2
WHERE UPPER(P1.SPORT) = ‘GOLF’
AND UPPER(P2.SPORT) = ‘TENNIS’
AND P1.NUMC = P2.NUMC ;

SELECT P1.NUMC
FROM PROPOSE P1
WHERE UPPER(P1.SPORT) = ‘GOLF’
AND P1.NUMC IN (SELECT P2.NUMC
FROM PROPOSE P2
WHERE UPPER(P2.SPORT) = ‘TENNIS’) ;

74
2004 /
5. Exemples de requêtes SQL
Requête G : Différence
Afficher la liste des numéros des centres sportifs
qui ne proposent que la natation (pas d'autres sports).

SELECT NUMC
FROM PROPOSE
WHERE UPPER(SPORT) = ‘NATATION’

MINUS

SELECT NUMC
FROM PROPOSE
WHERE UPPER(SPORT) <> ‘NATATION’ ;

75
2004 /
5. Exemples de requêtes SQL

Requête G : Différence
Afficher la liste des numéros des centres sportifs
qui ne proposent que la natation (pas d'autres sports).

SELECT NUMC
FROM PROPOSE
WHERE UPPER(SPORT) = ‘NATATION’

AND NUMC NOT IN

(SELECT NUMC
FROM PROPOSE
WHERE UPPER(SPORT) <> ‘NATATION’) ;

76
2004 /
5. Exemples de requêtes SQL
Requête H1 : Division
Afficher la liste des numéros des acteurs qui pratiquent tous les sports
proposés par le centre sportif de numéro 104.
Les acteurs concernés doivent les pratiquer dans le centre 104.

SELECT P1.NUMA
FROM PRATIQUE P1
WHERE NOT EXISTS
( SELECT *
FROM PROPOSE P2
WHERE NUMC = ‘104’
AND NOT EXISTS
(SELECT *
FROM PRATIQUE P3
WHERE P1.NUMC = P3.NUMC)
AND P2.NUMC = P3.NUMC) ;

77
2004 /
5. Exemples de requêtes SQL

Requête H2 : Division
Afficher la liste des numéros des acteurs qui pratiquent tous les sports
proposés par le centre sportif de numéro 104.
Les acteurs concernés ne les pratiquent pas forcément dans le centre 104.

SELECT P1.NUMA
FROM PRATIQUE P1
WHERE NOT EXISTS
( SELECT *
FROM PROPOSE P2
WHERE NOT EXISTS
(SELECT *
FROM PRATIQUE P3
WHERE P1.NUMC = P3.NUMC)
AND P2.NUMC = P3.NUMC) ;

78
2004 /
5. Exemples de requêtes SQL

Requête I 1 : Calculs
Afficher la liste des numéros des centres sportifs, les villes où ils
se trouvent et le coût d'inscription réduit de 10%..

SELECT NUMC, VILC, COUTINSC * 0,9


FROM CENTRE ;

Renommer des colonnes à l’affichage (à l’écran)

SELECT NUMC AS Centre, VILC AS Ville,


COUTINSC * 0,9 AS Nouveau_Coût
FROM CENTRE ;

79
2004 /
5. Exemples de requêtes SQL
Requête I 2 : Calculs
Afficher la valeur maximale du coût d'inscription dans les centres sportifs

SELECT MAX (COUTINSC)


FROM CENTRE ;

Requête I 3 : Calculs
Afficher la valeur minimale du coût d'inscription dans les centres sportifs

SELECT MIN (COUTINSC)


FROM CENTRE ;

Requête I 4 : Calculs
Compter le nombre d’adhérents (inscrits ou non) dans la table ACTEUR

SELECT COUNT (*)


FROM ACTEUR ;

80
2004 /
5. Exemples de requêtes SQL
Requête I 5 : Calculs
Afficher le(s) numéro(s) de(s) centre(s) sportif(s) dont le coût d'inscription
est le moins élevé.

SELECT NUMC, COUTINSC


FROM CENTRE WHERE
COUTINSC= ( SELECT MIN (COUTINSC) FROM CENTRE ) ;

Requête I 6 : Calculs
Afficher la liste des centres sportifs (NUMC, NOMC, COUTINSC)
les plus chers.

SELECT NUMC, NOMC, COUTINSC


FROM CENTRE WHERE
COUTINSC = ( SELECT MAX (COUTINSC) FROM CENTRE ) ;

81
2004 /
5. Exemples de requêtes SQL

Requête I 7 : Calculs
Afficher la liste des centres sportifs (NUMC, NOMC, COUTINSC) dont le
coût d'inscription est supérieur ou égal à la moyenne des coûts d'inscription
des différents centres.

SELECT NUMC || ‘ ‘ || NOMC AS Centre,


COUTINSC AS Coût_Inscription
FROM CENTRE WHERE
COUTINSC >= ( SELECT AVG(COUTINSC) FROM CENTRE ) ;

82
2004 /
5. Exemples de requêtes SQL

Requête I 8 : Calculs
Compter le nombre de sport(s) proposé(s) par chacun des centres sportifs

SELECT NUMC, COUNT(SPORT)


FROM PROPOSE
GROUP BY NUMC;

SELECT NUMC AS Centre, COUNT(SPORT) AS NbrSports


FROM PROPOSE
GROUP BY NUMC;

83
2004 /
5. Exemples de requêtes SQL

Requête I 9 : Calculs
Compter le nombre de sport(s) proposé(s) par chacun des
centres sportifs parisiens.

SELECT NUMC AS Centre, COUNT(SPORT) AS NbrSports


FROM PROPOSE
WHERE UPPER(VILC) = ‘PARIS’
GROUP BY NUMC;

84
2004 /
5. Exemples de requêtes SQL

Requête I 10 : Calculs

Compter le nombre de sport(s) proposé(s) par chacun des centres


sportifs parisiens. Présenter le résultat par ordre décroissant du
nombre de sports.

SELECT NUMC AS Centre, COUNT(SPORT) AS NbrSports


FROM PROPOSE
WHERE UPPER(VILC) = ‘PARIS’
GROUP BY NUMC
ORDER BY 2 DESC;

85
2004 /
5. Exemples de requêtes SQL

Requête I 11 : Calculs
Compter le nombre de sport(s) proposé(s) par chacun des centres sportifs
parisiens. Présenter le résultat par ordre décroissant du nombre de sports. Ne pas
afficher les résultats dont le nombre de sports proposés est inférieur à 5.

SELECT NUMC AS Centre, COUNT(SPORT) AS NbrSports


FROM PROPOSE
WHERE UPPER(VILC) = ‘PARIS’
GROUP BY NUMC
HAVING COUNT(SPORT) < 5
ORDER BY 2 DESC;

86
2004 /
5. Exemples de requêtes SQL

Requête I 11 : Calculs
Compter le nombre de sport(s) proposé(s) par chacun des centres sportifs parisiens.
Présenter le résultat par ordre décroissant du nombre de sports. Ne pas afficher les
résultats dont le nombre de sports proposés est inférieur à 5.

CREATE OR REPLACE VIEW


V (CENTRE, NBSPORTS) AS
(SELECT NUMC, COUNT(SPORT)
FROM PROPOSE WHERE UPPER(VILC) = ‘PARIS’ GROUP BY NUMC) ;

SELECT *
FROM V
WHERE NBSPORTS < 5
ORDER BY 2 DESC ;
87
2004 /
6. Notion de transaction

SQL> COMMIT ; -- permet de valider les mises à jour des données

SQL> ROLLBACK ; -- permet d’abandonner les mises à jour des données

SQL> EXIT ; -- permet de terminer une session oracle


SQL> QUIT ; -- permet de terminer une session oracle

88
2004 /
7. Exemples de commandes SQL PLUS sous ORACLE

SQL> DESC table -- permet d’avoir la description de la table

SQL> SHOW USER -- permet d’avoir le nom de l’utilisateur connecté à la BD

SQL> SELECT table_name FROM user_tables ; -- permet d’avoir les noms des créées
par l’utilisateur connecté à la BD

SQL> TTILE ‘message à afficher’ -- permet d’avoir un titre si la requête renvoie des valeurs
SQL> COLUMN colonne FORMAT A10 -- la colonne est affichée sur 10 positions
SQL> COLUMN colonne FORMAT 999 -- la colonne est affichée sur 3 positions
SQL> SET LINES 100 SQL> SET PAGES 100
SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MM-YYYY' ;
SQL> SELECT … FROM … WHERE … ;

89
2004 /
8. Exemples de commandes SQL PLUS sous ORACLE

SYSDATE est la date du système.

REM afficher le jour de naissance d’une personne.


TO_DATE (MM-DD-YYYY HH24:MI:SS') "Now" FROM DUAL.

TO_CHAR (c) convertit la chaîne en VARCHAR2.

TO_CHAR (d[, format]) convertit la date en VARCHAR2.

RPAD(c1, n, c2) ; insertion à droite de c2 dans c1 sur n caractères.

LPAD(c1, n, c2) ; insertion à gauche de c2 dans c1 sur n caractères.

SUBSTR(c, n, [t]) extraction de la sous chaîne c commençant à la position n sur t caractères.

LENGTH(c) Longueur de la chaîne c.

DECODE(colonne, val1, result1, val2, result2, …) programme un cas.

NVL(expr1, expr2) convertit expr1 susceptible d’être nulle en une valeur réelle (expr2).

TRUNC(n, m) coupure de n à m décimales.

ROUND(d, format) arrondit une date d selon un format (exemple YEAR).

EXTRACT({YEAR | MONTH | DAYFROM} FROM d).

ADD_MONTHS(d,n) ajoute n mois à la date d.

90
2004 /
8. Exemples de commandes SQL PLUS sous ORACLE

SELECT SYSDATE FROM DUAL;

REM afficher le jour de naissance d’une personne


SELECT TO_CHAR (TO_DATE('16-10-1980', 'DD-MM-YYYY'),'DAY') JOURNAISSANCE FROM DUAL;

select TO_CHAR (TO_DATE('30-11-2004', 'DD-MM-YYYY'),'DAY') JOURNAISSANCE FROM DUAL;


SELECT RPAD('Soleil',17,'bla') "RPAD exemple" FROM DUAL;
SELECT LPAD('DESS EID',15,'*.') "LPAD exemple" FROM DUAL;
SELECT SUBSTR('DESS EID',6,3) "SUBSTR exemple" FROM DUAL;
SELECT TO_CHAR (SYSDATE, 'MM-DD-YYYY HH24:MI:SS') "Now" FROM DUAL;
SELECT LENGTH('WEB WAREHOUSE') "Longueur en caractères" FROM DUAL;
SELECT DECODE(ANNEE, 1, 'Première', 2, 'Seconde', 'Valeur différente de 1 et de 2 !!') AS ANETUDE FROM ELEVES;
SELECT NVL(SPECIALITE, 'Valeur NON renseignée') FROM PROFESSEURS;
SELECT ROUND(17.0958,1) "ROUND exemple" FROM DUAL;
SELECT TRUNC(1958.0917,1) "TRUNC exemple" FROM DUAL;
SELECT ROUND(TO_DATE('17-SEP-2002'), 'YEAR') "New Year" FROM DUAL;
SELECT EXTRACT(YEAR FROM SYSDATE) FROM DUAL;
SELECT ADD_MONTHS(SYSDATE,7) FROM DUAL;

91
2004 /
A VOUS DE JOUER

Etant donné le schéma relationnel de la BD SPORACT

CEN  CENTRE (NUMC, NOMC, VILC, COUTINSC)


PRO  PROPOSE (NUMC, SPORT)
ACT  ACTEUR (NUMA, PRENA, NOMA, VILA)
EST  ESTMEMBRE (NUMA, NUMC, DATEINSC)
PRA  PRATIQUE (NUMA, SPORT, NUMC)

QUESTIONS
Rédigez en langage SQL les requêtes permettant d'obtenir :

a) Noms et villes des centres dont le coût d'inscription est inférieur à 500 €;
b) Prénoms et noms des acteurs inscrits dans des centres à Paris;
c) Coût moyen d'inscription dans un centre (tous les centres étant considérés);
d) Coûts moyens d'inscription pour chaque nom de centre, dans l'ordre alphabétique croissant des noms
de centres (coût moyen pour les centres "Green Park", coût moyen pour les centres "Nannou", etc...);
e) Nombre d'acteurs inscrits dans les centres "Nannou Center".
f) Prénoms et noms des acteurs qui ne pratiquent aucun sport sur une période donnée;

92
2004 /
A VOUS DE JOUER

Etant donné le schéma relationnel de la BD SPORACT

CEN  CENTRE (NUMC, NOMC, VILC, COUTINSC)


PRO  PROPOSE (NUMC, SPORT)
ACT  ACTEUR (NUMA, PRENA, NOMA, VILA)
EST  ESTMEMBRE (NUMA, NUMC, DATEINSC)
PRA  PRATIQUE (NUMA, SPORT, NUMC)

QUESTIONS
Indiquez le résultat des requêtes SQL suivantes sur l'exemple d'occurrences de la BD SPORACT :

a) SELECT A.NOMA FROM ACTEUR A, ESTMEMBRE E


WHERE ( E.DATEINSC BETWEEN ’01-JAN-02’ AND ’17-SEP-04’ ) AND A.NUMA = E.NUMA ;

b) SELECT DISTINCT A.NOMA FROM ACTEUR A, ESTMEMBRE E


WHERE ( E.DATEINSC BETWEEN ’01-JAN-02’ AND ’17-SEP-04’ ) AND A.NUMA = E.NUMA ;

c) SELECT A.NOMA FROM ACTEUR A, ESTMEMBRE E


WHERE ( E.DATEINSC BETWEEN ’01-JAN-02’ AND ’17-SEP-04’ ) AND A.NUMA = E.NUMA
ORDER BY A.NOMA ;

93
2004 /
A VOUS DE JOUER
Pour les requêtes suivantes, indiquez quelles sont les réponses correctes parmi celles proposées :

a) Noms des acteurs qui pratiquent le tennis ou la natation


R1: SELECT NOMA FROM ACTEUR WHERE NUMA
IN ( SELECT NUMA FROM PRATIQUE WHERE SPORT = ‘Tennis’
UNION
SELECT NUMA FROM PRATIQUE WHERE SPORT = ‘Natation’ ) ;

R2 : SELECT NOMA FROM ACTEUR WHERE EXISTS


( SELECT NUMA FROM PRATIQUE WHERE SPORT = ‘Tennis’
UNION
SELECT NUMA FROM PRATIQUE WHERE SPORT = ‘Natation’ ) ;

R3 : SELECT NOMA FROM ACTEUR, PRATIQUE WHERE


( SPORT = ‘Tennis’ OR SPORT = ‘Natation’ ) AND ACTEUR.NUMA = PRATIQUE.NUMA ;

b) Numéros des acteurs qui pratiquent le tennis dans les centres ‘Nannou Center’
R1 : SELECT NUMA FROM PRATIQUE WHERE SPORT = ‘Tennis’
INTERSECT
SELECT NUMA FROM ESTMEMBRE, CENTRE WHERE NOMC = ‘Nannou Center’
AND CENTRE.NUMC = ESTMEMBRE.NUMC ;

R2 : SELECT NUMA FROM PRATIQUE, CENTRE WHERE SPORT = ‘Tennis’


AND NOMC = ‘Nannou Center’ AND PRATIQUE.NUMC = CENTRE.NUMC ;

94
2004 /
A VOUS DE JOUER
Pour les requêtes suivantes, indiquez quelles sont les réponses correctes parmi celles proposées :

c) Numéros des centres qui ne proposent pas le football

R1 : SELECT NUMC FROM PROPOSE WHERE SPORT <>’Football’ ;

R2 : SELECT NUMC FROM CENTRE WHERE NUMC


NOT IN
( SELECT NUMC FROM PROPOSE WHERE SPORT = ‘Football’ ) ;

R3 : SELECT NUMC FROM CENTRE WHERE NOT EXISTS


( SELECT NUMC FROM PROPOSE WHERE SPORT = ‘Football’
AND CENTRE.NUMC = PROPOSE.NUMC ) ;

95
2004 /
Exemple 2 : BD ‘BDEmp
ToyesAreAs

96
2004 /
Le Langage SQL
L’algèbre relationnelle est composée de plusieurs opérations.
Les plus connues sont :
- la projection (garder des colonnes à partir d’une table) ;
- la sélection (restriction) (garder des lignes à partir d’une table) ;
- l’union de 2 tables :
- l’intersection entre 2 tables ;
- la différence entre 2 tables ;
- le produit cartésien entre 2 tables (croiser 2 tables) ;
- la jointure entre 2 tables (rapprocher 2 tables sur des critères) ;
- la division ;
- Etc....

Des opérateurs :
- le calcul (minimum, maximum, moyenne, somme, comptage) dans
une table ;
- le tri des données etc.…

Le langage SQL est donc le langage qui permet d’exprimer ces opérations.

97
2004 /
Exemple BDEmp
Les données de base gérées par le service des Ressources
Humaines de l’entreprise TOYESAREAS sont décrites
ci-dessous :
Un employé est identifié par son numéro et est décrit par
son nom et sa date d’embauche ;
Un service est identifié par son numéro et est décrit par
son nom ;
La carrière d’un employé est décrite par les différents
postes occupés dans les différents services.

98
2004 /
Exemple BDEmp
Dictionnaire de données :
Colonne
Champ
Attribut Signification Type de données

DATEDEB Date de début d’affectation au service Date


DATEFIN Date de fin d’affectation au service Date
DATEEMB Date d’embauche de l’employé Date
DATESORTIE Date de sortie de l’employé Date
NOMEMP Nom de l’employé Caractère (20)
NOMSERV Nom du service Caractère (20)
NUMEMP Numéro de l’employé Numérique (4)
NUMSERV Numéro du service Caractère (2)
POSTE Poste occupé Caractère (20)
SALAIRE Salaire de l’employé Numérique (12,3)

99
2004 /
Exemple BDEmp
 Les tables de la Base de Données sont décrites par les
schémas des relations ci-dessous :
 BDEmp
Table des employés : Employés (NumEmp, NomEmp, DateEmb, DateSortie)

Table des services : Services (NumServ, NomServ)


Table des postes :
Postes (NumEmp*, Poste, Salaire, NumServ*, DateDeb, DateFin) ? Clé primaire
Postes (NumEmp*, NumServ*, Poste, Salaire, DateDeb, DateFin) ? Clé primaire
Postes (NumEmp*, NumServ*, DateDeb, Poste, Salaire, DateFin) ? Clé primaire
Postes (NumEmp*, DateDeb, NumServ*, Poste, Salaire, DateFin) ? Clé primaire

100
2004 /
Exemple BDEmp
La création des tables se fait comme suit :

CREATE TABLE Employes


(NUMEMP NUMBER(4) PRIMARY KEY, NOMEMP VARCHAR(20) NOT NULL,
DATEEMB DATE , DATESORTIE DATE) ;

CREATE TABLE Services


(NUMSERV VARCHAR(2) PRIMARY KEY, NOMSERV VARCHAR(20) NOT NULL) ;

CREATE TABLE Postes


(NUMEMP NUMBER(4), NUMSERV VARCHAR(2), DATEDEB DATE, POSTE VARCHAR(20),
SALAIRE NUMBER(13,2), DATEFIN DATE,
CONSTRAINT PK_Postes PRIMARY KEY (NUMEMP, DATEDEB),
CONSTRAINT FK_PosteEmp FOREIGN KEY (NUMEMP) REFERENCES EMPLOYES,
CONSTRAINT FK_PosteServ FOREIGN KEY (NUMSERV) REFERENCES SERVICES) ;

101
2004 /
Exemple BDEmp
L ’insertion des données dans les tables se fait comme suit :

INSERT INTO Employes (NUMEMP, NOMEMP, DATEEMB)


VALUES (9802, ‘CLEMENCE ’, ‘17-OCT-98 ’) ;

LA modification des données dans les tables se fait comme suit :


UPDATE Employes
SET DATEMB = ‘16-OCT-98 ’ WHERE NUMEMP = 9802 ;

LA suppression des données dans les tables se fait comme suit :


DELETE FROM Employes WHERE NUMEMP=2004;

102
2004 /
Exemple BDEmp

103
2004 /
Requête A1 : Liste des noms de tous les employés :

Il faut afficher une seule colonne, celle qui contient les noms des employés, à partir
de la tables des employés. Ce qui se traduit par :

Algèbre Relationnelle

Résultat = Projection ( Employés, { NomEmp } )

104
2004 /
Ce qui se traduit en SQL par :

SQL
Sans élimination des doubles SELECT NomEmp FROM Employés ;
ou
SELECT Employés.NomEmp FROM Employés ;

NomEmp
CHEVALIER
Résultat LEROY
affiché : LAMI
SULTAN
CLEMENCE
CAVALIER
ALEXANDRE

SQL
pour l’élimination des doubles SELECT DISTINCT NomEmp FROM Employés ;

105
2004 /
Requête A2 : Liste de tous les postes.

Il faut afficher une seule colonne, celle qui contient les postes, à partir de la table des
postes. On veut éliminer les doublons. Ce qui se traduit par :

Algèbre Relationnelle
Résultat = Projection ( Postes, {Poste} )

SQL

SELECT DISTINCT Poste


FROM Postes ;

106
2004 /
Requête A3 : Liste de tous les employés :

Il faut afficher toutes les colonnes de la table (tous les détails) :

Algèbre Relationnelle

R = Projection ( Employés, { NumEmp, NomEmp, DateEmb, DateSortie } )

SQL
SELECT * FROM Employés ;
ou
SELECT NumEmp, NomEmp, DateEmb, DateSortie FROM Employés ;

107
2004 /
Requête A4 : Liste des employés embauchés à partir du 1er janvier 1999
(la date d ’embauche >31 déc 1998):
Il faut sélectionner les lignes qui correspondent au critère demandé. On veut afficher toutes les colonnes
de la table des employés qui correspondent à ce critère. Ce qui se traduit par :

Algèbre Relationnelle
R = Sélection ( Employés, { DateEmb >= 1er janvier 1999 } )

La constante du type date 31 décembre 1998


s’écrit : sous Oracle ’31-DEC-98’ ; sous Access #12/31/1998#

SQL
SELECT * FROM Employés
WHERE DateEmb > #12/31/1998#;

108
2004 /
Requête A5 : Liste des noms de tous les employés de Paris.

Algèbre Relationnelle
T1 = Sélection ( Employés, { VilleEmp = ‘Paris’ } )
R = Projection ( T1, { NomEmp } )

R = Projection ( Sélection ( Employés, { VilleEmp = ‘Paris’ } ), { NomEmp } )


La constante ‘Paris’ ou « Paris » selon les logiciels

SQL
SELECT DISTINCT NomEmp FROM Employés
WHERE VilleEmp = ‘Paris’ ; Oracle

SELECT DISTINCT NomEmp FROM Employés


WHERE VilleEmp = “Paris” ; Access

109
2004 /
Requête A6 : Liste des employés dont le nom commence par la lettre C.
Il faut sélectionner les lignes qui correspondent au critère demandé, en n’affichant que 2 colonnes
(numéro et nom) de la table des employés qui correspondent à ce critère. Ce qui se traduit par :

Algèbre Relationnelle
Etape1 = Sélection ( Employés, {NomEmp commence par C} )
Résultat = Projection (Etape1, {NumEmp, NomEmp} )

SQL
SELECT Employés.NumEmp, Employés.NomEmp
FROM Employés
WHERE NomEmp LIKE "C*"; Access

Remarque : WHERE NomEmp LIKE "C%"; Oracle

110
2004 /
Requête A7 : Liste des postes occupés dont le salaire de l’employé est
supérieur ou égal à 3000.
Il faut sélectionner les lignes qui correspondent au critère demandé, et afficher toutes les colonnes
de la table des postes qui correspondent à ce critère. Ce qui se traduit par :

Algèbre Relationnelle

Résultat = Sélection ( Postes, {Salaire >=3000 et DateFin est vide} )

SQL

SELECT * FROM Postes


WHERE Salaire >= 3000 AND DateFin IS NULL;

111
2004 /
Exemples de Conditions de sélection

 intervalle de valeurs : salaire compris entre 1000 et 2000


salaire >= 1000 AND salaire <= 2000
salaire BETWEEN 1000 AND 2000
 liste de valeurs : salaire = 1000 ou 1100 ou 1200
salaire = 1000 OR salaire = 1100 OR salaire = 1200
salaire IN ( 1000 , 1100, 1200 )
 comparaison avec un filtre : commence par, se termine par, contient
nom commence par c : nom LIKE « C* »
nom se termine par c : nom LIKE « *C »
nom contient c : nom LIKE « *C* »

112
2004 /
Exemples de Conditions de sélection

 valeur vide : le nom est vide


nom IS NULL
 valeur non vide : le nom est non vide
nom IS NOT NULL
 liste de valeurs : salaire <> 1000 et salaire <>2000
salaire <> 1000 AND salaire <> 2000
salaire NOT IN ( 1000 , 2000 )

113
2004 /
Requête B1 : Trier (classer) les employés par ordre décroissant sur les noms.
Il faut afficher toutes les colonnes de la table des employés.

Algèbre Relationnelle
Résultat = Tri ( Employés, {Nom DéCroissant} )

SQL
SELECT *
FROM Employés
ORDER BY NomEmp DESC ;

l’ordre est croissant par défaut (ASC)


l’ordre décroissant s’obtient avec la clause DESC

114
2004 /
Requête B2 : Trier (classer) les postes occupés par ordre croissant sur les
salaires.
Il faut afficher les colonnes SALAIRE et NUMSERV de la table des postes après avoir trié les
données.

Algèbre Relationnelle
Etape1 = Tri ( Postes, {Salaire Croissant} )
Résultat = Projection ( Etape1, {Salaire, NumServ} )

SQL
SELECT Salaire, NumServ
FROM Postes SELECT Salaire, NumServ
ORDER BY Salaire ; FROM Postes
ORDER BY 1 ;
l’ordre est croissant par défaut le 1 désigne la colonne SALAIRE

115
2004 /
Requête C1 : Faire un calcul sur une colonne ; calculer la moyenne des salaires.
Il faut afficher une seule valeur la moyenne des salaires.

Algèbre Relationnelle

Résultat = Calcul ( Postes, {Moyenne(Salaire) nommée Moyenne_Salr} )

SQL
SELECT AVG(Salaire)
FROM Postes;

SELECT AVG(Salaire) AS Moyenne_Salr


FROM Postes;

116
2004 /
Requête C2 : Faire un calcul sur une colonne ; calculer la moyenne des salaires
pour les postes actuellement occupés.
Il faut afficher une seule valeur la moyenne des salaires nommée Moyenne_Salaires

Algèbre Relationnelle
Etape1 = Sélection ( Postes, { DateDeb est non vide et DateFin est vide } )
Résultat = Calcul ( Etape1, { Moyenne(Salaire) nommée Moyenne_Salaires } )

SQL
SELECT AVG(Postes.Salaire) AS Moyenne_Salaires
FROM Postes
WHERE DateDeb IS NOT NULL AND DateFin IS NULL;

117
2004 /
Requête C3 : Faire un calcul sur une colonne ; calculer le plus bas salaire.

Il faut afficher une seule valeur le minimum des salaires nommée Le_plus_bas_salaire

Algèbre Relationnelle

Résultat = Calcul ( Postes, { Min(Salaire) nommée Le_Plus_Bas_Salaire } )

SQL
SELECT MIN(Salaire) AS Le_Plus_Bas_Salaire
FROM Postes ;

118
2004 /
Requête C4 : Faire un calcul sur une colonne ; calculer le plus haut salaire.

Il faut afficher une seule valeur le maximum des salaires nommée Le_plus_haut_salaire

Algèbre Relationnelle

Résultat = Calcul ( Postes, { Max(Salaire) nommée Le_Plus_haut_Salaire } )

SQL
SELECT MAX(Salaire) AS Le_haut_Bas_Salaire
FROM Postes ;

119
2004 /
Requête C5 : Faire un calcul sur une colonne ; Compter le nombre de salariés qui
répondent à des critères
Il faut afficher une seule valeur le nombre de salaire(s) > 3000 , nommée Nombre_Salariés

Algèbre Relationnelle
Etape1 = Sélection ( Postes, { Salaire > 3000 et DateFin est vide } )
Résultat = Calcul ( Etape1, { Compter(Salaire) nommée Nombre_Salariés } )

SQL
SELECT COUNT(*) AS Nombre_Salariés
FROM Postes
WHERE Salaire > 3000 AND DateFin IS NULL;

120
2004 /
Requête C6 : Faire des synthèses dans une table ; créer des partitions sur les
valeurs ; Faire des groupements par service.
Il faut afficher
Pour chaque service la moyenne des salaires , nommée MoyenneDesSalaires

Algèbre Relationnelle
Etape1 = Sélection ( Postes, { DateFin est vide } )
Résultat = Grouper ( Numserv, Calcul ( Etape1, { Moyenne(Salaire) nommée MoyenneDesSalaires } )

SQL
SELECT Postes.NumServ,
AVG(Postes.Salaire) AS MoyenneDeSalaires
FROM Postes
WHERE DateFin IS NULL
GROUP BY Postes.NumServ;

121
2004 /
Requête E1 : Afficher les employés dont le salaire > 3000 €. On demande le
numéro, le nom et le salaire.
Faire des jointures entre plusieurs tables.
Algèbre Relationnelle
Etape1 = Sélection ( Postes, {Salaire > 3000 )
Etape2 = Jointure ( Etape1, Employés, { NumEmp } )
Résultat = Projection ( Etape2, {NumEmp, NomEmp, Salaire} )

SQL
SELECT Employés.NumEmp, Employés.NomEmp, Postes.Salaire
FROM Employés, Postes
WHERE Employés.NumEmp = Postes.NumEmp
AND Postes.Salaire > 3000 ;

122
2004 /
Requête E2 : Afficher les employés qui travaillent dans le service du personnel.
Faire des jointures entre plusieurs tables.

Algèbre Relationnelle
Etape1 = Sélection ( Services, {NomServ = « Personnel »} )
Etape2 = Jointure ( Etape1, Postes, { NumServ } )
Etape3 = Jointure ( Etape2, Employés, { NumEmp } )
Résultat = Projection ( Etape3, {NumEmp, NomEmp} )

SQL
SELECT Employés.NumEmp, Employés.NomEmp
FROM Employés, Postes, Services
WHERE Employés.NumEmp = Postes.NumEmp
AND Postes.NumServ = Services.NumServ
AND Services.NomServ="Personnel";

123
2004 /
Requête E5 : Faire des jointures entre plusieurs tables
Algèbre Relationnelle
Etape1 = Sélection ( Services, {NomServ = « Personnel »} )
Etape2 = Jointure ( Etape1, Postes, { NumServ } )
Etape3 = Jointure ( Etape2, Employés, { NumEmp } )
Résultat = Projection ( Etape3, {NumEmp, NomEmp} )

SQL
SELECT Employés.NumEmp, Employés.NomEmp
FROM Employés, Postes, Services
WHERE Employés.NumEmp = Postes.NumEmp
AND Postes.NumServ = Services.NumServ
AND Postes.DateFin IS NULL AND Services.Nomserv = “Personnel”
ORDER BY Employés.NomEmp DESC;

124
2004 /
Requête XCE1 : Faire des synthèses dans une ou plusieurs tables ; créer des
partitions sur les valeurs ; Faire des groupements par service.
Il faut afficher
Pour chaque service le nombre des salariés , nommée NombreSalariés

SQL
SELECT NomServ AS NomService,
COUNT(Salaire) AS NombreSalariés
FROM Postes, Services
WHERE Postes.NumServ = Services.NumServ AND DateFin IS NULL
GROUP BY NomServ ;

125
2004 /
SQL
SELECT Colonne(s) FROM Table(s)
WHERE Condition(s)
ORDER BY …
GROUP BY …
HAVING ….;

Colonnes :
 Colonne simple issue d’une table
 Calcul (AVG ; SUM ; MIN ; MAX ; COUNT)
 Une * (pour désigner toutes les colonnes)
 Un nouveau nom de colonne ( AS le_nouveau_nom)
 Pour éliminer les doubles (DISTINCT)

126
2004 /
Conditions :
• conditions simples (Colonne comparée à une Valeur)
• conditions simples (Colonne comparée à Colonne)
• des conditions simples connectées avec des AND ; des OR ; des NOT

• La comparaison peut se faire avec


LIKE ; BETWEEN ; IN ; IS NULL
NOT LIKE ; NOT BETWEEN ; NOT IN ; IS NOT NULL

Les opérateurs de comparaison sont :


< <= = > >= <>

127
2004 /
On appellera BLOC SQL toute commande du type :
SELECT ... FROM ... WHERE ...

Pour effectuer un classement des données (tri des données),


il faut ajouter la commande ORDER BY au bloc sql :

SELECT ... FROM ... WHERE ...


ORDER BY colonne(s) suivie(s) éventuellement de l’ordre ;
L’ordre peut être croissant
(par défaut il est croissant  dans SQL : ASC)

L’ordre décroissant est obtenu dans SQL avec la commande DESC.

ASC veut dire ASCending (= croissant)


DESC veut dire DESCending (= décroissant)

128
2004 /
Pour effectuer un groupement des données ,
il faut ajouter la commande GROUP BY au bloc sql :

SELECT ... FROM ... WHERE …


ORDER BY …
GROUP BY colonne(s) ;

Pour effectuer une sélection sur le groupement, en cours de réalisation,


il faut ajouter la commande HAVING condition(s) au bloc sql :

SELECT ... FROM ... WHERE …


ORDER BY …
GROUP BY colonne(s)
HAVING condition(s);

129
2004 /
Une requête SQL peut donc être formulée comme suit :

Ces deux commandes sont


SELECT ……… obligatoires

FROM ………… N’est nécessaire que s’il y a des


conditions à exprimer :
des conditions de sélections et/ou
WHERE ………. des conditions de jointures

N’est nécessaire que s’il y


ORDER BY …… a un classement à
effectuer.
GROUP BY ……
N’est nécessaire que s’il y
a un groupement à
HAVING …….. effectuer.
Le HAVING ne peut exister
qu’avec GROUP BY

130
2004 /

Vous aimerez peut-être aussi