Vous êtes sur la page 1sur 7

Université de Kairouan Année Universitaire

Institut Supérieur d’Informatique 2020-2021


et de Gestion de Kairouan

Support de cours Ingénierie des BD


2èmeSI, 2èmeIG, 2ème ISI
Omar MAZHOUD

Chapitre n°3 : Les fonctions SQL


Il existe un certain nombre de fonctions prédéfinies qu’on peut utiliser. On peut les classer en
plusieurs catégories : les fonctions numériques, les fonctions de manipulation de chaînes de
caractères, les fonctions manipulant des dates et les fonctions de conversion et transformation.
1. Les fonctions de manipulation de chaînes de caractères
- UPPER(ch) : met la chaîne de caractères en majuscule.
SQL> select ename, upper(ename) as MAJ from emp where comm is not null;

ENAME MAJ
------ ------
Martin MARTIN
Allen ALLEN
Turner TURNER
Ward WARD
- LOWER(ch) : met la chaîne de caractères en minuscule.
SQL> select distinct job, lower(job) as MINU from emp;

JOB MINU
---------- ----------
ANALYST analyst
CLERK clerk
PRESIDENT president
MANAGER manager
SALESMAN salesman
- INITCAP(ch) : met le première lettre de chaque mot de la chaîne en majuscule, le reste en
minuscule.
SQL> Select INITCAP ('LE LANGAGE_SQL ET pL/sQL pOUR OrACLE') "Fonction INITCAP"
FROM DUAL;
Fonction INITCAP _
Le Langage_Sql Et Pl/Sql Pour Oracle

- Table DUAL : Oracle fournit une petite table DUAL qui se compose d’une ligne et d’une
colonne qui est utilisée pour tester des fonctions ou effectuer des calculs rapides.
SQL> desc dual
Name Null? Type
----------------------------------------- -------- ----------------------------
DUMMY VARCHAR2(1)
Les colonnes qui existent dans DUAL n’ont aucune importance.
On peut donc facilement expérimenter les différentes fonctions au moyen de cette table, afin
d’en comprendre le fonctionnement avant de les appliquer sur des données de tables réelles.
Dans ces exemples, l’instruction Select ne tient pas compte des colonnes de la table, et seule
une ligne suffit à démontrer un fonctionnement.
Par exemple, supposons qu’on veut rapidement afficher la date de demain, le nom
d’utilisateur et calculer (14522/3.14) * 13.89.
SQL> Select USER, SYSDATE+1, (14522/3.14) * 13.89 FROM DUAL;

USER SYSDATE+ (14522/3.14)*13.89


------------------------------ -------- ------------------
SYSTEM 18/02/19 64239,0382

Cours Ingénierie des BD -Omar MAZHOUD- ISIGK -2020/2021 17


- CONCAT(ch) : Effectue la concaténation de deux chaînes de caractères :
CONCAT(Exp1, Exp2)= Exp1||Exp2
SQL> Select CONCAT(CONCAT(ENAME, ' '), 'a pour emploi') ||' '|| JOB AS
Liste_des_emplois from emp where SAL > 1500;

LISTE_DES_EMPLOIS
-------------------------------
King a pour emploi PRESIDENT
Blake a pour emploi MANAGER
Clark a pour emploi MANAGER
Jones a pour emploi MANAGER
Allen a pour emploi SALESMAN
Ford a pour emploi ANALYST
Scott a pour emploi ANALYST

7 rows selected.
Le caractère cote(') est le caractère qui délimite les constantes de type chaînes de caractères,
pour l’afficher il suffit d’écrire deux fois le caractère (') dans la chaîne.
SQL> Select 'L''utilisation du caractère cote :''' FROM DUAL;
'L''UTILISATIONDUCARACTÈRECOTE:'''
L'utilisation du caractère cote :'
- LPAD(ch,l,sch) : complète ou tronque la chaîne à gauche à une longueur donnée:
LPAD(chaîne,long[,chaîne2]) = Retour
Chaîne1 : La chaîne à traiter.
Chaîne2 : Un ou plusieurs caractères utilisés comme modèle pour le remplissage. Le
paramètre est optionnel ; par défaut la chaîne est complétée par des espaces.
long : La longueur de la chaîne après le traitement.
Retour : La chaîne traitée redimensionnée à la longueur long. Si long est inférieur à la
longueur de la chaîne, la chaîne est tronquée en éliminant la fin.
SQL> Select ENAME, LPAD(ENAME,5) sur_5, LPAD(JOB,8,'*') sur_8, LPAD(ENAME,10,'*/@')
sur_10 FROM EMP WHERE COMM IS Null;
ENAME SUR_5 SUR_8 SUR_10
------ -------------------- ----------------- --------------------
King King PRESIDEN */@*/@King
Blake Blake *MANAGER */@*/Blake
Clark Clark *MANAGER */@*/Clark
Jones Jones *MANAGER */@*/Jones
James James ***CLERK */@*/James
Ford Ford *ANALYST */@*/@Ford
Smith Smith ***CLERK */@*/Smith
Scott Scott *ANALYST */@*/Scott
Adams Adams ***CLERK */@*/Adams
Miller Mille ***CLERK */@*Miller
10 rows selected.
- RPAD(ch,l,sch) : complète ou tronque la chaîne à droite à une longueur donnée:
RPAD(chaîne,long[,chaîne2]) = Retour
Chaîne1 : La chaîne à traiter.
Chaîne2 : Un ou plusieurs caractères utilisés comme modèle pour le remplissage. Le
paramètre est optionnel ; par défaut la chaîne est complétée par des espaces.
long : La longueur de la chaîne après le traitement.
Retour : La chaîne traitée redimensionnée à la longueur long. Si long est inférieur à la
longueur de la chaîne, la chaîne est tronquée en éliminant la fin.
SQL> Select ENAME, RPAD(ENAME,5) sur_5, RPAD(JOB,8,'*') sur_8, RPAD(ENAME,12,'*/@')
sur_12 FROM EMP WHERE SAL < 1500;
ENAME SUR_5 SUR_8 SUR_12
------ ----------- ------------- -----------------
Martin Marti SALESMAN Martin*/@*/@
James James CLERK*** James*/@*/@*
Ward Ward SALESMAN Ward*/@*/@*/
Smith Smith CLERK*** Smith*/@*/@*
Adams Adams CLERK*** Adams*/@*/@*
Miller Mille CLERK*** Miller*/@*/@

6 rows selected.

Cours Ingénierie des BD -Omar MAZHOUD- ISIGK -2020/2021 18


- LTRIM(ch,sch) : Supprime un ensemble de caractères indésirables à gauche de la chaîne:
LTRIM(chaîne1[,chaîne2]) = Retour
Chaîne1 : La chaîne à traiter.
Chaîne2 : Un ou plusieurs caractères indésirables. La requête recherche et efface une série
contiguë d’un ou plusieurs caractères de la liste, positionnées à gauche de la chaîne de
caractères. Le paramètre est optionnel ; par défaut, la chaîne efface tous les espaces.
SQL>Select LTRIM(‘ chaîne avec des caractères indésirables')
Nouvelle_chaîne FROM DUAL;
Nouvelle_chaîne
------------------------------------------
chaîne avec des caractères indésirables
SQL>Select LTRIM('**********chaîne avec des caractères indésirables','*')
Nouvelle_chaîne FROM DUAL;
Nouvelle_chaîne
------------------------------------------
chaîne avec des caractères indésirables
SQL>Select LTRIM('ABDACBCDchaîne avec des caractères indésirables','ABCD')
Nouvelle_chaîne FROM DUAL;
Nouvelle_chaîne
------------------------------------------
chaîne avec des caractères indésirables

- RTRIM(ch,sch) : Supprime un ensemble de caractères indésirables à droite de la chaîne:


RTRIM(chaîne1[,chaîne2]) = Retour
- Chaîne1 : La chaîne à traiter.
- Chaîne2 : Un ou plusieurs caractères indésirables. La requête recherche et efface une série
contiguë d’un ou plusieurs caractères de la liste, positionnées à droite de la chaîne de
caractères. Le paramètre est optionnel ; par défaut, la chaîne efface tous les espaces.
SQL> Select RTRIM('chaîne avec des caractères indésirables ')
FROM DUAL;
LA_NOUVELLE_CHAîNE
-------------------------------------------
chaîne avec des caractères indésirables
SQL> Select RTRIM('chaîne avec des caractères indésirables**************','*')
La_nouvelle_Chaîne FROM DUAL;
LA_NOUVELLE_CHAîNE
-------------------------------------------
chaîne avec des caractères indésirables
SQL> Select RTRIM('chaîne avec des caractères indésirablesQRSTQRSTTTT','QRST')
La_nouvelle_Chaîne FROM DUAL;
LA_NOUVELLE_CHAîNE
-------------------------------------------
chaîne avec des caractères indésirables

- SUBSTR(ch,d,l) : renvoie la sous chaîne spécifiée à partir d’une position et longueur


donnée :
SUBSTR(chaîne1,position[,longueur])=Retour
Chaîne1 : La chaîne à traiter.
position : La position de départ pour la nouvelle chaîne.
longueur : Le paramètre longueur est optionnel ; détermine le nombre de caractères de la
nouvelle chaîne, par défaut la sous-chaîne va jusqu’à l’extrémité de la chaîne.
SQL> Select ENAME, SUBSTR(ENAME,4,5) "1", SUBSTR(ENAME,6,1) "2", SUBSTR(ENAME,3)
"3" FROM EMP WHERE COMM IS NOT NULL;

ENAME 1 2 3
------ ------------ ---- ----------------
Martin tin n rtin
Allen en len
Turner ner r rner
Ward d rd

Cours Ingénierie des BD -Omar MAZHOUD- ISIGK -2020/2021 19


- LENGTH(ch) : retourne la longueur de la chaîne.
SQL> Select LENGTH('Chaîne') FROM DUAL;
LENGTH('CHAÎNE')
6
- INSTR(ch,sch,pos,occ) : recherche la position de la nième occurrence de la sous chaîne
dans la chaîne.
INSTR(chaîne1,chaîne2,position,occurrence) = numérique
Chaîne1 : La chaîne à traiter.
Chaîne2 : Une sous-chaîne constituée d’un ou plusieurs caractères recherchés.
position : La position de départ pour la recherche, paramètre facultatif vaut 1 par défaut. Une
valeur négative signifie une recherche à partir de la fin de la chaîne.
occurrence : Le paramètre occurrence permet de rechercher la nième occurrence chaîne2 dans
la chaîne. Ce paramètre vaut 1 par défaut.
numérique : La position trouvée dans la chaîne de caractères. Zéro signifie que la sous-
chaîne n’a pas été trouvée.
SQL>Select quantité, INSTR(quantité,' ') "1", INSTR(quantité,' ',5,2) "2",
INSTR(quantité,'ml',-1) "3", INSTR(quantité,' ',-5,2) "4" FROM produits;
QUANTITÉ 1 2 3 4
---------------------------------------------------
Boîtes (500 ml) 7 12 13 0
Bouteilles (0,5 litre) 11 16 0 11
Pots (12 onces) 5 9 0 5
Cartons (12 paquets) 8 12 0 8
- REPLACE(ch1,ch2,ch3) : Permet de remplacer les séquences ch2 par ch3 :
REPLACE(chaîne1,chaîne2,chaîne3)=Retour
Chaîne1 : La chaîne à traiter.
Chaîne2 : Un caractère ou une chaîne de caractères à remplacer.
Chaîne3 : Un caractère ou une chaîne pour remplacer Chaîne2. Si la chaîne est vide, la
fonction efface les caractères recherchés.
SQL> Select REPLACE('SGBD ou DBMS','D','') REPLACE1, REPLACE('SGBD ou DBMS',
'D','DD') REPLACE2 FROM DUAL;
REPLACE1 REPLACE2
---------- --------------
SGB ou BMS SGBDD ou DDBMS
- TRANSLATE(ch1,ch2,ch3) : Permet de remplacer chaque caractère de la chaîne ch2
présent dans ch1 par son correspondant dans ch3 :
SQL> select Distinct JOB, TRANSLATE(JOB,'ABCDRS','12345') Translations from emp;
JOB TRANSLATIONS
---------- ----------------------------------------
MANAGER M1N1GE5
PRESIDENT P5EI4ENT
CLERK 3LE5K
ANALYST 1N1LYT
SALESMAN 1LEM1N
- ASCII(ch) : Retourne le code ASCII du caractère :
SQL> select ASCII('A') FROM DUAL;
ASCII('A')
----------
65
- CHR(N) : Retourne le caractère de la valeur ASCII.
SQL> select CHR(65) FROM DUAL;
C
-
A

2. Les fonctions numériques


- ABS(n) : retourne la valeur absolue de n.
SQL> Select ABS(-10), ABS(0), ABS(1) FROM DUAL;

ABS(-10) ABS(0) ABS(1)


---------- ---------- ----------
10 0 1

Cours Ingénierie des BD -Omar MAZHOUD- ISIGK -2020/2021 20


- SIGN(n) : retourne le signe de n (-1, 0 ou 1).
SQL> Select SIGN(-10), SIGN(0), SIGN(1) FROM DUAL;
SIGN(-10) SIGN(0) SIGN(1)
---------- ---------- ----------
-1 0 1
- CEIL(n) : retourne le plus petit entier supérieur ou égal à n.
SQL> Select CEIL(-50.23), CEIL(14), CEIL(99.23) FROM DUAL;
CEIL(-50.23) CEIL(14) CEIL(99.23)
------------ ---------- -----------
-50 14 100
- FLOOR(n) : retourne le plus grand entier inférieur ou égal à n.
SQL> Select FLOOR(-50.23), FLOOR(14), FLOOR(99.23) FROM DUAL;
FLOOR(-50.23) FLOOR(14) FLOOR(99.23)
------------- ---------- ------------
-51 14 99
- ROUND(m,n) : calcule la valeur arrondie de m avec une précision n.
La précision peut prendre 3 types de valeurs :
1. positive alors elle détermine le nombre de décimales à conserver,
2. zéro, est la valeur par défaut, on ne conserve pas de décimales,
3. négative, alors l’arrondi se fait sur les valeurs entières.
SQL> Select ROUND(-10.2326,2), ROUND (10.2326,3), ROUND(-10.2326) FROM DUAL;
ROUND(-10.2326,2) ROUND(10.2326,3) ROUND(-10.2326)
----------------- ---------------- ---------------
-10,23 10,233 -10
- TRUNC(m,n) : Calcule une valeur tronquée à la précision n.
SQL> Select TRUNC(10.2326,2), TRUNC (10.2376,2), TRUNC(102826,-3), TRUNC(10.2326)
FROM DUAL;
TRUNC(10.2326,2) TRUNC(10.2376,2) TRUNC(102826,-3) TRUNC(10.2326)
---------------- ---------------- ---------------- --------------
10,23 10,23 102000 10
- MOD(m,n) : calcule le reste de la division entière de m par n.
SQL> Select MOD(7,2) FROM DUAL;
MOD(7,2)
----------
1
- POWER(m,n) : calcule la valeur de m élevé à la puissance n
SQL> select POWER(5,3) FROM DUAL;
POWER(5,3)
----------
125
- SQRT(n) : retourne la racine carrée de n.
SQL> Select SQRT(21) FROM DUAL;
SQRT(21)
----------
4,58257569

3. Les fonctions sur les dates


- ADD_MONTHS(date,n) : permet d’ajouter ou soustraire un nombre de mois à une date.
SQL> Select sysdate, ADD_MONTHS(SYSDATE,6) FROM DUAL;
SYSDATE ADD_MONT
-------- --------
18/02/19 18/08/19

- NEXT_DAY(date,jour_semaine) : permet de trouver la date du prochain jour de la


semaine spécifié.
NEXT_DAY(date,jour_semaine) = valeur
jour_semaine : indique le jour de la semaine(‘Lundi’,’Mardi’,etc.). La valeur du jour de la
semaine doit être saisie dans la langue de la session en cours.
Valeur : la valeur de retour est de type date.
Cours Ingénierie des BD -Omar MAZHOUD- ISIGK -2020/2021 21
SQL>Select SYSDATE, NEXT_DAY(SYSDATE,'LUNDI'),NEXT_DAY(SYSDATE,'MARDI'),
NEXT_DAY(SYSDATE,'MERCREDI'),NEXT_DAY(SYSDATE,'JEUDI'),NEXT_DAY(SYSDATE,'VENDREDI')
,NEXT_DAY(SYSDATE,'SAMEDI'), NEXT_DAY(SYSDATE,'DIMANCHE') FROM DUAL;
SYSDATE NEXT_DAY NEXT_DAY NEXT_DAY NEXT_DAY NEXT_DAY NEXT_DAY NEXT_DAY
-------- -------- -------- -------- -------- -------- -------- --------
18/02/19 25/02/19 19/02/19 20/02/19 21/02/19 22/02/19 23/02/19 24/02/19

- LAST_DAY(date) : retourne le dernier jour dans le mois.


SQL> Select Sysdate, LAST_DAY(SYSDATE), LAST_DAY(ADD_MONTHS(SYSDATE,1)) FROM DUAL;
SYSDATE LAST_DAY LAST_DAY
-------- -------- --------
18/02/19 28/02/19 31/03/19

- MONTHS_BETWEEN(d1,d2) : calcule le nombre de mois entre deux dates.


Le résultat exprimé en nombre de mois, le résultat peut être un nombre décimal. La partie
fractionnaire du résultat est calculée en considérant chaque jour comme égal à 1/31 de mois.
SQL> Select SYSDATE, SYSDATE+35, MONTHS_BETWEEN(SYSDATE+35,SYSDATE) FROM DUAL;

SYSDATE SYSDATE+ MONTHS_BETWEEN(SYSDATE+35,SYSDATE)


-------- -------- ----------------------------------
18/02/19 25/03/19 1,22580645
- ROUND(Argument,précision) : permet de calculer l’arrondi d’une date selon une
précision spécifiée.
La précision est indiquée en utilisant un des masques de mise en forme de la date. On peut
ainsi arrondir une date à l’année, au mois, à la minute, etc. Par défaut, la précision est le jour.
SQL> Select SYSDATE, ROUND(SYSDATE, 'YEAR') "Année", ROUND(SYSDATE, 'MONTH')
"Mois", ROUND(SYSDATE, 'Q') "Trimestre", ROUND(SYSDATE, 'W') "Semaine" FROM DUAL;
SYSDATE Année Mois Trimestr Semaine
-------- -------- -------- -------- --------
18/02/19 01/01/19 01/03/19 01/04/19 22/02/19
- TRUNC(Argument,précision) : permet de calculer une valeur tronquée d’une date selon
une précision spécifiée. La précision est indiquée en utilisant un des masques de mise en
forme de la date.
On peut ainsi tronquer une date à l’année, au mois, à la minute, etc. Par défaut, la précision
est le jour.
SQL> Select SYSDATE, TRUNC(SYSDATE, 'YEAR') "Année", TRUNC(SYSDATE, 'MONTH')
"Mois", TRUNC(SYSDATE, 'Q') "Trimestre", TRUNC(SYSDATE, 'W') "Semaine" FROM DUAL;
SYSDATE Année Mois Trimestr Semaine
-------- -------- -------- -------- --------
18/02/19 01/01/19 01/02/19 01/01/19 15/02/19

4. Les fonctions de conversion


Le tableau suivant résume les fonctions de conversion entre les types de données.
DE \ Vers CHAR ou VARCHAR2 NUMBER DATE
CHAR ou VARCHAR2 Inutile TO_NUMBER TO_DATE
NUMBER TO_CHAR Inutile TO_DATE
DATE TO_CHAR Invalide Inutile

Cours Ingénierie des BD -Omar MAZHOUD- ISIGK -2020/2021 22


- TO_CHAR(date vers chaîne) : TO_CHAR(DATE, FORMAT)
FORMAT DESCRIPTION
MM Numéro du mois dans l’année
DD Numéro du jour dans le mois
D Numéro du jour dans la semaine
YYYY Année complète sur 4 chiffres

SQL> select sysdate, to_char(sysdate,'MM') MM, to_char(sysdate,'DD') JJ,


to_char(sysdate,'D') Num, to_char(sysdate,'YYYY') Annee from DUAL;

SYSDATE MM JJ N ANNE
-------- -- -- - ----
18/02/19 02 18 1 2019

5. Les fonctions générales


Le langage SQL propose également des fonctions générales qui travaillent avec tous les types
de données.
- GREATEST(Exp1, Exp2, […]) : Permet de trouver la plus grande valeur dans une liste des
valeurs. Les arguments peuvent être de type numérique, chaîne ou date. Le type de donnée du
premier argument détermine le type de retour de la fonction. Les arguments suivants sont
convertis automatiquement au type du premier.
SQL> SELECT GREATEST('HARRY', 'Harry','HARRIOT','HAROLD') "Greatest",
ASCII('A'),ASCII('a') FROM DUAL;
Great ASCII('A') ASCII('A')
----- ---------- ----------
Harry 65 97
SQL> SELECT GREATEST(TO_DATE('01/10/2005'), TO_DATE('22/05/2005'),
TO_DATE('21/08/2005')) "DATE", GREATEST('01/10/2005', TO_DATE('22/05/2005'),
TO_DATE('21/08/2005')) "Chaîne" FROM DUAL;
DATE Chaîne
-------- --------
01/10/05 22/05/05
- LEAST(Exp1, Exp2, […]) : Permet de trouver la plus petite valeur dans une liste des
valeurs. Les arguments peuvent être de type numérique, chaîne ou date. Le type de donnée du
premier argument détermine le type de retour de la fonction. Les arguments suivants sont
convertis automatiquement au type du premier.
SQL> Select LEAST (TO_NUMBER('033'),'22','21') "Numérique", LEAST('033','22','21')
"Chaîne" FROM DUAL;
Numérique Cha
---------- ---
21 033
- DECODE(Exp,Valeur1, Résultat1[, Valeur2, Résultat2…][,DEFAUT])
Permet de choisir une valeur parmi une liste d’expressions, en fonction de la valeur prise par
une expression servant de critère de sélection
SQL> Select Ename, Hiredate, trunc((sysdate - Hiredate)/365) "Ancienneté",
DECODE(trunc((sysdate - Hiredate)/365),36,'Nouveau',37, 'Ancien','Senior') FROM emp where sal
< 2000;

ENAME HIREDATE Ancienneté DECODE(


------ -------- ---------- -------
Martin 28/09/81 37 Ancien
Allen 20/02/81 38 Senior
Turner 08/09/81 37 Ancien
James 03/12/81 37 Ancien
Ward 22/02/81 38 Senior
Smith 17/12/80 38 Senior
Adams 12/01/83 36 Nouveau
Miller 23/01/82 37 Ancien

8 rows selected.

Cours Ingénierie des BD -Omar MAZHOUD- ISIGK -2020/2021 23