Vous êtes sur la page 1sur 50

Le langage SQL

NOTES DE COURS &


TRAVAUX PRATIQUES CORRIGÉS
CYCLE PRÉPARATOIRE, LICENCE & CYCLE INGÉNIEUR

PRÉREQUIS :
LES FONDAMENTAUX DES BASES DE DONNÉES RELATIONNELLES

Ons BEN ROMDHANE


bromdhane_ons@episousse.com.tn

Adel DAHMANE
adeldahmane@episousse.com.tn
Table des matières

Table des matières

0. Introduction au langage SQL ....................................................................................... 4


0.1 Concepts de base ......................................................................................................... 4
0.1.1 Base de données ................................................................................................. 4
0.1.2 SGBD ................................................................................................................... 4
0.1.3 Le langage SQL .................................................................................................... 5
0.2 Architecture du serveur oracle .................................................................................... 5
0.3 Instance Oracle ............................................................................................................ 5
0.4 Schéma de démonstration « HR » ............................................................................... 6

1. Récupération de données à l'aide de l'instruction SQL Select ...................................... 9


1.1 Notes de cours ............................................................................................................. 9
1.1.1 La commande DESCRIBE ..................................................................................... 9
1.1.2 Rêquete SELECT de base ..................................................................................... 9
1.2 Requêtes .................................................................................................................... 10

2. Restriction et Tri de données .................................................................................... 13


2.1 Notes de cours ........................................................................................................... 13
2.1.1 Données restreintes ......................................................................................... 13
2.1.2 Le tri .................................................................................................................. 13
2.1.3 Les variables de substitution ............................................................................ 14
2.2 Requêtes .................................................................................................................... 14

3. Fonctions « Monoligne » .......................................................................................... 17


3.1 Notes de cours ........................................................................................................... 17
3.1.1 Fonctions de chaînes de caractères ................................................................. 17
3.1.2 Fonctions numériques ...................................................................................... 18
3.1.3 Fonctions sur les dates ..................................................................................... 18
3.2 Requêtes .................................................................................................................... 19

4. Fonctions de conversion et Expressions conditionnelles............................................ 22


4.1 Notes de cours ........................................................................................................... 22
4.1.1 Fonctions de conversion ................................................................................... 22
4.1.2 Fonctions générales .......................................................................................... 24
4.1.3 Expressions conditionnelles ............................................................................. 25
4.2 Requêtes .................................................................................................................... 27

5. Agrégation de données à l’aide de fonctions de groupe ............................................ 30


5.1 Notes de cours ........................................................................................................... 30

2020/2021 - Ons BEN ROMDHANE & Adel DAHMANE 2


Table des matières

5.1.1 Définition des fonctions de groupe .................................................................. 30


5.1.2 La clause GROUP BY.......................................................................................... 31
5.1.3 La clause HAVING ............................................................................................. 32
5.2 Requêtes .................................................................................................................... 32

6. Affichage de données à partir de plusieurs tables - Jointure ...................................... 34


6.1 Notes de cours ........................................................................................................... 34
6.1.1 Types de jointure .............................................................................................. 34
6.1.2 Jointure interne ................................................................................................ 35
6.1.3 Jointure externe................................................................................................ 36
6.1.4 Jointure croisée ................................................................................................ 37
6.2 Requêtes .................................................................................................................... 38

7. Les sous-requêtes..................................................................................................... 40
7.1 Notes de cours ........................................................................................................... 40
7.1.1 Définition d’une sous-requête.......................................................................... 40
7.1.2 Pourquoi utiliser les sous-requêtes ? ............................................................... 40
7.1.3 Types de sous-requêtes .................................................................................... 41
7.2 Requêtes .................................................................................................................... 43

8. Langage de Manipulation de Données « DML » ........................................................ 44


8.1 Notes de cours ........................................................................................................... 44
8.2 Requêtes .................................................................................................................... 47

9. Langage de Définition de Données............................................................................ 48


9.1 Notes de cours ........................................................................................................... 48
9.2 Requêtes .................................................................................................................... 50

2020/2021 - Ons BEN ROMDHANE & Adel DAHMANE 3


Notes de cours & TP 0

0.Introduction au langage SQL

Objectifs
Au terme de ce chapitre, l’étudiant devra :
➢ Réviser quelques concepts concernant les bases de données relationnelles.
➢ Définir le serveur de données Oracle.
➢ Expliquer le schéma de la base de données HR.

Durée estimative : 1h:30

0.1 CONCEPTS DE BASE

0.1.1 BASE DE DONNÉES

Une base de données informatique est un ensemble de données qui ont été stockées sur un
support informatique, et organisées et structurées de manière à pouvoir facilement consulter
et modifier leur contenu.
Une base de données seule ne suffit donc pas, il est nécessaire d'avoir également :
• un système permettant de gérer cette base.
• un langage pour transmettre des instructions à la base de données (par l'intermédiaire du
système de gestion).

0.1.2 SGBD

Un Système de Gestion de Base de Données (SGBD) est un logiciel (ou un ensemble de


logiciels) permettant de manipuler les données d'une base de données. Manipuler, c'est-à-
dire sélectionner et afficher des informations tirées de cette base, modifier des données, en
ajouter ou en supprimer (ce groupe de quatre opérations étant souvent appelé "CRUD", pour
Create, Read, Update, Delete).
Oracle est un système de gestion de bases de données relationnel (SGBDR). Un SGBDR est un
SGBD qui implémente la théorie relationnelle, c’est-à-dire que les données sont contenues
dans ce qu'on appelle des relations, qui sont représentées sous forme de tables.
Il y a d’autres SGBD tels que : Microsoft SQL Server, MySQL, PostgreSQL, SQLite.

2020/2021 - Ons BEN ROMDHANE & Adel DAHMANE 4


Chapitre 1 : Introduction au langage SQL

0.1.3 LE LANGAGE SQL

La plupart des SGBD sont basés sur un modèle Client-Serveur. C'est-à-dire que la base de
données se trouve sur un serveur, et pour interagir avec cette base de données, il faut utiliser
un logiciel "client" qui va interroger le serveur et transmettre la réponse que le serveur lui
aura donnée, ce langage est le SQL.
SQL (Structured Query Language ou Set Query Language) est la norme standard internationale
pour la gestion des données stockées dans les bases de données relationnelles. Le langage
SQL est un standard, c'est-à-dire que quel que soit le SGBD utilisé, on se servira du langage
SQL. Mais, il y a en fait quelques petites variantes d'un SGBD à l'autre, mais cela concerne
généralement les commandes les plus avancées.
Voici les 16 commandes SQL, séparées en groupes couramment utilisés :
• Data Manipulation Language (DML) : SELECT, INSERT, UPDATE, DELETE & MERGE
• Data Definition Language (DDL) : CREATE, ALTER, DROP, RENAME, TRUNCATE & COMMENT
• Data Control Language (DCL) : GRANT & REVOKE
• Transaction Control Language (TCL) : COMMIT, ROLLBACK & SAVEPOINT

0.2 ARCHITECTURE DU SERVEUR ORACLE

Un serveur Oracle est composé d'une instance Oracle et d'une base de données Oracle.
L’accès à la base de données se fait à travers l’instance Oracle (voir figure 1.1).

Figure 1-1: Un serveur de données Oracle = instance Oracle + base de données [5].

0.3 INSTANCE ORACLE

L’instance Oracle est un ensemble de processus et de structures de mémoire. Elle existe dans
le CPU et dans la mémoire du nœud de serveur temporairement.
SGA (System Global Area) est une zone mémoire utilisée pour partager les informations entre
les différents processus Oracle.
Une instance peut être démarré ou arrêtée. Les utilisateurs d’une base de données établissent
des sessions sur l’instance, et l’instance gère ensuite tous les accès à la base de données. Il est

2020/2021 - Ons BEN ROMDHANE & Adel DAHMANE 5


Chapitre 1 : Introduction au langage SQL

impossible dans l’environnement Oracle pour tout utilisateur d’avoir un contact direct avec la
base de données.
Pour Oracle, une instance ne gère qu’une seule base de données tandis que pour Microsoft
SQL Server, Sybase et autres, l’instance peut gérer plusieurs bases de données.

0.4 SCHÉMA DE DÉMONSTRATION « HR »

Oracle lie chaque objet (table, index, vue, …) au compte utilisateur qui l’a créé. On parle alors
de propriétaire de l’objet ou schéma. Un schéma est donc, un compte utilisateur qui possède
des tables, des indexes et autres objets. Un utilisateur est associé à un seul schéma.
Tout au long de ce support, il y a des exemples d'exécution du code SQL sur des tables de
données. Ces exemples utilisent des tables d’un schéma de démonstration fourni par Oracle :
le schéma HR. C’est un schéma composé de sept tables qui simulent une application de
ressources humaines simple. La figure 1.2 montre les colonnes de chaque table du schéma
HR.

Figure 0-2: Schéma HR

Deux des relations représentées sur la figure 1.2 peuvent ne pas être immédiatement
compréhensibles. Tout d'abord, il existe une relation réflexive un à plusieurs entre
EMPLOYEES et EMPLOYEES. Cela signifie que de nombreux employés peuvent avoir un même
chef, mais le chef est également un employé. Cette relation est mise en œuvre par la colonne
manager_id dans EMPLOYEES qui représente l’EMPLOYEE_ID du chef.

2020/2021 - Ons BEN ROMDHANE & Adel DAHMANE 6


Chapitre 1 : Introduction au langage SQL

La seconde relation est la relation bidirectionnelle entre DEPARTMENTS et EMPLOYEES. Le


premier sens indique simplement qu'il peut y avoir de nombreux personnels dans chaque
département, cela est représenté par la colonne department_id dans EMPLOYEES. Le
deuxième sens montre qu'un employé peut être le chef de plusieurs départements, et ceci est
mis en œuvre par la colonne manager_id dans DEPARTMENTS.

Description du Schéma HR :

Commandes utiles :
• Se connecter en tant qu’administrateur par défaut (défini lors de l’installation) :
connect SYSTEM/SYSTEM ;
• Activer le schéma prédéfini Oracle HR :
alter user hr account unlock identified by hr ;
• Afficher l’utilisateur (login) connecté :
show user ;
• Afficher la liste des tables de l’utilisateur en cours :
select table_name from user_tables ;
select * from tab ;
• Créer un nouvel utilisateur :
create user login identified by password ;
• Accorder à un utilisateur les rôles connect et resource (regroupant plusieurs privilèges)
grant connect, resource to login ;
• Se connecter :
connect login/password ;

2020/2021 - Ons BEN ROMDHANE & Adel DAHMANE 7


Chapitre 1 : Introduction au langage SQL

Exercice :
The OE (Order Entry) schema includes these tables:
■ CUSTOMERS
■ INVENTORIES
■ ORDERS
■ ORDER_ITEMS
■ PRODUCT_DESCRIPTIONS
■ PRODUCT_INFORMATION
■ WAREHOUSES

• A CUSTOMER can place many ORDERS, and an order can have many ORDER_ITEMS.
• Each item will be of one product, described by its PRODUCT_INFORMATION, and each product may
have several PRODUCT_DESCRIPTIONS, in different languages.
• There are a number of WAREHOUSES, each of which can store many products.
• One product may be stored in many warehouses.
• An INVENTORIES entry relates products to warehouses, showing how much of each product is in
each warehouse.

Sketch out this schema as an entity-relationship diagram, showing the many-to-one connections
between the tables and ensuring that there are no many-to-many connections.

2020/2021 - Ons BEN ROMDHANE & Adel DAHMANE 8


Notes de cours & TP 1

1.Récupération de données à l'aide de


l'instruction SQL Select

Objectifs
Au terme de ce chapitre, l’étudiant saura :
➢ Écrire une requête de base avec les clauses : Select et From.
➢ Déterminer les valeurs à afficher.

Durée estimative : 1h30

1.1 NOTES DE COURS

1.1.1 LA COMMANDE DESCRIBE

La commande DESCRIBE donne des informations sur la table comme le nom de la table, le
propriétaire de la table, des détails sur les colonnes qui la composent et sa taille de stockage
physique sur le disque.
La syntaxe de cette commande :

DESC[RIBE] [<schema> .]nomtable

Le mot clé DESCRIBE peut être raccourci à DESC. Si vous décrivez une table qui appartient au
schéma auquel vous avez connecté, la partie <SCHEMA> de la commande peut être omise.

1.1.2 RÊQUETE SELECT DE BASE

La requête SELECT se base sur les concepts de la théorie des relations : projection, sélection
et jointure. Ce chapitre traite la projection, c’est-à-dire, limiter les colonnes affichées par la
requête SELECT.

SELECT *|{[DISTINCT] column|expression[alias],...}


FROM table

• SELECT : identifie les colonnes à afficher.

2020/2021 - Ons BEN ROMDHANE & Adel DAHMANE 9


Notes de cours & TP 1 : Récupération de données à l'aide de l'instruction SQL Select

• FROM : identifie la table contenant les colonnes.


• * : sélectionne toutes les colonnes.
• DISTINCT : élimine les valeurs dupliquées.
• Alias : pour renommer les colonnes. L’alias doit être entre guillemets s’il contient un espace
ou si on veut garder la même casse lors de l’affichage.

1.2 REQUÊTES

1) Activer le schéma HR ou bien exécuter son script de création en utilisant le fichier


HR_CRE.sql (voir compte réseau \\srv-etudiant\compte_partagé). Pour charger cette
base de données, exécuter le script HR_INS.sql.
2) Dans chaque cas, on demande d’écrire une requête SQL pour l’opération considérée :

a) Donner la définition de la table EMPLOYEES.

b) Afficher toutes les colonnes et toutes les lignes de la table REGIONS.

c) Afficher employee_id, job_id et department_id de la table JOB_HISTORY.

2020/2021 - Ons BEN ROMDHANE & Adel DAHMANE 10


Notes de cours & TP 1 : Récupération de données à l'aide de l'instruction SQL Select

d) Afficher des valeurs distinctes de job_id de la table JOB_HISTORY.

e) Afficher pour chaque employé de la table JOB_HISTORY, son employee_id, job_id,


start_date, end_date et le nombre de jours passés dans ce poste (Days_Employed).

f) Afficher les employés comme suit :

g) Convertir l’année en nombre de secondes

h) Afficher le résultat suivant

2020/2021 - Ons BEN ROMDHANE & Adel DAHMANE 11


Notes de cours & TP 1 : Récupération de données à l'aide de l'instruction SQL Select

i) Afficher les lignes suivantes à partir de la table JOBS en utilisant les colonnes JOB_ID
et JOB_TITLE:

j) Afficher le résultat suivant à partir de la table EMPLOYEES


Null Arithmethic = commission_pct + employee_id + 10
Division By Null = 10/commission_pct

2020/2021 - Ons BEN ROMDHANE & Adel DAHMANE 12


Notes de cours & TP 2

2.Restriction et Tri de données

Objectifs
Au terme de ce chapitre, l’étudiant saura :
➢ Écrire une requête avec les clauses : Select, From, Where et Order By.
➢ Appliquer les opérateurs de comparaison et les opérateurs logiques.
➢ Utiliser les variables de substitution.

Durée estimative : 1h

2.1 NOTES DE COURS

2.1.1 DONNÉES RESTREINTES

Ce chapitre discute le deuxième concept de la théorie des relations sur lequel se base la
requête SELECT, c’est la sélection. Elle consiste à réduire le nombre de lignes affichées par la
requête SELECT. Cette réduction se fait à l’aide de :
• La clause WHERE.
• Des opérateurs de comparaison : =, <=, BETWEEN, IN, ANY, ALL, LIKE et IS NULL.
• Des opérateurs logiques : AND, OR et NOT.

Le format de la requête SELECT qui comprend la clause WHERE est le suivant :

SELECT * | {[DISTINCT] column | expression [alias],…}


FROM table
WHERE condition(s)]

2.1.2 LE TRI

Pour trier le résultat de la requête SELECT, if faut utiliser la clause ORDER BY, c’est la dernière
clause de la requête SELECT :

SELECT * | [DISTINCT] column | expression [alias],…


FROM table
WHERE condition(s)ORDER BY {col(s) | expression | alias |
numeric_pos} [ASC|DESC] [NULLS FIRST| NULLS LAST]]

2020/2021 - Ons BEN ROMDHANE & Adel DAHMANE 13


Notes de cours & TP 2 : Restriction et tri de données

• Numeric_pos : la position de la colonne dans la clause Select.


• ASC : trier dans l’ordre croissant.
• DESC : trier dans l’ordre décroissant.
• NULLS FIRST : afficher les valeurs nulles au début.
• NULLS LAST : afficher les valeurs nulles à la fin.

2.1.3 LES VARIABLES DE SUBSTITUTION

Une variable de substitution permet d’utiliser une requête plusieurs fois. Elle stocke
temporairement une valeur en utilisant le caractère & ou &&. Elle peut être utilisée pour
substituer une valeur à tout élément de la requête SQL : nom d’une table, nom d’une colonne,
les conditions de WHERE, la clause ORDER BY.

2.2 REQUÊTES

Dans chaque cas, on demande d’écrire une requête SQL pour l’opération considérée :

a) Donner les noms des employés dont le salaire est égal à 10000.

b) Afficher les noms des employés dont le JOB_ID est égal à SA_REP.
c) Afficher les noms des employés dont la date d'embauche (hire_date) est égale à
07/06/02.
d) Afficher les noms des employés dont le salaire est inférieur ou égal à 2500.
e) Afficher les noms des employés dont le salaire est compris entre 2500 et 3000.
f) Donner les noms des employés dont le salaire est égal à 1000 ou 4000 ou 6000.

g) Afficher les pays (COUNTRIES) dont la cinquième lettre du nom est ‘i’.

2020/2021 - Ons BEN ROMDHANE & Adel DAHMANE 14


Notes de cours & TP 2 : Restriction et tri de données

h) Donner les noms des employés dont la valeur de commission_pct est nulle.

i) Obtenir les employés dont le prénom commence par ‘J’, le nom contient la lettre ‘o’, la
valeur de leur commission_pct est supérieure à 0.1 et qui ont été recruté après le 1 juin
1996.

j) Obtenir les employés dont le prénom commence par ‘B’ ou bien la valeur de leur
commission_pct est supérieure à 0.35.

k) Obtenir les employés dont le poste (job_id) est ni IT_PROG ni SA_REP ni ST_CLERK.

l) Afficher les employés dont le poste est égal à SA_MAN ou MK_MAN. Le résultat doit être
trié par ordre croissant selon la colonne commission_pct.

m) Obtenir le même résultat que la requête précédente mais trié dans l’ordre décroissant
selon la colonne commission_pct.

n) Obtenir le même résultat que la requête précédente mais les lignes contenant des valeurs
nulles dans la colonne de tri sont affichées à la fin.

2020/2021 - Ons BEN ROMDHANE & Adel DAHMANE 15


Notes de cours & TP 2 : Restriction et tri de données

o) Pour chaque employé afficher son nom, son salaire et le numéro de son département. Le
résultat doit être affiché par ordre croissant du numéro de département puis par ordre
décroissant du salaire.

p) Afficher le numéro, le numéro du département, le nom et le salaire de l’employé dont le


numéro est saisi par l’utilisateur (ex : 101).

q) Afficher le numéro du département, le nom, le salaire annuel et la date de recrutement


de l’employé dont le job_id et la date de recrutement sont donnés par l’utilisateur (ex :
job_id = IT_PROG et hire_date=07/02/07)

r) Afficher le numéro et le nom de l’employé ainsi qu’une autre colonne spécifiée par
l’utilisateur (utilisée aussi comme colonne de tri). Le résultat doit satisfaire une condition
donnée par l’utilisateur (Utiliser uniquement la table EMPLOYEES).

2020/2021 - Ons BEN ROMDHANE & Adel DAHMANE 16


Notes de cours & TP 3

3.Fonctions « Monoligne »

Objectifs
Au terme de ce chapitre, l’étudiant saura :
➢ Appliquer les fonctions mono-lignes.
➢ Utiliser les fonctions de gestion des chaînes de caractères.
➢ Utiliser les fonctions de gestion des dates.
➢ Utiliser les fonctions d’arrondissement.

Durée estimative : 1h

3.1 NOTES DE COURS

3.1.1 FONCTIONS DE CHAÎNES DE CARACTÈRES

• Fonctions de manipulations des chaines de caractères

Fonction Résultat
Concat('Hello', 'World') HelloWorld

Substr('HelloWorld',1,5) Hello

Left ('HelloWorld',5) Hello

Right ('HelloWorld',5) World

Length('HelloWorld') 10

Instr('HelloWorld', 'W') 6

Lpad(salary,10,'*') *****24000

Rpad(salary, 10, '*') 24000*****

Replace ('JACK and JUE','J','BL') BLACK and BLUE

Trim('H' FROM 'HelloWorld') elloWorld

2020/2021 - Ons BEN ROMDHANE & Adel DAHMANE 17


Notes de cours & TP 3 : Fonctions « Mono-Ligne »

• Fonctions de conversion de chaînes de caractères

Fonction Résultat
Lower('Cours SQL') cours sql
Upper('Cours SQL') COURS SQL
Initcap('Cours SQL') Cours Sql

3.1.2 FONCTIONS NUMÉRIQUES

• ROUND
Effectue un arrondissement sur une valeur numérique.

ROUND(45.39) = 45
ROUND(45.8) = 46
ROUND(45.39, 1) = 45.4
ROUND(45.926, 2) = 45.93
ROUND(45.923, -1) = 50
ROUND(44.923, -1) = 40
ROUND(1666.923, -2)= 1700

• TRUNC
Tronquer une valeur numérique.
TRUNC (45.39) = 45
TRUNC (45.8) = 45
TRUNC (45.39, 1) = 45.3
TRUNC(45.926, 2) = 45.92
TRUNC(45.923, -1) = 40
TRUNC(1666.923, -3) = 1000

• MOD
Retourne le reste de la division

MOD(1600, 300) = 100

3.1.3 FONCTIONS SUR LES DATES

Le format d'affichage par défaut de la date est DD-MON-YY. Il existe plusieurs fonctions qui
opèrent sur les dates, telles que :

• SYSDATE

Retourne la date système.

2020/2021 - Ons BEN ROMDHANE & Adel DAHMANE 18


Notes de cours & TP 3 : Fonctions « Mono-Ligne »

• MONTHS_BETWEEN (date_fin,date_debut)

Retourne le nombre de mois entre les deux dates. Le résultat peut être négatif.
MONTHS_BETWEEN ('01-SEP-95','11-JAN-94') = 19.6774194

• ADD_MONTHS (date_debut, nombre_mois)

Retourne une date calculée par l’ajout d’un nombre de mois à une date donnée. Le nombre
de mois peut être négatif.

ADD_MONTHS (‘31-JAN-96', 1) = 29-FEB-96

• NEXT_DAY (date, jour_semaine)

Retourne la date qui correspond à la prochaine occurrence du jour_semaine.

NEXT_DAY ('01 -SEP-95','FRIDAY') = 08-SEP-95

• LAST_DAY (date)

Retourne la date du dernier jour du mois de la date passée comme paramètre.

LAST_DAY ('01-FEB-95') = 28-FEB-95

• ROUND et TRUNC :

On suppose que sysdate = '25/07/03'

Fonction Résultat
Round(SYSDATE,'MONTH') 01/08/03
Round(SYSDATE,'YEAR') 01/01/04
Trunc(SYSDATE,'MONTH') 01/07/03
Trunc(SYSDATE,'YEAR') 01/01/03

3.2 REQUÊTES

Dans chaque cas, on demande d’écrire une requête SQL pour l’opération considérée :

a) Afficher le numéro d'employé, le nom et le numéro de département pour tous les


employés higgins.

2020/2021 - Ons BEN ROMDHANE & Adel DAHMANE 19


Notes de cours & TP 3 : Fonctions « Mono-Ligne »

b) Obtenir le résultat suivant pour les employés dont le job_id se termine par REP :


33 lignes.

c) Pour chaque employé du département 60, afficher son nom et les huit premiers
caractères de son nom suivis du ‘_US’(en majuscule).

d) Pour chaque directeur commercial (SA_MAN), afficher son last_name, son salary et le
nombre de jours travaillés (sans et avec arrondissement à l’entier le plus proche).

e) Afficher le nom et le nombre de semaines de travail de chaque employé du département


identifié par 90.

2020/2021 - Ons BEN ROMDHANE & Adel DAHMANE 20


Notes de cours & TP 3 : Fonctions « Mono-Ligne »

f) Le département financier veut majorer les salaires de ses employés de 1.13123. Afficher
le résultat suivant :

g) A partir de la table JOB_HISTORY, calculer le nombre de mois de travail de chaque


employé comme suit :

h) Afficher pour chaque employé ayant comme job_id la valeur it_prog, son nom et le
nombre de jours travaillés dans son premier mois d’emploi.

2020/2021 - Ons BEN ROMDHANE & Adel DAHMANE 21


Notes de cours & TP 4

4.Fonctions de conversion et
Expressions conditionnelles

Objectifs
Au terme de ce chapitre, l’étudiant saura :
➢ Effectuer les conversions des nombres, des dates et des chaînes de caractères.
➢ Manipuler les valeurs nulles.
➢ Utiliser les expressions conditionnelles.

Durée estimative : 4h

4.1 NOTES DE COURS

4.1.1 FONCTIONS DE CONVERSION

• Conversion implicite des types de données


Le serveur Oracle peut convertir automatiquement les types de données suivants :

De A
VARCHAR2 ou CHAR  NUMBER
VARCHAR2 ou CHAR  DATE
NUMBER  VARCHAR2 ou CHAR
DATE  VARCHAR2 ou CHAR

SELECT mod ('11',2) FROM dual

Le serveur Oracle convertit la chaîne de caractères '11' en entier 11 puis retourne l’entier 1.

SELECT add_months ('24-01-16', 1) FROM dual

Cette requête convertit la chaîne de caractères '24-01-16' en date puis retourne 24/02/16.

SELECT length (123456789) FROM dual

Cette requête convertit le nombre 123456789 en chaîne de caractères puis retourne sa taille
qui est égale à 9.

2020/2021 - Ons BEN ROMDHANE & Adel DAHMANE 22


Notes de cours & TP 4 : Fonctions de conversion et expressions conditionnelles

SELECT length (SYSDATE) FROM dual

Cette requête convertit la date système en chaîne de caractères puis retourne sa taille qui est
égale à 8.

• Conversion explicite des types de données

Convertir un nombre en chaîne de caractères : TO_CHAR (number, [format])

SELECT to_char(00001) FROM dual

La requête retourne la chaîne de caractères '1'.

SELECT to_char(00001,'0999999')FROM dual

La requête retourne la chaîne de caractères '0000001'.

Convertir une date en chaîne de caractères : TO_CHAR (date, [format])

SELECT to_char (sysdate, ’MONTH YYYY’) FROM dual

Si sysdate =’17/09/2016’ alors cette requête retourne SEPTEMBRE 2016.

Quelques formats de date

On suppose que la date est 17 septembre 2016.

Elément Description Résultat


YYYY Quatre chiffres de l’année 2016
YEAR Année en toutes lettres (en Anglais) TWENTY SIXTEEN
MM Deux chiffres du mois 09
MONTH Mois en toutes lettres (en majuscule) SEPTEMBRE
MON Premières lettres du mois Sept
DY Trois premières lettres du jour de la semaine Sam
DAY Jour en toutes lettres Samedi
DD Numéro du jour du mois 17

Convertir une chaîne de caractères en date : TO_DATE (chaîne, [format])

SELECT to_date ('25-12-2010') FROM dual

SELECT to_date ('25-12-2010 18:03:45',


'DD-MM-YYYY HH24:MI:SS')
FROM dual

2020/2021 - Ons BEN ROMDHANE & Adel DAHMANE 23


Notes de cours & TP 4 : Fonctions de conversion et expressions conditionnelles

Convertir une chaîne de caractères en nombre : TO_NUMBER (chaîne, [format])

Exemples
SELECT to_number('$1,000.55') FROM dual

Retourne une erreur à cause du dollar, de la virgule et du point.


SELECT to_number('$1,000.55','$999,999.99') FROM dual
Retourne le nombre 1000.55

SELECT to_number('123.56','999.9') FROM dual


Retourne une erreur car la longueur du format est inférieure à celle de la chaîne de
caractères.

4.1.2 FONCTIONS GÉNÉRALES

• Fonction NVL

NVL (original, sinul)


NVL retourne le paramètre original s’il n’est pas nul, sinon elle retourne le paramètre sinul.

SELECT nvl (9876) FROM dual


Retourne une erreur car il manque un paramètre.

SELECT nvl(null,9876) FROM dual


Retourne 9876.

SELECT nvl(substr('abc',4),'No substring exists') FROM dual


Retourne la chaîne de caractères 'No substring exists'

• Fonction NVL2

NVL2 (original, sinonnul, sinul)


Si le paramètre original n’est pas nul alors NVL2 retourne sinonnul, sinon elle retourne sinul.

Exemples
SELECT nvl2(null, 1234, 5678) FROM dual
Retourne 5678.

SELECT nvl2(substr('abc',2), ' de', 'No substring') FROM dual


Retourne 'de'.

SELECT nvl2(1234,1, 'a string') FROM dual


Retourne une erreur car les types sont incompatibles.

2020/2021 - Ons BEN ROMDHANE & Adel DAHMANE 24


Notes de cours & TP 4 : Fonctions de conversion et expressions conditionnelles

• Fonction NULLIF

NULLIF (parametre1, parametre2)


Si les deux paramètres sont égaux alors la fonction NULLIF retourne null, sinon elle retourne
le parametre1.

SELECT NULLIF(2016, 2016) FROM dual


Retourne NULL.

SELECT NULLIF(2016, 2016+1) FROM dual


Retourne 2016.

SELECT NULLIF('24-JUL-2009', '24-JUL-09') FROM dual


Retourne '24-JUL-2009' car ce sont deux chaînes de caractères différentes.

• Fonction COALESCE

COALESCE (parametre1, parametre2,…,parametreN)


Retourne le premier paramètre non nul.

SELECT coalesce(null, null, null, 'a string') FROM dual


Retourne le paramètre ‘a string’ car c’est le premier paramètre non nul.

SELECT coalesce(null, null, null) FROM dual


Retourne null car tous les paramètres sont nuls.

SELECT coalesce(substr('abc',4),'bc','No substring') FROM dual


Retourne ‘bc’ car le premier paramètre est nul.

4.1.3 EXPRESSIONS CONDITIONNELLES

• Fonction DECODE

DECODE(expr1, comp1, iftrue1, [comp2, iftrue2..., [compN,


iftrueN]], [iffalse])

Si expr1 est égale à comp1 alors la requête retourne iftrue1. Sinon si expr1 est égale à comp2
alors elle retourne iftrue2, et ainsi de suite. Si rien ne correspond elle retourne iffalse si elle
existe sinon null.

SELECT decode(123,123, '123 is a match') FROM dual


123 est égal à 123, alors la requête retourne '123 is a match'.

SELECT decode(1234,123, '123 is a match') FROM dual


1234 est différent de 123, alors la requête retourne null.

2020/2021 - Ons BEN ROMDHANE & Adel DAHMANE 25


Notes de cours & TP 4 : Fonctions de conversion et expressions conditionnelles

SELECT decode(1234,123, '123 is a match', 'No match')


FROM dual
1234 est différent de 123, alors la requête retourne 'No match'.

SELECT decode ('search', 'comp1', 'true1',


'comp2', 'true2',
'search', 'true3',
substr ('2search',2,6)), 'true4',
'false')
FROM dual
La requête retourne 'true3'.

• FONCTION CASE

1ère version

CASE expr WHEN comparison_expr1 THEN return_expr1


[WHEN comparison_expr2 THEN return_expr2
WHEN comparison_exprn THEN return_exprn
ELSE iffalse]
END

Comme la fonction DECODE, elle implémente la structure conditionnelle Si-Alors-Sinon.

SELECT CASE substr(1234,1,3) WHEN '134' THEN'1234 is a match'


WHEN '1235'THEN '1235 is a match'
WHEN concat('1','23') THEN
concat('1','23')||' is a match'
ELSE 'no match'
END value
FROM dual
La requête retourne '123 is a match'.

2ème version

CASE WHEN condition1 THEN return_expr1


[WHEN condition2 THEN return_expr2

WHEN conditionN THEN return_exprN
ELSE ilfalse]
END

SELECT CASE WHEN substr(1234,1,3) = '134' THEN'1234 is a match'


WHEN substr(1234,1,3) = '1235'THEN '1235 is a match'

2020/2021 - Ons BEN ROMDHANE & Adel DAHMANE 26


Notes de cours & TP 4 : Fonctions de conversion et expressions conditionnelles

WHEN substr(1234,1,3) = concat('1','23') THEN


concat('1','23')||' is a match'
ELSE 'no match'
END value
FROM dual

4.2 REQUÊTES

Dans chaque cas, on demande d’écrire une requête SQL pour l’opération considérée :

a) A partir de la table JOB_HISTORY, obtenir le résultat suivant ordonné selon la colonne


end_date.

b) Afficher le résultat suivant pour les employés du département numéro 30.

c) Pour tous les employés dont le nom commence par ‘E’, afficher leurs noms, leurs salaires,
leurs commission_pct et leurs commissions mensuelles = commission_pct*salary+1000.

2020/2021 - Ons BEN ROMDHANE & Adel DAHMANE 27


Notes de cours & TP 4 : Fonctions de conversion et expressions conditionnelles

d) Pour tous les employés dont le nom commence par ‘G’, afficher le résultat suivant.

e) Afficher les colonnes suivantes pour chaque employé ayant un prénom de longueur 4 et si
son email est égal à la concaténation de la première lettre de son prénom et son nom en
majuscule, alors afficher ’Match Found’ sinon afficher ‘Email does not match pattern ‘.

f) Pour chaque employé ayant depatment_id égal à 90, afficher son nom et son employee_id
ainsi que sa commission_pct. Si elle est nulle afficher son manager_id et s’il est nul afficher
’no commission and no manager’.

g) A partir de la table LOCATIONS, si country_id est égal à BR(Brasil) ou AU (Australia) alors


afficher ‘South’, sinon afficher ‘North’.

… 14 lignes

2020/2021 - Ons BEN ROMDHANE & Adel DAHMANE 28


Notes de cours & TP 4 : Fonctions de conversion et expressions conditionnelles

h) On veut majorer les salaires des employés selon leurs job_id comme suit :

Job_id Majoration
IT_PROG 0.1
ST_CLERK 0.15
SA_REP 0.2
Autres 0

Écrire de deux manières une requête qui affiche pour chaque employé son nom, son job_id,
son ancien salaire et son nouveau salaire.

2020/2021 - Ons BEN ROMDHANE & Adel DAHMANE 29


Notes de cours & TP 5

5.Agrégation de données à l’aide de


fonctions de groupe

Objectifs
Au terme de ce chapitre, l’étudiant saura :
➢ Générer de données agrégées à l’aide des fonctions de groupe : Min, Max,
Avg, Count et Sum.
➢ Écrire des requêtes avec les clauses : Group By & Having.
Durée estimative : 1,5h

5.1 NOTES DE COURS

5.1.1 DÉFINITION DES FONCTIONS DE GROUPE

Les fonctions de groupe ou fonctions agrégatives opèrent sur des groupes pour donner un
résultat pour chaque groupe. On ne peut pas utiliser une fonction de groupe dans la clause
WHERE.
Les fonctions de groupe sont : AVG, SUM, MIN, MAX, COUNT, STDDEV, et VARIANCE. La
syntaxe générale est :

SELECT group_function (column),...


FROM table
[WHERE condition]
[ORDER BY column]

SELECT AVG (salary), MAX (salary), MIN (salary), SUM (salary),


COUNT (salary)
FROM Employees

SELECT COUNT (*) FROM Employees


Cette requête retourne 107. C’est le nombre de lignes dans la table EMPLOYEES.

SELECT COUNT (department_id) FROM Employees


Cette requête 106. C’est le nombre de lignes dans la table EMPLOYEES contenant une valeur
non nulle de department_id, car les fonctions de groupes ignorent les valeurs nulles.

2020/2021 - Ons BEN ROMDHANE & Adel DAHMANE 30


Notes de cours & TP 5 : Agrégation de données à l’aide de fonctions de groupe

SELECT COUNT (NVL (department_id, 0)) FROM employees


Cette requête retourne 107. Si department_id est nul NVL retourne 0, donc même les valeurs
nulles seront comptabilisées. La fonction NVL force les fonctions de groupes à inclure les
valeurs nulles.

SELECT COUNT (DISTINCT department_id) FROM employees

Elle retourne 11. C’est le nombre de valeurs distinctes et non nulles de department_id.

SELECT COUNT (DISTINCT NVL (department_id, 0)) FROM employees

Retourne 12. C’est le nombre de valeurs distinctes de department_id y compris les valeurs
nulles.

5.1.2 LA CLAUSE GROUP BY

SELECT column | expression | group_function(column|expression


[alias]),…
FROM table
[WHERE condition(s)]
[GROUP BY {col(s) |expr}]
[ORDER BY column]

La clause GROUP BY décompose un ensemble de lignes en des sous groupes. L'attribut de


regroupement qui figure devant GROUP BY est la clé commune partagée par les lignes de
chaque groupe. On peut par exemple décomposer les lignes de la table EMPLOYEES en des
groupes contenant chacun le même department_id, puis exécuter les fonctions de groupe sur
chaque groupe (employés du même département) pour calculer le salaire maximum dans
chaque département, le salaire minimum, le salaire moyen…
Tout élément de la liste SELECT doit être une fonction de groupe ou un attribut de
regroupement de la clause GROUP BY.

SELECT department_id, max (salary), count (*)


FROM Employees
GROUP BY department_id
ORDER BY department_id

La clause GROUP BY permet de partitionner un ensemble de données en groupes et permet


aussi à ces groupes d'être divisés en sous-groupes en utilisant plusieurs attributs de
regroupement.

SELECT department_id, job_id, max (salary), count (*)


FROM Employees
GROUP BY department_id, job_id
ORDER BY department_id, job_id

2020/2021 - Ons BEN ROMDHANE & Adel DAHMANE 31


Notes de cours & TP 5 : Agrégation de données à l’aide de fonctions de groupe

5.1.3 LA CLAUSE HAVING

SELECT column | expression | group_function(column|expression


[alias]),…
FROM table
[WHERE condition(s)]
[GROUP BY {col(s) |expr}]
[HAVING group_condition(s)]
[ORDER BY column]

La clause HAVING ne peut être spécifiée que si la clause GROUP BY est présente. Elle est
évaluée après avoir effectué les regroupements et exécuté les fonctions de groupe.

Exemple
SELECT department_id, count (*)
FROM job_history
WHERE department_id in (50, 60, 80, 110)
GROUP BY department_id
HAVING count(*)>1

5.2 REQUÊTES

Dans chaque cas, on demande d’écrire une requête SQL pour l’opération considérée :
a) On veut afficher des informations sur les employés dont le job_id est SA_REP : le plus petit
salaire, le plus grand salaire, les dates de recrutement du premier employé et du dernier
employé.

b) Afficher la moyenne des salaires par département.

c) Afficher pour chaque département, son numéro et la somme des commissions de ses
employés. On ne considère pas les commissions nulles.

d) Afficher pour chaque département, son numéro, ses job_id et la somme des commissions
des employés dans chaque job_id. On ne considère pas les commissions nulles.

2020/2021 - Ons BEN ROMDHANE & Adel DAHMANE 32


Notes de cours & TP 5 : Agrégation de données à l’aide de fonctions de groupe

e) Obtenir le nombre des employés qui ont quitté leur emploi, regroupés par l'année de
sortie. Leurs emplois (job_id) sont également nécessaires. Le résultat doit être classé par
ordre décroissant du nombre d'employés dans chaque groupe puis par ordre croissant de
l’année de sortie.

f) A partir de la table EMPLOYEES, afficher le salaire moyen et le nombre d’employés de


chaque job_id. On exclut les job_id ayant un salaire moyen inférieur ou égal à 10000 et un
nombre d’employés égal à 1. Trier le résultat selon l’ordre croissant du salaire moyen.

g) La même requête précédente mais on exclut les job_id qui contiennent ‘MAN’.

2020/2021 - Ons BEN ROMDHANE & Adel DAHMANE 33


Notes de cours & TP 6

6.Affichage de données à partir de


plusieurs tables - Jointure

Objectifs
Au terme de ce chapitre, l’étudiant saura :
➢ Extraire des informations à partir de plusieurs tables.
➢ Distinguer entre les différents types de jointure.

Durée estimative : 4,5h

6.1 NOTES DE COURS

6.1.1 TYPES DE JOINTURE

Pour sélectionner des lignes provenant de plusieurs tables, il est nécessaire d'utiliser des
jointures dans la requête SQL. Il existe trois types de jointures :
• Jointures internes : utilisent les clauses NATURAL JOIN, USING et ON.
• Jointures externes : utilisent les clauses LEFT OUTER JOIN, RIGHT OUTER JOIN et FULL
OUTER JOIN.
• Jointure croisée : utilise la clause CROSS JOIN.

La syntaxe générale est :


SELECT table1.column, table2.column
FROM table1
[NATURAL JOIN table2] |
[JOIN table2 USING (column_name)] |
[JOIN table2
ON (table1.column_name = table2.column_name)]|
[LEFT|RIGHT|FULL OUTER JOIN table2
ON (table1.column_name = table2.column_name)]|
[CROSS JOIN table2]

2020/2021 - Ons BEN ROMDHANE & Adel DAHMANE 34


Notes de cours & TP 6 : Affichage de données à partir de plusieurs tables - Jointure

6.1.2 JOINTURE INTERNE

• NATURAL JOIN
La clause NATURAL JOIN est basée sur toutes les colonnes des deux tables ayant le
même nom et le même type.

SELECT department_id, department_name, location_id, city


FROM departments NATURAL JOIN locations

• JOIN…USING
La clause JOIN…USING permet de spécifier explicitement une ou plusieurs colonnes
d’équi-jointure entre parenthèses après le mot-clé USING. Cette colonne doit avoir le
même nom dans les deux tables.

SELECT employee_id, last_name, location_id, department_id


FROM employees JOIN departments USING (department_id)

• JOIN ... ON
La clause JOIN ... ON permet de spécifier explicitement des colonnes de jointure,
indépendamment de leurs noms. C’est la jointure la plus générale et la plus utilisée.

SELECT e.employee_id, e.last_name, e.department_id,


d.department_id, d.location_id
FROM employees e JOIN departments d
ON (e.department_id = d.department_id)

SELECT e.employee_id, e.last_name, e.department_id,


d.department_id, d.location_id
FROM employees e JOIN departments d
ON (e.department_id = d.department_id)
WHERE e.manager_id = 149

-- Au lieu de la clause WHERE on peut écrire : AND e.manager_id = 149

• JOINTURES MULTIPLES
Il n'y a aucune restriction sur le nombre de tables qui peuvent être liées à l'aide des
jointures.

SELECT employee_id, city, department_name


FROM employees e

2020/2021 - Ons BEN ROMDHANE & Adel DAHMANE 35


Notes de cours & TP 6 : Affichage de données à partir de plusieurs tables - Jointure

JOIN departments d ON d.department_id = e.department_id


JOIN locations l ON d.location_id = l.location_id

• AUTO-JOINTURE
C’est la jointure d’une table avec elle-même comme si c’était une autre table. Ce type
de requête n’est pas si commun mais très pratique dans le cas où on veut joindre des
enregistrements d'une table à d'autres enregistrements de cette même table. Pour ce
faire, il faut utiliser des alias.

SELECT e.last_name emp, m.last_name mgr


FROM employees e JOIN employees m
ON (e.manager_id = m.employee_id)

• NON EQUI-JOINTURE
Contrairement à l'équi-jointure qui consiste à opérer une jointure avec une condition
d'égalité, la non équi-jointure utilise n'importe quelle condition de jointure entre deux
tables, exceptée la stricte égalité.

SELECT e.last_name, e.salary, j.grade_level


FROM employees e JOIN job_grades j
ON e.salary BETWEEN j.lowest_sal AND j.highest_sal

6.1.3 JOINTURE EXTERNE

Une jointure externe permet de sélectionner les lignes ayant des correspondances entre les
deux tables jointes ainsi que les lignes n'ayant pas de correspondance dans la table à droite,
ou dans la table à gauche ou dans les deux tables jointes.

SELECT e.last_name, d.department_id, d.department_name


FROM employees e JOIN departments d
ON (e.department_id = d.department_id)

Cette requête retourne 106 lignes. C’est le nombre d’employés affectés aux différents
départements.

• LEFT OUTER JOIN

SELECT e.last_name, d.department_id, d.department_name


FROM employees e LEFT OUTER JOIN departments d
ON (e.department_id = d.department_id)

2020/2021 - Ons BEN ROMDHANE & Adel DAHMANE 36


Notes de cours & TP 6 : Affichage de données à partir de plusieurs tables - Jointure

Cette requête retourne 107 lignes. C’est le nombre de tous les employés même ceux qui ne
sont pas affectés aux départements.

• RIGHT OUTER JOIN

SELECT e.last_name, d.department_id, d.department_name


FROM employees e RIGHT OUTER JOIN departments d
ON (e.department_id = d.department_id)

Cette requête retourne 122 lignes. C’est le nombre de tous les départements même ceux qui
ne correspondent pas à des employés.

• FULL OUTER JOINS

SELECT e.last_name, d.department_id, d.department_name


FROM employees e FULL OUTER JOIN departments d
ON (e.department_id = d.department_id)

Cette requête retourne 123 lignes. Elles contiennent les employés affectés aux départements
et ceux non affectés ainsi que les départements qui ne correspondent pas à des employés.

6.1.4 JOINTURE CROISÉE

La jointure croisée génère un produit cartésien entre les tables. Pour éviter le produit
cartésien, il faut que le nombre de conditions de jointure soit supérieur ou égal à N, avec N
est le nombre de tables jointes.

SELECT count(*) FROM employees


Retourne 107 lignes.

SELECT count(*) FROM departments


Retourne 27 lignes.

SELECT count(*) FROM employees CROSS JOIN departments


Retourne 2889 lignes (107*27).

2020/2021 - Ons BEN ROMDHANE & Adel DAHMANE 37


Notes de cours & TP 6 : Affichage de données à partir de plusieurs tables - Jointure

6.2 REQUÊTES

Dans chaque cas, on demande d’écrire une requête SQL pour l’opération considérée :

a) Afficher les noms des pays qui appartiennent à la région nommée Americas.

b) Afficher les noms des directeurs ainsi que les noms de leurs départements comme suit :

c) Afficher le résultat suivant pour les employés ayant un salaire >12000.

2020/2021 - Ons BEN ROMDHANE & Adel DAHMANE 38


Notes de cours & TP 6 : Affichage de données à partir de plusieurs tables - Jointure

d) Afficher le numéro, le nom et le numéro du département de chaque employé des


départements 10 ou 20 ou 30 avec le nom de son directeur. Trier le résultat par ordre
croissant selon le numéro du département.

e) Afficher les numéros des départements avec leurs localisations (location_id) et leurs villes
(city). On affiche aussi les localisations qui ne contiennent pas des départements.

2020/2021 - Ons BEN ROMDHANE & Adel DAHMANE 39


Notes de cours & TP 7

7.Les sous-requêtes

Objectifs
Au terme de ce chapitre, l’étudiant saura :
➢ Écrire des sous-requêtes.
➢ Distinguer entre les différents types des sous-requêtes

Durée estimative : 3h

7.1 NOTES DE COURS

7.1.1 DÉFINITION D’UNE SOUS-REQUÊTE

Une sous-requête est une requête imbriquée dans une instruction SELECT, INSERT, UPDATE
ou DELETE ou à l'intérieur d'une autre sous-requête. Une sous-requête peut renvoyer un
ensemble de lignes ou simplement une ligne. Une sous-requête scalaire est une requête qui
renvoie exactement une valeur : une seule ligne, avec une seule colonne. On peut utiliser une
sous-requête dans les clauses suivantes :
- SELECT : utilisée pour la projection de colonnes.
- FROM.
- WHERE.
- HAVING.

7.1.2 POURQUOI UTILISER LES SOUS-REQUÊTES ?

Il y a plusieurs situations où on aura besoin d’utiliser le résultat d'une requête dans une autre.

Exemple
Quels sont les noms des employés qui ont un salaire inférieur au salaire moyen ?
Cela peut être répondu par deux instructions, ou par une seule instruction avec une sous-
requête.
L'exemple suivant utilise deux instructions :
SELECT avg(salary) FROM employees
SELECT last_name FROM employees
WHERE salary < résultat de la requête précédente>

2020/2021 - Ons BEN ROMDHANE & Adel DAHMANE 40


Notes de cours & TP 7 : Les sous-requêtes

Comme on peut utiliser une seule instruction avec une sous-requête :


SELECT last_name
FROM employees
WHERE salary < (select avg(salary)from employees)

La syntaxe générale d’une sous-requête est :

SELECT liste_select
FROM table
WHERE expr operateur (SELECT liste_select FROM table)

NB :
- Mettre les sous-requêtes entre parenthèses.
- Placez les sous-requêtes sur le côté droit de la condition de comparaison pour la lisibilité.

7.1.3 TYPES DE SOUS-REQUÊTES

Il existe trois grands types de sous-requêtes :


- Sous-requêtes monolignes.
- Sous-requêtes multilignes
- Sous-requêtes corrélées.

• SOUS-REQUETES MONOLIGNE
- Retournent une seule ligne
- Utilisent des opérateurs de comparaison mono-ligne : =, <, >, <=, >=, <>.
- La sous-requête (requête interne) s'exécute (une seule fois) avant la requête principale
(requête externe).
- Le résultat de la sous-requête est utilisé par la requête principale.

SELECT last_name, job_id, salary


FROM employees
WHERE salary = (SELECT min(salary) FROM employees)

• SOUS-REQUETES MULTILIGNES
- Retournent plusieurs lignes.
- Utilisent des opérateurs de comparaison à multilignes.
- La sous-requête (requête interne) s'exécute (une seule fois) avant la requête
principale (requête externe).
- Le résultat de la sous-requête est utilisé par la requête principale.

2020/2021 - Ons BEN ROMDHANE & Adel DAHMANE 41


Notes de cours & TP 7 : Les sous-requêtes

Opérateur Signification
IN égal à n'importe quelle valeur dans une liste
NOT IN différente de n'importe quelle valeur dans une liste
ANY doit être précédé de =,<>,>, <, <=,> =. Renvoie des lignes
qui correspondent à n’importe quelle valeur d'une liste.
ALL doit être précédé de =,<>,>, <, <=,> =. Renvoie des lignes
qui correspondent à toutes les valeurs d'une liste.

SELECT employee_id, last_name, job_id, salary


FROM employees
WHERE salary < ANY (SELECT salary FROM employees
WHERE job_id = 'IT_PROG')
AND job_id <> 'IT_PROG’

• SOUS-REQUETES CORRELEES
Une sous-requête corrélée fait référence à des colonnes dans la requête principale,
donc son résultat dépend de la requête principale. Cela rend impossible l'évaluation
de la sous-requête avant d'évaluer la requête principale.

Exemple :
Considérez une requête qui affiche tous les employés dont le salaire est inférieur au
salaire moyen de leur département. Dans ce cas, la sous-requête doit être exécutée
pour chaque employé afin de déterminer le salaire moyen de son département Il est
nécessaire de passer le numéro de département de l'employé à la sous-requête.

SELECT p.last_name, p.department_id


FROM employees p
WHERE p.salary < (SELECT avg(s.salary) FROM employees s
WHERE s.department_id=p.department_id)

2020/2021 - Ons BEN ROMDHANE & Adel DAHMANE 42


Notes de cours & TP 7 : Les sous-requêtes

7.2 REQUÊTES

Dans chaque cas, on demande d’écrire une requête SQL pour l’opération considérée :
a) Afficher les employés ayant le salaire minimal.

b) Afficher les noms de tous les directeurs.

c) Quels sont les employés qui ont un salaire inférieur au salaire moyen de tous les
employés ?

d) Quels sont les employés qui ont un salaire inférieur au salaire moyen des employés de
leurs départements ?

e) Donner le salaire maximum dans chaque pays.

f) Quels sont les départements qui ont le nombre maximum d’employés ?

2020/2021 - Ons BEN ROMDHANE & Adel DAHMANE 43


Notes de cours & TP 8 : Manipulation de Données

Notes de cours & TP 8

8.Langage de Manipulation de Données


« DML »

Objectifs
Au terme de ce chapitre, l’étudiant saura :
➢ Décrire chaque instruction du langage de manipulation de données (DML)
➢ Insérer et Mettre à jour des lignes dans une table
➢ Supprimer des lignes d'une table
➢ Gérer les transactions de contrôle

Durée estimative : 3h

8.1 NOTES DE COURS

Une instruction LMD est exécutée en cas de :


- Ajout de nouvelles lignes à une table.
- Modification des lignes existantes dans une table.
- Suppression des lignes existantes d'une table.

Une transaction consiste en une collection d'instructions LMD qui forment une unité de travail
logique.

• AJOUT DE NOUVELLES LIGNES A UNE TABLE

Ajout d’une seule ligne à une table


Une instruction INSERT peut insérer une ligne, avec des valeurs de colonne spécifiées
dans l’instruction. La syntaxe générale est :

INSERT INTO table [(column [, column...])]


VALUES (value [, value...])
INSERT INTO DEPARTMENTS (department_id, department_name,
manager_id, location_id) VALUES (70, 'Public Relations',
100, 1700)
Mettre les chaînes de caractères et les dates entre des guillemets simples.

2020/2021 - Ons BEN ROMDHANE & Adel DAHMANE 44


Notes de cours & TP 8 : Manipulation de Données

Ajout d’un ensemble de lignes à une table


Une commande INSERT peut insérer un ensemble de lignes créées par une instruction
SELECT.
- Écrire l’instruction INSERT avec une sous-requête SELECT.
- Il n’y a pas de clause VALUES.
- Associer le nombre de colonnes dans la clause INSERT à celles de la sous-requête.

INSERT INTO SALES_REPS (id, name, salary, commission_pct)


SELECT employee_id, last_name, salary, commission_pct
FROM EMPLOYEES
WHERE job_id LIKE '%REP%'

Insérer toutes les lignes renvoyées par la sous-requête dans la table SALES_REPS.

• MODIFICATION DES LIGNES EXISTANTES DANS UNE TABLE


Une instruction UPDATE peut modifier les lignes dans une seule table, mais elle peut
modifier n'importe quel nombre de lignes dans cette table. Avec la clause WHERE,
seulement les valeurs des lignes spécifiques sont modifiées. Si on omet la clause WHERE,
les valeurs de toutes les lignes de la table sont modifiées.
La syntaxe générale est :

UPDATE table
SET column= value [, column = value, ...]
[WHERE condition]

UPDATE employees
SET department_id = 50
WHERE employee_id = 113

• SUPPRESSION DES LIGNES EXISTANTES D'UNE TABLE


La commande DELETE supprime une ligne ou un ensemble de lignes de la table, selon une
clause WHERE. S'il n'y a pas de clause WHERE, toutes les lignes de la table seront
supprimées.
La syntaxe générale est :

DELETE [FROM] table


[WHERE condition]

DELETE FROM departments


WHERE department_name = ‘Finance'

2020/2021 - Ons BEN ROMDHANE & Adel DAHMANE 45


Notes de cours & TP 8 : Manipulation de Données

2020/2021 - Ons BEN ROMDHANE & Adel DAHMANE 46


Notes de cours & TP 8 : Manipulation de Données

8.2 REQUÊTES

Dans chaque cas, on demande d’écrire une requête SQL pour l’opération considérée :

a) Créer une nouvelle table nommée DEPT possédant deux colonnes :


- Ndept number(3) : C’est la clé primaire et doit être entre 10 et 300.
- Dname : varchar2(20) qui doit être non nulle.

b) Insérer dans la table DEPT toutes les lignes de la table DEPARTMENTS.

c) Crée une nouvelle table EMP, copie de la table EMPLOYEES.

d) Ajouter l’information suivante : l’employé Ahmed BEN AHMED ayant comme numéro 260
a commencé son travail comme IT_PROG le ‘01/10/2010’ dans le département 300. Qu’est-
ce-que vous remarquez ?

e) Supprimer la dernière ligne ajoutée (department_id=300).

f) Ajouter dans la table EMP la contrainte de clé primaire pk_emp et la contrainte d’intégrité
référentielle fk_emp.

g) Exécuter la requête d). Qu’est-ce-que vous remarquez ?

h) Modifier le type de Dname par varchar2(30).

2020/2021 - Ons BEN ROMDHANE & Adel DAHMANE 47


Notes de cours & TP 8 : Manipulation de Données et Langage de définition de données

Notes de cours & TP 9

9.Langage de Définition de Données

Objectifs
Au terme de ce chapitre, l’étudiant saura :
➢ Créer une table avec ses colonnes et ses contraintes.
➢ Modifier la structure d’une table existante.

Durée estimative : 3h

9.1 NOTES DE COURS

Une instruction LDD est exécutée en cas de :


- Création d’une table : CREATE TABLE.
- Modification de la structure d’une table : ALTER TABLE.

• CREATION D’UNE TABLE : CREATE TABLE


Pour pouvoir créer une table, il faut :
- Avoir le privilège CREATE TABLE.
- Spécifier : le nom de la table, le nom, le type et la taille de chaque colonne.
La syntaxe générale est :

CREATE TABLE [schema.] TABLE


(nom_colonne type_données [DEFAULT expr][, ...])

Les noms des tables et des colonnes ne doivent pas dépasser 30 caractères. Les caractères
peuvent être des lettres, des chiffres, du trait de soulignement, du dollar ou du hash.
Chaque colonne doit avoir un type de données. Il y a plusieurs types de données, on peut
citer : VARCHAR2, CHAR, NUMBER, DATE. Une colonne peut avoir une valeur par défaut.

CREATE TABLE DEPT


(deptno NUMBER(2),
dname VARCHAR2(14),
loc VARCHAR2(13),
create_date DATE DEFAULT SYSDATE)

2020/2021 - Ons BEN ROMDHANE & Adel DAHMANE 48


Notes de cours & TP 8 : Manipulation de Données et Langage de définition de données

• CREATION DES CONTRAINTES LORS DE LA CREATION D’UNE TABLE


Les types de contraintes prises en charge par la base de données Oracle sont les suivants :
- UNIQUE
- NOT NULL
- PRIMARY KEY
- FOREIGN KEY CHECK

CREATE TABLE employees


(emp_id number(6)
CONSTRAINT emp_employee_id PRIMARY KEY,
first_name VARCHAR2(20),
last_name varchar2(25)
CONSTRAINT emp_last_name_nn NOT NULL,
email varchar2(25)
CONSTRAINT emp_email_nn NOT NULL
CONSTRAINT emp_email_uk UNIQUE,
phone_number varchar2(20),
hire_date date
CONSTRAINT emp_hire_date_nn NOT NULL,
job_id varchar2(10)
CONSTRAINT emp_job_nn NOT NULL,
salary number(8,2)
CONSTRAINT emp_salary_ck CHECK (salary>0),
commission_pct number(2,2),
manager_id number(6)
CONSTRAINT emp_manager_fk REFERENCES
employees (employee_id),
department_id number(4)
CONSTRAINT emp_dept_fk REFERENCES
departments (department_id))

• MODIFICATION DE LA STRUCTURE D’UNE TABLE : ALTER TABLE.


L’instruction ALTER TABLE est utilisée pour :

Ajouter une nouvelle colonne :


ALTER TABLE EMP ADD (JOB_ID NUMBER)

2020/2021 - Ons BEN ROMDHANE & Adel DAHMANE 49


Notes de cours & TP 8 : Manipulation de Données et Langage de définition de données

Modifier une définition de colonne existante :

ALTER TABLE EMP MODIFY (JOB_ID NUMBER(3,2))

Définir une valeur par défaut pour une colonne :

ALTER TABLE EMP MODIFY (COMM NUMBER(3,2) DEFAULT 0.05)

Supprimer une colonne :

ALTER TABLE EMP DROP COLUMN COMM

Renommer une colonne :

ALTER TABLE EMP RENAME COLUMN HIREDATE TO RECRUITED

Modifier la table en mode lecture seule :

ALTER TABLE EMP READ ONLY

Marquer des colonnes comme inutilisées

ALTER TABLE EMP SET UNUSED COLUMN JOB_ID

• SUPPRESSION D’UNE TABLE

Supprimer une table avec sa structure :

DROP TABLE [SCHEMA.]TABLENAME

Supprimer chaque ligne d'une table, tout en laissant la définition de table intacte :

TRUNCATE TABLE TABLE

9.2 REQUÊTES

Dans chaque cas, on demande d’écrire une requête SQL pour l’opération considérée :

i) Créer une nouvelle table nommée DEPT possédant deux colonnes :


- Ndept number(3) : C’est la clé primaire et doit être entre 10 et 300.
- Dname : varchar2(20) qui doit être non nulle.

2020/2021 - Ons BEN ROMDHANE & Adel DAHMANE 50

Vous aimerez peut-être aussi