Académique Documents
Professionnel Documents
Culture Documents
Mayssa TRABELSI
mayssa-trabelsi@outlook.com
Chapitre 1 Introduction
Le langage SQL (Structered Query Language) est le langage standard de gestion des bases de
données relationnelles. Il permet de définir, manipuler et contrôler les données. Ainsi SQL est
constitué de trois sous langages :
1. LDD (Langage de Définition de Données) incluant les requêtes CREATE, ALTER,
DROP, RENAME, TRUNCATE. Le LDD permet de créer, de changer et d'éliminer une
structure de données Oracle.
3. LCD (langage de contrôle de données) incluant les requêtes GRANT, REVOKE. Le LCD
permet de donner ou de priver les droits d'accès à une base de données Oracle ou à ces
structures.
SQL a été implémenté par IBM dans les années 70, et se base sur l'algèbre relationnelle de
Codd. Chaque SGBDR (DB2, Informix, Ingres, SQL SERVER...) présente sa propre version de
SQL. ORACLE possède sa propre version. Ceci dit, toutes les versions sont fondées sur le même
noyau.
DATE : Le type de données incluant la date et l'heure. Le format par défaut est le
suivant : DD-MON-YY, par exemple : `04-0CT-04'.
Chapitre 1 : Introduction 6
BFILE : Données binaires stockées dans un fichier externe allant jusqu'à 4 Go.
ROWID : Chaîne hexadécimale représentant l'adresse unique d'une ligne dans une
table. C'est un type de données qu'on peut utiliser pour stocker les valeurs retournées
par le pseudo colonne ROWID.
INTERVAL DAY TO SECOND : Stocke une période de temps sous forme de jours
et de secondes.
Remarque
- Une colonne de type LONG ne peut pas être copiée lors de la création d'une table à l'aide
d'une requête SELECT.
- Une colonne de type LONG ne peut pas être incluse dans une clause GROUP BY ou
HAVING.
- Une table ne peut contenir qu'une seule colonne de type LONG.
- Une colonne de type LONG ne peut pas avoir de contrainte.
- Le type de données CLOB inclut LONG.
- Il n'y a pas de type de données booléen, ce dernier peut être simulé par NUMBER(1) ou
CHAR(1).
- Une colonne non renseignée porte la valeur NULL qui est différente de 0 pour les nombres
et de la chaîne vide pour les chaînes de caractères.
Chapitre 2 La sélection simple
2.1 La sélection simple
La requête SELECT nous permet d'extraire des données à partir d'une base de données. La
clause SELECT est suivie d'une ou de plusieurs colonnes, ce sont les colonnes qu'on veut
extraire. La clause FROM est suivie par le nom de la table à partir de laquelle on veut afficher les
données.
Tous les exemples qui suivent se basent sur les tables EMP, DEPT et SALGRADE.
La requête R1 affiche toutes les colonnes de la table EMP :
REQ 1 :
SELECT * FROM EMP ;
Le symbole ‘*’ remplace toutes les colonnes de la table EMP.
REQ 2 :
SELECT EMPNO, ENAME, SAL FROM EMP ;
Cette opération est dite opération de projection sur EMP sur les colonnes EMPNO, ENAME et
SAL.
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
………..
………..
………..
………..
………..
………..
………..
………..
ENAME ANNSAL
SMITH 9600
ALLEN 19200
…
REQ 5 :
Afficher les codes et les noms concaténés de tous employés ?
SELECT EMPNO||ENAME EMPLOYEE FROM EMP ;
EMPLOYEE
7369SMITH
7499ALLEN
……….
REQ 6
SELECT EMPNO||„ „||ENAME EMPLOYEE, „works in‟, DEPTNO
FROM EMP ;
………
………
Chapitre 2 : La sélection simple 9
Nous avons introduit le littéral „ „ (espace) concaténé à EMPNO et ENAME, ainsi que le
littéral ‘works in’. Ces deux littéraux s’affichent pour chaque ligne.
ENAME ANNSAL
SMITH
ALLEN 19500
WARD 15500
JONES
MARTIN 16400
BLAKE
CLARK
SCOTT
KING
TURNER 18000
ADAMS
JAMES
FORD
MILLER
Quoique le salaire de SMITH est de 9600, le résultat affiché ci-dessus est NULL. La fonction
NVL(col,val) nous sera très utile dans ce cas, car cette fonction retourne val si la colonne
porte la valeur NULL.
REQ 8
La requête est :
SELECT ENAME, SAL*12+NVL(COMM,0) ANNSAL FROM EMP ;
REQ 9
SELECT DISTINCT DEPTNO FROM EMP ;
DEPTNO
10
20
30
DISTINCT ne peut être introduite qu’une seule fois, juste après le SELECT, et concerne
toutes les colonnes qui la suivent. Le résultat est toute combinaison distincte de ces colonnes.
REQ 10
Afficher les jobs dans chaque département de manière distincte.
SELECT DISTINCT JOB, DEPTNO FROM EMP ;
La clause WHERE est suivie d’une condition simple ou composée (combinaison de plusieurs
conditions). Chaque ligne satisfaisant cette condition est retournée.
Chapitre 2 : La sélection simple 11
REQ 12
Afficher les employés du département 20.
SELECT * FROM EMP WHERE DEPTNO=20 ;
REQ 13
Afficher les employés dont la commission est inférieure au salaire.
SELECT * FROM EMP WHERE NVL(COMM,0)<SAL ;
IS NULL (l’opérateur = ne peut pas être utilisée pour comparer une colonne à
NULL, on utilise cet opérateur).
L’opérateur logique NOT peut être utilisé avec ces opérateurs NOT BETWEEN…., NOT
IN….., NOT LIKE…., IS NOT NULL.
REQ 14
Donner les noms et les salaires des employés dont le salaire est entre 1000 et 2000 ?
SELECT ENAME, SAL FROM EMP WHERE SAL BETWEEN 1000 AND 2000 ;
REQ 15
Donner les employés dont le manager est 7902, 7566 ou 7788 ?
SELECT * FROM EMP WHERE MGR IN (7902, 7566, 7788) ;
REQ 16
Afficher les employés dont le nom commence par ‘S’ ?
SELECT * FROM EMP WHERE ENAME LIKE „S%‟ ;
REQ 17
Afficher les employés dont le nom est composé de 4 caractères ?
Chapitre 2 : La sélection simple 12
…………
Ainsi SUBSTR(„ORACLE‟,2,4)„RACL‟
LENGTH(arg) : retourne la taille de l’argument en nombre de caractères.
INSTR(arg,cc[,m][,n]) : retourne la position de cc dans l’argument en commençant
par la position m et dont l’occurrence est n. Par défaut m et n sont mis à 1.
REQ 23
Afficher le nombre d’occurrences du caractère ‘E’ dans chaque nom d’employé ?
SELECT LENGTH(ENAME)–LENGTH(REPLACE(ENAME,„E‟)) NBRE FROM
EMP ;
Ainsi ROUND(46.8) 47
ROUND(46.862,1) 46.9
ROUND(46.862,2) 46.86
ROUND(46.862,-1) 50
ROUND(51.342,-2) 100
TRUNC(46.862,2) 46.86
TRUNC(46.862,-1) 40
TRUNC(51.342,-2) 0
CEIL(arg) : retourne le plus petit entier supérieur à l’argument.
CEIL(99.9) 100
CEIL(-11.1) -11.
FLOOR(arg) : retourne le plus grand entier inférieur à l’argument.
FLOOR(99.9) 99
FLOOR(-11.1) -12.
POWER(arg,n) : col à la puissance n.
EXP(arg) : exponentielle de col.
SQRT(arg) : racine carré de col.
SIGN(arg) : -1 si col <0, 1 si col>0, 0 sinon.
ABS(arg) : valeur absolue de col.
Chapitre 3 : Les fonctions 16
DATE1 – DATE2 : retourne la différence entre les deux dates en nombre réel de jours. Le
résultat est souvent un nombre réel car l’opération de soustraction tient compte des heures des
deux dates.
fonction retourne la même date si l’heure est < à 12 :00, et la date du lendemain si l’heure est ≥ à
12 :00.
TRUNC(date1[,fmt]) : retourne date1 tronquée selon fmt.
Ainsi, la concaténation des colonnes EMPNO et ENAME de la table EMP est possible sans
convertir la colonne EMPLNO qui est numérique ; la conversion est faite de manière automatique.
La conversion explicite est faite à travers un ensemble de fonctions de conversion :
MOYENNE
550
REQ 28
Afficher la moyenne des salaires annuels des employés du département 20 ?
SELECT AVG(SAL*12+NVL(COMM,0)) MOYENNE FROM EMP
WHERE DEPTNO=20;
MOYENNE
26100
COUNT(*|[DISTINCT]|[ALL] arg) : retourne pour chaque groupe le nombre de
lignes où l’argument est différent de NULL. Pour retourner le nombre de lignes y compris les
lignes dupliquées et ayant des champs NULL, on utilise COUNT(*).
Chapitre 3 : Les fonctions 19
REQ 29
Afficher le nombre de lignes de la table EMP ?
SELECT COUNT(*) “NB LIGNES” FROM EMP ;
NB LIGNES
14
REQ 30
Afficher le nombre de jobs dans l’netrprise?
SELECT COUNT(DISTINCT JOB) NB_JOB FROM EMP ;
NB_JOB
5
MAX([DISTINCT|ALL] arg) : retourne la valeur maximale de l’argument pour chaque
groupe.
REQ 31
Afficher le salaire maximum ?
SELECT MAX(SAL) SAL_MAX FROM EMP ;
SAL_MAX
5000
REQ 32
Afficher le salaire minimum ?
SELECT MIN(SAL) SAL_MIN FROM EMP ;
SAL_MIN
800
SUM([DISTINCT]/[ALL] arg) : retourne la somme des valeurs de l’argument.
VARIANACE([DISTINCT]/[ALL] arg): retourne la variance des valeurs de
l’argument.
STDDEV([DISTINCT]/[ALL] arg) : retourne l’écart type (standard deviation) des
valeurs de l’argument.
Le mot clé DISTINCT oblige une fonction de groupe à ne considérer que les lignes
distinctes ; contrairement à ALL qui lui oblige à considérer les valeurs dupliquées. ALL est
Chapitre 3 : Les fonctions 20
DEPTNO NBR_EMP
10 3
20 5
30 6
REQ 34
Afficher la moyenne des salaires par job dans le département 20 ?
SELECT JOB, AVG(SAL) FROM EMP
WHERE DEPTNO=20
GROUP BY JOB ;
JOB AVG(SAL)
ANALYST 3000
CLERK 950
MANAGER 2975
Remarque
Il est à noter qu’on ne peut mettre dans la clause SELECT que les fonctions de groupe et/ou
les colonnes qui suivent la clause GROUP BY.
Supposons que nous voulons créer la table personne dont les champs sont : id, nom, prénom et
date de naissance. La requête relative est la suivante :
CREATE TABLE personne (id NUMBER, nom VARCHAR2(15), prenom VARCHAR2(15),
date_naissance DATE) ;
A partir de ce moment, il est possible d’insérer des lignes dans la table personne (objet du
prochain chapitre).
Toute contrainte est définie par une table, une colonne, un type et un nom. L’utilisateur peut
affecter un nom à une contrainte, sinon Oracle lui affectera un nom par défaut. Les types de
contraintes sont les suivants :
1. Clé primaire
PRIMARY KEY une clé primaire d’une table est composée d’une ou plusieurs colonnes. Elle
est utilisée pour identifier chaque ligne de manière unique. La valeur d’une clé primaire composée
de plusieurs colonnes est dite clé primaire composée. Une clé primaire ne doit pas contenir de
valeurs NULL.
2. Clé unique
UNIQUE cette contrainte oblige la colonne de ne pas avoir deux valeurs identiques. Elle a
donc le même principe qu’une clé primaire à l’exception qu’elle peut avoir la valeur NULL. Cette
contrainte peut être appliquée à une ou à plusieurs colonnes (dans ce cas, chaque uplet doit être
unique).
Chapitre 4 : Le Langage de Définition de Données 40
3. Clé étrangère
FOREIGN KEY … REFERENCES … elle représente une relation entre deux tables. Elle
concerne une ou plusieurs colonnes d’une table dite table fille, et dont les valeurs dépendent des
clés primaires ou uniques (et de leurs types données) d’une table dite table mère. On peut ajouter
l’option [ON DELETE CASCADE] pour que la suppression d’une ligne de la table mère
entraîne la suppression de toutes les lignes de la table fille qui en dépendent. Si cette option n’est
pas spécifiée ([ON DELETE RESTRICT] par défaut), la suppression des lignes de la table mère
est impossible si elles référencent des lignes dans la table fille. On peut aussi ajouter [ON
DELETE SET NULL] et dans ce cas, la suppression d’une ligne de la table mère entraîne la mise
à NULL des colonnes qui la référencent dans la table fille.
4. Contrainte de vérification
CHECK parfois la colonne d’une table doit satisfaire certaines conditions posées par
l’utilisateur. Les contraintes de vérification permettent généralement de restreindre le domaine
d’une colonne.
5. NOT NULL
NOT NULL si cette contrainte est appliquée à une colonne, alors cette colonne ne doit pas
contenir de valeurs NULL.
REQ 68
Créez la table EMP sachant que la table DEPT l’est déjà. Cette table contient une clé primaire
EMPNO, un nom qui doit être unique ENAME, un poste JOB, un salaire SAL qui doit dépasser
un salaire minimum conventionnel (SMIG) de 600, une date d’embauche HIREDATE qui ne
peut pas être NULL, un code d’employeur MGR qui réfère la colonne EMPNO et finalement un
numéro de département DEPTNO qui réfère la colonne DEPTNO de la table DEPT ?
CREATE TABLE EMP(EMPNO NUMBER CONSTRAINT PK1 PRIMARY KEY, ENAME
VARCHAR2(20) CONSTRAINT UN1 UNIQUE, JOB VARCHAR2(15), SAL NUMBER CONSTRAINT
CH1 CHECK(SAL>600), HIREDATE DATE DEFAULT ‟01-JAN-80‟ NOT NULL, MGR NUMBER
CONSTRAINT FK_EMP_EMP REFERENCES EMP(EMPNO), DEPTNO NUMBER REFERENCES
DEPT(DEPTNO) ON DELETE CASCADE) ;
Rappelons que dans la requête, chaque clause CONSTRAINT sert à donner un nom à la
contrainte en cours et qu’elle est facultative (la clause). En cas d’omission de cette clause, Oracle
affectera par défaut un nom à cette contrainte.
Remarquez aussi le mot clé DEFAULT suivi par une constante et défini sur la colonne
HIREDATE. Ce mot clé sert à affecter à une colonne une valeur par défaut si on insère une ligne
et qu’on ignore cette colonne.
Oracle SQL (et non pas SQL) permet aussi de créer une table et d’y insérer les lignes
résultantes d’une interrogation SELECT en une seule requête.
Chapitre 4 : Le Langage de Définition de Données 41
REQ 69
Créez la table EMP1 dont les colonnes sont NUEMP, NOMEMP, NOMDEPT et EGRADE
et y insérer les lignes convenables à partir des tables EMP, DEPT et SALGRADE ?
CREATE TABLE EMP1(NUEMP NUMBER PRIMARY KEY, NOMEMP VARCHAR2(15), NOMDEPT
VARCHAR2(15), EGRADE VARCHAR2(15))
AS SELECT EMPNO, ENAME, DNAME, GRADE FROM EMP E, DEPT D, SALGRADE S
WHERE E.DEPTNO=D.DEPTNO AND E.SAL BETWEEN S.LOSAL AND S.HISAL;
Dans le cas, de création d’une table à clé primaire composée, cette contrainte est ajoutée à la
fin de la requête. De même pour la contrainte unique qui peut porter sur plusieurs tables :
REQ 71
Créez la table FPJ ?
CREATE TABLE FPJ(NF NUMBER REFERENCES F(NF), NP NUMBER REFERENCES P(NP),
NJ NUMBER REFERENCES J(NJ), QTE NUMBER, PRIMARY KEY(NF,NP,NJ));
interdisant d’avoir une valeur NULL à moins qu’elle soit affectée à une valeur par défaut ou que
la table soit vide.
REQ 73
Ajouter les colonnes téléphone TEL et Adresse ADR. La colonne TEL ne doit pas avoir la
valeur NULL ?
ALTER TABLE EMP ADD (TEL NUMBER(8) DEFAULT „00000000‟ NOT NULL, ADR
VARCHAR2(30)) ;
L’ajout d’une contrainte n’est possible que si les données qu’elle concerne, la respectent déjà.
Notons ici l’importance de nommer une contrainte lors de sa création, car la clause DISABLE
ne réfère les contraintes FOREIGN KEY, NOT NULL et CHECK que par leurs noms (un nom
que l’utilisateur donne à la contrainte, ou assigné par défaut par Oracle).
La réactivation d’une contrainte se fait par la clause ENABLE. Il faut bien sûr que les données
respectent déjà cette contrainte sinon sa réactivation échouera. Par exemple, si on veut réactiver
la contrainte FK_EMP_EMP, il faut que la colonne MGR ne contienne aucune valeur
n’appartenant pas à la colonne EMPNO.
REQ 80
Réactiver la contrainte de clé étrangère sur la colonne MGR de la table EMP ?
ALTER TABLE EMP ENABLE CONSTRAINT FK_EMP_EMP ;
nom_table est le nom de la table dans laquelle on veut insérer notre ligne, il est suivi par la liste
des colonnes de la table, par le mot clé VLAUES et par la liste des valeurs qu’on veut insérer. Il
est possible d’insérer une partie d’une ligne (omettre les valeurs d’une ou de plusieurs colonnes)
mais à condition de respecter les contraintes de la table (on ne peut pas omettre la valeur d’une
colonne NOT NULL), dans ce cas les valeurs non communiquées auront NULL par défaut. Il
faut aussi respecter une certaine cohérence dans la requête INSERT entre la liste descriptive de la
table et la liste des valeurs à ajouter. Cette cohérence concerne le nombre et l’ordre des colonnes.
La liste descriptive peut être omise, et dans ce cas on doit respecter l’ordre des colonnes (défini
lors de la création de la table et qu’on peut consulter par la commande DESC nom_table) et saisir
les valeurs de toutes les colonnes de la table.
REQ 83
Insérer dans la table EMP le nouvel employé de matricule 7521, de nom ‘PATRICK’,
‘SALESMAN’, de manager 5000, de salaire 1250 et département 30 ?
INSERT INTO EMP (EMPNO,ENAME,JOB,HIREDATE,MGR,SAL,DEPTNO)
VALUES(7521,„PATRICK‟,‟SALESMAN‟,SYSDATE,5000,1250,30);
REQ 85
Dans la table FPJ, insérer le projet ‘J1’ qui a été alimenté par 5 pièces ‘P1’ par les fournisseurs
de ‘LONDRES’ ?
INSERT INTO FPJ
SELECT NF,‟J1‟,‟P1‟,5 FROM F
WHERE VILLE=‟LONDRES‟;
Ici, la mise à jour concerne la table nom_table et plus particulièrement les lignes de cette table
qui satisfont la condition de la clause WHERE. Seules les colonnes de la clause SET sont
modifiées par cette requête. Un argument argi peut être un littéral (constante), une expression, une
fonction ou encore une sous-requête (le résultat d’une sous-requête). Il est à noter que la clause
WHERE est facultative, si elle est omise la mise à jour concerne alors toute les lignes de la table.
Il est possible aussi de mettre à jour plusieurs colonnes d’une table à partir d’une seule sous-
requête, la syntaxe correspondante est la suivante :
UPDATE nom_table
SET (col1,…,coln)=(SELECT arg1,…,argn FROM table)
[WHERE condition(s)]
REQ 86
Mettez à jour la colonne COMM dans la table EMP. Chaque valeur NULL doit être remplacée
par zéro ?
UPDATE EMP
SET COMM=0
WHERE COMM IS NULL;
REQ 87
Mettez à jour le salaire et le job des SALESMAN, ils ont eu une augmentation de 10% et leur
job est maintenant dit SALESPERSON ?
UPDATE EMP
SET SAL=SAL*1.1, JOB=‟SALESPERSON‟
WHERE JOB=‟SALESMAN‟ ;
Chapitre 5 : Le Langage de Manipulation de Données 48
REQ 88
Affectez pour chaque employé du département 10 et 20 le salaire minimum de son
département ?
UPDATE EMP A
SET SAL=(SELECT MIN(SAL) FROM EMP B
WHERE B.DEPTNO=A.DEPTNO)
WHERE A.DEPTNO IN (10,20);
La clause WHERE est facultative, elle est utilisée pour spécifier quelles lignes veut-on
éliminer. Si la clause WHERE est omise, alors toutes les lignes de la table sont supprimées.
REQ 89
Supprimez toutes lignes de la table SALGRADE ?
DELETE FROM SALGRADE;
REQ 90
Supprimez les employés du département 30 ?
DELETE FROM EMP
WHERE DEPTNO=30;
Annexe A
Les tables EMP, DEPT et SALGRADE sont utilisés dans les exemples du document.
La table EMP
La table DEPT
La table SALGRADE
Annexe B
Ce tableau contient les éléments d’un format de Date, il peuvent être combinés pour donner
un format utilisable lors d’une conversion VARCHAR DATE ou DATE VARCHAR.
DY Abréviation du jour.
PM ou AM Indicateur méridien.
MI Minute.
SS Seconde.
Annexe B 51
Remarques :
1. DAY et MONTH retournent le jour et le mois en toutes lettres, pour uniformiser leurs
tailles, la fonction to_char ajoute des espaces. Tous les DAY sont retournés sur 9 lettres, de
même pour les MONTHS.
Le préfixe fm peut être ajouté à MONTH ou DAY pour éliminer les espaces ajoutés
(‘DAYFM’ ou ‘MONTHFM’).
2. Trois suffixes peuvent être utilisés :
TH : retourne un nombre ordinal, exemple ‘DDTH’ nous donne ‘4TH’ si DD=04.
SP : retourne un nombre en toutes lettres, exemple ‘DDSP’ nous donne ‘FOUR si DD=04.
SPTH : retourne un nombre ordinal en toutes lettres, exemple ‘FOURTH’.
3. Les éléments d’un format de Date sont sensibles à la majuscule/minuscule et affectent
l’affichage des éléments correspondants. Pour un Sysdate=’09-nov-04’ :
To_Char(Sysdate, ‘DAY’) retourne ‘TUESDAY’ alors que To_Char(Sysdate, ‘Day’) retourne
‘Tuesday’.