Vous êtes sur la page 1sur 34

Mme LABBENE AYACHI Faten

LE LANGAGE SQL
Dialecte Oracle

Interrogation des données


& Contrôle des accès utilisateurs

Références :

Le langage SQL & L’outil SQL*PLUS Le langage SQL & L’outil iSQL*PLUS
Volume 1 - Manuel du stagiaire Volume 1 - Manuel du stagiaire
M41001FR11 M40057FR11
Production 1.0 - July 1997 Production 1.1 -Février 2002
MO3989-FR D34268
Oracle Oracle
Sommaire
Interrogation des données
Les fonctions mono-ligne ……………………………………………............. 3
Fonction Caractère. 3
Fonctions numériques. 5
Fonctions Date. 7
Fonctions de conversion. 8
La fonction DECODE. 9
Formats de type DATE. 9
Format Heure. 10
Autres formats. 10
Utilisation du préfixe FM. 11
Influence des suffixes sur les nombres affichés. 11
Le format Date RR. 11
Eléments format numérique. 12
Imbrication des fonctions mono-ligne. 12

La conjugaison du verbe SELECT


Les différentes façons d’afficher le contenu d’une table ………... 13
Le bloc SWGH. 13
Expressions arithmétiques sur les données. 14
Alias sur les colonnes ou changement d’un titre de colonne à l’affichage. 14
Opérateur de concaténation. 15
Gestion des valeurs NULL. 15
Gestion des doublons. 16
Tri des lignes avec la clause ORDER BY. 16
Sélection des lignes avec la clause WHERE. 17

Afficher le contenu de plusieurs tables ………………………………… 20


Requête avec une jointure simple ou équi-jointure. 20
Alias de table. 21
Non équi-jointure. 21
Jointure externe. 22
Jointure d’une table sur elle-même (auto-jointure) avec alias de table. 22

La clause group by …………………………………………………………….... 23


Fonctions multi-ligne. 23
Règles syntaxiques avec la clause GROUP BY. 25
Groupes au sein d’autres groupes. 26

Les sous-interrogations ………………………………………………………… 27


Sous-interrogations mono-ligne. 28
Sous-interrogation multi-ligne. 28
Sous-interrogations multi-colonne. 30
Sous-interrogations synchronisées ou corrélatives. 30

Traduction des opérateurs algébriques dans le langage SQL 31


Projection –Sélection - Jointure 31
Différence 32
Union – Intersection - Division 33

Le langage SQL - Extrait du manuel du stagiaire © Faten Labbene Ayachi 2


Interrogation des données

Les fonctions permettent de construire des interrogations de base plus puissantes, et sont utilisées pour
manipuler des données. Il existe deux types de fonctions : les fonctions mono-ligne et les fonctions multi-
lignes.

Les fonctions mono_ligne

Les fonctions mono-lignes agissent sur une seule ligne à la fois, et retournent une valeur par ligne.
Les différents types de fonctions mono-ligne sont indiqués ci-dessous.
- caractère
- numérique
- date
- conversion

Elles sont utilisées dans les clauses SELECT, WHERE et ORDER BY.

nom_fonction (colonne | expression, [arg1, arg2, …])

nom_fonction nom de la fonction


colonne nom de la colonne base de données
expression est une chaîne de caractères ou une expression calculée
arg1, arg2 arguments utilisés par la fonction

Fonctions caractère

Les fonctions mono-ligne caractère acceptent des données de type caractère en entrée et peuvent
retourner soit des valeurs de type caractère, soit des valeurs de type numérique.

Fonctions de type CARACTERE Description

LOWER(colonne | expression) Convertit les caractères alpha en minuscule.

UPPER(colonne | expression) Convertit les caractères alpha en majuscule

INITCAP(colonne | expression) Convertit le premier caractère de chaque mot en majuscule, et


tous les autres en minuscule.

CONCAT(col1 | exp1, col2 | exp2) Concatène la première chaîne de caractères avec la seconde
chaîne de caractères. Elle est équivalente à l’opérateur ||.

SUBSTR(colonne | expression, m [, N]) Extraction de caractères à partir de la position m, sur une

Le langage SQL - Extrait du manuel du stagiaire © Faten Labbene Ayachi 3


longueur de N. Si m est négatif elle part de la fin de la valeur.

LENGTH(colonne | expression) Retourne le nombre de caractères de la valeur.

SOUNDEX(colonne | expression) Ressemblance phonétique entre les chaines

LPAD(chaine, N) Ajuste la chaine sur N positions avec justification à droite


(ajoute des blancs à gauche).

RPAD(chaine, N) Ajuste la chaine sur N positions avec justification à gauche


(ajoute des blancs à droite).

LTRIM(colonne | expression) Tronque les blancs à gauche de l’expression.

RTRIM(colonne | expression) Tronque les blancs à droite de l’expression.

TRIM(colonne | expression) Tronque les blancs à gauche et à droite de l’expression.

REPLACE(colonne | expression, ch1, ch2) Remplace dans la valeur de la colonne ou de l’expression


toutes les occurrences de la sous chaine ch1 par la sous chaîne
ch2.

INSTR(colonne | expression, ch, Bi, N) Calcule la position de la Nième occurrence de la sous chaine
ch dans la colonne ou l’expression à partir de la position Bi.

TRANSLATE(chaîne, car_source,
car_cible)

UPPER(‘Cours SQL’) = ‘COURS SQL’


LOWER(‘Cours SQL’) = ‘cours sql’
INITCAP(‘Cours SQL’) = ‘COURS SQL’
CONCAT(‘Good’, ‘String’) = ‘GoodString’
SUBSTR(‘String’, 1, 3) = ‘Str’
LENGTH(‘String’) = 6

« Numéro des pilotes dont les noms ressemblent à ‘MIREND’? »

SELECT PLNUM
FROM PILOTE
WHERE SOUNDEX(PLNOM) = SOUNDEX(‘MIREND’);

SELECT LTRIM(' TOTO ') ---------


FROM DUAL TOTO

SELECT RTRIM(' TOTO ') ---------


FROM DUAL; TOTO

SELECT TRIM(' TOTO ') ----


FROM DUAL; TOTO

Le langage SQL - Extrait du manuel du stagiaire © Faten Labbene Ayachi 4


SELECT INSTR('BLABLABLA', 'A', 1, 2) INSTR('BLABLABLA','A',1,2)
FROM DUAL; --------------------------
6

SELECT REPLACE('BLABLABLA', 'BL', 'PK') REPLACE('


FROM DUAL; ---------
PKAPKAPKA

SELECT TRANSLATE(PLNOM, 'AM', '*#')


FROM PILOTE;

Fonctions numériques

Fonctions de type NUMERIQUE Description

ROUND(colonne | expression, n) Arrondit la valeur de la colonne ou de l’expression au


nombre de décimales n. Si n n’est pas indiqué aucune
décimale n’est positionnée. Si n est négatif le nombre à
gauche du point décimal est arrondis.

TRUNC(colonne | expression, n) Tronque la valeur de la colonne ou de l’expression au


nombre de décimales n. Si n n’est pas indiqué aucune
décimale n’est positionnée. Si n est négatif, les |n| premiers
chiffres à gauche du point décimal sont remplacés par zéro.

MOD(m, n) Retourne le reste de la division de m par n.

CEIL(colonne | expression) Calcule la valeur plafond.

FLOOR(colonne | expression) Calcule la partie entière de la colonne ou expression.

ABS(colonne | expression) Calcule la valeur absolue de colonne ou expression.

SIGN(colonne | expression) Retourne 1 si la valeur de la colonne ou de l’expression est


positive et -1 sinon.

SQRT(colonne | expression) Calcule racine carré de colonne ou expression.

GREATEST({colonne | expression}) Retourne la plus grande valeur des valeurs passées en


paramètres.

LEATEST({colonne | expression}) Retourne la plus petite valeur des valeurs passées en


paramètres.

POWER(x, N) Calcule x à la puissance N.

Le langage SQL - Extrait du manuel du stagiaire © Faten Labbene Ayachi 5


ROUND et TRUNC peuvent aussi être utilisés avec des données de type DATE.

SELECT ROUND(45.927, 2), ROUND(45.927, 0), ROUND(45.927, -1)


FROM DUAL;

ROUND(45.927, 2) ROUND(45.927, 0) ROUND(45.927, -1)


------------------------ ------------------------- ---------------------------
45.93 46 50

SELECT TRUNC(45.927, 2), TRUNC(45.927, 0), TRUNC(45.927, -1)


FROM DUAL;

TRUNC(45.927,2) TRUNC(45.927,0) TRUNC(45.927,-1)


----------------------- ------------------------ ----------------------------
45,92 45 40

SELECT MOD(1600, 300)


FROM DUAL;

MOD(1600,300)
---------------------
100

DUAL est une table système artificielle dont le propriétaire est SYS. Elle possède une colonne
DUMMY, et une ligne dont la valeur est ‘X’. La table DUAL est utilisée lorsque la valeur à afficher ne
provient pas directement de la base, par exemple un calcul avec des constantes.

Le fait que les dates soient stockées comme des nombres dans la base de données, permet
d’effectuer des calculs arithmétiques tels qu’une addition ou une soustraction sur des données de
type date.

Les opérations permises sont les suivantes :

Opération Résultat Description


date + nombre date Ajout d’un nombre de jours à une date.
date – nombre date Soustrait un nombre de jours à une date.
date – date Nombre d’heures Soustrait une date à une autre.
date + nombre / 24 date Ajout d’un nombre d’heures à une date.

SYSDATE est une fonction SQL qui retourne la date et l’heure courantes.

« Afficher la date courante. »


SELECT SYSDATE
FROM DUAL

Le langage SQL - Extrait du manuel du stagiaire © Faten Labbene Ayachi 6


Fonctions Date

Fonctions DATE Description

MONTHS_BETWEEN(date1, date2) Calcule le nombre de mois entre date1 et date2. Le résultat peut
être positif ou négatif. Si date1 est plus grand que date2, le résultat
est positif ; par contre si date1 est plus petit que date2 le résultat
est négatif. La partie décimale du résultat représente une portion
de mois.

ADD_MONTHS(date, n) Ajout d’un nombre de mois n à une date. n doit être un entier et
peut être négatif.

NEXT_DAY(date, expr) Calcule la date du prochain jour de la semaine spécifié dans expr.
Expr peut être un nombre représentant un n° de jour de la semaine
ou une chaîne de caractères (nom du jour).

LAST_DAY(date) Calcule la date du dernier jour du mois que contient la date.

ROUND(date[, ‘fmt’]) Retourne la date arrondie en fonction du format fmt. Si ce dernier


n’est pas spécifié, la date est arrondie au jour et l’heure est mise à
minuit. Cela permet des comparaisons entre deux dates.

TRUNC(date[, ‘fmt’]) Retourne la date tronquée en fonction du format fmt. Si ce dernier


n’est pas spécifié, la date est tronquée au jour et l’heure est mise à
minuit.

Oracle stocke les dates dans un format interne numérique, représenté de la façon suivante :
Siècle, Année, Mois, Jour, Heures, Minutes, Secondes

L’affichage et le format de saisie par défaut pour toutes les dates est DD-MON-YY.

MONTHS_BETWEEN(‘01-SEP-95’, ‘11-JAN-94’) = 19.6774194


ADD_MONTHS(‘11-JAN-94’, 6) = ‘11-JUL-94’
NEXT_DAY(‘01-SEP-95’, ‘Friday’) = ‘08-SEP-95’
LAST-DAY(‘01-SEP-95’) = ‘30-SEP-95’

Il est possible de tronquer ou d’arrondir les dates à l’année ou au mois.


ROUND(‘25-MAY-95’, ‘MONTH’) = ‘01-JUN’95’
ROUND(‘25-MAY-95’, ‘YEAR’) = 01-JAN-95
ROUND(‘25-MAY-95’) = 25-MAY-95

Arrondit au jour le plus proche en fonction de l’heure.


TRUNC(‘25-MAY-95’, ‘MONTH’) = 01-MAY-95
TRUNC(‘25-MAY-95’, ‘YEAR’) = 01-JAN-95

Le langage SQL - Extrait du manuel du stagiaire © Faten Labbene Ayachi 7


Fonctions de conversion

SQL propose trois fonctions de conversion pour changer le type de donnée d’une valeur en un autre.

Fonction Description

TO_CHAR(nombre | date [, ‘fmt’]) Convertit une valeur numérique ou date en chaîne de caractères
VARCHAR2 avec le format fmt.

TO_NUMBER(char) Convertit une chaîne de caractères contenant des chiffres en


numérique.

TO_DATE(char [, ‘fmt’]) Convertit une chaîne de caractères représentant une date en une
valeur de type date accordée au format fmt spécifié. Si fmt n’est
pas indiqué, le format est DD-MON-YY.

ASCII(chaîne) Code ASCII ou EBCEDIC du premier caractère de la chaîne.

CHR(code) Caractère du code ASCII.

VSIZE(expression) Taille de l’expression.

La fonction TO_CHAR permet de convertir une date dans un format spécifique exp : ‘MM/YY’.

EXTRACT remplace TO_CHAR mais avec une syntaxe plus simple.

SELECT TO_CHAR(SYSDATE, 'MM/YY')


FROM DUAL;

TO_CHAR(SYSDATE, 'MM/YY')
------------
10/07

SELECT extract(day from sysdate),


extract(month from sysdate),
extract(year from sysdate)
FROM dual;

EXTRACT(DAYFROMSYSDATE) EXTRACT(MONTHFROMSYSDATE) EXTRACT(YEARFROMSYSDATE)


-------------------------------------- ----------------------------------------- --------------------------------------
17 10 2007

Le langage SQL - Extrait du manuel du stagiaire © Faten Labbene Ayachi 8


La fonction DECODE

DECODE(CRIT, VAL1, RES1(, VAL2, RES2 …), DEF)

Résultat :
= RES1 si CRIT = VAL1
= RES2 si CRIT = VAL2
= …
= DEF si CRIT != VAL1, != VAL2, ….

Exemple :
Afficher le nom, la fonction, le salaire des employés sans afficher le salaire des présidents et
des managers.

SELECT ENAME, JOB,


DECODE(JOB, 'PRESIDENT', '***', 'MANAGER', '***', SAL) SALAIRE
FROM EMP;

ENAME JOB SALAIRE


---------- --------- ----------------------------------------
SMITH CLERK 800
ALLEN SALESMAN 1600
WARD SALESMAN 1250
JONES MANAGER ***
MARTIN SALESMAN 1250
BLAKE MANAGER ***
CLARK MANAGER ***
SCOTT ANALYST 3000
KING PRESIDENT ***
TURNER SALESMAN 1500
ADAMS CLERK 1100
JAMES CLERK 950
FORD ANALYST 3000
MILLER CLERK 1300

Formats de type DATE

Elément Description
SCC ou CC Siècle ; préfixe S pour une date avant J.C représentée par un –
YYYY ou SYYYY Année ; préfixe S pour une date avant J.C représentée par un –
YYY ou YY ou Y Les 3, 2, 1 chiffre(s) de l’année.
Y,YYY Année avec une virgule à cette position.
SYEAR ou YEAR Année en toutes lettres ; S préfixe les années avant J.C. par –
BC ou AD Indique avant ou après J.C.
B.C ou A.D Indique avant ou après J.C. avec des points.
Q N° du trimestre dans l’année.
MM N° du mois dans l’année.
MONTH Nom du mois en toutes lettres, complété par des blancs jusqu’à 9 caractères.
Abréviation du nom du mois sur 3 lettres.

Le langage SQL - Extrait du manuel du stagiaire © Faten Labbene Ayachi 9


MON N° du mois en chiffres romains.
RM N° de semaine dans l’année ou le mois.
WW ou W N° du jour dans l’année, le mois ou la semaine.
DDD ou DD ou D Nom du jour complété par des blancs jusqu’à 9 caractères.
DAY Abréviation du nom du jour sur 3 lettres.
DY Jour du calendrier Julien ; nombre de jours depuis le 31 décembre 4713 avant
J J.C.

SELECT TO_CHAR(sysdate, 'day') JOUR


Jour --------
FROM DUAL; Jeudi

SELECT CURRENT_DATE "DATE" Date


FROM DUAL; --------
29/11/07

SELECT CURRENT_TIMESTAMP CURRENT_TIMESTAMP


FROM DUAL; ------------------------------------------------------------
29/11/07 23:37:22,343000 +01:00

SELECT SYSTIMESTAMP SYSTIMESTAMP


FROM DUAL; ----------------------------------------------------
29/11/07 23:38:59,468000 +01:00

Formats Heure

On utilise la liste des formats dans le tableau ci-dessous pour afficher des informations sur l’heure.

Elément Description
AM ou PM Indicateur de la journée (avant ou après midi).
A.M ou P.M Indicateur de la journée avec des points.
HH ou HH12 ou HH24 Heure du jour ou heure (1-12) ou heure (0-23).
MI Minutes (0-59).
SS Secondes (0-59).
SSSSS Secondes après minuit (0-86399).

Autres formats

Elément Description
/.,: Ponctuation reproduite dans le résultat.
‘of the’ Chaîne de caractères reproduite dans le résultat.

Le langage SQL - Extrait du manuel du stagiaire © Faten Labbene Ayachi 10


Utilisation du préfixe FM

Le préfixe FM supprime les blancs dans les noms des mois et de jours, gardant un résultat sur une
longueur variable. Ceci supprime aussi les zéros précédents les nombres. La seconde occurrence de
FM replace les blancs.

Influence des suffixes sur le nombre affiché

Suffixe Description
TH Nombre ordinal (par exemple, DDTH pour 4 TH).
SP Nombre en toutes lettres (par exemple, DDSP pour FOUR).
SPTH ou THSP Nombre ordinal en toutes lettres (par exemple, DDSPTH pour FOURTH).

Le format Date RR

Le format Date RR est identique à l’élément YY, mais il permet de spécifier différents siècles. Il est
possible d’utiliser le format date RR à la place de YY, ainsi le siècle de la valeur retournée varie
suivant les deux chiffres de l’année spécifiée et les deux derniers chiffres de l’année courante. Le
tableau de la page ci-contre résume les caractéristiques de l’élément RR.

Année courante Date donnée Interprété (RR) Interprété (YY)


1994 27-OCT-95 1995 1995
1994 27-OCT-17 2017 1917
2001 27-OCT-17 2017 2017

Si les deux chiffres de l’année spécifiée sont


0-49 50-99
Si les La date retournée est La date retournée est
deux 0 – 49 dans le siècle courant. dans le siècle avant celui
chiffres courant.
de La date retournée est La date retournée est
l’année 50 - 99 dans le siècle après dans le siècle courant.
courante celui courant.
sont

Le langage SQL - Extrait du manuel du stagiaire © Faten Labbene Ayachi 11


Eléments format Numérique

Elément Description Exemple Résultat


9 Représente un chiffre (le nombre de 9 détermine la taille 999999 1234
d’affichage).

0 Affiche des zéros à gauche. 099999 001234

$ Signe dollar flottant. $999999 $1234

L Symbole local courant flottant. L999999 FF1234

. Point décimal à la position spécifiée. 999999.99 1234.00

, Virgule à la position spécifiée. 999,999 1,234

MI Signe moins à droite (valeur négative). 999999MI 1234-

PR Nombre négatif entre les signes inférieur et supérieur. 999999PR <1234>

EEEE Notation scientifique. 99.999EEEE 1.234E+03

V Multiplie n fois le nombre par 10 (n=nombre de chiffres 9999V99 123400


après le signe V).

B Affiche la valeur zéro par un blanc. B9999.99 1234.00

Pour pouvoir utiliser l’élément format L, il faut positionner le paramètre NLS_CURRENCY dans le
fichier init.ora.
Oracle 7 Server affiche une chaîne de caractères # à la place de la valeur numérique lorsque le
nombre de chiffres excède le format spécifié.

Imbrication de fonctions mono-ligne

Les fonctions mono-ligne peuvent être imbriquées les unes à l’intérieur des autres. Les fonctions
sont alors évaluées du niveau le plus à l’intérieur vers le niveau le plus extérieur.

Le langage SQL - Extrait du manuel du stagiaire © Faten Labbene Ayachi 12


Interrogation des données

La conjugaison du verbe SELECT


Les différentes façons d’afficher le contenu d’une table

Pour pouvoir interroger les données contenues dans la base vous devez savoir utiliser la commande
SELECT du langage SQL. Vous aurez très fréquemment besoin de spécifier les lignes et les
colonnes que vous souhaitez afficher, ainsi que l’ordre dans lequel les lignes doivent être triées.

Le bloc SWFGH

SELECT [DISTINCT] { colonne [alias], …} ou *


FROM liste de tables Partie obligatoire

[WHERE condition(s)] Partie optionnelle

[GROUP BY colonnes de groupement [HAVING condition de groupe] ]


[ORDER BY {colonne, expr, alias} [ASC|DESC]]

La clause SELECT définie les colonnes de la table qu’on veut avoir pour le résultat.
La clause FROM précise les noms des tables qui seront utilisées pour répondre à la requête.
La clause WHERE définie une expression booléenne que doivent satisfaire les n-uplets de la
relation résultat.
Cette expression est formée en utilisant :

- les opérateurs de comparaison (<, >, <=, >=, =, <>, !=, ^=)
- les connecteurs logiques (NOT, AND, OR)
- les prédicats d’appartenance à un ensemble (IN, NOT IN)
- le prédicat de comparaison rapprochée (LIKE, NOT LIKE, NULL, NOT NULL)
- le prédicat d’existence (EXISTS, NOT EXISTS)
- le prédicat d’interval (BETWEEN, NOT BETWEEN).

La clause GROUP BY permet de diviser le résultat en groupes selon un ou plusieurs critères.


La clause HAVING permet de sélectionner les groupes vérifiant un ou plusieurs critères.
La clause ORDER BY permet de trier le résultat final selon un ou plusieurs critères de tri.
La clause DISTINCT permet d’éliminer les tuples en double du résultat final.

« Contenue de la table PILOTE »


SELECT *
FROM PILOTE

SELECT ROWNUM, PILOTE.*


FROM PILOTE

Le langage SQL - Extrait du manuel du stagiaire © Faten Labbene Ayachi 13


« Projection de la table PILOTE : Liste des numéros et noms de tous les pilotes »
SELECT PLNUM, PLNOM
FROM PILOTE

« Sélection de lignes : Liste des pilotes qui habitent ‘TUNIS’ »


SELECT *
FROM PILOTE
WHERE UPPER(VILLE) = ‘TUNIS’

« Sélection + Projection de la table PILOTE : Liste des numéros des pilotes qui habitent
‘TUNIS’»
SELECT PLNUM
FROM PILOTE
WHERE UPPER(VILLE) = ‘TUNIS’

Expressions arithmétiques sur les données

Il est possible de créer des expressions sur des données de type NUMBER ou DATE (Oracle 7) avec
les opérateurs :

- Addition +
- Soustraction -
- multiplication *
- Division /

Priorité de * et / sur + et –
() pour forcer la priorité des opérateurs.

On pourra référencer ces opérateurs dans toutes les clauses d’une instruction SELECT sauf dans la
clause FROM.

« Salaire annuel des pilotes »


SELECT PLNUM, PLNOM, SALAIRE*12
FROM PILOTE

La colonne SALAIRE*12 existe uniquement à l’affichage.

Alias sur les colonnes ou changement d’un titre de colonne à l’affichage

Un alias sur colonne renomme l’entête de la colonne :

- très utile pour les expressions


- se trouve immédiatement derrière le nom de la colonne, éventuellement, séparé de celui-ci
par le mot clé AS
- utiliser des guillemets si l’alias contient des espaces, des caractères spéciaux ou s’il faut
distinguer les majuscules des minuscules.

Le langage SQL - Extrait du manuel du stagiaire © Faten Labbene Ayachi 14


SELECT PLNUM « Numéro Pilote », PLNOM « Nom Pilote »
FROM PILOTE

SELECT PLNUM, PLNOM, SALAIRE*12 Salaire_Annuel


FROM PILOTE

SELECT PLNUM, PLNOM, SALAIRE*12 AS Salaire_Annuel


FROM PILOTE

SELECT PLNUM, PLNOM, SALAIRE*12 AS « Salaire Annuel »


FROM PILOTE

Opérateur de concaténation

Il est représenté par deux barres verticales ||


Il lie des colonnes ou des chaînes de caractères à d’autres colonnes.
La colonne résultante est de type chaîne de caractères.

SELECT PLNUM || ‘, ‘ || PLNOM AS « Pilotes »


FROM PILOTE

Gestion des valeurs NULL

NULL désigne l’absence de valeur.


NULL est différent de zéro et du caractère « espace ».
Les expressions contenant des valeurs NULL sont évaluées à NULL.
Les colonnes de tous types peuvent contenir du NULL.

Pour convertir une valeur NULL en une valeur définie, on utilisera la fonction NVL

NVL(expr1, expr2) tel que expr1 et expr2 sont du même type


expr2 est la valeur retournée quand expr1 vaut NULL

COALESCE(expr1, expr2) elle est équivalente à NVL.

Plus intéressante que NVL, NVL2 admet 3 paramètres plutôt que 2 mais retourne toujours du
varchar2.

NVL2(expr1, expr2, expr3) expr2 et expr3 sont de type varchar2


expr2 est la valeur retournée quand expr1 vaut NULL
sinon c’est expr3 qui est retournée

« Salaire annuel des pilotes »


SELECT PLNUM, PLNOM, NVL(SALAIRE, 0)*12
FROM PILOTE

Le langage SQL - Extrait du manuel du stagiaire © Faten Labbene Ayachi 15


« Nombre des heures de vol des pilotes »
SELECT PLNUM, PLNOM, NVL(Nbhvol, 0) « Nombre Heures vol »
FROM PILOTE

« Liste des pilotes avec leurs adresses »


SELECT PLNUM, PLNOM, NVL(ville, ‘Adresse manquante ‘)
FROM PILOTE

Gestion des doublons

SQL n’élimine pas les doubles à moins de le spécifier explicitement par DISTINCT, l’option par
défaut étant ALL.

« Liste de toutes les destinations assurées par Tunis-Air »


SELECT DISTINCT VILLEDEP, VILLEARR
FROM VOL

Tri des lignes avec la clause ORDER BY

L’ordre des lignes rapporté par une requête est indéterminé. La clause ORDER BY sert à trier les
lignes.

SELECT expr
FROM table
[ORDER BY {colonne, expr} [ASC|DESC]]

avec ASC trie les lignes par ordre croissant


DESC trie les lignes par ordre décroissant

SELECT PLNUM, PLNOM SELECT PLNUM, PLNOM


FROM PILOTE FROM PILOTE
ORDER BY PLNUM ORDER BY 1

Il est possible de trier sur


- un alias de colonne
- une expression
- la position d’une colonne dans le SELECT

La clause ORDER BY peut renfermer jusqu’à 16 critères de tri au maximum.

Sélection des lignes avec la clause WHERE

Il est possible de restreindre le nombre de lignes rapportées par une requête en utilisant la clause
WHERE.

Le langage SQL - Extrait du manuel du stagiaire © Faten Labbene Ayachi 16


SELECT expr
FROM table
[WHERE condition]
[ORDER BY {colonne, expr} [ASC|DESC]]

avec condition exprimée avec des noms de colonnes, des expressions, des constantes et des
opérateurs de comparaison.

Il existe deux catégories d’opérateurs de comparaison : logiques et SQL.

… WHERE expr1 opérateur expr2

expr1 et expr2 désignent respectivement :


- un nom de colonne
- une expression
- ou une constante

Les opérateurs de comparaison logiques sont = > >= < <=


Les opérateurs de comparaison SQL sont

Opérateur Signification
BETWEEN … AND … Teste si la variable est comprise en deux valeurs (bornes incluses)
IN (list) Teste si la variable correspond à l’une des valeurs spécifiées dans la
liste.
LIKE Teste la ressemblance partielle avec une chaîne de caractères.
IS NULL Teste si la variable vaut NULL

« Liste des avions dont la capacité est comprise entre 200 et 350 »
SELECT *
FROM AVION
WHERE CAPACITE BETWEEN 200 AND 350

« Liste des vols utilisant les avions numéros 6 et 4 »


SELECT *
FROM VOL
WHERE AVNUM IN (6, 4)

« Liste des pilotes qui n’ont pas d’adresse »


SELECT PLNUM, PLNOM
FROM PILOTE
WHERE VILLE IS NULL

L’opérateur LIKE autorise l’utilisation de méta caractères :


‘% ‘ remplace un ou plusieurs caractères
‘_ ‘ remplace un et un seul caractère

« Afficher tous les pilotes dont le nom commence par un ‘M’ »


SELECT PLNOM
FROM PILOTE
WHERE PLNOM LIKE ‘M%’

Le langage SQL - Extrait du manuel du stagiaire © Faten Labbene Ayachi 17


Pour rechercher les caractères ‘ %’ et ‘_ ‘ en tant que simple caractères, il faut les préfixer
d’un caractère ESCAPE Dans l’exemple ci-dessous, le caractère ’\’ est déclaré comme caractère
ESCAPE.

« Afficher le nom des pilotes contenant la chaîne de caractères ‘X_Y’ »


SELECT PLNOM
FROM PILOTE
WHERE PLNOM LIKE ‘%X\_Y%’ ESCAPE ’\’

Les opérateurs logiques sont AND OR NOT


L’opérateur AND est prioritaire sur l’opérateur OR.

Parfois, il est bien plus simple d’exclure les lignes qui ne remplissent pas une condition, plutôt que
de trouver celles qui ne la vérifient pas. Les opérateurs suivants permettent d’exprimer une
condition négative.

Op. de comp. logiques négatifs Op. de comp. SQL négatifs


!= NOT BETWEEN … AND …
<> NOT IN
NOT colonne = NOT LIKE
NOT colonne > IS NOT NULL

Pour comparer si une variable est NULL il faut utiliser l’opérateur IS NULL ou IS NOT NULL.
Par exemple, la comparaison « salaire <> NULL » ne retournera aucune ligne.

AND TRUE FALSE NULL


TRUE TRUE FALSE NULL
FALSE FALSE FALSE FALSE
NULL NULL FALSE NULL

OR TRUE FALSE NULL


TRUE TRUE TRUE TRUE
FALSE TRUE FALSE NULL
NULL TRUE NULL NULL
NOT TRUE FALSE NULL
FALSE TRUE NULL

Ordre d’évaluation Opérateur


1 Opérateurs arithmétiques
2 Opérateurs de concaténation
3 Conditions de comparaison
4 IS[NOT] NULL, LIKE, [NOT] IN
5 [NOT] BETWEEN
6 Condition logique NOT
7 Condition logique AND
8 Condition logique OR

Le langage SQL - Extrait du manuel du stagiaire © Faten Labbene Ayachi 18


Les chaînes de caractères et les dates apparaissant dans la clause WHERE doivent être entourées de
simples quotes (‘’). Pour les constantes numériques ce n’est pas nécessaire.
Les chaînes de caractères sont «case sensitive» : la distinction est faite entre majuscules et
minuscules.

Le langage SQL - Extrait du manuel du stagiaire © Faten Labbene Ayachi 19


Interrogation des données

La conjugaison du verbe SELECT


Afficher le contenu de plusieurs tables

Soit les trois relations :

AVION (AVNUM, AVNOM, CAPACITE, LOCALISATION)


VOL (VOLNUM,#PLNUM,#AVNUM, VILLEDEP, VILLEARR, HEUREDEP, HEUREARR)
PILOTE (PLNUM, PLNOM, PLPRENOM, VILLE, SALAIRE)

En souligné : clé primaire


# : clé étrangère

Il s’agit d’indiquer comment obtenir des données venant d’une table ou plus, en utilisant différentes
méthodes :
- Ecrire les ordres SELECT pour accéder aux données d’une ou de plusieurs tables en
utilisant les équijointures ou les non-équijointures.
- Visualiser les données qui ne correspondent pas à une condition de jointure, grâce aux
jointures externes.
- Faire la jointure d’une table sur elle même.

Ainsi, lorsqu’on a besoin de récupérer des données d’une ou de plusieurs tables, une condition de
jointure est nécessaire. La condition de jointure est exprimée dans la clause WHERE.
Quand la condition de jointure est invalide ou omise, le résultat est un produit cartésien, dans lequel
est affichée la combinaison des enregistrements.

Requête avec jointure simple ou équijointure

Pour afficher des données provenant de deux tables ou plus, il suffit d’écrire une condition de
jointure simple dans la clause WHERE.

SELECT table.colonne, table.colonne, …


FROM table1, table2
WHERE table1.colonne1 = table2.colonne2

Le nombre des tables dans la clause FROM est limité à 256.

Si la condition de jointure est omise alors la requête correspond dans ce cas à un produit cartésien
des différentes tables intervenant dans la clause FROM.
Exemple :
SELECT *
FROM PILOTE, VOL

Le langage SQL - Extrait du manuel du stagiaire © Faten Labbene Ayachi 20


Comment distinguer deux colonnes de même nom définis sur deux tables distinctes ?
Préfixer les colonnes par le nom de la table correspondante.

« Lister les pilotes en service»


SELECT PILOTE.PLNUM, PLNOM, VILLE
FROM PILOTE, VOL
WHERE (PILOTE.PLNUM = VOL.PLNUM)

« Lister le numéro, le nom et l’adresse de tous les pilotes qui conduisent un vol au départ de
Tunis »
SELECT PILOTE.PLNUM, PLNOM,, VILLE
FROM PILOTE, VOL
WHERE (PILOTE.PLNUM = VOL.PLNUM)
AND (UPPER(VILLEDEP) = ‘TUNIS’)

Alias de table

Préfixer les noms de colonnes avec le nom de tables peut être pénalisant au niveau des
performances, particulièrement si les noms des tables sont longs. Au lieu de cela il est préférable
d’utiliser les alias de table.

« Lister le numéro, le nom et l’adresse de tous les pilotes qui conduisent un vol au départ de
Tunis »
SELECT P.PLNUM, PLNOM, VILLE
FROM PILOTE P, VOL V
WHERE (P.PLNUM=V.PLNUM) AND (UPPER(VILLEDEP)=‘TUNIS’)

Lorsqu’on parcourt plus d’une fois une même table, les alias de table deviennent obligatoires.

Les alias de table sont limités à 30 caractères, mais il vaut mieux privilégier les alias les plus courts.
Un alias n’est valable que dans l’ordre SELECT dans lequel il est défini.

Non équijointure

« Liste des pilotes qui n’habitent pas la même ville que la ville de départ qu’un vol qu’ils
conduisent »
SELECT PLNOM, PILOTE.PLNUM
FROM PILOTE, VOL
WHERE (VILLE<>VILLEDEP) AND (PILOTE.PLNUM=VOL.PLNUM )

Jointure externe

Si un enregistrement ne satisfait pas la condition de jointure, alors cet enregistrement ne va pas


apparaître dans le résultat de la recherche.
Les enregistrements manquants peuvent être retournés avec un opérateur de jointure externe utilisé
dans la condition de jointure. L’opérateur est un signe plus placé entre parenthèses (+), qui est

Le langage SQL - Extrait du manuel du stagiaire © Faten Labbene Ayachi 21


placé du côté de la jointure ou il y a déficience d’information. L’opérateur a pour effet de créer une
ou plusieurs lignes vides pour les lignes de la table qui n’ont pas satisfait la condition de jointure.

SELECT table.colonne, table.colonne, …


FROM table1, table2
WHERE table1.colonne1 = table2.colonne2(+)

SELECT table.colonne, table.colonne, …


FROM table1, table2
WHERE table1.colonne1(+) = table2.colonne2

(+) ne peut pas être placé des deux côtés en même temps.

avec table1.colonne1= table2.colonne2

la condition de jointure qui permet de relier les deux tables.

La condition de jointure externe ne doit pas


- utiliser l’opérateur IN
- être reliée à une autre condition par l’opérateur OR.

« Afficher les noms des pilotes, leurs identifiants et pour ceux qui sont en service les
numéros des vols qu’ils assurent »
SELECT P.PLNOM, P.PLNUM, V.VOLNUM
FROM PILOTE P, VOL V
WHERE P.PLNUM = V.PLNUM(+)

Jointure d’une table sur elle même (auto jointure) avec alias de table

« Liste des pilotes qui habitent la même ville que le pilote ‘MIRANDA’ »
SELECT P2.PLNOM, P2.PLNUM
FROM PILOTE P1, PILOTE P2
WHERE (P1.VILLE = P2.VILLE)
AND (UPPER(P1.PLNOM)=‘MIRANDA’)
AND (UPPER(P2.PLNOM)<>‘MIRANDA’)

Les alias sont utilisés dans les jointures des tables avec elles-mêmes.

Le langage SQL - Extrait du manuel du stagiaire © Faten Labbene Ayachi 22


Interrogation des données

La conjugaison du verbe SELECT


La clause ‘group by’ ou partitionnement

Cette partie présente les fonctions de groupe : comment obtenir des informations calculées, comme
les moyennes de groupes de lignes. Différentes façons de grouper les lignes d’une table dans des
sous-ensembles sont disponibles.

SELECT colonne, group_fonction


FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[HAVING group_condition]
[ORDER BY colonne]

Par défaut, toutes les lignes d’une table forment un groupe. Utiliser la clause GROUP BY dans
l’ordre SELECT, pour diviser ces lignes en petits groupes.
La clause HAVING restreint les groupes résultants.

group_by_expression spécifie les colonnes dont les valeurs vont déterminer la base
de regroupement des lignes
group_condition restreint les groupes de lignes retournés aux groupes qui
vérifient la condition.

Fonctions multi-ligne

Les fonctions multi-ligne manipulent des groupes de lignes pour donner un résultat par groupe de
lignes.

DISTINCT oblige la fonction à éliminer les doublons. ALL oblige la fonction à considérer toutes les
valeurs en incluant les doublons. Par défaut, le paramètre est positionné à ALL.
Les types de données pour le paramètre expr peuvent être CHAR, VARCHAR2, NUMBER ou DATE.
Toutes les fonctions de groupe, excepté COUNT(*), ignorent les valeurs NULL. Pour remplacer une
valeur NULL par une autre valeur, utiliser la fonction NVL.

« Afficher le premier nom de pilote, par ordre alphabétique, et le dernier nom de pilote par
ordre alphabétique »
SELECT MIN(PLNOM), MAX(PLNOM)
FROM PILOTE

COUNT, MAX et MIN peuvent être utilisés pour tous les types de données.

Le langage SQL - Extrait du manuel du stagiaire © Faten Labbene Ayachi 23


« Afficher la moyenne, le plus grand, le plus petit et la somme des salaires de tous les
pilotes »
SELECT AVG(SALAIRE), MAX(SALAIRE), MIN(SALAIRE),
SUM(SALAIRE)
FROM PILOTE

Les fonctions AVG, SUM, STDDEV et VARIANCE ne peuvent être utilisées que pour les colonnes
numériques.

« Afficher le nombre total des pilotes »


SELECT COUNT(*)
FROM PILOTE

« Nombre des types d’avions différents »


SELECT COUNT(distinct avnom)
FROM avion

Les fonctions peuvent être imbriquées à deux niveaux et dans ce cas il faut utiliser la clause GROUP
BY.

« Afficher le salaire moyen maximum des départements »


SELECT MAX(AVG(SAL))
FROM EMP
GROUP BY DEPTNO;

« Les numéros des pilotes avec le nombre de vols au départ de ‘Tunis’ »


SELECT PLNUM, COUNT(*) 4 Ordre d’exécution
FROM VOL 1
WHERE UPPER(VILLEDEP) = ‘TUNIS’ 2
GROUP BY PLNUM 3

Ainsi, dans la syntaxe précédente, nous pouvons rajouter l’ordre d’exécution comme suit :

SELECT colonne, group_fonction 5 Ordre d’exécution


FROM table 1
[WHERE condition] 2
[GROUP BY group_by_expression] 3
[HAVING group_condition] 4
[ORDER BY colonne] 6

Le GROUP BY correspond donc au partitionnement horizontal d’une table en sous-tables en


fonction d’un ou de plusieurs attributs de partitionnement suivi de l’application d’une fonction de
calcul à chaque colonne (vue comme un ensemble de valeurs) des sous-tables obtenues.

La clause GROUP BY permet de préciser les attributs de partitionnement, alors que les fonctions de
calcul appliquées aux ensembles générés, sont directement exprimées dans SELECT ou dans la
clause HAVING.

Le langage SQL - Extrait du manuel du stagiaire © Faten Labbene Ayachi 24


Règles syntaxiques avec la clause GROUP BY

Le résultat de la requête suivante :

SELECT PLNUM, COUNT(*)


FROM VOL
WHERE UPPER(VILLEDEP) = ‘TUNIS’
GROUP BY PLNUM

est plus significatif que celui de la requête ci-dessous :

SELECT COUNT(*)
FROM VOL
WHERE UPPER(VILLEDEP) = ‘TUNIS’
GROUP BY PLNUM

La requête suivante est incorrecte :

SELECT PLNUM, COUNT(*)


FROM VOL
WHERE UPPER(VILLEDEP) = ‘TUNIS’

car PLNUM doit être une colonne de groupement c’est à dire apparaître dans la clause GROUP BY.

Nous vérifions ainsi les règles d’écriture suivantes :

- Toutes les colonnes de la clause SELECT qui ne sont pas dans une fonction de groupe
doivent obligatoirement être présentes dans la clause GROUP BY.

- Une colonne dans le GROUP BY ne doit pas nécessairement être présente dans le
SELECT.

- Toutefois, les résultats sont plus significatifs si les colonnes du GROUP BY sont dans
le SELECT.

« Les numéros des pilotes qui assurent plus de trois vols »


SELECT PLNUM
FROM VOL
GROUP BY PLNUM
HAVING COUNT(*) > 3

La règle syntaxique générale est

SELECT A, B, fonction
FROM relation
WHERE …
GROUP BY A, B
HAVING fonction …

Le langage SQL - Extrait du manuel du stagiaire © Faten Labbene Ayachi 25


Groupes au sein d’autres groupes

« Afficher par pilote, le nombre de vols par ville de départ »


SELECT PLNUM, VILLEDEP, COUNT(*)
FROM VOL
GROUP BY PLNUM, VILLEDEP

Il est possible de retourner des résultats calculés pour les groupes ou sous-groupes en spécifiant plus
d’une colonne dans la clause du GROUP BY.

« Capacité moyenne des avions par nom et par ville»


SELECT AVNOM, LOCALISATION, AVG(CAPACITE)
FROM AVION
GROUP BY AVNOM, LOCALISATION

Le langage SQL - Extrait du manuel du stagiaire © Faten Labbene Ayachi 26


Interrogation des données

La conjugaison du verbe SELECT


Les sous-interrogations

Une sous-interrogation est l’expression d’un prédicat à l’aide du résultat d’un SELECT.
On écrit une sous-interrogation lorsqu’une interrogation est basée sur des valeurs inconnues.

SELECT select_list ------- interrogation principale


FROM table
WHERE expr opérateur
(SELECT ------- sous-interrogation
FROM
WHERE
…)

opérateur est un opérateur de comparaison


mono-ligne (>, =, >=, <, <=, <>) ou
multi-ligne (IN, NOT IN, =ANY, =SOME)

On peut placer les sous-interrogations dans les clauses SQL suivantes :

- clause WHERE
- clause HAVING
- ordre UPDATE
- clause INTO d’un ordre INSERT
- clause SET d’un ordre UPDATE
- clause FROM d’un ordre SELECT ou DELETE

La sous-interrogation est un ordre SELECT imbriqué dans un ordre SQL.

Au maximum, 16 niveaux de sous-interrogations sont autorisés.


Une sous-interrogation ne ramenant rien est interprétée comme une erreur.

Il faut :
- mettre entre parenthèses la sous-interrogation
- placer la sous-interrogation après l’opérateur de comparaison
- ne pas mettre de clause ORDER BY dans une sous-interrogation. On ne peut avoir qu’un
seul ORDER BY dans un ordre SELECT, et il doit être spécifié en dernier, dans l’ordre
SELECT principal.

Le langage SQL - Extrait du manuel du stagiaire © Faten Labbene Ayachi 27


Sous-interrogations mono-ligne

Quand la sous-interrogation retourne une seule valeur, elle est appelée mono-ligne. On doit alors
utiliser les opérateurs de comparaison =, <, <=, >, >=.
C’est le cas par exemple des sous-requêtes qui retournent une fonction de groupe.

La sous-interrogation est exécutée avant l’interrogation principale. Le résultat de la sous-


interrogation complète la condition de l’interrogation principale.

« Liste des pilotes qui habitent la même ville que le pilote ‘MIRANDA’»
SELECT PLNOM, PLNUM
FROM PILOTE
WHERE VILLE =( SELECT VILLE
FROM PILOTE
WHERE UPPER(PLNOM)=’MIRANDA’)

« Quels sont les pilotes dont le salaire est supérieur à 10% de la moyenne des salaires des
pilotes »
SELECT *
FROM PILOTE
WHERE SALAIRE>( SELECT AVG(SALAIRE) * 1,1
FROM PILOTE )

La sous-interrogation retourne une fonction de groupe.

« Afficher le nom et le prénom des pilotes qui assurent moins que la moyenne des heures de
vols des pilotes »
SELECT PLNOM, PLPRENOM
FROM PILOTE
WHERE NBHVOL< ( SELECT AVG(NBHVOL)
FROM PILOTE)

Une des erreurs les plus courantes liées aux sous-interrogations est que la sous-interrogation ramène
plus d’une ligne alors qu’on utilise un opérateur de comparaison de type mono-ligne.

Sous-interrogations multi-ligne

Les sous-interrogations qui retournent plus d’une ligne sont appelées les sous-interrogations multi-
ligne. Il faut alors utiliser un opérateur de type multi-ligne, tel que IN, à la place d’un opérateur
mono-ligne.

« Liste des pilotes conduisant les avions 6 ou 4 »

Solution1 : Requête prédicative

SELECT PILOTE.PLNUM, PLNOM, VILLE


FROM PILOTE, VOL
WHERE (PILOTE.PLNUM = VOL.PLNUM) AND (AVNUM IN (6, 4))

Solution2 : Requête ensembliste faisant intervenir des sous-interrogations indépendantes.

Le langage SQL - Extrait du manuel du stagiaire © Faten Labbene Ayachi 28


SELECT *
FROM PILOTE
WHERE PLNUM IN (SELECT PLNUM
FROM VOL
WHERE AVNUM = 6)
OR PLNUM IN (SELECT PLNUM
FROM VOL
WHERE AVNUM = 4)

Une sous-interrogation qui inclut un GROUP-BY est multi-ligne.

… WHERE salaire IN = ANY


(SELECT salaire
… )

… WHERE salaire = Les pilotes qui touchent le salaire max


(SELECT MAX(salaire)
… )

… WHERE salaire >= ALL Les pilotes qui touchent le salaire max
(SELECT DISTINCT salaire = max(…)
… )

… WHERE salaire >= SOME Les pilotes qui ne touchent pas le salaire le
(SELECT salaire plus bas
… ) > min(…)

… WHERE salaire <= ALL Les pilotes qui touchent le salaire le plus bas
(SELECT salaire = min(…)
… )

… WHERE EXISTS (SELECT … Connecteur existential ()


) Utilisable avec la sous-interrogation.
Opérateur booléen, TRUE si la sous-
interrogation qui suit ramène au moins une
ligne et FALSE sinon.
NOT EXISTS inverse le sens.
Permet de tester si le résultat d’une sous
requête imbriquée est vide ou non.

Les opérateurs ensemblistes admettent comme opérandes des sous-interrogations multi-ligne.

SELECT …
{UNION | INTERSECT | MINUS}
SELECT …
{UNION | INTERSECT | MINUS}
SELECT …

Ces opérateurs admettent les règles d’utilisation suivantes :

Le langage SQL - Extrait du manuel du stagiaire © Faten Labbene Ayachi 29


- Même nombre de variables de types identiques dans chacun des SELECT.
- Les doublons sont éliminés (DISTINCT implicite).
- Titres des colonnes identiques à ceux du premier SELECT.
- Largeur de la colonne égale à la plus grande de tous les SELECT.
- La clause ORDER BY fait référence au numéro de la colonne et non plus à son nom.

Sous-interrogations multi-colonne

« Sélection des noms, emplois et salaires des employés ayant même salaire et même numéro
de département que ‘Ford’ ».

SELECT ENAME, JOB, SAL


FROM EMP
WHERE (JOB, SAL, DEPTNO) = ( SELECT JOB, SAL, DEPTNO
FROM EMP
WHERE ENAME = 'FORD')
AND ENAME != 'FORD';

Le résultat est

ENAME JOB SAL


---------- --------- ----------
SCOTT ANALYST 3000

Les sous-interrogations synchronisées ou corrélatives

Dépendance entre la sous-interrogation et l’interrogation principale. C’est le cas lorsque la sous-


interrogation fait référence à une colonne de l’interrogation principale.

« Liste des employés ne travaillant pas dans le même département que leur manager ? »

SELECT ENAME
FROM EMP X
WHERE MGR IS NOT NULL
AND DEPTNO != (SELECT DEPTNO
FROM EMP
WHERE X.MGR = EMPNO);

Ainsi, la sous-interrogation est réévaluée pour chaque ligne de l’interrogation principale.


L’interrogation principale et la sous-interrogation sont dites synchronisées ou corrélatives.

Le langage SQL - Extrait du manuel du stagiaire © Faten Labbene Ayachi 30


Interrogation des données

La conjugaison du verbe SELECT

Traduction des opérateurs algébriques dans le langage SQL

PROJECTION

“Noms et numéros des pilotes de la compagnie”

SELECT PLNOM, PLNUM


FROM PILOTE

“Origine des pilotes”

SELECT DISTINCT VILLE


FROM PILOTE

SELECTION

“Les pilotes qui habitent ‘Tunis’ »

SELECT *
FROM PILOTE
WHERE UPPER(VILLE) = ‘TUNIS’

“Les pilotes qui n’ont pas d’adresse”

SELECT *
FROM PILOTE
WHERE VILLE is NULL

JOINTURE

« Nom des pilotes en service au départ de ‘Tunis’ »

Requête prédicative

SELECT PLNOM
FROM PILOTE, VOL
WHERE (UPPER(VILLEDEP) = ‘TUNIS’) AND (PILOTE.PLNUM = VOL.PLNUM)

Le langage SQL - Extrait du manuel du stagiaire © Faten Labbene Ayachi 31


Requête ensembliste

SELECT PLNOM
FROM PILOTE
WHERE PLNUM IN (SELECT PLNUM
FROM VOL
WHERE (UPPER(VILLEDEP) = ‘TUNIS’) AND
(PILOTE.PLNUM = VOL.PLNUM)
)

Requête corrélative

SELECT PLNOM
FROM PILOTE
WHERE PLNUM EXISTS
( SELECT PLNUM
FROM VOL
WHERE (UPPER(VILLEDEP) = ‘TUNIS’) AND
(PILOTE.PLNUM = VOL.PLNUM)
)

DIFFERENCE

“Numéros des pilotes qui ne sont pas en service”

SELECT PLNUM
FROM PILOTE
MINUS
SELECT PLNUM
FROM VOL

“Noms des pilotes qui ne sont pas en service”

Requêtes corrélatives

SELECT PLNOM
FROM PILOTE
WHERE NOT EXISTS
( SELECT PLNUM
FROM VOL
WHERE PILOTE.PLNUM = VOL.PLNUM
)
Requêtes indépendantes

SELECT PLNOM
FROM PILOTE
WHERE PLNUM NOT IN
(SELECT PLNUM
FROM VOL
)

Le langage SQL - Extrait du manuel du stagiaire © Faten Labbene Ayachi 32


UNION

N: “Numéros et noms des pilotes qui conduisent les avions numéros 4 OU 6”

SELECT PILOTE.PLNUM, PLNOM


FROM PILOTE, VOL
WHERE (PILOTE. PLNUM = VOL.PLNUM) AND (AVNUM = 6)
UNION
SELECT PILOTE.PLNUM, PLNOM, VILLE
FROM PILOTE, VOL
WHERE (PILOTE. PLNUM = VOL.PLNUM) AND (AVNUM = 4)

SELECT PILOTE.PLNUM, PLNOM


FROM PILOTE, VOL
WHERE (PILOTE. PLNUM = VOL.PLNUM) AND
(AVNUM in (4, 6))

INTERSECTION

“Numéros et noms des pilotes qui conduisent les avions numéros 4 ET 6”

SELECT PILOTE.PLNUM, PLNOM


FROM PILOTE, VOL
WHERE (PILOTE. PLNUM = VOL.PLNUM) AND (AVNUM = 6)
INTERSECT
SELECT PILOTE.PLNUM, PLNOM, VILLE
FROM PILOTE, VOL
WHERE (PILOTE. PLNUM = VOL.PLNUM) AND (AVNUM = 4)

Il existe d’autres solutions avec IN, = ANY.

DIVISION

« Liste des pilotes conduisant tous les ‘A320’ de la compagnie »

SELECT *
FROM PILOTE
WHERE ((SELECT AVNUM
FROM VOL
WHERE PILOTE.PLNUM = PLNUM)
CONTAINS
(SELECT AVNUM
FROM AVION
WHERE AVNOM = ‘A320‘)
)

Le langage SQL - Extrait du manuel du stagiaire © Faten Labbene Ayachi 33


SELECT DISTINCT V.PLNUM
FROM VOL
WHERE AVNUM IN ( SELECT AVNUM
FROM AVION
WHERE UPPER(AVNOM) LIKE ‘A%’)
GROUP BY PLNUM
HAVING COUNT(*) = (SELECT COUNT(*)
FROM AVION
WHERE UPPER(AVNOM) LIKE ‘A%’)

SELECT DISTINCT V.PLNUM


FROM VOL V
WHERE NOT EXISTS
(SELECT AVNUM
FROM AVION
WHERE AVNOM = ‘A320’ AND
NOT EXISTS
(SELECT *
FROM VOL Y
WHERE (V.PLNUM = Y.PLNUM) AND
AVION.AVNUM = Y.AVNUM)
)


« Liste des pilotes conduisant tous les ‘A320’ de la compagnie »
X Y

Les pilotes / qque soit l’A320 alors il existe un VOL associant X et Y 


X / (Y) (Z) VOL(Z, X, Y) 
X /  ((Y)  ((Z) VOL(Z, X, Y))) 
X /  (Y)  ((Z) VOL(Z, X, Y))

Réécriture faite dans le calcul des prédicats du premier ordre.

Le langage SQL - Extrait du manuel du stagiaire © Faten Labbene Ayachi 34

Vous aimerez peut-être aussi