You are on page 1of 59

I.

Fonctions de chaines de caractère

• CONCAT()
Dans le langage SQL la fonction CONCAT() permet de concaténer les valeurs de plusieurs colonnes
pour ne former qu’une seule chaîne de caractère. Cette fonction SQL peut se révéler pratique pour
mettre bout-à-bout les valeurs de plusieurs colonnes pour n’en afficher qu’une. C’est donc pratique
pour afficher un résultat facile à lire tout en maintenant les données dans plusieurs colonnes pour une
bonne maintenance des données.
Syntaxe
CONCAT( attribut1, attribut 2,... )
Il est intéressant de noter que la fonction peut prendre plus de 2 paramètres (sauf pour Oracle).

• LENGTH() ou LEN
Dans le langage SQL la fonction LENGTH() permet de calculer la longueur d’une chaîne de
caractères.
La fonction se base sur le nombre d’octets. Un caractère multi-octet compte comme un seul caractère.
Autrement dit, un caractère tel que “œ” compte comme un seul caractère.
Nom de la fonction selon le Système de Gestion de Base de Données (SGBD) :
Syntaxe
LENGTH(attribut) Pour MySQL, PostgreSQL et Oracle
LEN(attribut) PourSQL Server

• REPLACE()
La fonction REPLACE dans le langage SQL permet de remplacer des caractères alphanumériques
dans une chaîne de caractère. Cela sert particulièrement à mettre à jour des données dans une base de
données ou à afficher des résultats personnalisés.
Syntaxe
REPLACE(texte d’entrée, texte à remplacer, texte de remplacement);
Exemple
SELECT REPLACE('Hello tout le monde', 'Hello', 'Bonjour');
Résultat :
Bonjour tout le monde
Le résultat montre bien que le mot “Hello” a été remplacé dans la chaîne initiale.
1
Fo nc ti on RE PL ACE da ns un UPD ATE
Pour modifier certains caractères dans une base de données, il est possible d’utiliser une requête avec
la syntaxe suivante:
UPDATE table
SET nom_colonne = REPLACE(nom_colonne, 'ancien texte', 'texte de remplacement')
Cette requête permet de remplacer le texte de la colonne “nom_colonne”. Cela peut se révéler très
pratique pour corriger des erreurs d’une base de données.

• SOUNDEX()
La fonction SOUNDEX() dans le langage SQL permet de retourner 4 caractères en fonction de la
sonorité d’une chaîne de caractère. Cette chaîne de retour est régulièrement utilisée pour évaluer la
similarité sonore entre 2 chaînes. Une utilisation courante consiste à utiliser cette fonction SQL pour
améliorer la pertinence d’un algorithme dans le cas où un utilisateur se trompe dans l’orthographe
d’un mot.
Attention : par défaut le système se base sur les sonorités anglaises. Dès lors, rien ne garantit un bon
fonctionnement pour les autres langues.
Syntaxe
SELECT SOUNDEX(texte);
Exemple1
SELECT SOUNDEX(‘Hello’);
Résultat
H400
Exemple2
Sono ri t é de “j ohn” e t “ jo ne”
Il est possible de juger concrètement de la pertinence
SELECT SOUNDEX('john'), SOUNDEX('jone');
Résultat :

SOUN DE X(' j o hn ') SOU N DEX( 'j on e' )

J500 J500

Rec her ch er un uti l i s at eur à pa rt ir de son pr é nom ma l or t hogr a phi é


Imaginons une application utilisant une base de données avec une table des utilisateurs.

2
Table utilisateur :

id pr en om nom

1 John Smith

2 Joël Lemaitre

3 Valéry Buisson

Cette application possède son propre moteur de recherche pour rechercher les utilisateurs. La
fonction SOUNDEX() va permettre de récupérer la liste des utilisateurs en fonction d’un nom, du
moment que le nom se prononce de la même façon.
La requête ci-dessous est un exemple mettant en scène un utilisateur qui recherche l’utilisateur
“john” avec une mauvaise orthographe, en utilisant à la place le mot “jone”.
SELECT id, prenom, nom
FROM utilisateur
WHERE SOUNDEX(prenom) = SOUNDEX('jone')
Résultat :

id pre n om no m

1 John Smith

• SUBSTRING() ou SUBSTR()
La fonction SUBSTRING() dans le langage SQL (ou SUBSTR() ) est utilisée pour segmenter une
chaîne de caractère. Autrement dit, cela permet d’extraire une partie d’une chaîne, par exemple pour
tronquer un texte.
Compatibilité :
 MySQL : SUBSTR() ou SUBSTRING()
 PostgreSQL : SUBSTR() ou SUBSTRING()
 Oracle : SUBSTR() ou SUBSTRING()
 SQL Server : SUBSTRING()
 SQLite : SUBSTR()
 Firebird : SUBSTRING()
Syntaxe
 SUBSTRING(chaine, debut) : retourne la chaîne de caractère de “chaine” à partir de la
position définie par “debut” (position en nombre de caractères)

3
 SUBSTRING(chaine FROM debut) : idem que précédent
 SUBSTRING(chaine, debut, longueur) : retourne la chaîne de caractère “chaine” en partant
de la position définie par “debut” et sur la longueur définie par “longueur”
 SUBSTRING(chaine FROM debut FOR longueur) : idem que précédent
A savoir : il ne faut pas oublier que la fonction est aussi parfois appelée SUBSTR().
Co mpat i bi l it é
Il est important de savoir que ces syntaxes ne sont pas toutes comprises de certains Système de
Gestion de Base de Données (SGBD). Pour savoir si un SGBD comprend une de ces syntaxes, il
convient de consulter les 2 tableaux récapitulatifs ci-dessous :
Fonction SUBSTR() :

SUBST R( s t ri n g
SUBST R (s t ri n g, SUB STR (s t ri n g, SUB ST R(s t r in g FROM s t a rt
SGBD s t ar t) s t a rt, le ngt h) FR OM s ta r t) FOR l en gt h)

MySQL ✔ ✔ ✔ ✔

PostgreSQL ✔ ✔ ✘ ✘

Oracle ✔ ✔ ✔ ✔

SQL Server ✘ ✘ ✘ ✘

SQLite ✔ ✔ ✘ ✘

Firebird ✘ ✘ ✘ ✘

Fonction SUBSTRING() :

S UBST RI N G(s t
SUB STR IN G( s t r SU BST RI N G(s t r i ng FR OM
SUBST R IN G( s tr i ng, s ta rt, r in g FR OM s ta rt FOR
SGBD i ng, s ta rt ) l en gt h) s t a rt ) l e ngth )

MySQL ✔ ✔ ✔ ✔

PostgreS ✘ ✘ ✔ ✔
QL

4
S UBST RI N G(s t
SUB STR IN G( s t r SU BST RI N G(s t r i ng FR OM
SUBST R IN G( s tr i ng, s ta rt, r in g FR OM s ta rt FOR
SGBD i ng, s ta rt ) l en gt h) s t a rt ) l e ngth )

Oracle ✔ ✔ ✔ ✔

SQL ✘ ✔ ✘ ✘
Server

SQLite ✘ ✘ ✘ ✘

Firebird ✘ ✘ ✔ ✔

• LEFT() et RIGHT()
Permet de retourner le nombre souhaité de caractères parmi les premiers caractères (LEFT) ou à
partir de la fin d’une chaîne de caractères. Cette fonction va tronquer volontairement le texte d’entrée
à la longueur désiré.

• REVERSE()
La fonction REVERSE() permet de retourner une chaîne de caractère en inversant l’ordre des
caractères. Le premier caractère devient le dernier, le deuxième devient l’avant dernier, et ainsi de
suite.
Compatibilité : la fonction SQL REVERSE() est notamment utilisée sous MySQL, PostgreSQL et
SQL Server.
Syntaxe
REVERSE( chaine );
Exemple
La fonction SQL REVERSE() s’utilise pour inverser l’ordre des caractères. Ces quelques exemples
illustres l’utilisation de la fonction :
SELECT REVERSE('abc'); -- retourne : cba
SELECT REVERSE('123'); -- retourne : 321
SELECT REVERSE('bonjour le monde'); -- retourne : ednom el ruojnob
La chaîne de retour de ces requêtes SQL démontre que l’ordre des lettres est bel et bien inversé entre
la chaîne d’entrée et la chaîne de sortie.

5
TRIM(), LTRIM(), RTRIM()
Permettent de supprimer des caractères au début et en fin (TRIM), au début (LTRIM), à la fin
(RTRIM) d’une chaîne de caractère. Le plus souvent elles permettent de supprimer les caractères
invisibles, c’est-à-dire les caractères tels que l’espace, la tabulation, le retour à la ligne ou bien même
le retour chariot. Une telle fonction peut se révéler utile pour économiser de l’espace dans une base
de données ou pour afficher proprement des données.
Syntaxe
TRIM | LTRIM |RTRIM ( texte );

Remarque
Il est intéressant de savoir que dans certains Système de Gestion de Base de Données (SGBD) tel que
MySQL ou PostgreSQL cette fonction peut supprimer certains caractères spécifiques.
My SQ L, P os tgr eSQL , F irebi r d et O racl e
Supprimer un caractère spécifique en début et en fin de chaîne :
TRIM(BOTH 'x' FROM 'xxxExemplexxx');
Résultat : “Exemple”
Supprimer un caractère spécifique uniquement en début de chaîne :
TRIM(LEADING 'x' FROM 'xxxExemplexxx');
Résultat : “Exemplexxx”
Supprimer un caractère spécifique uniquement en début de chaîne :
TRIM(TRAILING 'x' FROM 'xxxExemplexxx');
Résultat : “xxxExemple”
SQ Li te
Supprimer un caractère spécifique en début et en fin de chaîne :
TRIM('x', 'xxxExemplexxx');
Résultat : Exemple

• LPAD()
Dans le langage SQL, la fonction LPAD() permet de compléter une chaîne de caractère jusqu’à ce
qu’elle atteigne la taille souhaitée, en ajoutant des caractères au début de cette chaîne.
La fonction LPAD() s’utilise avec 2 ou 3 paramètres. Le premier paramètre correspond à la chaîne de
caractères d’entrée, le second paramètre définie la longueur souhaitée. Finalement, le 3ème paramètre
correspond à la chaîne de complétion. Ce dernier paramètre est facultatif sur certains Systèmes de
Gestion de Base de Données (SGBD) tel que Oracle ou PostgreSQL (mais pas pour MySQL).

6
Important : si la longueur souhaitée est plus petite que la taille actuelle de la chaîne de caractère,
alors la chaîne retournée sera tronquée pour faire la taille exacte qui est souhaitée.
Syntaxe
LPAD(texte, longueur, caractère à ajouter)
Exemple
SELECT LPAD('azerty', 4, 'x'); -- retourne 'azer'
SELECT LPAD('azerty', 6, 'x'); -- retourne 'azerty'
SELECT LPAD('azerty', 10, 'x'); -- retourne 'xxxxazerty'
SELECT LPAD('azerty', 10); -- retourne ' azerty' (fonctionne avec Oracle ou PostgreSQL, mais
pas avec MySQL)
SELECT LPAD('azerty', 9, 'xy'); -- retourne 'xyxazerty'
SELECT LPAD('123', 6, '0'); -- retourne '000123'

Par défaut si le troisième paramètre n’est pas complété la chaîne de complétion sera un espace vide.

• UPPER(), LOWER(), UCASE(), LCASE()


Permet de transformer tous les caractères en majuscules ou en minuscule.
Compatibilité : fonctionne notamment sous MySQL, PostgreSQL, SQLite, SQL server et Oracle. A
noter que sous MySQL et Oracle la fonction peut aussi être appelé grâce à l’alias UCASE().
Syntaxe
La syntaxe d’une requête utilisant cette fonction SQL est la suivante :
UPPER | LOWER | UCASE | LCASE (texte);

• LOCATE()
En SQL, la fonction LOCATE() permet de chercher la position d’une chaîne de caractère dans un
enregistrement. La fonction retourne zéro si la chaîne de caractère n’a pas été trouvée.
Cette fonction peut se révéler très utile lorsqu’elle est couplée à la fonction SUBSTR() ( alias
SUBSTRING() ) pour pouvoir remplacer des caractères dans une chaîne.
A noter : pour les utilisateurs de SQL Server la fonction s’appelle CHARINDEX() et fonctionne de
la même façon.
A propos : la fonction LOCATE() s’assimile à la fonction PHP strpos().
Syntaxe
LOCATE ( chaine_recherche, chaine_source );

7
Dans cette requête, la fonction va chercher le contenu de “chaine_recherche” dans “chaine_source”.
Si la chaîne existe et est présente, alors la fonction retournera la position de la première occurrence.
Attention : le premier caractère est à la position 1 et si la chaîne n’est pas trouvée, la fonction
retournera 0.
Il est possible de chercher une chaîne de caractère en commençant à chercher à partir d’une position.
La requête SQL suivante permet de chercher la chaîne “test” dans la colonne “nom_colonne” en
commençant à chercher à partir de la position 4.
SELECT LOCATE( 'test', nom_colonne, 4 );
Ce 3ème paramètre est optionnel et peut être utilisé s’il faut ignorer une première partie.
Exemple
Imaginons une table qui contient les différentes unités liées aux mètres (kilomètre, millimètre,
centimètre …).
Table “metre” :

id un it e pu is s a nce da t e_aj o ut

1 kilomètre 1000 2013-07-16

2 millimètre 0.001 2013-08-06

3 mètre 1 2013-09-02

4 centimètre 0.01 2013-11-27

5 mm 0.001 2013-11-29

Récupérer la position du mot “mètre” dans la colonne “unite”. Pour cela il est possible d’exécuter la
requête suivante :
SELECT id, unite, LOCATE(unite) AS locate_unite, puissance
FROM metre
Résultats :

id un it e l oc ate _u nit e pu i s s anc e

1 kilomètre 5 1000

2 millimètre 6 0.001

3 mètre 1 1

8
id un it e l oc ate _u nit e pu i s s anc e

4 centimètre 6 0.01

5 mm 0 0.001

• INSTR()
Dans le langage SQL, la fonction INSTR() est utilisée par MySQL et Oracle pour obtenir la position
d’une occurrence dans une chaîne de caractères. Cette fonction permet donc de savoir si une chaîne
est présente dans une autre chaîne et d’obtenir par la même occasion sa position.
La fonction est identique à la fonction LOCATE() à la seule différence que les 2 paramètres qui la
composent sont inversés.
Syntaxe
SELECT INSTR( str1 , str2 );
Dans la requête ci-dessus, la fonction INSTR() va chercher et retourner la position de str2 dans str1.
Si la chaîne str2 n’est pas présente dans str1, alors la fonction retournera la position 0.
Il faut également savoir que si la chaîne str2 est présente plusieurs fois dans str1, alors ce sera
seulement la position de la première occurrence qui sera retournée.
Exemple
Exe mple s i mpl e
Pour montrer concrètement l’utilité de cette fonction, prenons une requête SQL simple dans laquelle
nous allons chercher le mot “world” dans la chaîne de caractère “hello world!”.
SELECT INSTR( 'hello world!' , 'world' );
Résultat : 7

II. Fonctions mathématiques


• RAND()
En SQL la fonction RAND() permet de sélectionner un nombre aléatoire à virgule, compris entre 0 et
1. Le résultat de cette fonction sera différent à chaque fois que la fonction est exécutée dans une
requête SQL.
Cette fonction se révèle pratique avec un ORDER BY pour classer des résultats aléatoirement.
Toutefois, même si c’est possible il faut essayer d’éviter cette méthode qui n’est pas particulièrement
efficace en terme de performances.

9
La fonction peut aussi être utilisée dans une clause WHERE. Cela peut être pratique pour
sélectionner un résultat aléatoirement.
Syntaxe
RAND();
Le résultat de cette fonction sera différent à chaque fois que la requête sera exécutée. Voici une liste
possible de résultats de cette fonction :
0.8702846307962059
0.0648367116831585
0.7657416637667843
Il est possible d’effectuer des opérations mathématiques avec le résultat de cette fonction. Par
exemple, pour obtenir un nombre aléatoire entre 0 et 100, il suffit de multiplier le résultat de RAND()
par 100, comme dans l’exemple ci-dessous:
SELECT RAND() * 100;
Résultats possibles :
60.11546427394773
51.26955569839995
15.105471494705855
Exemple
Imaginons une application qui utilise une base de données des principales villes de France. Pour le
bien de ce cours, nous allons utiliser une table qui contient 10 villes françaises.
Table ville :

id vi l l e de pa r te men t

1 Paris Paris

2 Marseille Bouches-du-Rhône

3 Lyon Rhône

4 Toulouse Haute-Garonne

5 Nice Alpes-Maritimes

6 Nantes Loire-Atlantique

7 Strasbourg Bas-Rhin

8 Montpellier Hérault

10
id vi l l e de pa r te men t

9 Bordeaux Gironde

10 Lille Nord

Tr ier l es r és ul ta ts al é at oi re ment
Il est possible de trier les résultats aléatoirement en utilisant la syntaxe suivante :
SELECT *
FROM `ville`
ORDER BY RAND()
A chaque fois que la requête sera exécutée, celle-ci retournera un résultat aléatoire. L’un des résultats
possibles sera donc le suivant:

id vi l l e de pa r te men t

2 Marseille Bouches-du-Rhône

10 Lille Nord

6 Nantes Loire-Atlantique

7 Strasbourg Bas-Rhin

9 Bordeaux Gironde

1 Paris Paris

5 Nice Alpes-Maritimes

3 Lyon Rhône

4 Toulouse Haute-Garonne

8 Montpellier Hérault

Sé le c ti onne r un ré sul t at a lé at oi reme nt


En couplant cette fonction SQL avec la fonction ROUND() qui permet d’arrondir un nombre a
virgule à un entier, il est possible de retourner un nombre entier plutôt qu’un nombre a virgule
flottante. Ce résultat entier peut être utilisé pour sélectionner une ligne parmi un set d’enregistrement.
Voici une requête SQL utilisant cette méthode:
SELECT *
FROM `ville`

11
WHERE `id` = ROUND( RAND() * 9 ) + 1
Voici une explication concernant cette requête :
 RAND() * 9 permet de générer un nombre a virgule compris entre 0 et 9
 ROUND() permet d’arrondir le nombre généré pour obtenir exclusivement des nombres entier
 + 1 permet d’ajouter 1 au résultat précédent. Ainsi, le nombre sera compris entre 1 et 10
Cette requête va donc se baser sur un nombre entier entre 1 et 10 pour sélectionner une ville
aléatoirement dans la table “ville”. L’un des résultats possibles est donc le suivant:

id vil l e de pa rte men t

7 Strasbourg Bas-Rhin

Attention, il faut faire attention avec cette méthode qu’il n’y a pas de trou entre les identifiants sous
peine de ne retourner aucun résultat.

• ROUND()
Dans le langage SQL la fonction ROUND() permet d’arrondir un résultat numérique. Cette fonction
permet soit d’arrondir sans utiliser de décimal pour retourner un nombre entier (c’est-à-dire : aucun
chiffre après la virgule), ou de choisir le nombre de chiffre après la virgule.
Syntaxe
ROUND(nom_colonne, nombre_de_chiffre)

Arrondir le résultat à la dizaine


Il est possible d’utiliser une valeur négative dans le second argument pour obtenir une valeur arrondit
à la dizaine, centaine ou plus selon la valeur indiquée. Cela peut être effectué en utilisant la requête
suivante:

III. Fonctions de date et heure

SQL DATE_FORMAT()
Permet de formater une donnée de type DATE dans le format indiqué. Il s’agit de la fonction idéal si
l’on souhaite définir le formatage de la date directement à partir du langage SQL et pas uniquement
dans la partie applicative.
Syntaxe
DATE_FORMAT(date, format)

12
Le premier paramètre correspond à une donnée de type DATE (ou DATETIME), tandis que le
deuxième paramètre est une chaîne de caractère contenant le choix de formatage :
 %a : nom du jour de la semaine abrégé (Sun, Mon, … Sat)
 %b : nom du mois abrégé (Jan, Fev, … Dec)
 %c : numéro du mois (0, 1, 2, … 12) (numérique)
 %D : numéro du jour, avec le suffixe anglais (0th, 1st, 2nd, 3rd, …)
 %d : numéro du jour du mois, sous 2 décimales (00..31) (numérique)
 %e : numéro du jour du mois (0..31) (numérique)
 %f : microsecondes (000000..999999)
 %H : heure (00..23)
 %h : heure (01..12)
 %I : heure (01..12)
 %i : minutes (00..59) (numérique)
 %j : jour de l’année (001..366)
 %k : heure (0..23)
 %l : heure (1..12)
 %M : nom du mois (January..December)
 %m : mois (00..12) (numérique)
 %p : AM ou PM
 %r : heure au format 12-heures (hh:mm:ss suivi par AM ou PM)
 %S : secondes (00..59)
 %s : secondes (00..59)
 %T : heure au format 24 heures (hh:mm:ss)
 %U : Semaine (00..53), pour lequel le dimanche est le premier jour de la semaine; WEEK()
mode 0
 %u : Semaine (00..53), pour lequel le lundi est le premier jour de la semaine; WEEK() mode 1
 %V : Semaine (01..53), pour lequel le dimanche est le premier jour de la semaine; WEEK()
mode 2; utilisé avec %X
 %v : Semaine (01..53), pour lequel le lundi est le premier jour de la semaine; WEEK() mode 3;
utilisé avec %x
 %W : nom du jour de la semaine (Sunday, Monday, … Saturday)
 %w : numéro du jour de la semaine (0=dimanche, 1=lundi, … 6=samedi)
 %X : numéro de la semaine de l’année, pour lequel le dimanche est le premier jour de la
semaine, numérique, 4 digits; utilisé avec %V

13
 %x : numéro de la semaine de l’année, pour lequel le lundi est le premier jour de la semaine,
numérique, 4 digits; utilisé avec %v
 %Y : année, numérique (avec 4 digits)
 %y : année, numérique (avec 2 digits)
 %% : un caractère %
 %x x, pour n’importe lequel “x” non listé ci-dessus
Exemple
Il est possible de combiner plusieurs valeurs ci-dessous afin d’obtenir le formatage d’une date dans le
format de son choix. Voici une liste d’exemples d’usages de cette fonction DATE_FORMAT() dans
des requêtes SQL :
SELECT DATE_FORMAT("2018-09-24", "%D %b %Y");
-- résultat : "24th Sep 2018"
SELECT DATE_FORMAT("2018-09-24", "%M %d %Y");
-- résultat : "September 24 2018"
SELECT DATE_FORMAT("2018-09-24 22:21:20", "%W %M %e %Y");
-- résultat : "Monday September 24 2018"
SELECT DATE_FORMAT("2018-09-24", "%d/%m/%Y");
-- résultat : "24/09/2018"
SELECT DATE_FORMAT("2018-09-24", "Message du : %d/%m/%Y");
-- résultat : "Message du : 24/09/2018"
SELECT DATE_FORMAT("2018-09-24 22:21:20", "%H:%i:%s");
-- résultat : "22:21:20"
Les exemples ci-dessous ne sont que quelques cas d’usages, la richesse de la fonction
DATE_FORMAT() réside dans le fait qu’il est possible de combiner le formatage de la façon qui
vous intéresse. La fonction est idéale pour s’adapter au formatage de date et heure dans des projets
internationaux.
Exemple:
SELECT *, DATE_FORMAT(date_inscription, "%d/%m/%Y")
FROM utilisateur;
La requête ci-dessous permet d’obtenir la liste des données d’une table contenant des utilisateurs,
ainsi que la date d’inscription avec un formatage jour/mois/année prêt à être exploité affiché dans un
format facile à lire pour les utilisateurs.

• DATEDIFF()

14
Dans le langage SQL, la fonction DATEDIFF() permet de déterminer l’intervalle entre 2 dates
spécifiées. La fonction est utilisée avec les systèmes MySQL et SQL Server, mais s’utilise
différemment :
 MySQL : la fonction prend 2 dates en paramètres et retourne le nombre de jours entre les 2
dates
 SQL Server : la fonction prend 2 dates ainsi qu’un paramètre déterminant sous quel intervalle
de distance temporelle le résultat doit être retourné (nombre de jours entre 2 dates, nombre
d’années, nombre de semaines, nombre d’heures …)
Syntaxe
My SQ L
DATEDIFF( date1, date2 );
Les dates doivent être au format DATE (cf. AAAA-MM-JJ) ou DATETIME (cf. AAAA-MM-JJ
HH:MM:SS). Pour que le résultat soit positif il faut que la date1 soit plus récente que la date2.
SQ L Se rver
DATEDIFF( type_limite, date1, date2 );
Le paramètre “type_limite” permet de spécifier si le résultat doit être exprimé en jour, semaine, mois,
année … Ce paramètre utilise l’une de ses valeurs : year, quarter, month, dayofyear, day, week,
weekday, hour, minute, second, millisecond, microsecond ou nanosecond.
Pour reproduire le même fonctionnement que la fonction DATEDIFF() de MySQL, il convient
d’utiliser la valeur “day” pour le paramètre “type_limite”.
Les dates peuvent être au format TIME, DATE, SMALLDATETIME, DATETIME, DATETIME2
ou DATETIMEOFFSET. Pour que le résultat soit positif il faut que la date2 soit plus récente que la
date1.
Exemple
My SQ L
La fonction peut s’utiliser pour faire la comparaison entre 2 dates d’une table ou peut s’utiliser en
utilisant directement les dates.
Voici une liste d’exemples concrets :
SELECT DATEDIFF('2014-01-09', '2014-01-01'); -- retourne : 8
SELECT DATEDIFF('2014-01-09 00:00:00', '2014-01-01 00:00:00'); -- retourne : 8
SELECT DATEDIFF('2014-01-01', '2014-01-09'); -- retourne : -8
SELECT DATEDIFF('2015-01-01', '2014-01-01'); -- retourne : 365
SELECT DATEDIFF('2014-01-02', '2014-01-01'); -- retourne : 1
SELECT DATEDIFF('2014-01-02 23:59:59', '2014-01-01'); -- retourne : 1

15
SQ L Se rver
La fonction DATEDIFF() sous SQL Server peut s’utiliser d’une façon presque similaire, mais les
dates doivent être inversées pour obtenir le même résultat qu’avec MySQL.
SELECT DATEDIFF(day, '2014-01-09', '2014-01-01'); -- retourne : -8
SELECT DATEDIFF(day, '2014-01-09 00:00:00', '2014-01-01 00:00:00'); -- retourne : -8
SELECT DATEDIFF(day, '2014-01-01', '2014-01-09'); -- retourne : 8
SELECT DATEDIFF(day, '2015-01-01', '2014-01-01'); -- retourne : -365
SELECT DATEDIFF(day, '2014-01-02', '2014-01-01'); -- retourne : -1
SELECT DATEDIFF(day, '2014-01-02 23:59:59', '2014-01-01'); -- retourne : -1

• DAYOFWEEK()
La fonction DAYOFWEEK() permet d’obtenir le jour de la semaine d’une date spécifique. Le
résultat est un index numérique allant de 1 (Dimanche) à 7 (Samedi).
Détail des résultats possibles :
 1 : Dimanche
 2 : Lundi
 3 : Mardi
 4 : Mercredi
 5 : Jeudi
 6 : Vendredi
 7 : Samedi
Syntaxe
Mysql
DAYOFWEEK (date) :
SQL server
DATEPART(partie_a_afficher, date)
DATENAME(partie_a_afficher, date)
Exemple 1 : obtenir le jour de la semaine actuel
Un exemple très simple consiste à essayer d’obtenir le jour de la semaine du jour courant, à l’aide de
la requête SQL suivante :
SELECT DAYOFWEEK(NOW());
SELECT Datepart(dw,SYSDATETIME())
Le résultat sera une valeur numérique comprise de 1 à 7.

16
SELECT Datename(dw,SYSDATETIME())
Le résultat sera un jour compris entre lundi et dimanche

• MONTH()
Dans le langage SQL la fonction MONTH() permet d’extraire le numéro de mois à partir d’une date
au format date. Si la date d’entrée est par exemple ‘2014-02-03’, la valeur de retour sera ‘3’.
SQL Server : la fonction accepte les valeurs de type time, date, smalldatetime, datetime, datetime2
ou datetimeoffset.
PostgreSQL : la fonction MONTH() n’existe pas avec ce Système de Gestion de Base de Données
(SGBD). Pour simuler le fonctionnement, il est possible d’utiliser la fonction EXTRACT() en
spécifiant le type “month”.
Syntaxe
MONTH( date );

• NOW()
En SQL, la fonction NOW() permet de retourner la date et l’heure du système. Cette fonction est très
pratique pour enregistrer la date et l’heure d’ajout ou de modification d’une donnée, dans un
DATETIME ou un DATE(). Cela permet de savoir exactement le moment où a été ajouté une donnée
contenue dans une table.
Syntaxe
NOW();

• SQL SEC_TO_TIME()
Dans le langage SQL, la fonction SEC_TO_TIME() permet d’afficher des secondes dans un format :
“HH:MM:SS” (heures, minutes et secondes). La fonction convertit le nombre de seconde en nombre
d’heures, de minutes et de secondes pour être plus compréhensible pour un humain.
La fonction est particulièrement utile pour afficher proprement la différence entre 2 timestamps. Elle
est également utile pour ré-afficher au bon format des heures qui auraient été additionnées après avoir
été converti en nombre de secondes à l’aide de la fonction TIME_TO_SEC().
Compatibilité : MySQL, Oracle et MariaDB.
Attention : le résultat est limité de -838:59:59 à 838:59:59 (3.020.399 secondes). Au delà, il faut
trouver une autre solution, par exemple en retournant le résultat en secondes et en convertissant sous
ce format avec un autre langage de programmation.
Syntaxe

17
SELECT SEC_TO_TIME( secondes );
Exemple
SELECT SEC_TO_TIME(1); -- retourne : 00:00:01
SELECT SEC_TO_TIME(60); -- retourne : 00:01:00
SELECT SEC_TO_TIME(3600); -- retourne : 01:00:00
SELECT SEC_TO_TIME(86398); -- retourne : 23:59:58
SELECT SEC_TO_TIME(86399); -- retourne : 23:59:59

• TIMEDIFF()
La fonction TIMEDIFF() utilisée en SQL permet de calculer la différence entre 2 heures distinctes.
Les 2 arguments de la fonction peuvent soit être des heures (TIME) ou des dates avec heure
(DATETIME), le résultat sera une heure comprise entre “-838:59:59” et “838:59:59”.
Syntaxe
TIMEDIFF(heure1, heure2);
Exemples
SELECT TIMEDIFF("HH:MM", "HH:MM"); -- format de la réponse : "HH:MM"
Exemple de comparaison avec l’heure courante
La fonction TIMEDIFF() est également très pratique pour comparer l’heure actuelle avec une heure
spécifiée. Un usage courant peut consister à afficher la durée comparé à l’heure actuelle.
SELECT TIMEDIFF(CURTIME(), "23:00");

• TIMESTAMP()
La fonction SQL TIMESTAMP() est utilisée dans le langage SQL pour obtenir un DATETIME à
partir d’une DATE. La fonction peut contenir un à deux argument selon l’usage souhaité.
 Avec 1 argument : une date au format DATE est transformée en DATETIME
 Avec 2 arguments : une date et heure seront transformée en DATETIME
Syntaxe
La syntaxe d’utilisation de cette fonction peut s’effectuer dans une requête SQL sous la forme
suivante :
SELECT TIMESTAMP("YYYY-MM-DD"); -- résultat sous le format YYYY-MM-DD HH:MM:SS
SELECT TIMESTAMP("YYYY-MM-DD", "HH:MM"); -- résultat sous la format YYYY-MM-DD
HH:MM:SS
Les 2 requêtes comportent un usage différent.
Exemple
18
Un usage pourrait consister à obtenir une date/heure à partir d’un champ qui ne contiendrait qu’une
date.
SELECT TIMESTAMP("2018-09-15"); -- résultat sous le format 2018-09-15 00:00:00
Il peut aussi arriver qu’une date soit enregistrée dans une colonne, tandis que l’horaire est enregistré
dans une autre colonne. Cette fonction serait alors utilisée pour combiner la date et heure en une
seule information au format DATETIME.
SELECT TIMESTAMP("2018-09-15", "10:35"); -- résultat sous la format 2018-09-15 10:35:00

• YEAR()
Dans le langage SQL la fonction YEAR() permet d’extraire une année à partir d’une date au format
date.
SQL Server : la fonction accepte les valeurs de type time, date, smalldatetime, datetime, datetime2
ou datetimeoffset.
PostgreSQL : la fonction n’existe pas avec PostgreSQL. Pour extraire une date avec ce Système de
Gestion de Base de Données (SGBD) il convient d’utiliser la fonction EXTRACT() et de spécifier le
type “year”.
Syntaxe
Pour utiliser la fonction dans une requête SQL il convient de respecter la syntaxe suivante :
YEAR(date );

IV. Les autres fonctions, clauses ou opérateurs SQL


• IS NULL / IS NOT NULL
Dans le langage SQL, l’opérateur IS permet de filtrer les résultats qui contiennent la valeur NULL.
Cet opérateur est indispensable car la valeur NULL est une valeur inconnue et ne peut par conséquent
pas être filtrée par les opérateurs de comparaison (cf. égal, inférieur, supérieur ou différent).
Syntaxe
SELECT *
FROM `table`
WHERE nom_colonne IS NULL
A l’inverse, pour filtrer les résultats et obtenir uniquement les enregistrements qui ne sont pas null, il
convient d’utiliser la syntaxe suivante:
SELECT *
FROM `table`
WHERE nom_colonne IS NOT NULL
19
• GROUP BY WITH ROLLUP
La commande GROUP BY est utilisée en SQL pour grouper plusieurs résultats et utiliser des
fonctions sur le groupement. L’ajout de la commande WITH ROLLUP permet quant à elle d’ajouter
une ligne supplémentaire qui fonctionne tel qu’un système de “super-agrégateur” sur l’ensemble des
résultats.
Syntaxe
GROUP BY colonne1 WITH ROLLUP
Exemple d’utilisation
Prenons en considération une table “client” qui résume les clients, leurs code postal, leurs
commandes, leurs date d’inscription :
Maintenant, il est possible de considérer que nous souhaitons obtenir des informations clés pour
chaque code postal, tel que :
 Le nombre de clients pour chaque code postal
 Le nombre de commandes pour chaque code postal
 La date de première inscription par code postal
 La date de dernière inscription par code postal
Le besoin ci-dessus sera facilement effectué grâce à GROUP BY. L’ajout de la commande WITH
ROLLUP permettra d’obtenir une ligne avec le complément d’informations suivantes (quelque soit le
code postal) :
 Le nombre de clients total
 Le nombre de commandes totales
 La date de première inscription
 La date de dernière inscription
Afin d’obtenir les informations liées à ce besoin, la requête SQL sera la suivante :
SELECT `code_postal`, COUNT(*), SUM(`commande`), MIN(`date_inscription`),
MAX(`date_inscription`)
FROM `client`
GROUP BY code_postal WITH ROLLUP
A noter : l’utilisation de la clause “WITH ROLLUP” est bien entendue une bonne astuce, qui se
révèle utile pour améliorer les performances d’une application.

• LIMIT
La clause LIMIT est à utiliser dans une requête SQL pour spécifier le nombre maximum de résultats
que l’on souhaite obtenir. Cette clause est souvent associé à un OFFSET, c’est-à-dire effectuer un
20
décalage sur le jeu de résultat. Ces 2 clauses permettent par exemple d’effectuer des systèmes de
pagination (exemple : récupérer les 10 articles de la page 4).
ATTENTION : selon le système de gestion de base de données, la syntaxe ne sera pas pareil.
Syntaxe simple
LIMIT nombre_d’enregistrement
LIMIT position de départ, nombre_d’enregistrement
LIMIT nombre_d’enregistrement OFFSET position de départ

Exemple : select * from table LIMIT 10


Cette requête permet de récupérer seulement les 10 premiers résultats d’une table. Bien entendu, si la
table contient moins de 10 résultats, alors la requête retournera toutes les lignes.
Bon à savoir : la bonne pratique lorsque l’on utilise LIMIT consiste à utiliser également la
clause ORDER BY pour s’assurer que quoi qu’il en soit ce sont toujours les bonnes données qui sont
présentées. En effet, si le système de tri est non spécifié, alors il est en principe inconnu et les
résultats peuvent être imprévisible.
Limit et Offset avec PostgreSQL
L’offset est une méthode simple de décaler les lignes à obtenir. La syntaxe pour utiliser une limite et
un offset est la suivante :
SELECT *
FROM table
LIMIT 10 OFFSET 5
Cette requête permet de récupérer les résultats 6 à 15 (car l’OFFSET commence toujours à 0). A titre
d’exemple, pour récupérer les résultats 16 à 25 il faudrait donc utiliser: LIMIT 10 OFFSET 15
A noter : Utiliser OFFSET 0 reviens au même que d’omettre l’OFFSET.
Limit et Offset avec MySQL
La syntaxe avec MySQL est légèrement différente :
SELECT *
FROM table
LIMIT 5, 10;
Cette requête retourne les enregistrements 6 à 15 d’une table. Le premier nombre est l’OFFSET
tandis que le suivant est la limite.
Bon à savoir : pour une bonne compatibilité, MySQL accepte également la syntaxe LIMIT nombre
OFFSET nombre. En conséquent, dans la conception d’une application utilisant MySQL il est

21
préférable d’utiliser cette syntaxe car c’est potentiellement plus facile de migrer vers un autre
système de gestion de base de données sans avoir à ré-écrire toutes les requêtes.

• CASE
Dans le langage SQL, la commande “CASE … WHEN …” permet d’utiliser des conditions de type
“si / sinon” (cf. if / else) similaire à un langage de programmation pour retourner un résultat
disponible entre plusieurs possibilités. Le CASE peut être utilisé dans n’importe quelle instruction ou
clause, telle que SELECT, UPDATE, DELETE, WHERE, ORDER BY ou HAVING.
Syntaxe 1
CASE a
WHEN 1 THEN 'un'
WHEN 2 THEN 'deux'
WHEN 3 THEN 'trois'
ELSE 'autre'
END
Dans cet exemple les valeurs contenues dans la colonne “a” sont comparées à 1, 2 ou 3. Si la
condition est vraie, alors la valeur située après le THEN sera retournée.
A noter : la condition ELSE est facultative et sert de ramasse-miette. Si les conditions précédentes ne
sont pas respectées alors ce sera la valeur du ELSE qui sera retournée par défaut.
Syntaxe 2
Il est possible d’établir des conditions plus complexes pour récupérer un résultat ou un autre. Cela
s’effectue en utilisant la syntaxe suivante:
CASE
WHEN a=b THEN 'A égal à B'
WHEN a>b THEN 'A supérieur à B'
ELSE 'A inférieur à B'
END
Dans cet exemple les colonnes “a”, “b” et “c” peuvent contenir des valeurs numériques. Lorsqu’elles
sont respectées, les conditions booléennes permettent de rentrer dans l’une ou l’autre des conditions.
Il est possible de reproduire le premier exemple présenté sur cette page en utilisant la syntaxe
suivante:
CASE
WHEN a=1 THEN 'un'
WHEN a=2 THEN 'deux'

22
WHEN a=3 THEN 'trois'
ELSE 'autre'
END
Exemple
Pour présenter le CASE dans le langage SQL il est possible d’imaginer une base de données utilisées
par un site de vente en ligne. Dans cette base il y a une table contenant les achats, cette table contient
le nom des produits, le prix unitaire, la quantité achetée et une colonne consacrée à une marge fictive
sur certains produits.
Table “achat” :

id n om s ur ch ar ge p ri x_ un it a ir e q ua nt i te

1 Produit A 1.3 6 3

2 Produit B 1.5 8 2

3 Produit C 0.75 7 4

4 Produit D 1 15 2

Il est possible d’effectuer une requête qui va afficher un message personnalisé en fonction de la
valeur de la marge. Le message sera différent selon que la marge soit égale à 1, supérieur à 1 ou
inférieure à 1. La requête peut se présenter de la façon suivante:
SELECT id, nom, marge_pourcentage, prix_unitaire, quantite,
CASE
WHEN marge_pourcentage=1 THEN 'Prix ordinaire'
WHEN marge_pourcentage>1 THEN 'Prix supérieur à la normale'
ELSE 'Prix inférieur à la normale'
END
FROM `achat`
Résultat :

i d nom s u rc ha rge pr ix _u ni ta i re qu an ti te C ASE

1 Produit A 1.3 6 3 Prix supérieur à la normale

2 Produit B 1.5 8 2 Prix supérieur à la normale

23
i d nom s u rc ha rge pr ix _u ni ta i re qu an ti te C ASE

3 Produit C 0.75 7 4 Prix inférieur à la normale

4 Produit D 1 15 2 Prix ordinaire

Ce résultat montre qu’il est possible d’afficher facilement des messages personnalisés selon des
conditions simples.
Af f ic her u n p ri x un i t ai re dif f ér e nt se l on une c ondi ti on
Avec un CASE il est aussi possible d’utiliser des requêtes plus élaborées. Imaginons maintenant que
nous souhaitions multiplier le prix unitaire par 2 si la marge est supérieur à 1, la diviser par 2 si la
marge est inférieure à 1 et laisser le prix unitaire tel quel si la marge est égale à 1. C’est possible
grâce à la requête SQL:
SELECT id, nom, marge_pourcentage, prix_unitaire, quantite,
CASE
WHEN marge_pourcentage=1 THEN prix_unitaire
WHEN marge_pourcentage>1 THEN prix_unitaire*2
ELSE prix_unitaire/2
END
FROM `achat`
Résultat :

id no m s urc ha r ge pr i x_u ni t ai r e qu a nt ite CAS E

1 Produit A 1.3 6 3 12

2 Produit B 1.5 8 2 16

3 Produit C 0.75 7 4 3.5

4 Produit D 1 15 2 15

Co mpar e r un c ham p à une va le ur don né e


Imaginons maintenant que l’application propose des réductions selon le nombre de produits achetés:
 1 produit acheté permet d’obtenir une réduction de -5% pour le prochain achat
 2 produit acheté permet d’obtenir une réduction de -6% pour le prochain achat
 3 produit acheté permet d’obtenir une réduction de -8% pour le prochain achat
 Pour plus de produits achetés il y a un réduction de -10% pour le prochain achat

24
Pour effectuer une telle procédure, il est possible de comparer la colonne “quantite” aux différentes
valeurs spécifiée et d’afficher un message personnalisé en fonction du résultat. Cela peut être réalisé
avec cette requête SQL:
SELECT id, nom, marge_pourcentage, prix_unitaire, quantite,
CASE quantite
WHEN 0 THEN 'Erreur'
WHEN 1 THEN 'Offre de -5% pour le prochain achat'
WHEN 2 THEN 'Offre de -6% pour le prochain achat'
WHEN 3 THEN 'Offre de -8% pour le prochain achat'
ELSE 'Offre de -10% pour le prochain achat'
END
FROM `achat`
Résultat :

i d nom s ur ch ar ge pri x_ un it a i re q ua nt i te CASE

1 Produit A 1.3 6 3 Offre de -8% pour le prochain achat

2 Produit B 1.5 8 2 Offre de -6% pour le prochain achat

3 Produit C 0.75 7 4 Offre de -10% pour le prochain achat

4 Produit D 1 15 2 Offre de -6% pour le prochain achat

Astuce : la condition ELSE peut parfois être utilisée pour gérer les erreurs.
UP DATE a vec C ASE
Comme cela a été expliqué au début, il est aussi possible d’utiliser le CASE à la suite de la
commande SET d’un UPDATE pour mettre à jour une colonne avec une données spécifique selon
une règle. Imaginons par exemple que l’on souhaite offrir un produit pour tous les achats qui ont une
surcharge inférieure à 1 et que l’on souhaite retirer un produit pour tous les achats avec une surcharge
supérieure à 1. Il est possible d’utiliser la requête SQL suivante:
UPDATE `achat`
SET `quantite` = (
CASE
WHEN `surcharge` < 1 THEN `quantite` + 1
WHEN `surcharge` > 1 THEN `quantite` - 1
ELSE quantite
END
25
)

• SQL MD5() ou SHA1() ou HASHBYTES('MD5', 'Test')


Dans le langage SQL, la fonction MD5() permet de chiffrer une chaîne de caractère en un entier
hexadécimal de 32 caractères. Cette chaîne de retour peut être particulièrement utile pour être utilisée
comme clé de hachage.
Syntaxe
MD5(valeur)
SHA1(valeur)
HASHBYTES (algorithme de cryptage_MD5_ou_SHA1, valeur)

Exemple :
Select MD5(‘Test’)
Select HASHBYTES ('MD5', 'Test')
Une telle requête retournera la chaîne suivante :
098f6bcd4621d373cade4e832627b4f6 avec MySql
0x0CBC6611F5540BD0809A388DC95A615B avec SQL server

• CAST()
La fonction CAST() dans le langage SQL est une fonction de transtypage qui permet de convertir une
données d’un type en un autre. Il est par exemple possible de transformer une date au format
DATETIME en DATE, ou l’inverse.
Syntaxe
CAST( expression AS type );
Dans cette syntaxe, “expression” correspond à la valeur à transformer, tandis que “type” contient le
type de données que l’on souhaite obtenir. Ce type de données peut être l’une des valeurs suivantes
(dépend du système de gestion de base de données) :
 BINARY
 CHAR
 DATE
 DATETIME
 TIME
Exemple

26
Pour le bien de ce tutoriel nous allons imaginer une base de données qui contient une table des clients
avec leur prénom, leur nom, la date d’ajout du client (au format DATETIME) et également le budget
du client.
Table client :

id pr en om no m da t e_aj o ut b ud ge t

1 Thierry Jourdain 2013-02-05 14:11:09 314.21

2 Laurette Bertin 2013-03-15 15:06:45 154.34

3 André Moreira 2013-08-26 08:24:39 255.47

4 Aurélie Moulin 2013-09-04 11:36:17 147.95

Dans cette table, les types des colonnes sont les suivants :
 id : BIGINT
 prenom : VARCHAR
 nom : VARCHAR
 date_ajout : DATETIME
 budget : FLOAT
Ext r ai re l a da te au f o rmat DATE
Il est possible de récupérer la date d’ajout du client au format DATE pour ne garder que l’année, le
mois et le jour. Cela permet donc d’ignorer l’heure pour ne conserver qu’un jour.
SELECT id, prenom, nom, CAST( date_ajout AS DATE ) AS date_ajout_cast, budget
FROM client
Résultat :

id pre no m nom da te _aj ou t _cas t b ud ge t

1 Thierry Jourdain 2013-02-05 314.21

2 Laurette Bertin 2013-03-15 154.34

3 André Moreira 2013-08-26 255.47

4 Aurélie Moulin 2013-09-04 147.95

Ext r ai re le b udge t a u f or ma t I NT EG ER

27
Grâce à la fonction CAST() il est également possible de convertir un nombre à virgule en nombre
entier. La colonne “budget” est initialement de type FLOAT mais il est possible d’utiliser CAST pour
convertir son type en un INTEGER.
SELECT id, prenom, nom, date_ajout, CAST( budget AS SIGNED INTEGER ) AS budget_cast
FROM client
A savoir : cette requête fonctionne avec MySQL. Ce dernier doit spécifier si le type INTEGER doit
être signé ou non (SIGNED ou UNSIGNED). D’autres systèmes de gestion de base de données n’ont
pas nécessairement besoin de préciser cela.
Résultat :

id p re no m no m da t e _aj o ut bu dget _ ca s t

1 Thierry Jourdain 2013-02-05 14:11:09 314

2 Laurette Bertin 2013-03-15 15:06:45 154

3 André Moreira 2013-08-26 08:24:39 255

4 Aurélie Moulin 2013-09-04 11:36:17 148

• ISNULL()
Dans le langage SQL la fonction ISNULL() peut s’avérer utile pour traiter des résultats qui possèdent
des données nulles. Attention toutefois, cette fonction s’utilise différemment selon le système de
gestion de base de données :
 MySQL : la fonction ISNULL() prend un seul paramètre et permet de vérifier si une données
est nulle
 SQL Server : la fonction ISNULL() prend 2 paramètres et sert à afficher la valeur du 2ème
paramètre si le premier paramètre est null. Cette même fonctionnalité peut être effectuée par
d’autres systèmes de gestion de base de données d’une manière différente :
 MySQL : il faut utiliser la fonction IFNULL()
 PostgreSQL : il faut utiliser la fonction COALESCE()
 Oracle : il faut utiliser la fonction NVL()
Syntaxe
Fo nc ti on I SNUL L( ) de My SQ L

28
ISNULL(valeur)
Exemple
SELECT ISNULL(NULL); -- retourne 1
SELECT ISNULL(3*3); -- retourne 0
SELECT ISNULL(3/0); -- retourne 1

Fo nc ti on I SNUL L( ) de SQL Ser ver


ISNULL(valeur1,valeur2)
Si la première valeur est nulle, ce sera la valeur du 2ème paramètre qui sera utilisée.
Exemple
SELECT ISNULL(1,0); -- le résultat sera : 1
SELECT ISNULL(NULL,10); -- le résultat sera : 10
SELECT ISNULL(1/0,10); -- le résultat sera : 10
SELECT ISNULL(1/0,'oui'); -- le résulta sera : 'oui'

• GROUP_CONCAT()
Dans le langage SQL, la fonction GROUP_CONCAT() permet de regrouper les valeurs non nulles
d’un groupe en une chaîne de caractère. Cela est utile pour regrouper des résultats en une seule ligne
afin d’avoir autant de ligne qu’il y a de résultat dans ce groupe.
L’intérêt le plus flagrant de cette fonction consiste à concaténer les valeurs d’une colonne
correspondant à une jointure avec une autre table. De cette manière, il n’est pas forcément nécessaire
d’effectuer un traitement supplémentaire des résultats pour exploiter les valeurs.
Attention : la fonction GROUP_CONCAT() est actuellement disponible que pour MySQL. Les
autres Systèmes de Gestion de Base de Données (SGBD) tel que PostgreSQL, SQLite ou SQL Server
n’intègrent pas cette fonctionnalité.
Syntaxe
GROUP_CONCAT( `nom_colonne` )
Les valeurs de la colonne “nom_colonne” seront concaténées et séparées par défaut par une virgule.
Il est possible de choisir le caractère qui sert de séparateur en respectant la syntaxe suivante :
GROUP_CONCAT( `nom_colonne` SEPARATOR ' ' )
Dans cette seconde requête SQL, les valeurs seront séparées par un espace. Il est intéressant de savoir
que le séparateur peut être vide pour ne pas mettre de séparateur dans la concaténation.
Exemple

29
Imaginons un blog qui possède des articles et auxquels il est possible d’associer des mots-clés. Les
articles sont enregistrés dans la table “article” ont un titre, une date de création, une date de
publication et une catégorie. Les mots-clés sont ajoutés dans une table “mot_cle” et sont associés à
chaque article grâce à une clé étrangère (cf. il s’agit d’une “foreign key”).
Table “article” :

i d ti t re d at e _c rea ti o n d a te _p ubli ca ti on c a tegor ie

1 3 outils 2012-07-11 2012-07-18 information


informatiques à
connaître

2 Améliorer les 2013-04-03 2013-04-06 tutorial


performances
d'une application
web

3 Protection contre 2013-08-22 2013-08-29 tutorial


les failles de
sécurités

4 Astuces de codage 2013-11-24 2013-12-01 astuces


pour les gros
projets

5 Encrypter les 2013-12-02 2013-12-04 astuces


données d'une
application

Table “mot_cle” :

id ar ti cl e_ i d m ot da t e_c reat i on

1 1 MySQL 2012-07-18

2 1 PostgreSQL 2012-07-18

3 1 Excel 2012-07-18

4 3 Failles XSS 2013-08-28

30
id ar ti cl e_ i d m ot da t e_c reat i on

5 3 Attaque par force brute 2013-08-29

6 4 Pear 2013-12-01

7 4 Astuce 2013-12-01

Lister les catégories et concaténer les titres


Il est possible de lister toutes les catégories et d’utiliser la fonction GROUP_CONCAT() pour
afficher chacun des titres associés à ces catégories, séparés par une virgule. Il est donc possible
d’utiliser la requête SQL suivante :
SELECT `categorie`, GROUP_CONCAT(`titre`) AS concat_titre
FROM `article`
GROUP BY `categorie`
Résultats :

c ate go ri e co nca t_ t it re

information 3 outils informatiques à connaître

tutorial Améliorer les performances d'une application web,Protection


contre les failles de sécurités

astuces Astuces de codage pour les gros projets,Encrypter les données


d'une application

Le résultat de cette requête SQL démontre qu’il est possible d’utiliser la fonction
GROUP_CONCAT() pour regrouper dans une seule colonne tous les titres de chacune de ces
catégories.
Lister les articles et concaténer les mots-clés
Les articles peuvent être affichés tout en associant la liste des mots-clés de chacun de ces articles.
Pour cela, il est possible d’exécuter la requête suivante :
SELECT `titre`, `date_publication`, GROUP_CONCAT(`mot` SEPARATOR " ") AS concat_mot
FROM `article`
LEFT JOIN `mot_cle` ON `article_id` = `article`.`id`
GROUP BY `article`.`id`
Résultats :

31
t it re da te _p ubli ca ti on G ROUP_ CONC AT( mo t )

3 outils informatiques 2012-07-18 MySQL PostgreSQL Excel


à connaître

Améliorer les 2013-04-06 NULL


performances d'une
application web

Protection contre les 2013-08-29 Failles XSS Attaque par force


failles de sécurités brute

Astuces de codage 2013-12-01 Astuce Pear


pour les gros projets

Encrypter les données 2013-12-04 NULL


d'une application

Le résultat de cette requête permet d’obtenir en une seule requête les articles et les mots-clés qui sont
stockés dans une autre table. Grâce à la modification du séparateur, les mots-clés sont séparés par un
espace.
Erreurs courantes
1/ Att ent i on au sé pa ra te ur
Il convient de bien définir le séparateur et de vérifier que celui-ci ne va pas interférer avec le contenu
des colonnes. Par exemple, si le séparateur est une virgule et doit séparer des mots-clés, il convient
de s’assurer qu’aucun mot-clé ne contient de virgule. Le cas échéant, il ne sera pas possible de savoir
si la virgule est le séparateur ou s’il est inclus dans un mot.
2/ Att ent i on à l a l imi te de l o ngue ur
Dans l’hypothèse ou la requête contient de nombreux résultats, il convient de s’assurer que la limite
de longueur n’est pas dépassée. Il est possible de redéfinir cette longueur via le paramètre
“group_concat_max_len”. Voici une requête pour modifier cette longueur :
SET SESSION group_concat_max_len = 1000000;
3/ Att ent i on au mul t i ple G ROU P_ CONCAT( ) dans un e requê te S QL
Il convient de faire attention à des éventuels doublons dans les résultats lorsque plusieurs champs
GROUP_CONCAT() existent au sein d’une même requête SQL.

32
V. Les opérateurs de l’algèbre relationnelle

• UNION
La commande UNION de SQL permet de mettre bout-à-bout les résultats de plusieurs requêtes
utilisant elles-même la commande SELECT. C’est donc une commande qui permet de concaténer les
résultats de 2 requêtes ou plus. Pour l’utiliser il est nécessaire que chacune des requêtes à concaténer
retournes le même nombre de colonnes, avec les mêmes types de données et dans le même ordre.
A savoir : par défaut, les enregistrements exactement identiques ne seront pas répétés dans les
résultats. Pour effectuer une union dans laquelle même les lignes dupliquées sont affichées il faut
plutôt utiliser la commande UNION ALL.
Syntaxe
La syntaxe pour unir les résultats de 2 tableaux sans afficher les doublons est la suivante:
SELECT * FROM table1
UNION
SELECT * FROM table2
Schéma explicatif
L’union de 2 ensembles A et B est un concept qui consiste à obtenir tous les éléments qui
correspondent à la fois à l’ensemble A ou à l’ensemble B. Cela se résume très simplement par un
petit schéma où la zone en bleu correspond à la zone que l’on souhaite obtenir (dans notre cas : tous
les éléments).

Union de 2 ensembles
Exemple
Imaginons une entreprise qui possède plusieurs magasins et dans chacun de ces magasins il y a une
table qui liste les clients.
La table du magasin n°1 s’appelle “magasin1_client” et contient les données suivantes :

33
pr en om no m vi l le da t e_ na i s sanc e t ot a l _a cha t

Léon Dupuis Paris 1983-03-06 135

Marie Bernard Paris 1993-07-03 75

Sophie Dupond Marseille 1986-02-22 27

Marcel Martin Paris 1976-11-24 39

La table du magasin n°2 s’appelle “magasin2_client” et contient les données suivantes :

pr en om n om vi l le d at e _nai s sa nc e to ta l _a c ha t

Marion Leroy Lyon 1982-10-27 285

Paul Moreau Lyon 1976-04-19 133

Marie Bernard Paris 1993-07-03 75

Marcel Martin Paris 1976-11-24 39

Sachant que certains clients sont présents dans les 2 tables, pour éviter de retourner plusieurs fois les
mêmes enregistrement, il convient d’utiliser la requête UNION. La requête SQL est alors la suivante
:
SELECT * FROM magasin1_client
UNION
SELECT * FROM magasin2_client
Résultat :

pr en om no m vi l le da t e_ na i s sanc e t ot a l _a cha t

Léon Dupuis Paris 1983-03-06 135

Marie Bernard Paris 1993-07-03 75

Sophie Dupond Marseille 1986-02-22 27

Marcel Martin Paris 1976-11-24 39

Marie Leroy Lyon 1982-10-27 285

Paul Moreay Lyon 1976-04-19 133

34
Le résultat de cette requête montre bien que les enregistrements des 2 requêtes sont mis bout-à-bout
mais sans inclure plusieurs fois les mêmes lignes.

• UNION ALL
La commande UNION ALL de SQL est très similaire à la commande UNION. Elle permet de
concaténer les enregistrements de plusieurs requêtes, à la seule différence que cette commande
permet d’inclure tous les enregistrements, même les doublons. Ainsi, si un même enregistrement est
présents normalement dans les résultats des 2 requêtes concaténées, alors l’union des 2 avec UNION
ALL retournera 2 fois ce même résultat.
A savoir : tout comme la commande UNION, il convient que les 2 requêtes retournes exactement le
même nombre de colonnes, avec les mêmes types de données et dans le même ordre.
Syntaxe
La syntaxe de la requête SQL pour unir les résultats des 2 tables est la suivante:
SELECT * FROM table1
UNION ALL
SELECT * FROM table2
Exemple
Imaginons une entreprise qui possède des bases de données dans chacun de ces magasins. Sur ces
bases de données il y a une table de la liste des clients avec quelques informations et le total des
achats dans l’entreprise.
La table “magasin1_client” correspond au premier magasin :

pr en om no m vi l le da t e_ na i s sanc e t ot a l _a cha t

Léon Dupuis Paris 1983-03-06 135

Marie Bernard Paris 1993-07-03 75

Sophie Dupond Marseille 1986-02-22 27

Marcel Martin Paris 1976-11-24 39

La table “magasin2_client” correspond au deuxième magasin :

pr en om n om vi l le d at e _nai s sa nc e to ta l _a c ha t

Marion Leroy Lyon 1982-10-27 285

Paul Moreau Lyon 1976-04-19 133

35
pr en om n om vi l le d at e _nai s sa nc e to ta l _a c ha t

Marie Bernard Paris 1993-07-03 75

Marcel Martin Paris 1976-11-24 39

Pour concaténer tous les enregistrements de ces tables, il est possible d’effectuer une seule requête
utilisant la commande UNION ALL, comme l’exemple ci-dessous :
SELECT * FROM magasin1_client
UNION ALL
SELECT * FROM magasin2_client
Résultat :

pr en om no m vi l le da t e_ na i s sanc e t ot a l _a cha t

Léon Dupuis Paris 1983-03-06 135

Marie Bernard Paris 1993-07-03 75

Sophie Dupond Marseille 1986-02-22 27

Marcel Martin Paris 1976-11-24 39

Marion Leroy Lyon 1982-10-27 285

Paul Moreau Lyon 1976-04-19 133

Marie Bernard Paris 1993-07-03 75

Marcel Martin Paris 1976-11-24 39

Le résultat de cette requête montre qu’il y a autant d’enregistrement que dans les 2 tables réunis. A
savoir, il y a quelques clients qui étaient présents dans les 2 tables d’origines en conséquent ils sont
présent 2 fois dans le résultat de cette requête SQL.

• INTERSECT
La commande SQL INTERSECT permet d’obtenir l’intersection des résultats de 2 requêtes. Cette
commande permet donc de récupérer les enregistrements communs à 2 requêtes. Cela peut s’avérer
utile lorsqu’il faut trouver s’il y a des données similaires sur 2 tables distinctes.
A savoir : pour l’utiliser convenablement il faut que les 2 requêtes retourne le même nombre de
colonnes, avec les mêmes types et dans le même ordre.

36
Compatibilité : PostgreSQL, SQL Server, Oracle et SQLite. Pas disponible sous MySQL, mais il
existe une alternative.
Syntaxe
La syntaxe à adopter pour utiliser cette commande est la suivante :
SELECT * FROM `table1`
INTERSECT
SELECT * FROM `table2`
Dans cet exemple, il faut que les 2 tables soient similaires (mêmes colonnes, mêmes types et même
ordre). Le résultat correspondra aux enregistrements qui existent dans table1 et dans table2.
Schéma explicatif
L’intersection de 2 ensembles A et B correspond aux éléments qui sont présent dans A et dans B, et
seulement ceux-là. Cela peut être représenté par un schéma explicatif simple ou l’intersection de A et
B correspond à la zone en bleu.

Intersection de 2 ensembles
Exemple
Prenons l’exemple de 2 magasins qui appartiennent au même groupe. Chaque magasin possède sa
table de clients.
La table du magasin n°1 est “magasin1_client” :

p re nom n om vil l e d at e _nai s sa nc e t ot al _ac hat

Léon Dupuis Paris 1983-03-06 135

Marie Bernard Paris 1993-07-03 75

Sophie Dupond Marseille 1986-02-22 27

Marcel Martin Paris 1976-11-24 39

La table du magasin n°2 est “magasin2_client” :

37
pr en om n om vi l le d at e _nai s sa nc e to ta l _a c ha t

Marion Leroy Lyon 1982-10-27 285

Paul Moreau Lyon 1976-04-19 133

Marie Bernard Paris 1993-07-03 75

Marcel Martin Paris 1976-11-24 39

Pour obtenir la liste des clients qui sont présents de façon identiques dans ces 2 tables, il est possible
d’utiliser la commande INTERSECT de la façon suivante:
SELECT * FROM `magasin1_client`
INTERSECT
SELECT * FROM `magasin2_client`
Résultat :

no m pr en om vi ll e da t e_ na i s sa nc e t ot a l _a cha t

Marie Bernard Paris 1993-07-03 75

Marcel Martin Paris 1976-11-24 39

Le résultat présente 2 enregistrements, il s’agit des clients qui sont à la fois dans la table
“magasin1_client” et dans la table “magasin2_client”. Sur certains systèmes une telle requête permet
de déceler des erreurs et d’enregistrer seulement à un seul endroit la même information.
Alternative pour MySQL
MySQL ne propose malheureusement pas cette commande SQL, heureusement le fonctionnement de
cette requête peut-être simulé grâce à une petite astuce. La requête SQL ci-dessous est l’alternative à
INTERSECT :
SELECT DISTINCT value FROM `table1`
WHERE value IN (
SELECT value
FROM `table2`
);
A noter : la colonne “value” est à remplacer par la colonne de votre choix. La commande DISTINCT
n’est pas obligatoire, mais est la plupart du temps utile pour éviter d’afficher plusieurs fois les mêmes
valeurs.

38
• EXCEPT / MINUS
Dans le langage SQL la commande EXCEPT s’utilise entre 2 instructions pour récupérer les
enregistrements de la première instruction sans inclure les résultats de la seconde requête. Si un
même enregistrement devait être présent dans les résultats des 2 syntaxes, ils ne seront pas présent
dans le résultat final.
A savoir : cette commande s’appelle différemment selon les Systèmes de Gestion de Base de
Données (SGBD) :
 EXCEPT : PostgreSQL
 MINUS : MySQL et Oracle
Dès lors, il faut remplacer tout le reste de ce cours par MINUS pour les SGBD correspondants.
Syntaxe
La syntaxe d’une requête SQL est toute simple :
SELECT * FROM table1
EXCEPT | MINUS
SELECT * FROM table2
Cette requête permet de lister les résultats du table 1 sans inclure les enregistrements de la table 1 qui
sont aussi dans la table 2.
Attention : les colonnes de la première requête doivent être similaires entre la première et la
deuxième requête (même nombre, même type et même ordre).
Schéma explicatif
Cette commande permet de récupérer les éléments de l’ensemble A sans prendre en compte les
éléments de A qui sont aussi présent dans l’ensemble B. Dans le schéma ci-dessous seule la zone
bleu sera retournée grâce à la commande EXCEPT (ou MINUS).

Sélection d’un ensemble avec exception


Exemple
Imaginons un système informatique d’une entreprise. Ce système contient 2 tables contenant des
listes de clients:

39
 Une table “clients_inscrits” qui contient les prénoms, noms et date d’inscription de clients
 Une table “clients_refus_email” qui contient les informations des clients qui ne souhaitent pas
être contacté par email
Cet exemple aura pour objectif de sélectionner les utilisateurs pour envoyer un email d’information.
Les utilisateurs de la deuxième table ne devront pas apparaître dans les résultats.
Table “clients_inscrits” :

id p re no m no m da t e_i ns c ri pti on

1 Lionel Martineau 2012-11-14

2 Paul Cornu 2012-12-15

3 Sarah Schmitt 2012-12-17

4 Sabine Lenoir 2012-12-18

Table “clients_refus_email” :

id pr en om no m d at e _ref us

1 Paul Cornu 2013-01-27

2 Manuel Guillot 2013-01-27

3 Sabine Lenoir 2013-01-29

4 Natalie Petitjean 2013-02-03

Pour pouvoir sélectionner uniquement le prénom et le nom des utilisateurs qui accepte de recevoir
des emails informatifs. La requête SQL à utiliser est la suivante :
SELECT prenom, nom FROM clients_inscrits
EXCEPT
SELECT prenom, nom FROM clients_refus_email
Résultats :

pr en om no m

Lionel Martineau

Sarah Schmitt

40
Ce tableau de résultats montre bien les utilisateurs qui sont dans inscrits et qui ne sont pas présent
dans le deuxième tableau. Par ailleurs, les résultats du deuxième tableau ne sont pas présent sur ce
résultat final.
• ON DUPLICATE KEY UPDATE
L’instruction ON DUPLICATE KEY UPDATE est une fonctionnalité de MySQL qui permet de
mettre à jour des données lorsqu’un enregistrement existe déjà dans une table. Cela permet d’avoir
qu’une seule requête SQL pour effectuer selon la convenance un INSERT ou un UPDATE.
Syntaxe
Cette commande s’effectue au sein de la requête INSERT INTO avec la syntaxe suivante:
INSERT INTO table (a, b, c)
VALUES (1, 20, 68)
ON DUPLICATE KEY UPDATE a=a+1
A noter : cette requête se traduit comme suit :
1. Insérer les données a, b et c avec les données respectives de 1, 20 et 68
2. Si la clé primaire existe déjà pour ces valeurs alors seulement faire une mise à jour de a = a+1
Exemple avec la commande WHERE
Grâce à la commande “ON DUPLICATE KEY” Il est possible d’enregistrer la date à laquelle la
donnée est insérée pour la première fois et la date de dernière mise à jour, comme le montre la
commande ci-dessous:
INSERT INTO table (a, b, c, date_insert)
VALUES (1, 20, 1, NOW())
ON DUPLICATE KEY UPDATE date_update=NOW
WHERE c=1
A noter : cette requête se traduit comme suit :
1. insérer les données a, b, c et date_insert, avec les données respectives de 1, 20, 1 ainsi que la
date et l’heure actuelle
2. Si la clé primaire existe déjà pour ces valeurs alors mettre a jour la date et l’heure du champ
“date_update”
3. Effectuer la mise à jour uniquement sur les champs où c = 1
Exemple
Imaginons une application qui laisse les utilisateurs voter pour les produits qu’ils préfèrent. Le
système de vote est très simple et est basé sur des +1. La table des votes contient le nombre de votes
par produits avec la date du premier vote et la date du dernier vote.
Table vote :

41
i d pro du it _i d vo t e_ co un t vo te _f i rs t _d at e vo te _ la s t _dat e

1 46 2 2012-04-25 2013-02-16
17:45:24 09:47:02

2 39 4 2012-04-28 2013-02-14
16:54:44 21:04:35

3 49 1 2012-04-25 2013-01-06
19:11:09 20:32:57

Pour n’utiliser qu’une seule ligne qui permet d’ajouter des votes dans cette table, sans se préoccuper
de savoir s’il faut faire un INSERT ou un UPDATE, il est possible d’utiliser la requête SQL suivante:
INSERT INTO vote (produit_id, vote_count, vote_first_date, vote_last_date)
VALUES (50, 1, NOW(), NOW())
ON DUPLICATE KEY UPDATE vote_count = vote_count+1, vote_last_date = NOW()
Dans cette requête la date et l’heure est générée automatiquement avec la fonction NOW().
Résultat après la première exécution de la requête:

i d pro du it _i d vo t e_ co un t vo te _f i rs t _d at e vo te _ la s t _dat e

1 46 2 2012-04-25 2013-02-16
17:45:24 09:47:02

2 39 4 2012-04-28 2013-02-14
16:54:44 21:04:35

3 49 1 2012-04-25 2013-01-06
19:11:09 20:32:57

4 55 1 2013-04-02 2013-04-02
15:06:34 15:06:34

Ce résultat montre bien l’ajout d’une ligne en fin de table, donc la requête a été utilisé sous la forme
d’un INSERT. Après une deuxième exécution de cette même requête le lendemain, les données
seront celles-ci:

i d pro du it _i d vo t e_ co un t vo te _f i rs t _d at e vo te _ la s t _dat e

1 46 2 2012-04-25 2013-02-16
17:45:24 09:47:02

42
i d pro du it _i d vo t e_ co un t vo te _f i rs t _d at e vo te _ la s t _dat e

2 39 4 2012-04-28 2013-02-14
16:54:44 21:04:35

3 49 1 2012-04-25 2013-01-06
19:11:09 20:32:57

4 55 2 2013-04-02 2013-04-03
15:06:34 08:14:57

Ces résultats montre bien qu’il y a eu un vote supplémentaire et que la date du dernier vote a été mis
à jour.
Insérer une ligne ou ne rien faire
Dans certains cas il est intéressant d’utiliser un INSERT mais de ne rien faire si la commande a déjà
été insérée précédemment. Malheureusement, si la clé primaire existe déjà la requête retournera une
erreur. Et s’il n’y a rien à mettre à jour, la commande ON DUPLICATE KEY UPDATE (ODKU) ne
semble pas convenir. Toutefois il y a une astuce qui consiste à utiliser une requête de ce type:
INSERT INTO table (a, b, c)
VALUES (1, 45, 6)
ON DUPLICATE KEY UPDATE id = id
Cette requête insert les données et ne produit aucune erreur si l’enregistrement existait déjà dans la
table.
A savoir : théoriquement il aurait été possible d’utiliser INSERT IGNORE mais malheureusement
cela empêche de retourner des erreurs telles que des erreurs de conversions de données.
Compatibilité
Pour le moment cette fonctionnalité n’est possible qu’avec MySQL depuis la version 4.1 (date de
2003). Les autres Systèmes de Gestion de Bases de Données (SGBD) n’intègrent pas cette
fonctionnalité. Pour simuler cette fonctionnalité il y a quelques alternatives:
 PostgreSQL : il y a une astuce en utilisant une fonction. L’astuce est expliquée dans la
documentation officielle : fonction INSERT/UPDATE.
 Oracle : il est possible d’utiliser la commande MERGE pour effectuer la même chose.
 SQL Server : il est possible d’utiliser une procédure.

• MERGE

43
Dans le langage SQL, la commande MERGE permet d’insérer ou de mettre à jour des données dans
une table. Cette commande permet d’éviter d’effectuer plusieurs requêtes pour savoir si une donnée
est déjà dans la base de données et ainsi adapter l’utilisation d’une requête pour ajouter ou une autre
pour modifier la donnée existante. Cette commande peut aussi s’appeler “upsert”.
Attention : bien que l’instruction a été ajoutée dans le standard SQL:2003, les différentes SGBD
n’utilisent pas toutes les mêmes méthodes pour effectuer un upsert.
Syntaxe
La syntaxe standard pour effectuer un merge consiste à utiliser une requête SQL semblable à celle ci-
dessous :
MERGE INTO table1
USING table_reference
ON (conditions)
WHEN MATCHED THEN
UPDATE SET table1.colonne1 = valeur1, table1.colonne2 = valeur2
DELETE WHERE conditions2
WHEN NOT MATCHED THEN
INSERT (colonnes1, colonne3)
VALUES (valeur1, valeur3)
Voici les explications détaillées de cette requête :
1. MERGE INTO permet de sélectionner la table à modifier
2. USING et ON permet de lister les données sources et la condition de correspondance
3. WHEN MATCHED permet de définir la condition de mise à jour lorsque la condition est
vérifiée
4. WHEN NOT MATCHED permet de définir la condition d’insertion lorsque la condition n’est
pas vérifiée
Compatibilité
Les systèmes de gestion de bases de données peuvent implémenter cette fonctionnalité soit de façon
standard, en utilisant une commande synonyme ou en utilisant une syntaxe non standard.
 Syntaxe standard : SQL Server, Oracle, DB2, Teradata et EXASOL
 Utilisation du terme UPSERT : Microsoft SQL Azure et MongoDB
 Utilisation non standard : MySQL, SQLite, Firebird, IBM DB2 et Microsoft SQL

• TRUNCATE TABLE

44
En SQL, la commande TRUNCATE permet de supprimer toutes les données d’une table sans
supprimer la table en elle-même. En d’autres mots, cela permet de purger la table. Cette instruction
diffère de la commande DROP qui a pour but de supprimer les données ainsi que la table qui les
contient.
A noter : l’instruction TRUNCATE est semblable à l’instruction DELETE sans utilisation de
WHERE. Parmi les petites différences TRUNCATE est toutefois plus rapide et utilise moins de
ressources. Ces gains en performance se justifie notamment parce que la requête n’indiquera pas le
nombre d’enregistrement supprimés et qu’il n’y aura pas d’enregistrement des modifications dans le
journal.
Syntaxe
Cette instruction s’utilise dans une requête SQL semblable à celle-ci :
TRUNCATE TABLE table
Dans cet exemple, les données de la table “table” seront perdues une fois cette requête exécutée.
Exemple
Pour montrer un exemple concret de l’utilisation de cette commande, nous pouvons imaginez un
système informatique contenant la liste des fournitures d’une entreprise. Ces données seraient tout
simplement stockées dans une table “fourniture”.
Table “fourniture” :

id n om d at e _aj out

1 Ordinateur 2013-04-05

2 Chaise 2013-04-14

3 Bureau 2013-07-18

4 Lampe 2013-09-27

Il est possible de supprimer toutes les données de cette table en utilisant la requête suivante :
TRUNCATE TABLE `fourniture`
Une fois la requête exécutée, la table ne contiendra plus aucun enregistrement. En d’autres mots,
toutes les lignes du tableau présenté ci-dessus auront été supprimées.
Différence entre TRUNCATE et DELETE
La commande TRUNCATE s’avère être similaire à la commande DELETE, lorsqu’elle est utilisée de
la façon suivante :
DELETE FROM `fourniture`

45
Il y a toutefois une différence notable : la commande TRUNCATE va ré-initialiser la valeur de
l’auto-incrément, s’il y en a un.
Dès lors, il faut potentiellement noter la valeur de l’auto-incrément avant de faire un TRUNCATE,
surtout s’il faut ré-indiquer l’ancienne valeur après avoir écrasé toutes les données.

VI. Les jointures

• INNER JOIN
Dans le langage SQL la commande INNER JOIN, aussi appelée EQUIJOIN, est un type de jointures
très communes pour lier plusieurs tables entre-elles. Cette commande retourne les enregistrements
lorsqu’il y a au moins une ligne dans chaque colonne qui correspond à la condition.

Intersection de 2 ensembles
Syntaxe
Pour utiliser ce type de jointure il convient d’utiliser une requête SQL avec cette syntaxe :
SELECT *
FROM table1
INNER JOIN table2 ON table1.id = table2.fk_id
La syntaxe ci-dessus stipule qu’il faut sélectionner les enregistrements des
tables table1 et table2 lorsque les données de la colonne “id” de table1 est égal aux données de la
colonne fk_id de table2.
La jointure SQL peut aussi être écrite de la façon suivante :
SELECT *
FROM table1
INNER JOIN table2
WHERE table1.id = table2.fk_id
La syntaxe avec la condition WHERE est une manière alternative de faire la jointure mais qui
possède l’inconvénient d’être moins facile à lire s’il y a déjà plusieurs conditions dans le WHERE.

46
Exemple
Imaginons une application qui possède une table utilisateur ainsi qu’une table commande qui
contient toutes les commandes effectuées par les utilisateurs.
Table utilisateur :

id pr e nom no m e m ail vi ll e

1 Aimée Marechal aime.marechal@example.com Paris

2 Esmée Lefort esmee.lefort@example.com Lyon

3 Marine Prevost m.prevost@example.com Lille

4 Luc Rolland lucrolland@example.com Marseille

Table commande :

ut i li sa t eu r_ id d at e _ac ha t n um _f ac t ure pri x _t ot al

1 2013-01-23 A00103 203.14

1 2013-02-14 A00104 124.00

2 2013-02-17 A00105 149.45

2 2013-02-21 A00106 235.35

5 2013-03-02 A00107 47.58

Pour afficher toutes les commandes associées aux utilisateurs, il est possible d’utiliser la requête
suivante :
SELECT id, prenom, nom, date_achat, num_facture, prix_total
FROM utilisateur
INNER JOIN commande ON utilisateur.id = commande.utilisateur_id
Résultats :

i d pre n om no m da t e_ach at n um _f a ct ure p ri x_ to ta l

1 Aimée Marechal 2013-01-23 A00103 203.14

1 Aimée Marechal 2013-02-14 A00104 124.00

2 Esmée Lefort 2013-02-17 A00105 149.45

2 Esmée Lefort 2013-02-21 A00106 235.35

47
Le résultat de la requête montre parfaite la jointure entre les 2 tables. Les utilisateurs 3 et 4 ne sont
pas affichés puisqu’il n’y a pas de commandes associés à ces utilisateurs.
Attention : il est important de noter que si un utilisateur à été supprimé, alors on ne verra pas ses
commandes dans la liste puisque INNER JOIN retourne uniquement les résultats ou la condition est
vrai dans les 2 tables.

• CROSS JOIN (ou le produit cartésien de l’algèbre relationnelle)


Dans le langage SQL, la commande CROSS JOIN est un type de jointure sur 2 tables SQL qui
permet de retourner le produit cartésien. Autrement dit, cela permet de retourner chaque ligne d’une
table avec chaque ligne d’une autre table. Ainsi effectuer le produit cartésien d’une table A qui
contient 30 résultats avec une table B de 40 résultats va produire 1200 résultats (30 x 40 = 1200). En
général la commande CROSS JOIN est combinée avec la commande WHERE pour filtrer les
résultats qui respectent certaines conditions.
Attention, le nombre de résultat peut facilement être très élevé. S’il est effectué sur des tables avec
beaucoup d’enregistrements, cela peut ralentir sensiblement le serveur.
Syntaxe
Pour effectuer une jointure avec CROSS JOIN, il convient d’effectuer une requête SQL respectant la
syntaxe suivante:
SELECT *
FROM table1
CROSS JOIN table2
Méthode alternative pour retourner les mêmes résultats :
SELECT *
FROM table1, table2
L’une ou l’autre de ces syntaxes permettent d’associer tous les résultats de table1 avec chacun des
résultats de table2.
Exemple
Imaginons une application de recettes de cuisines qui contient 2 tables d’ingrédients, la
table legume et la table fruit.
Table legume :

l _i d l_ nom _ f r_ f r l _no m_ e n_gb

45 Carotte Carott

48
l _i d l_ nom _ f r_ f r l _no m_ e n_gb

46 Oignon Onion

47 Poireau Leek

Table fruit :

f _ id f _no m_f r _f r f _n om _e n _gb

87 Banane Banana

88 Kiwi Kiwi

89 Poire Pear

Pour une raison quelconque l’application doit associer tous les légumes avec tous les fruits. Toutes
les combinaisons doivent être affichées. Pour cela il convient d’effectuer l’une ou l’autre des requêtes
suivantes:
SELECT l_id, l_nom_fr_fr, f_id, f_nom_fr_fr
FROM legume
CROSS JOIN fruit
ou :
SELECT l_id, l_nom_fr_fr, f_id, f_nom_fr_fr
FROM legume, fruit
Résultats :

l _i d l _no m _f r _f r f_id f _n om _f r_ f r

45 Carotte 87 Banane

45 Carotte 88 Kiwi

45 Carotte 89 Poire

46 Oignon 87 Banane

46 Oignon 88 Kiwi

46 Oignon 89 Poire

47 Poireau 87 Banane

47 Poireau 88 Kiwi

49
l _i d l _no m _f r _f r f_id f _n om _f r_ f r

47 Poireau 89 Poire

Le résultat montre bien que chaque légume est associé à chaque fruit. Avec 3 fruits et 3 légumes, il y
a donc 9 lignes de résultats (3 x3 = 9).
• LEFT JOIN
Dans le langage SQL, la commande LEFT JOIN (aussi appelée LEFT OUTER JOIN) est un type de
jointure entre 2 tables. Cela permet de lister tous les résultats de la table de gauche (left = gauche)
même s’il n’y a pas de correspondance dans la deuxième table.
Syntaxe
Pour lister les enregistrement de table1, même s’il n’y a pas de correspondance avec table2, il
convient d’effectuer une requête SQL utilisant la syntaxe suivante.
SELECT *
FROM table1
LEFT JOIN table2 ON table1.id = table2.fk_id
La requête peut aussi s’écrire de la façon suivante :
SELECT *
FROM table1
LEFT OUTER JOIN table2 ON table1.id = table2.fk_id
Cette requête est particulièrement intéressante pour récupérer les informations de table1 tout en
récupérant les données associées, même s’il n’y a pas de correspondance avec table2. A savoir, s’il
n’y a pas de correspondance les colonnes de table2 vaudront toutes NULL.
Exemple
Imaginons une application contenant des utilisateurs et des commandes pour chacun de ces
utilisateurs. La base de données de cette application contient une table pour les utilisateurs et
sauvegarde leurs achats dans une seconde table. Les 2 tables sont reliées grâce à la
colonne utilisateur_id de la table des commandes. Cela permet d’associer une commande à un
utilisateur.
Table utilisateur :

id pr e nom no m e m ail vi ll e

1 Aimée Marechal aime.marechal@example.com Paris

2 Esmée Lefort esmee.lefort@example.com Lyon

50
id pr e nom no m e m ail vi ll e

3 Marine Prevost m.prevost@example.com Lille

4 Luc Rolland lucrolland@example.com Marseille

Table commande :

ut i li sa t eu r_ id d at e _ac ha t n um _f ac t ure pri x _t ot al

1 2013-01-23 A00103 203.14

1 2013-02-14 A00104 124.00

2 2013-02-17 A00105 149.45

2 2013-02-21 A00106 235.35

5 2013-03-02 A00107 47.58

Pour lister tous les utilisateurs avec leurs commandes et afficher également les utilisateurs qui n’ont
pas effectuée d’achats, il est possible d’utiliser la requête suivante:
SELECT *
FROM utilisateur
LEFT JOIN commande ON utilisateur.id = commande.utilisateur_id
Résultats :

i d pre n om no m da t e_ach at n um _f a ct ure p ri x_ to ta l

1 Aimée Marechal 2013-01-23 A00103 203.14

1 Aimée Marechal 2013-02-14 A00104 124.00

2 Esmée Lefort 2013-02-17 A00105 149.45

2 Esmée Lefort 2013-02-21 A00106 235.35

3 Marine Prevost NULL NULL NULL

4 Luc Rolland NULL NULL NULL

Les dernières lignes montrent des utilisateurs qui n’ont effectuée aucune commande. La ligne
retourne la valeur NULL pour les colonnes concernant les achats qu’ils n’ont pas effectués.
Filtrer sur la valeur NULL

51
Attention, la valeur NULL n’est pas une chaîne de caractère. Pour filtrer sur ces caractères il faut
utiliser la commande IS NULL. Par exemple, pour lister les utilisateurs qui n’ont pas effectués
d’achats il est possible d’utiliser la requête suivante.
SELECT id, prenom, nom, utilisateur_id
FROM utilisateur
LEFT JOIN commande ON utilisateur.id = commande.utilisateur_id
WHERE utilisateur_id IS NULL
Résultats :

id p re no m no m u ti l i sat e ur _i d

3 Marine Prevost NULL

4 Luc Rolland NULL

• RIGHT JOIN
En SQL, la commande RIGHT JOIN (ou RIGHT OUTER JOIN) est un type de jointure entre 2
tables qui permet de retourner tous les enregistrements de la table de droite (right = droite) même s’il
n’y a pas de correspondance avec la table de gauche. S’il y a un enregistrement de la table de droite
qui ne trouve pas de correspondance dans la table de gauche, alors les colonnes de la table de gauche
auront NULL pour valeur.
Syntaxe
L’utilisation de cette commande SQL s’effectue de la façon suivante:
SELECT *
FROM table1
RIGHT JOIN table2 ON table1.id = table2.fk_id
La syntaxe de cette requête SQL peux aussi s’écrire de la façon suivante :
SELECT *
FROM table1
RIGHT OUTER JOIN table2 ON table1.id = table2.fk_id
Cette syntaxe stipule qu’il faut lister toutes les lignes du tableau table2 (tableau de droite) et afficher
les données associées du tableau table1 s’il y a une correspondance
entre ID de table1 et FK_ID de table2. S’il n’y a pas de correspondance, l’enregistrement
de table2 sera affiché et les colonnes de table1 vaudront toutes NULL.
Exemple

52
Prenons l’exemple d’une base de données qui contient des utilisateurs et un historique d’achat de ces
utilisateurs. Cette 2 tables sont reliées entre grâce à la colonne utilisateur_id de la table des
commandes. Cela permet de savoir à quel utilisateur est associé un achat.
Table utilisateur :

i d p re nom no m em ail vi ll e a cti f

1 Aimée Marechal aime.marechal@example.com Paris 1

2 Esmée Lefort esmee.lefort@example.com Lyon 0

3 Marine Prevost m.prevost@example.com Lille 1

4 Luc Rolland lucrolland@example.com Marseille 1

Table commande :

ut i li sa t eu r_ id d at e _ac ha t n um _f ac t ure pri x _t ot al

1 2013-01-23 A00103 203.14

1 2013-02-14 A00104 124.00

2 2013-02-17 A00105 149.45

3 2013-02-21 A00106 235.35

5 2013-03-02 A00107 47.58

Pour afficher toutes les commandes avec le nom de l’utilisateur correspondant il est normalement
d’habitude d’utiliser INNER JOIN en SQL. Malheureusement, si l’utilisateur a été supprimé de la
table, alors ça ne retourne pas l’achat. L’utilisation de RIGHT JOIN permet de retourner tous les
achats et d’afficher le nom de l’utilisateur s’il existe. Pour cela il convient d’utiliser cette requête:
SELECT id, prenom, nom, utilisateur_id, date_achat, num_facture
FROM utilisateur
RIGHT JOIN commande ON utilisateur.id = commande.utilisateur_id
Résultats :

id pr e nom nom u ti l is at e ur _i d da te _ac ha t num _f a ct ure

1 Aimée Marechal 1 2013-01-23 A00103

1 Aimée Marechal 1 2013-02-14 A00104

53
id p re no m no m ut i li sa t eu r_i d d at e _ac ha t n um _f ac t ure

2 Esmée Lefort 2 2013-02-17 A00105

3 Marine Prevost 3 2013-02-21 A00106

NULL NULL NULL 5 2013-03-02 A00107

Ce résultat montre que la facture A00107 est liée à l’utilisateur numéro 5. Or, cet utilisateur n’existe
pas ou n’existe plus. Grâce à RIGHT JOIN, l’achat est tout de même affiché mais les informations
liées à l’utilisateur sont remplacé par NULL.

• FULL JOIN
Dans le langage SQL, la commande FULL JOIN (ou FULL OUTER JOIN) permet de faire une
jointure entre 2 tables. L’utilisation de cette commande permet de combiner les résultats des 2 tables,
les associer entre eux grâce à une condition et remplir avec des valeurs NULL si la condition n’est
pas respectée.

Union de 2 ensembles
Syntaxe
SELECT *
FROM table1
FULL JOIN table2 ON table1.id = table2.fk_id
Cette requête peut aussi être conçu de cette façon :
SELECT *
FROM table1
FULL OUTER JOIN table2 ON table1.id = table2.fk_id
La condition présentée ici consiste à lier les tables sur un identifiant, mais la condition peut être
définie sur d’autres champs.
Exemple

54
Prenons l’exemple d’une base de données qui contient une table utilisateur ainsi qu’une
table commande qui contient toutes les ventes.
Table utilisateur :

i d p re nom no m em ail vi ll e a cti f

1 Aimée Marechal aime.marechal@example.com Paris 1

2 Esmée Lefort esmee.lefort@example.com Lyon 0

3 Marine Prevost m.prevost@example.com Lille 1

4 Luc Rolland lucrolland@example.com Marseille 1

Table commande :

ut i li sa t eu r_ id d at e _ac ha t n um _f ac t ure pri x _t ot al

1 2013-01-23 A00103 203.14

1 2013-02-14 A00104 124.00

2 2013-02-17 A00105 149.45

3 2013-02-21 A00106 235.35

5 2013-03-02 A00107 47.58

Il est possible d’utiliser FULL JOIN pour lister tous les utilisateurs ayant effectué ou non une vente,
et de lister toutes les ventes qui sont associées ou non à un utilisateur. La requête SQL est la suivante
:
SELECT id, prenom, nom, utilisateur_id, date_achat, num_facture
FROM utilisateur
FULL JOIN commande ON utilisateur.id = commande.utilisateur_id
Résultat :

id pr e nom nom u ti l is at e ur _i d da te _ac ha t num _f a ct ure

1 Aimée Marechal 1 2013-01-23 A00103

1 Aimée Marechal 1 2013-02-14 A00104

2 Esmée Lefort 2 2013-02-17 A00105

3 Marine Prevost 3 2013-02-21 A00106

55
id pr e nom nom u ti l is at e ur _i d da te _ac ha t num _f a ct ure

4 Luc Rolland NULL NULL NULL

NULL NULL NULL 5 2013-03-02 A00107

Ce résultat affiche bien l’utilisateur numéro 4 qui n’a effectué aucun achat. Le résultat retourne
également la facture A00107 qui est associée à un utilisateur qui n’existe pas (ou qui n’existe plus).
Dans les cas où il n’y a pas de correspondance avec l’autre table, les valeurs des colonnes valent
NULL.

• SELF JOIN
En SQL, un SELF JOIN correspond à une jointure d’une table avec elle-même. Ce type de requête
n’est pas si commun mais très pratique dans le cas où une table lie des informations avec des
enregistrements de la même table.
Syntaxe
Pour effectuer un SELF JOIN, la syntaxe de la requête SQL est la suivante:
SELECT `t1`.`nom_colonne1`, `t1`.`nom_colonne2`, `t2`.`nom_colonne1`, `t2`.`nom_colonne2`
FROM `table` as `t1`
LEFT OUTER JOIN `table` as `t2` ON `t2`.`fk_id` = `t1`.`id`
Ici la jointure est effectuée avec un LEFT JOIN, mais il est aussi possible de l’effectuer avec d’autres
types de jointures.
Exemple
Un exemple potentiel pourrait être une application d’un intranet d’entreprise qui possède la table des
employés avec la hiérarchie entre eux. Les employés peuvent être dirigé par un supérieur direct qui se
trouve lui-même dans la table.
Table utilisateur :

id pr en om n om em ai l m a na ge r_ id

1 Sebastien Martin s.martin@example.com NULL

2 Gustave Dubois g.dubois@example.com NULL

3 Georgette Leroy g.leroy@example.com 1

4 Gregory Roux g.roux@example.com 2

56
Les enregistrements de la table ci-dessus montre bien des employés. Les premiers employés n’ont pas
de supérieur, tandis que les employés n°3 et n°4 ont respectivement pour supérieur l’employé n°1 et
l’employé n°2.
Il est possible de lister sur une même ligne les employés avec leurs supérieurs direct, grâce à une
requête telle que celle-ci:
SELECT `u1`.`u_id`, `u1`.`u_nom`, `u2`.`u_id`, `u2`.`u_nom`
FROM `utilisateur` as `u1`
LEFT OUTER JOIN `utilisateur` as `u2` ON `u2`.`u_manager_id` = `u1`.`u_id`
Résultat :

u1 _i u1 _p re no u1_ no u1_ m an ager _ u2 _pr e no u 2_ no


d m m u1 _e mai l id m m

1 Sebastien Martin s.martin@example.co NULL NULL NULL


m

2 Gustave Dubois g.dubois@example.c NULL NULL NULL


om

3 Georgette Leroy g.leroy@example.co 1 Sebastien Martin


m

4 Gregory Roux g.roux@example.com 2 Gustave Dubois

• NATURAL JOIN
Dans le langage SQL, la commande NATURAL JOIN permet de faire une jointure naturelle entre 2
tables. Cette jointure s’effectue à la condition qu’il y ait des colonnes du même nom et de même type
dans les 2 tables. Le résultat d’une jointure naturelle est la création d’un tableau avec autant de lignes
qu’il y a de paires correspondant à l’association des colonnes de même nom.
A noter : puisqu’il faut le même nom de colonne sur les 2 tables, cela empêche d’utiliser certaines
règles de nommages pour le nom des colonnes. Il n’est par exemple pas possible de préfixer le nom
des colonnes sous peine d’avoir malheureusement 2 nom de colonnes différents.
Syntaxe
La jointure naturelle de 2 tables peut s’effectuer facilement, comme le montre la requête SQL
suivante :
SELECT *

57
FROM table1
NATURAL JOIN table2
L’avantage d’un NATURAL JOIN c’est qu’il n’y a pas besoin d’utiliser la clause ON.
Exemple
Une utilisation classique d’une telle jointure pourrait être l’utilisation dans une application qui utilise
une table utilisateur et une table pays. Si la table utilisateur contient une colonne pour l’identifiant du
pays, il sera possible d’effectuer une jointure naturelle.
Table “utilisateur” :

us e r_ i d u s er _p re nom u s e r_vi ll e p a ys _i d

1 Jérémie Paris 1

2 Damien Montréal 2

3 Sophie Marseille NULL

4 Yann Lille 9999

5 Léa Paris 1

Table “pays” :

pa ys _ i d pa ys _no m

1 France

2 Canada

3 Belgique

4 Suisse

Pour avoir la liste de tous les utilisateurs avec le pays correspondant, il est possible d’effectuer une
requête SQL similaire à celle-ci:
SELECT *
FROM utilisateur
NATURAL JOIN pays
Cette requête retournera le résultat suivant :

pa ys _ i d u s er _i d us e r _pr en om us e r_ vi l le pa ys _ no m

1 1 Jérémie Paris France

58
pa ys _ i d u s er _i d us e r _pr en om us e r_ vi l le pa ys _ no m

2 2 Damien Montréal Canada

NULL 3 Sophie Marseille NULL

9999 4 Yann Lille NULL

1 5 Léa Paris France

Cet exemple montre qu’il y a bien eu une jointure entre les 2 tables grâce à la colonne “pays_id” qui
se trouve dans l’une et l’autre des tables.

59

You might also like