Part III

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 40

Base de données

N O T E S D E C O U R S & FASCICULE DES


TR A V A U X PR A T I Q U E S C O R R I G E S

Dr. HAMMAMI Hamza


[email protected]

2023
Table des matières
1. Introduction à SQL ................................................................................................................ 5
1.1 Concepts de base ........................................................................................................... 5
1.1.1 Base de données ..................................................................................................... 5
1.1.2 SGBD ....................................................................................................................... 5
1.1.3 Le langage SQL ........................................................................................................ 5
1.2 Architecture du serveur oracle ...................................................................................... 6
1.3 Instance Oracle .............................................................................................................. 6
1.4 Schéma ........................................................................................................................... 7
1.5 Schéma de démonstration ............................................................................................. 7
2. Récupération des données avec la requête SQL SELECT de base ........................................ 9
2.1 Notes de cours ............................................................................................................... 9
2.1.1 La commande DESCRIBE ......................................................................................... 9
2.1.2 Rêquete SELECT de base ......................................................................................... 9
2.2 Requêtes ...................................................................................................................... 10
3. Données restreintes et Tri de données .............................................................................. 13
3.1 Notes de cours ............................................................................................................. 13
3.1.1 Données restreintes ............................................................................................. 13
3.1.2 Le tri ...................................................................................................................... 13
3.1.3 Les variables de substitution ................................................................................ 14
3.2 Requêtes ...................................................................................................................... 14
4. Fonctions Monolignes ........................................................................................................ 17
4.1 Notes de cours ............................................................................................................. 17
4.1.1 Fonctions de chaînes de caractères ..................................................................... 17
4.1.2 Fonctions numériques .......................................................................................... 18
4.1.3 Fonctions sur les dates ......................................................................................... 18
4.2 Requêtes ...................................................................................................................... 20
5. Fonctions de conversion et Expressions conditionnelles ................................................... 22
5.1 Notes de cours ............................................................................................................. 22
5.1.1 Fonctions de conversion ....................................................................................... 22
5.1.2 Fonctions générales .............................................................................................. 24
5.1.3 Expressions conditionnelles ................................................................................. 25
5.2 Requêtes ...................................................................................................................... 28
6. Fonctions de groupe ........................................................................................................... 31
6.1 Notes de cours ............................................................................................................. 31
6.1.1 Définition des fonctions de groupe ...................................................................... 31
6.1.2 La clause GROUP BY.............................................................................................. 32
6.1.3 La clause HAVING ................................................................................................. 33
6.2 Requêtes ...................................................................................................................... 34
7. Les sous-requêtes ............................................................................................................... 36
7.1 Notes de cours .............................................................................................................36
7.1.1 Définition d’une sous-requête.............................................................................. 36
7.1.2 Pourquoi utiliser les sous-requêtes ? ................................................................... 36
7.1.3 Types de sous-requêtes.......................................................................................... 37
7.2 Requêtes ...................................................................................................................... 39
Bibliographie ............................................................................................................................... 40
Introduction à SQL

Chapitre 1

1.Introduction à SQL

1.1 CONCEPTS DE BASE

1.1.1 BASE DE DONNEES

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).

1.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.

1.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

HAMMAMI Hamza 5
Introduction à SQL

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.

1.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.

1.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
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.

HAMMAMI Hamza 6
Introduction à SQL

1.4 SCHEMA

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.

1.5 SCHEMA DE DEMONSTRATION

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 dans le schéma
HR.

Figure 1-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.

HAMMAMI Hamza 7
Introduction à SQL

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


premier sens indique simplement qu'il peut y avoir de nombreux membres du personnel 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.

HAMMAMI Hamza 8
Chapitre 2 : Récupération des données avec la requête SQL SELECT de base

Chapitre 2

2.Récupération des données avec la


requête SQL SELECT de base

2.1 NOTES DE COURS

2.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.

2.1.2 REQUETE 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.


 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.
HAMMAMI Hamza 9
Chapitre 2 : Récupération des données avec la requête SQL SELECT de base

2.2 REQUETES

1) Exécuter le script de création de la base HR en utilisant le fichier HR_CRE.sql


2) Exécuter le script de chargement de la base HR en utilisant le fichier HR_INS.sql
3) 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.

HAMMAMI Hamza 10
Chapitre 2 : Récupération des données avec la requête SQL SELECT de base

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

HAMMAMI Hamza 11
Chapitre 2 : Récupération des données avec la requête SQL SELECT de base

h) Afficher le résultat suivant

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

HAMMAMI Hamza 12
1. Chapitre 3 : Données restreintes et Tri de données

Chapitre 3

3.Données restreintes et Tri de


données

3.1 NOTES DE COURS

3.1.1 DONNEES 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)]

3.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) | expr | alias | numeric_pos} [ASC|DESC] [NULLS
FIRST| NULLS LAST]]

HAMMAMI Hamza 13
1. Chapitre 3 : Données restreintes et Tri de données

3.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.

3.2 REQUETES

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’.

HAMMAMI Hamza 14
1. Chapitre 3 : Données restreintes 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.

HAMMAMI Hamza 15
1. Chapitre 3 : Données restreintes 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).

HAMMAMI Hamza 16
2. Chapitre 4 : Fonctions Monolignes

Chapitre 4

4.Fonctions Monolignes

4.1 NOTES DE COURS

4.1.1 FONCTIONS DE CHAINES DE CARACTERES

 Fonctions de conversion de chaînes de caractères : lower, upper, initcap.

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

 Fonctions de manipulations des chaînes de caractères : concat, substr, left, right, length,
instr, lpad, rpad, trim, rtrim, ltrim, replace.

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

HAMMAMI Hamza 17
2. Chapitre 4 : Fonctions Monolignes

4.1.2 FONCTIONS NUMERIQUES

 ROUND : effectue un arrondissement sur une valeur numérique.

Exemples
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.

Exemples
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

Exemple
MOD(1600, 300) = 100

4.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.

 MONTHS_BETWEEN (date_fin,date_debut) : retourne le nombre de mois entre les deux


dates. Le résultat peut être négatif.

Exemple
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.

HAMMAMI Hamza 18
2. Chapitre 4 : Fonctions Monolignes

Exemple
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.

Exemple
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.

Exemple
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

HAMMAMI Hamza 19
2. Chapitre 4 : Fonctions Monolignes

4.2 REQUETES

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.

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.
HAMMAMI Hamza 20
2. Chapitre 4 : Fonctions Monolignes

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.

HAMMAMI Hamza 21
Chapitre 5 : Fonctions de conversion et expressions conditionnelles

Chapitre 5

5. Fonctions de conversion et
Expressions conditionnelles

5.1 NOTES DE COURS

5.1.1 FONCTIONS DE CONVERSION

 CONVERSION IMPLICITE DES TYPES DE DONNEES


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

Exemples
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


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

SELECT length (123456789) FROM dual


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

SELECT length (SYSDATE) FROM dual


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

HAMMAMI Hamza 22
Chapitre 5 : Fonctions de conversion et expressions conditionnelles

 CONVERSION EXPLICITE DES TYPES DE DONNEES

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

Exemples
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])

Exemple
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])

Exemples
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

HAMMAMI Hamza 23
Chapitre 5 : 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.

5.1.2 FONCTIONS GENERALES

 FONCTION NVL

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

Exemples
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'.

HAMMAMI Hamza 24
Chapitre 5 : Fonctions de conversion et expressions conditionnelles

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


Retourne une erreur car les types sont incompatibles.

 FONCTION NULLIF

NULLIF (parametre1, parametre2)


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

Exemples
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.

Exemples
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.

5.1.3 EXPRESSIONS CONDITIONNELLES

 FONCTION DECODE

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


iftrueN]], [iffalse])

HAMMAMI Hamza 25
Chapitre 5 : Fonctions de conversion et expressions conditionnelles

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.

Exemples
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.

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.

Exemple
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'.
HAMMAMI Hamza 26
Chapitre 5 : Fonctions de conversion et expressions conditionnelles

 2ème version

CASE
WHEN condition1 THEN return_expr1
[WHEN condition2 THEN return_expr2

WHEN conditionN THEN return_exprN
Else ilfalse]
END

Exemple
SELECT CASE WHEN substr(1234,1,3) = '134' THEN'1234 is a match'
WHEN substr(1234,1,3) = '1235'THEN '1235 is a match'
WHEN substr(1234,1,3) = concat('1','23') THEN
concat('1','23')||' is a match'
ELSE 'no match'
END value
FROM dual

HAMMAMI Hamza 27
Chapitre 5 : Fonctions de conversion et expressions conditionnelles

5.2 REQUETES

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.

HAMMAMI Hamza 28
Chapitre 5 : 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’.

HAMMAMI Hamza 29
Chapitre 5 : Fonctions de conversion et expressions conditionnelles


14 lignes

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

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

HAMMAMI Hamza 30
Chapitre 6 : Fonctions de groupe

Chapitre 6

6.Fonctions de groupe

6.1 NOTES DE COURS

6.1.1 DEFINITION 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]

Exemples
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.

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.

HAMMAMI Hamza 31
Chapitre 6 : Fonctions de groupe

Exemple
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.

6.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.

Exemple
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.

Exemple
SELECT department_id , job_id, max (salary), count (*)
FROM Employees
GROUP BY department_id, job_id
ORDER BY department_id, job_id
HAMMAMI Hamza 32
Chapitre 6 : Fonctions de groupe

6.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

HAMMAMI Hamza 33
Chapitre 6 : Fonctions de groupe

6.2 REQUETES

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.

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.

HAMMAMI Hamza 34
Chapitre 6 : Fonctions de groupe

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’.

HAMMAMI Hamza 35
Chapitre 7 : Les sous-requêtes

Chapitre 7
8.Les sous-requêtes

7.1 NOTES DE COURS

7.1.1 DEFINITION D’UNE SOUS-REQUETE

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-REQUETES ?

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>

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


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

HAMMAMI Hamza 36
Chapitre 7 : Les sous-requêtes

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

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

- 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-REQUETES

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.

Exemple :
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.

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.

HAMMAMI Hamza 37
Chapitre 7 : Les sous-requêtes

Exemple :
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)

HAMMAMI Hamza 38
Chapitre 7 : Les sous-requêtes

7.2 REQUETES

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 ?

HAMMAMI Hamza 39
Bibliographie
LORENTZ , D. (s.d.). Oracle Database SQL Reference, 10g. Oracle Press.

WATSON, J., & RAMKLASS, R. (s.d.). OCA Oracle Database 11g. SQL Fundamentals I. Exam
Guide. Oracle Press.

Webographie
http://didier.deleglise.free.fr/dba/archi/archi_main.htm. Consulté Août 2018.
https://openclassrooms.com/courses/administrez-vos-bases-de-donnees-avec-mysql.
Octobre 2018
https://www.cbtnuggets.com/it-training/oracle-database-11g-sql-fundamentals-1-1z0-051.
Consulté Septembre 2018.
https://code.google.com/archive/p/adf-samples-demos/downloads. Consulté Août 2018.

HAMMAMI Hamza 40

Vous aimerez peut-être aussi