Académique Documents
Professionnel Documents
Culture Documents
LE LANGAGE SQL
Dialecte Oracle
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
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-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.
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.
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 ||.
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)
SELECT PLNUM
FROM PILOTE
WHERE SOUNDEX(PLNOM) = SOUNDEX(‘MIREND’);
Fonctions numériques
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.
SYSDATE est une fonction SQL qui retourne la date et l’heure courantes.
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).
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.
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_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.
La fonction TO_CHAR permet de convertir une date dans un format spécifique exp : ‘MM/YY’.
TO_CHAR(SYSDATE, 'MM/YY')
------------
10/07
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.
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.
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 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.
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.
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é.
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.
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
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).
« Sélection + Projection de la table PILOTE : Liste des numéros des pilotes qui habitent
‘TUNIS’»
SELECT PLNUM
FROM PILOTE
WHERE UPPER(VILLE) = ‘TUNIS’
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.
Opérateur de concaténation
Pour convertir une valeur NULL en une valeur définie, on utilisera la fonction NVL
Plus intéressante que NVL, NVL2 admet 3 paramètres plutôt que 2 mais retourne toujours du
varchar2.
SQL n’élimine pas les doubles à moins de le spécifier explicitement par DISTINCT, l’option par
défaut étant ALL.
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]]
Il est possible de restreindre le nombre de lignes rapportées par une requête en utilisant la clause
WHERE.
avec condition exprimée avec des noms de colonnes, des expressions, des constantes et des
opérateurs de comparaison.
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
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.
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.
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.
Pour afficher des données provenant de deux tables ou plus, il suffit d’écrire une condition de
jointure simple dans la clause WHERE.
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
« 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
(+) ne peut pas être placé des deux côtés en même temps.
« 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.
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.
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.
Les fonctions AVG, SUM, STDDEV et VARIANCE ne peuvent être utilisées que pour les colonnes
numériques.
Les fonctions peuvent être imbriquées à deux niveaux et dans ce cas il faut utiliser la clause GROUP
BY.
Ainsi, dans la syntaxe précédente, nous pouvons rajouter l’ordre d’exécution comme suit :
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.
SELECT COUNT(*)
FROM VOL
WHERE UPPER(VILLEDEP) = ‘TUNIS’
GROUP BY PLNUM
car PLNUM doit être une colonne de groupement c’est à dire apparaître dans la clause GROUP BY.
- 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.
SELECT A, B, fonction
FROM relation
WHERE …
GROUP BY A, B
HAVING fonction …
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.
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.
- 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
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.
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.
« 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 )
« 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.
… 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(…)
… )
SELECT …
{UNION | INTERSECT | MINUS}
SELECT …
{UNION | INTERSECT | MINUS}
SELECT …
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’ ».
Le résultat est
« 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);
PROJECTION
SELECTION
SELECT *
FROM PILOTE
WHERE UPPER(VILLE) = ‘TUNIS’
SELECT *
FROM PILOTE
WHERE VILLE is NULL
JOINTURE
Requête prédicative
SELECT PLNOM
FROM PILOTE, VOL
WHERE (UPPER(VILLEDEP) = ‘TUNIS’) AND (PILOTE.PLNUM = VOL.PLNUM)
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
SELECT PLNUM
FROM PILOTE
MINUS
SELECT PLNUM
FROM VOL
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
)
INTERSECTION
DIVISION
SELECT *
FROM PILOTE
WHERE ((SELECT AVNUM
FROM VOL
WHERE PILOTE.PLNUM = PLNUM)
CONTAINS
(SELECT AVNUM
FROM AVION
WHERE AVNOM = ‘A320‘)
)
« Liste des pilotes conduisant tous les ‘A320’ de la compagnie »
X Y