Vous êtes sur la page 1sur 89

Cours SQL

_____________
Base du langage SQL et des bases de donnes
Auteur Tony Archambeau
Site web http://sqlsh
!ate "# mai "$%#
Licence &is ' disposition selon les termes de la licence Creative Commons Attribution - Pas
dUtilisation Commerciale - Partage dans les Mmes Conditions 4.0 nternational.
(ous )tes libres de reproduire* distribuer et communiquer cette cration au public '
condition de +aire un lien ,ers http://sqlsh* de redistribuer dans les m)mes conditions et
de ne pas +aire d-utilisation commerciale du cours
%/./ sql.sh
Sommaire
SQL S0L01T2
SQL !3ST341T5
SQL AS 6alias7.
SQL 890:0%%
SQL A4! ; <:%2
SQL 34%=
SQL B0T8004%>
SQL L3?0%/
SQL 3S 4@LL / 3S 4<T 4@LL"%
SQL A:<@B BC"2
SQL 9A(34A"=
SQL <:!0: BC">
SQL L3&3T"/
SQL 1AS02%
SQL @43<42=
SQL @43<4 ALL2>
SQL 34T0:S01T2/
SQL 0D10BT / &34@S#%
SQL 34S0:T 34T<#2
SQL <4 !@BL31AT0 ?0C @B!AT0#=
SQL @B!AT0#.
SQL !0L0T0#/
SQL &0:A0=$
SQL T:@41AT0 TABL0=%
SQL 1:0AT0 !ATABAS0="
SQL !:<B !ATABAS0=2
SQL 1:0AT0 TABL0=#
SQL ALT0: TABL0=5
SQL !:<B TABL0=.
Eointure SQL=/
SQL 3440: E<345$
SQL 1:<SS E<345"
SQL L0FT E<345#
SQL :3A9T E<3455
SQL F@LL E<345.
SQL S0LF E<34>$
SQL 4AT@:AL E<34>"
SQL SousGrequ)te>#
SQL 0D3STS>>
SQL ALL>/
SQL A4C / S<&0.$
3ndeH SQL."
SQL 1:0AT0 34!0D.2
SQL 0DBLA34.=
1ommentaires en SQL..
"/./ sql.sh
SQL S!L!C"
LIutilisation la plus courante de SQL consiste ' lire des donnes issues de la base de donnes 1ela
sIe++ectue grJce ' la commande S0L01T* qui retourne des enregistrements dans un tableau de
rsultat 1ette commande peut slectionner une ou plusieurs colonnes dIune table
Commande basi#ue
LIutilisation basique de cette commande sIe++ectue de la maniKre sui,ante :
SELECT nom_du_champ
FROM nom_du_tableau
1ette requ)te ,a slectionner 6S0L01T7 le champ L nom_du_champ M pro,enant 6F:<&7 du
tableau appel L nom_du_tableau M
!$em%le
3maginons une base de donnes appele L client M qui contient des in+ormations sur les clients dIune
entreprise
"able & client ' (
identi+iant prenom nom ,ille
% Bierre !upond Baris
" Sabrina !urand 4antes
2 Eulien &artin Lyon
# !a,id Bernard &arseille
= &arie Leroy Arenoble
Si lIont ,eut a,oir la liste de toutes les ,illes des clients* il su++it dIe++ectuer la requ)te sui,ante :
SELECT ville
FROM client
)*sultat (
ville
Paris
Nantes
Lyon
Marseille
Grenoble
2/./ sql.sh
+btenir %lusieurs colonnes
A,ec la m)me table client il est possible de lire plusieurs colonnes ' la +ois 3l su++it tout simplement
de sparer les noms des champs souhaits par une ,irgule Bour obtenir les prnoms et les noms
des clients il +aut alors +aire la requ)te sui,ante:
SELECT prenom, nom
FROM client
)*sultat (
prenom nom
Pierre Dupond
Sabrina Durand
Julien Martin
David Bernard
Marie Leroy
+btenir toutes les colonnes dun tableau
3l est possible de retourner automatiquement toutes les colonnes dIun tableau sans a,oir ' connaNtre
le nom de toutes les colonnes Au lieu de lister toutes les colonnes* il +aut simplement utiliser le
caractKre L O M 6toile7 1Iest un PoQer qui permet de slectionner toutes les colonnes 3l sIutilise de la
maniKre sui,ante :
SELECT * FROM client
1ette requ)te retourne eHactement les m)mes colonnes quIil y a dans la base de donnes !ans
notre cas* le rsultat sera donc :
identifiant prenom nom ville
1 Pierre Dupond Paris
2 Sabrina Durand Nantes
3 Julien Martin Lyon
4 David Bernard Marseille
5 Marie Leroy Grenoble
3l y a des a,antages et des incon,nient ' lIutiliser Bour en sa,oir plus sur le suPet il est recommand
de lire lIarticle a,antage et incon,nient du slecteur toile
Cours avanc* ( ordre des commandes du S!L!C"
1ette commande SQL est relati,ement commune car il est trKs +rquent de de,oir lire les donnes
issues dIune base de donnes 3l eHiste plusieurs commandes qui permettent de mieuH grer les
donnes que lIont souhaite lire (oici un petit aperRu des +onctionnalits possibles qui sont abordes
sur le reste du site:
#/./ sql.sh
Eoindre un autre tableau auH rsultats
Filtrer pour ne slectionner que certains enregistrements
1lasser les rsultats
Arouper les rsultats pour +aire uniquement des statistiques 6note moyenne* priH le plus le,
S7
@n requ)te S0L01T peut de,enir asseT longue Euste ' titre in+ormati+* ,oici une requ)te S0L01T
qui possKde presque toutes les commandes possibles :
SELECT *
FROM table
WHERE condition
RO!" #$ e%pre&&ion
H'()* condition
+ !*)O* , )*TERSECT , E-CE"T .
OR/ER #$ e%pre&&ion
L)M)T count
OFFSET &tart
A noter ( cette requ)te imaginaire sert principale dIaideGmmoire pour sa,oir dans quel ordre sont
utilis chacun des commandes au sein dIune requ)te S0L01T
=/./ sql.sh
SQL ,S"-C"
LIutilisation de la commande S0L01T en SQL permet de lire toutes les donnes dIune ou plusieurs
colonnes 1ette commande peut potentiellement a++icher des lignes en doubles Bour ,iter des
redondances dans les rsultats il +aut simplement aPouter !3ST341T aprKs le mot S0L01T
Commande basi#ue
LIutilisation basique de cette commande consiste alors ' e++ectuer la requ)te sui,ante :
SELECT /)ST)*CT ma_colonne
FROM nom_du_tableau
1ette requ)te slectionne le champ L ma_colonne M de la table L nom_du_tableau M en ,itant de
retourner des doublons
)e#ute %our +racle
Bour le SystKme de Aestion de Bases de !onnes 6SAB!7 <racle* cette requ)te est remplace par
la commande L @43Q@0 M :
SELECT !*)0!E ma_colonne
FROM nom_du_tableau
!$em%le
Brenons le cas concret dIune table L client M qui contient des noms et prnoms :
identifiant prenom nom
1 Pierre Dupond
2 Sabrina Bernard
3 David Durand
4 Pierre Leroy
5 Marie Leroy
0n utilisant seulement S0L01T tous les noms sont retourns* or la table contient plusieurs +ois le
m)me prnom 6c+ Bierre7 Bour slectionner uniquement les prnoms uniques il +aut utiliser la
requ)te sui,ante :
SELECT /)ST)*CT prenom
FROM client
)*sultat (
prenom
Pierre
Sabrina
5/./ sql.sh
David
Marie
1e rsultat a++iche ,olontairement quIune seule +ois le prnom L Bierre M grJce ' lIutilisation de la
commande !3ST341T qui nIa++iche que les rsultats distincts
nt*rt
LIutilisation de la commande !3ST341T est trKs pratique pour ,iter les rsultats en doubles
1ependant* pour optimiser les per+ormances il est pr+rable dIutiliser la commande SQL A:<@B BC
lorsque cIest possible
>/./ sql.sh
SQL AS .alias/
!ans le langage SQL il est possible dIutiliser des alias pour renommer temporairement une colonne
ou une table dans une requ)te 1ette astuce est particuliKrement utile pour +aciliter la lecture des
requ)tes
nt*rts et utilit*s
Alias sur une colonne
Bermet de renommer le nom dIune colonne dans les rsultats dIune requ)te SQL 1Iest pratique
pour a,oir un nom +acilement identi+iable dans une application qui doit ensuite eHploiter les rsultats
dIune recherche
1as concrets dIutilisations :
@ne colonne qui sIappelle normalement c_iso_2%55 peut )tre renomme L code_pays M 6c+ le
code 3S< 2%55 correspond au code des pays7* ce qui est plus simple ' comprendre dans le
reste du code par un d,eloppeur
@ne requ)te qui utilise la commande @43<4 sur des champs auH noms di++rents peut )tre
ambigu pour un d,eloppeur 0n renommant les champs a,ec un m)me nom il est plus simple
de traiter les rsultats
LorsquIune +onction est utilis* le nom dIune colonne peutG)tre un peu compleHe 3l est ainsi
possible de renommer la colonne sur laquelle il y a une +onction SQL 0Hemple : S0L01T
1<@4T6O7 AS nombre_de_resultats F:<& UtableU
Lorsque plusieurs colonnes sont combines il est plus simple de renommer la nou,elle
colonne qui est une concatnation de plusieurs champs
Alias sur une table
Bermet dIattribuer un autre nom ' une table dans une requ)te SQL 1ela peut aider ' a,oir des
noms plus court* plus simple et plus +acilement comprhensible 1eci est particuliKrement ,rai
lorsquIil y a des Pointures
S0nta$e
Alias sur une colonne
La syntaHe pour renommer une colonne de colonne% ' c% est la sui,ante :
SELECT colonne1 'S c1, colonne2
FROM 3table3
1ette syntaHe peut galement sIa++icher de la +aRon sui,ante :
SELECT colonne1 c1, colonne2
FROM 3table3
A noter ( ' choisir il est pr+rable dIutiliser la commande L AS M pour que ce soit plus eHplicite 6plus
simple ' lire quIun simple espace7* dIautant plus que cIest recommand dans le standard 3S< pour
conce,oir une requ)te SQL
././ sql.sh
Alias sur une table
La syntaHe pour renommer une table dans une requ)te est la sui,ante :
SELECT *
FROM 3nom_table3 'S t1
1ette requ)te peut galement sIcrire de la +aRon sui,ante :
SELECT *
FROM 3table3t1
!$em%le
)enommer une colonne
3maginons une site dIeGcommerce qui possKde une table de produits 1es produits sont disponibles
dans une m)me table dans plusieurs langues * dont le +ranRais Le nom du produit peut ainsi )tre
disponible dans la colonne L nom_+r_+r M* L nom_en_gb M ou L nom_en_us M Bour utiliser lIun ou
lIautre des titres dans le reste de lIapplication sans a,oir ' se soucier du nom de la colonne* il est
possible de renommer la colonne de son choiH a,ec un nom gnrique !ans notre cas* la requ)te
pourra ressemble ' ceci :
SELECT p_id, p_nom_4r_4r 'S nom, p_de&cription_4r_4r 'S de&cription,
p_pri%_euro 'S pri%
FROM 3produit3
)*sultat (
id nom description prix
1 Ecran Ecran de grandes tailles. 399.99
2 Clavier Clavier sans fil. 27
3 Souris Souris sans fil. 24
4 Ordinateur portable Grande autonomie et et sacoche offerte. 700
1omme nous pou,ons le constater les colonnes ont t renommes
)enommer une ou %lusieurs tables
3maginons que les produits du site eGcommerce soit rpartis dans des catgories Bour rcuprer la
liste des produits en m)me temps que la catgorie auquel il appartient il est possible dIutiliser une
requ)te SQL a,ec une Pointure 1ette requ)te peut utiliser des alias pour ,iter dIutiliser ' chaque
+ois le nom des tables
La requ)te ciGdessous renomme la table L produit M en L p M et la table L produit_categorie M en L pc
M 6plus court et donc plus rapide ' crire7 :
SELECT p_id, p_nom_4r_4r, pc_id, pc_nom_4r_4r
FROM 3produit3 'S p
LEFT 5O)* 3produit_cate6orie3 'S pc O* pc7pc_id 8 p7p_49_cate6or:_id
//./ sql.sh
1ette astuce est encore plus pratique lorsquIil y a des noms de tables encore plus compliqus et
lorsquIil y a beaucoup de Pointures
%$/./ sql.sh
SQL 12!)!
La commande 890:0 dans une requ)te SQL permet dIeHtraire les lignes dIune base de donnes
qui respectent une condition 1ela permet dIobtenir uniquement les in+ormations dsires
S0nta$e
La commande 890:0 sIutilise en complment ' une requ)te utilisant S0L01T La +aRon la plus
simple de lIutiliser est la sui,ante :
SELECT nom_colonne&
FROM nom_table
WHERE condition
!$em%le
3maginons une base de donnes appele L client M qui contient le nom des clients* le nombre de
commandes quIils ont e++ectus et leur ,ille :
id nom nbr_commande ville
1 Paul 3 paris
2 Maurice 0 rennes
3 Josphine 1 toulouse
4 Grard 7 paris
Bour obtenir seulement la liste des clients qui habitent ' Baris* il +aut e++ectuer la requ)te sui,ante :
SELECT *
FROM client
WHERE ville 8 ;pari&;
)*sultat (
id nom nbr_commande nbr_commande
1 Paul 3 paris
4 Grard 7 paris
Attention ( dans notre cas tout est en minuscule donc il nIy a pas eu de problKme 1ependant* si un
table est sensible ' la casse* il +aut +aire attention auH maPuscules et minuscules
+%*rateurs de com%araisons
3l eHiste plusieurs oprateurs de comparaisons La liste ciGPointe prsente quelques uns des
oprateurs les plus couramment utiliss
%%/./ sql.sh
Oprateur Description
= gale
<> Pas gale
!= Pas gale
> Suprieur
< Infrieur
>= Suprieur ou gale
<= Infrieur ou gale
IN Liste de plusieurs valeurs possibles
BETWEEN Valeur comprise dans un intervalle donne (utile pour les nombres ou dates)
LIKE Recherche en spcifiant le dbut, milieu ou fin d'un mot.
IS NULL Valeur est nulle
IS NOT NULL Valeur n'est pas nulle
Attention ( il y a quelques oprateurs qui nIeHiste pas dans des ,ieilles ,ersions de systKme de
gestion de bases de donnes 6SAB!7 !e plus* il y a de nou,eauH oprateurs non indiqus ici qui
sont disponibles a,ec certains SAB! 4IhsiteT pas ' consulter la documentation de &ySQL*
BostgreSQL ou autre pour ,oir ce quIil ,ous est possible de +aire
%"/./ sql.sh
SQL A-, 3 +)
@ne requ)te SQL peut )tre restreinte ' lIaide de la condition 890:0 Les oprateurs logiques A4!
et <: peu,ent )tre utilises au sein de la commande 890:0 pour combiner des conditions
S0nta$e dutilisation des o%*rateurs A-, et +)
Les oprateurs sont ' aPouts dans la condition 890:0 3ls peu,ent )tre combins ' lIin+ini pour
+iltrer les donnes comme souhaits
LIoprateur A4! permet de sIassurer que la condition% 0T la condition" sont ,rai :
SELECT nom_colonne&
FROM nom_table
WHERE condition1 '*/ condition2
LIoprateur <: ,ri+ie quant ' lui que la condition% <@ la condition" est ,rai :
SELECT nom_colonne& FROM nom_table
WHERE condition1 OR condition2
1es oprateurs peu,ent )tre combins ' lIin+ini et mlangs LIeHemple ciGdessous +iltre les rsultats
de la table L nom_table M si condition% 0T condition" <@ condition2 est ,rai :
SELECT nom_colonne& FROM nom_table
WHERE condition1 '*/ <condition2 OR condition=>
Attention : il +aut penser ' utiliser des parenthKses lorsque cIest ncessaire 1ela permet dI,iter les
erreurs car et Ra amliore la lecture dIune requ)te par un humain
!$em%le de donn*es
Bour illustrer les prochaines commandes* nous allons considrer la table L produit M sui,ante :
id nom categorie stock prix
1 ordinateur informatique 5 950
2 clavier informatique 32 35
3 souris informatique 16 30
4 crayon fourniture 147 2
+%*rateur A-,
LIoprateur A4! permet de Poindre plusieurs conditions dans une requ)te 0n gardant la m)me table
que prcdemment* pour +iltrer uniquement les produits in+ormatique qui sont presque en rupture de
stocQ 6moins de "$ produits disponible7 il +aut eHcuter la requ)te sui,ante :
SELECT * FROM produit
WHERE cate6orie 8 ;in4ormati?ue; '*/ &toc9 @ 2A
%2/./ sql.sh
)*sultat (
id nom categorie stock prix
1 ordinateur informatique 5 950
3 souris informatique 16 30
+%*rateur +)
Bour +iltrer les donnes pour a,oir uniquement les donnes sur les produits L ordinateur M ou L
cla,ier M il +aut e++ectuer la recherche sui,ante :
SELECT * FROM produit
WHERE nom 8 ;ordinateur; OR nom 8 ;clavier;
)*sultats (
id nom categorie stock prix
1 ordinateur informatique 5 950
2 clavier informatique 32 35
Combiner A-, et +)
3l ne +aut pas oublier que les oprateurs peu,ent )tre combins pour e++ectuer de puissantes
recherche 3l est possible de +iltrer les produits L in+ormatique M a,ec un stocQ in+rieur ' "$ et les
produits L +ourniture M a,ec un stocQ in+rieur ' "$$ a,ec la recherche sui,ante :
SELECT * FROM produit
WHERE < cate6orie 8 ;in4ormati?ue; '*/ &toc9 @ 2A >
OR < cate6orie 8 ;4ourniture; '*/ &toc9 @ 2AA >
)*sultats (
id nom categorie stock prix
1 ordinateur informatique 5 950
2 clavier informatique 32 35
4 crayon fourniture 147 2
%#/./ sql.sh
SQL -
LIoprateur logique 34 dans SQL sIutilise a,ec la commande 890:0 pour ,ri+ier si une colonne est
gale ' une des ,aleurs comprise dans set de ,aleurs dtermins 1Iest une mthode simple pour
,ri+ier si une colonne est gale ' une ,aleur <@ une autre ,aleur <@ une autre ,aleur et ainsi de
suite* sans a,oir ' utiliser de multiple +ois lIoprateur <:
S0nta$e
Bour chercher toutes les lignes oV la colonne L nom_colonne M est gale ' W,aleur %X <@ W,aleur "X ou
W,aleur 2X* il est possible dIutiliser la syntaHe sui,ante :
SELECT nom_colonne
FROM table
WHERE nom_colonne )* < valeur1, valeur2, valeur=, 777 >
A savoir ( entre les parenthKses il nIy a pas de limite du nombre dIarguments 3l est possible
dIaPouter encore dIautres ,aleurs
1ette syntaHe peut )tre associe ' lIoprateur 4<T pour recherche toutes les lignes qui ne sont pas
gales ' lIune des ,aleurs stipules
Sim%licit* de lo%*rateur -
La syntaHe utilise a,ec lIoprateur est plus simple que dIutiliser une succession dIoprateur <:
Bour le montrer concrKtement a,ec un eHemple* ,oici " requ)tes qui retournerons les m)mes
rsultats* lIune utilise lIoprateur 34* tandis que lIautre utilise plusieurs <:
)e#ute avec %lusieurs +)
SELECT prenom
FROM utili&ateur
WHERE prenom 8 ;Maurice; OR prenom 8 ;Marie; OR prenom 8 ;ThimotB;
)e#ute *#uivalent avec lo%*rateur -
SELECT prenom
FROM utili&ateur
WHERE prenom )* < ;Maurice;, ;Marie;, ;ThimotB; >
!$em%le
3maginons une table L adresse M qui contient une liste dIadresse associe ' des utilisateurs dIune
application
id id_utilisateur addr_rue addr_code_postal addr_ville
1 23 35 Rue Madeleine Pelletier 25250 Bournois
2 43 21 Rue du Moulin Collet 75006 Paris
%=/./ sql.sh
3 65 28 Avenue de Cornouaille 27220 Mousseaux-Neuville
4 67 41 Rue Marcel de la Provot 76430 Graimbouville
5 68 18 Avenue de Navarre 75009 Paris
Si lIont souhaite obtenir les enregistrements des adresses de Baris et de Araimbou,ille* il est
possible dIutiliser la requ)te sui,ante :
SELECT *
FROM adre&&e
WHERE addr_ville )* < ;"ari&;, ;raimbouville; >
)*sultats (
id id_utilisateur addr_rue addr_code_postal addr_ville
2 43 21 Rue du Moulin Collet 75006 Paris
4 67 41 Rue Marcel de la Provot 76430 Graimbouville
5 68 18 Avenue de Navarre 75009 Paris
%5/./ sql.sh
SQL 4!"1!!-
LIoprateur B0T8004 est utilis dans une requ)te SQL pour slectionner un inter,alle de donnes
dans une requ)te utilisant 890:0 LIinter,alle peut )tre constitu de chaNnes de caractKres* de
nombres ou de dates LIeHemple le plus concret consiste par eHemple ' rcuprer uniquement les
enregistrements entre " dates d+inies
S0nta$e
LIutilisation de la commande B0T8004 sIe++ectue de la maniKre sui,ante :
SELECT *
FROM table
WHERE nom_colonne #ETWEE* ;valeur1; '*/ ;valeur2;
La requ)te sui,ante retournera toutes les lignes dont la ,aleur de la colonne L nom_colonne M sera
comprise entre ,aleur% et ,aleur"
!$em%le ( 5iltrer entre 6 dates
3maginons une table L utilisateur M qui contient les membres dIune application en ligne
id nom date_inscription
1 Maurice 2012-03-02
2 Simon 2012-03-05
3 Chlo 2012-04-14
4 Marie 2012-04-15
5 Clmentine 2012-04-26
Si lIont souhaite obtenir les membres qui se sont inscrit entre le % a,ril "$%" et le "$ a,ril "$%" il est
possible dIe++ectuer la requ)te sui,ante :
SELECT *
FROM utili&ateur
WHERE date_in&cription #ETWEE* C2A12DAEDA1F '*/ C2A12DAED2AF
)*sultat (
id nom date_inscription
3 Chlo 2012-04-14
4 Marie 2012-04-15
!$em%le ( 5iltrer entre 6 entiers
Si lIont souhaite obtenir tous les rsultats dont lIidenti+iant nIest pas situ entre # et %$* il +audra alors
utiliser la requ)te sui,ante :
%>/./ sql.sh
SELECT *
FROM utili&ateur
WHERE id *OT #ETWEE* E '*/ 1A
)*sultat (
id nom date_inscription
1 Maurice 2012-03-02
2 Simon 2012-03-05
3 Chlo 2012-04-14
4on 7 savoir
1ertaines ,ieilles ,ersions de systKmes de gestion de bases de donnes ne prennent pas en compte
la commande B0T8004 &ais si ,ous utiliseT une ,ersion rcente de &ySQL ou BostgreSQL* cela
ne cause aucun problKme
LIautre lment important ' sa,oir cIest que toutes les bases de donnes ne gKrent pas lIoprateur
B0T8004 de la m)me maniKre 1ertains systKmes ,ont inclurent les ,aleurs qui d+inissent
lIinter,alle tandis que dIautres systKmes considKrent ces ,aleurs sont eHclues 3l est important de
consulter la documentation o++icielle de la base de donnes que ,ous utiliseT pour a,oir une rponse
eHacte ' ce suPet
%././ sql.sh
SQL L8!
LIoprateur L3?0 est utilis dans la clause 890:0 des requ)tes SQL 1e motGcl permet dIe++ectuer
une recherche sur un modKle particulier 3l est par eHemple possible de rechercher les
enregistrements dont la ,aleur dIune colonne commence par telle ou telle lettre Les modKles de
recherches sont multiple
S0nta$e
La syntaHe ' utiliser pour utiliser lIoprateur L3?0 est la sui,ante :
SELECT *
FROM table
WHERE colonne L)GE modele
!ans cet eHemple le L modKle M nIa pas t d+ini* mais il ressemble trKs gnralement ' lIun des
eHemples sui,ants :
L8! 9:a ( le caractKre L Y M est un caractKre PoQer qui remplace tous les autres caractKres
Ainsi* ce modKle permet de rechercher toutes les chaines de caractKre qui se termine par un L
a M
L8! 9a: ( ce modKle permet de rechercher toutes les lignes de L colonne M qui commence
par un L a M
L8! 9:a: ( ce modKle est utilis pour rechercher tous les enregistrement qui utilisent le
caractKre L a M
L8! 9%a:on ( ce modKle permet de rechercher les chaines qui commence par L pa M et qui
se terminent par L on M* comme L pantalon M ou L pardon M
L8! 9a;c ( peu utilis* le caractKre L _ M 6underscore7 peut )tre remplac par nIimporte quel
caractKre* mais un seul caractKre uniquement 6alors que le symbole pourcentage L Y M peut
)tre remplac par un nombre incalculable de caractKres Ainsi* ce modKle permet de
retourner les lignes L aac M* L abc M ou m)me L aTc M
!$em%le
3maginons une table L client M qui contient les enregistrement dIutilisateurs :
id nom ville
1 Lon Lyon
2 Odette Nice
3 Vivien Nantes
4 Etienne Lille
+btenir les r*sultats #ui commencent %ar & - '
Si lIont souhaite obtenir uniquement les clients des ,illes qui commencent par un L 4 M* il est
possible dIutiliser la requ)te sui,ante :
SELECT *
FROM client
WHERE ville L)GE ;*H;
%//./ sql.sh
A,ec cette requ)te* seul les enregistrements sui,ants seront retourns :
id nom ville
2 Odette Nice
3 Vivien Nantes
+btenir les r*sultats terminent %ar & e '
)e#ute (
SELECT *
FROM client
WHERE ville L)GE ;He;
)*sultat (
id nom ville
2 Odette Nice
4 Etienne Lille
"$/./ sql.sh
SQL S -ULL < S -+" -ULL
!ans le langage SQL* lIoprateur 3S permet de +iltrer les rsultats qui contiennent la ,aleur 4@LL
1et oprateur est indispensable car la ,aleur 4@LL est une ,aleur inconnue et ne peut par
consquent pas )tre +iltre par les oprateurs de comparaison 6c+ gal* in+rieur* suprieur ou
di++rent7
S0nta$e
Bour +iltrer les rsultats oV les champs dIune colonne sont ' 4@LL il con,ient dIutiliser la syntaHe
sui,ante :
SELECT *
FROM 3table3
WHERE nom_colonne )S *!LL
A lIin,erse* pour +iltrer les rsultats et obtenir uniquement les enregistrements qui ne sont pas null* il
con,ient dIutiliser la syntaHe sui,ante :
SELECT *
FROM 3table3
WHERE nom_colonne )S *OT *!LL
A savoir ( lIoprateur 3S retourne en ralit un boolen* cIest ' dire une ,aleur T:@0 si la condition
est ,rai ou FALS0 si la condition nIest pas respecte 1et oprateur est sou,ent utilis a,ec la
condition 890:0 mais peut aussi trou, son utilit lorsquIune sousGrequ)te est utilise
!$em%le
3maginons une application qui possKde une table contenant les utilisateurs 1ette table possKde "
colonnes pour associer les adresses de li,raison et de +acturation ' un utilisateur 6grJce ' une cl
trangKre7 Si cet utilisateur nIa pas dIadresse de +acturation ou de li,raison* alors le champ reste '
4@LL
"able & utilisateur ' (
id nom date_inscription fk_adresse_livraison_id fk_adresse_facturation_id
23 Grgoire 2013-02-12 12 12
24 Sarah 2013-02-17 NULL NULL
25 Anne 2013-02-21 13 14
26 Frdrique 2013-03-02 NULL NULL
!$em%le = ( utilisateurs sans adresse de livraison
3l est possible dIobtenir la liste des utilisateurs qui ne possKdent pas dIadresse de li,raison en
utilisant la requ)te SQL sui,ante :
"%/./ sql.sh
SELECT *
FROM 3utili&ateur3
WHERE 349_adre&&e_livrai&on_id3 )S *!LL
)*sultat (
id nom date_inscription fk_adresse_livraison_id fk_adresse_facturation_id
24 Sarah 2013-02-17 NULL NULL
26 Frdrique 2013-03-02 NULL NULL
Les enregistrements retourns montrent bien que seul les utilisateurs ayant la ,aleur 4@LL pour le
champ de lIadresse de li,raison
!$em%le 6 ( utilisateurs avec une adresse de livraison
Bour obtenir uniquement les utilisateurs qui possKdent une adresse de li,raison il con,ient de lancer
la requ)te SQL sui,ante :
SELECT *
FROM 3utili&ateur3
WHERE 349_adre&&e_livrai&on_id3 )S *OT *!LL
)*sultat (
id nom date_inscription fk_adresse_livraison_id fk_adresse_facturation_id
23 Grgoire 2013-02-12 12 12
25 Anne 2013-02-21 13 14
Les lignes retourns sont eHclusi,ement celles qui nIont pas une ,aleur 4@LL pour le champ de
lIadresse de li,raison
""/./ sql.sh
SQL >)+UP 4?
La commande A:<@B BC est utilise en SQL pour grouper plusieurs rsultats et utiliser une +onction
de totauH sur un groupe de rsultat Sur une table qui contient toutes les ,entes dIun magasin* il est
par eHemple possible de liste regrouper les ,entes par clients identiques et dIobtenir le coZt total des
achats pour chaque client
S0nta$e dutilisation de >)+UP 4?
!e +aRon gnrale* la commande A:<@B BC sIutilise de la +aRon sui,ante :
SELECT colonne1, 4onction<colonne2>
FROM table
RO!" #$ colonne1
A noter ( cette commande doit touPours sIutiliser aprKs la commande 890:0 et a,ant la commande
9A(34A
!$em%le dutilisation
Brenons en considration une table L achat M qui rsume les ,entes dIune boutique :
id client tari+ date
% Bierre %$" "$%"G%$G"2
" Simon #> "$%"G%$G">
2 &arie %. "$%"G%%G$=
# &arie "$ "$%"G%%G%#
= Bierre %5$ "$%"G%"G$2
1e tableau contient une colonne qui sert dIidenti+iant pour chaque ligne* une autre qui contient le
nom du client* le coZt de la ,ente et la date dIachat
Bour obtenir le coZt total de chaque client en regroupant les commandes des m)mes clients* il +aut
utiliser la requ)te sui,ante :
SELECT client, S!M<tari4>
FROM achat
RO!" #$ client
La +onction S@&67 permet dIadditionner la ,aleur de chaque tari+ pour un m)me client Le rsultat
sera donc le sui,ant :
client SUM(tarif)
Pierre 262
Simon 47
Marie 38
"2/./ sql.sh
La maniKre simple de comprendre le A:<@B BC cIest tout simplement dIassimiler quIil ,a ,iter de
prsenter plusieurs +ois les m)mes lignes 1Iest une mthode pour ,iter les doublons
Euste ' titre in+ormati+* ,oici ce quIon obtient de la requ)te sans utiliser A:<@B BC
)e#ute (
SELECT client, S!M<tari4>
FROM achat
)*sultat (
client SUM(tarif)
Pierre 262
Simon 47
Marie 38
Marie 38
Pierre 262
Utilisation dautres 5onctions de statisti#ues
3l eHiste plusieurs +onctions qui peu,ent )tre utilises pour manipuler plusieurs enregistrements* il
sIagit des +onctions dIagrgations statistiques* les principales sont les sui,antes :
A(A67 pour calculer la moyenne dIun set de ,aleur Bermet de connaNtre le priH du panier
moyen pour de chaque client
1<@4T67 pour compter le nombre de lignes concernes Bermet de sa,oir combien dIachats a
t e++ectu par chaque client
&AD67 pour rcuprer la plus haute ,aleur Bratique pour sa,oir lIachat le plus cher
&3467 pour rcuprer la plus petite ,aleur @tile par eHemple pour connaNtre la date du premier
achat dIun client
S@&67 pour calculer la somme de plusieurs lignes Bermet par eHemple de connaNtre le total
de tous les achats dIun client
1es petites +onctions se r,Klent rapidement indispensable pour tra,ailler sur des donnes
"#/./ sql.sh
SQL 2A@->
La condition 9A(34A en SQL est presque similaire ' 890:0 ' la seule di++rence que 9A(34A
permet de +iltrer en utilisant des +onctions telles que S@&67* 1<@4T67* A(A67* &3467 ou &AD67
S0nta$e
LIutilisation de 9A(34A sIutilise de la maniKre sui,ante :
SELECT colonne1, S!M<colonne2>
FROM nom_table
RO!" #$ colonne1
H'()* 4onction<colonne2> operateur valeur
1ela permet donc de S[L01T3<440: les colonnes !0 la table L nom_table M en A:<@BA4T les
lignes qui ont des ,aleurs identiques sur la colonne L colonne%\ et que la condition de 9A(34A soit
respecte
m%ortant ( 9A(34A est trKs sou,ent utilis en m)me temps que A:<@B BC bien que ce ne soit
pas obligatoire
!$em%le
Bour utiliser un eHemple concret* imaginons une table L achat M qui contient les achats de di++rents
clients a,ec le coZt du panier pour chaque achat
id client tarif date_achat
1 Pierre 102 2012-10-23
2 Simon 47 2012-10-27
3 Marie 18 2012-11-05
4 Marie 20 2012-11-14
5 Pierre 160 2012-12-03
Si dans cette table on souhaite rcuprer la liste des clients qui ont command plus de #$]* toute
commandes con+ondu alors il est possible dIutiliser la requ)te sui,ante :
SELECT client, S!M<tari4>
FROM achat
RO!" #$ client
H'()* S!M<tari4> I EA
)*sultat (
client S@&6tari+7
Bierre %5"
Simon #>
"=/./ sql.sh
La cliente L &arie M a cumule 2.] dIachat 6un achat de %.] et un autre de "$]7 ce qui est in+rieur '
la limite de #$] impose par 9A(34A 0n consquent cette ligne nIest pas a++iche dans le rsultat
"5/./ sql.sh
SQL +),!) 4?
La commande <:!0: BC permet de trier les lignes dans un rsultat dIune requ)te SQL 3l est
possible de trier les donnes sur une ou plusieurs colonnes* par ordre ascendant ou descendant
S0nta$e
@ne requ)te oV lIont souhaite +iltrer lIordre des rsultats utilise la commande <:!0: BC de la sorte :
SELECT colonne1, colonne2
FROM table
OR/ER #$ colonne1
Bar d+aut les rsultats sont classs par ordre ascendant* toute+ois il est possible dIin,erser lIordre
en utilisant le su++iHe !0S1 aprKs le nom de la colonne Bar ailleurs* il est possible de trier sur
plusieurs colonnes en les sparant par une ,irgule @ne requ)te plus labor ressemblerais alors
cela :
SELECT colonne1, colonne2, colonne=
FROM table
OR/ER #$ colonne1 /ESC, colonne2 'SC
A noter ( il nIest pas oblig dIutiliser le su++iHe L AS1 M sachant que les rsultats sont touPours class
par ordre ascendant par d+aut Toute+ois* cIest plus pratique pour mieuH sIy retrou,er* surtout si on a
oubli lIordre par d+aut
!$em%le
Bour lIensemble de nos eHemple* nous allons prendre un base L utilisateur M de test* qui contient les
donnes sui,antes :
id nom prenom date_inscription tarif_total
1 Durand Maurice 2012-02-05 145
2 Dupond Fabrice 2012-02-07 65
3 Durand Fabienne 2012-02-13 90
4 Dubois Chlo 2012-02-16 98
5 Dubois Simon 2012-02-23 27
Bour rcuprer la liste de ces utilisateurs par ordre alphabtique du nom de +amille* il est possible
dIutiliser la requ)te sui,ante :
SELECT *
FROM utili&ateur
OR/ER #$ nom
)*sultat (
">/./ sql.sh
id nom prenom date_inscription tarif_total
4 Dubois Chlo 2012-02-16 98
5 Dubois Simon 2012-02-23 27
2 Dupond Fabrice 2012-02-07 65
1 Durand Maurice 2012-02-05 145
3 Durand Fabienne 2012-02-13 90
0n utilisant deuH mthodes de tri* il est possible de retourner les utilisateurs par ordre alphabtique
0T pour ceuH qui ont le m)me nom de +amille* les trier par ordre dcroissant dIinscription La requ)te
serait alors la sui,ante :
SELECT *
FROM utili&ateur
OR/ER #$ nom, date_in&cription /ESC
)*sultat (
id nom prenom date_inscription tarif_total
5 Dubois Simon 2012-02-23 27
4 Dubois Chlo 2012-02-16 98
2 Dupond Fabrice 2012-02-07 65
3 Durand Fabienne 2012-02-13 90
1 Durand Maurice 2012-02-05 145
"././ sql.sh
SQL LM"
La clause L3&3T est ' utiliser dans une requ)te SQL pour spci+ier le nombre maHimum de rsultats
que lIont souhaite obtenir 1ette clause est sou,ent associ ' un <FFS0T* cIestG'Gdire e++ectuer un
dcalage sur le Peu de rsultat 1es " clauses permettent par eHemple dIe++ectuer des systKme de
pagination 6eHemple : rcuprer les %$ articles de la page #7
A""!-"+- ( selon le systKme de gestion de base de donnes* la syntaHe ne sera pas pareil 1e
tutoriel ,a donc prsenter la syntaHe pour &ySQL et pour BostgreSQL
S0nta$e sim%le
La syntaHe commune auH principales systKme de gestion de bases de donnes est la sui,ante :
SELECT *
FROM table
L)M)T 1A
1ette requ)te permet de rcuprer seulement les %$ premiers rsultats dIune table Bien entendu* si
la table contient moins de %$ rsultats* alors la requ)te retournera toutes les lignes
4on 7 savoir ( la bonne pratique lorsque lIont utilise L3&3T consiste ' utiliser galement la clause
<:!0: BC pour sIassurer que quoi quIil en soit ce sont touPours les bonnes donnes qui sont
prsentes 0n e++et* si le systKme de tri est non spci+i* alors il est en principe inconnu et les
rsultats peu,ent )tre impr,isible
Limit et +55set avec PostgreSQL
LIo++set est une mthode simple de dcaler les lignes ' obtenir La syntaHe pour utiliser une limite et
un o++set est la sui,ante :
SELECT *
FROM table
L)M)T 1A OFFSET J
1ette requ)te permet de rcuprer les rsultats 5 ' %= 6car lI<FFS0T commence touPours ' $7 A titre
dIeHemple* pour rcuprer les rsultats %5 ' "= il +audrait donc utiliser: L3&3T %$ <FFS0T %=
A noter ( @tiliser <FFS0T $ re,iens au m)me que dIomettre lI<FFS0T
Limit et +55set avec M0SQL
La syntaHe a,ec &ySQL est lgKrement di++rente :
SELECT *
FROM table
L)M)T J, 1AK
1ette requ)te retourne les enregistrements 5 ' %= dIune table Le premier nombre est lI<FFS0T
tandis que le sui,ant est la limite
"//./ sql.sh
4on 7 savoir ( pour une bonne compatibilit* &ySQL accepte galement la syntaHe L3&3T nombre
<FFS0T nombre 0n consquent* dans la conception dIune application utilisant &ySQL il est
pr+rable dIutiliser cette syntaHe car cIest potentiellement plus +acile de migrer ,ers un autre
systKme de gestion de base de donnes sans a,oir ' rGcrire toutes les requ)tes
Per5ormance
1e dernier chapitre est destin ' un public a,erti 3l nIest pas ncessaire de le comprendre
entiKrement* mais simplement dIa,oir compris les grandes lignes
1ertains d,eloppeur pensent ' tort que lIutilisation de L3&3T permet de rduire le temps dIeHcution
dIune requ)te <r* le temps dIeHcution est sensiblement le m)me car la requ)te ,a permettre de
rcuprer toutes les lignes 6donc temps dIeHcution identique7 B@3S seulement les rsultats d+init
par L3&3T et <FFS0T seront retourns Au mieuH* utiliser L3&3T permet de rduire le temps
dIa++ichage car il y a moins de lignes ' a++icher
2$/./ sql.sh
SQL CAS!
!ans le langage SQL* la commande L 1AS0 S 8904 S M permet dIutiliser des conditions de type
L si / sinon M 6c+ i+ / else7 similaire ' un langage de programmation pour retourner un rsultat
disponible entre plusieurs possibilits Le 1AS0 peut )tre utilis dans nIimporte quelle instruction ou
clause* telle que S0L01T* @B!AT0* !0L0T0* 890:0* <:!0: BC ou 9A(34A
S0nta$e
LIutilisation du 1AS0 est possible de " maniKres di++rentes :
1omparer une colonne ' un set de rsultat possible
[laborer une srie de conditions boolennes pour dterminer un rsultat
Com%arer une colonne 7 un set de r*sultat
(oici la syntaHe ncessaire pour comparer une colonne ' un set dIenregistrement :
C'SE a
WHE* 1 THE* ;un;
WHE* 2 THE* ;deu%;
WHE* = THE* ;troi&;
ELSE ;autre;
E*/
!ans cet eHemple les ,aleurs contenus dans la colonne L a M sont compar ' %* " ou 2 Si la
condition est ,rai* alors la ,aleur situe aprKs le T904 sera retourne
A noter ( la condition 0LS0 est +acultati,e et sert de ramasseGmiette Si les conditions prcdentes
ne sont pas respectes alors ce sera la ,aleur du 0LS0 qui sera retourne par d+aut
Alaborer une s*rie de conditions bool*ennes %our d*terminer un r*sultat
3l est possible dItablir des conditions plus compleHes pour rcuprer un rsultat ou un autre 1ela
sIe++ectue en utilisant la syntaHe sui,ante :
C'SE
WHE* a8b THE* ;' B6al L #;
WHE* aIb THE* ;' &upBrieur L #;
ELSE ;' in4Brieur L #;
E*/
!ans cet eHemple les colonnes L a M* L b M et L c M peu,ent contenir des ,aleurs numriques
LorsquIelles sont respectes* les conditions boolennes permettent de rentrer dans lIune ou lIautre
des conditions
3l est possible de reproduire le premier eHemple prsent sur cette page en utilisant la syntaHe
sui,ante :
C'SE
WHE* a81 THE* ;un;
2%/./ sql.sh
WHE* a82 THE* ;deu%;
WHE* a8= THE* ;troi&;
ELSE ;autre;
E*/
!$em%le
Bour prsenter le 1AS0 dans le langage SQL il est possible dIimaginer une base de donnes
utilises par un site de ,ente en ligne !ans cette base il y a une table contenant les achats* cette
table contient le nom des produits* le priH unitaire* la quantit achete et une colonne consacre '
une marge +icti,e sur certains produits
"able & acBat ' (
id nom surcharge prix_unitaire quantite
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
A55icBer un message selon une condition
3l est possible dIe++ectuer une requ)te qui ,a a++icher un message personnalis en +onction de la
,aleur de la marge Le message sera di++rent selon que la marge soit gale ' %* suprieur ' % ou
in+rieure ' % La requ)te peut se prsenter de la +aRon sui,ante :
SELECT id, nom, mar6e_pourcenta6e, pri%_unitaire, ?uantite,
C'SE
WHE* mar6e_pourcenta6e81 THE* ;"ri% ordinaire;
WHE* mar6e_pourcenta6eI1 THE* ;"ri% &upBrieur L la normale;
ELSE ;"ri% in4Brieur L la normale;
E*/
FROM 3achat3
)*sultat (
id nom surcharge prix_unitaire quantite CASE
1 Produit A 1.3 6 3 Prix suprieur la normale
2 Produit B 1.5 8 2 Prix suprieur la normale
3 Produit C 0.75 7 4 Prix infrieur la normale
4 Produit D 1 15 2 Prix ordinaire
1e rsultat montre quIil est possible dIa++icher +acilement des messages personnaliss selon des
conditions simples
2"/./ sql.sh
A55icBer un %ri$ unitaire di55*rent selon une condition
A,ec un 1AS0 il est aussi possible dIutiliser des requ)tes plus labores 3maginons maintenant que
nous souhaitions multiplier le priH unitaire par " si la marge est suprieur ' %* la di,iser par " si la
marge est in+rieure ' % et laisser le priH unitaire tel quel si la marge est gale ' % 1Iest possible
grJce ' la requ)te SQL :
SELECT id, nom, mar6e_pourcenta6e, pri%_unitaire, ?uantite,
C'SE
WHE* mar6e_pourcenta6e81 THE* pri%_unitaire
WHE* mar6e_pourcenta6eI1 THE* pri%_unitaire*2
ELSE pri%_unitaireM2
E*/
FROM 3achat3
)*sultat (
id nom surcharge prix_unitaire quantite CASE
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
Com%arer un cBam% 7 une valeur donn*e
3maginons maintenant que lIapplication propose des rductions selon le nombre de produits
achets :
% produit achet permet dIobtenir une rduction de G=Y pour le prochain achat
" produit achet permet dIobtenir une rduction de G5Y pour le prochain achat
2 produit achet permet dIobtenir une rduction de G.Y pour le prochain achat
Bour plus de produits achets il y a un rduction de G%$Y pour le prochain achat
Bour e++ectuer une telle procdure* il est possible de comparer la colonne L quantite M auH di++rentes
,aleurs spci+ie et dIa++icher un message personnalis en +onction du rsultat 1ela peut )tre ralis
a,ec cette requ)te SQL :
SELECT id, nom, mar6e_pourcenta6e, pri%_unitaire, ?uantite,
C'SE ?uantite
WHE* A THE* ;Erreur;
WHE* 1 THE* ;O44re de DJH pour le prochain achat;
WHE* 2 THE* ;O44re de DNH pour le prochain achat;
WHE* = THE* ;O44re de DOH pour le prochain achat;
ELSE ;O44re de D1AH pour le prochain achat;
E*/
FROM 3achat3
)*sultat (
22/./ sql.sh
id nom surcharge prix_unitaire quantite 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 0LS0 peut par+ois )tre utilise pour grer les erreurs
UP,A"! avec CAS!
1omme cela a t eHpliqu au dbut* il est aussi possible dIutiliser le 1AS0 ' la suite de la
commande S0T dIun @B!AT0 pour mettre ' Pour une colonne a,ec une donnes spci+ique selon
une rKgle 3maginons par eHemple que lIont souhaite o++rir un produit pour tous les achats qui ont une
surcharge in+rieur ' % et que lIont souhaite retirer un produit pour tous les achats a,ec une
surcharge suprieur ' % 3l est possible dIutiliser la requ)te SQL sui,ante :
!"/'TE 3achat3
SET 3?uantite3 8 <
C'SE
WHE* 3&urchar6e3 @ 1 THE* 3?uantite3 P 1
WHE* 3&urchar6e3 I 1 THE* 3?uantite3 D 1
ELSE ?uantite
E*/
>
2#/./ sql.sh
SQL U-+-
La commande @43<4 de SQL permet de mettre boutG'Gbout les rsultats de plusieurs requ)tes
utilisant ellesGm)me la commande S0L01T 1Iest donc une commande qui permet de concatner les
rsultats de " requ)tes ou plus Bour lIutiliser il est ncessaire que chacune des requ)tes '
concatner retournes le m)me nombre de colonnes* a,ec les m)mes types de donnes et dans le
m)me ordre
A savoir ( par d+aut* les enregistrements eHactement identiques ne seront pas rpts dans les
rsultats Bour e++ectuer une union dans laquelle m)me les lignes dupliques sont a++iches il +aut
plut^t utiliser la commande @43<4 ALL
S0nta$e
La syntaHe pour unir les rsultats de " tableauH sans a++icher les doublons est la sui,ante :
SELECT * FROM table1
!*)O*
SELECT * FROM table2
ScB*ma e$%licati5
LIunion de " ensembles A et B est un concept qui consiste ' obtenir tous les lments qui
correspondent ' la +ois ' lIensemble A ou ' lIensemble B 1ela se rsume trKs simplement par un
petit schma oV la Tone en bleu correspond ' la Tone que lIont souhaite obtenir 6dans notre cas :
tous les lments7
Union de 2 ensembles
!$em%le
3maginons une entreprise qui possKde plusieurs magasins et dans chacun de ces magasins il y a
une table qui liste les clients
La table du magasin n_% sIappelle L magasin%_client M et contient les donnes sui,antes :
2=/./ sql.sh
prenom nom ville date_naissance total_achat
Lon 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_" sIappelle L magasin"_client M et contient les donnes sui,antes :
prenom nom ville date_naissance total_achat
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 prsents dans les " tables* pour ,iter de retourner plusieurs +ois
les m)mes enregistrement* il con,ient dIutiliser la requ)te @43<4 La requ)te SQL est alors la
sui,ante :
SELECT * FROM ma6a&in1_client
!*)O*
SELECT * FROM ma6a&in2_client
)*sultat (
prenom nom ville date_naissance total_achat
Lon 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
Le rsultat de cette requ)te montre bien que les enregistrements des " requ)tes sont mis boutG'G
bout mais sans inclure plusieurs +ois les m)mes lignes
25/./ sql.sh
SQL U-+- ALL
La commande @43<4 ALL de SQL est trKs similaire ' la commande @43<4 0lle permet de
concatner les enregistrements de plusieurs requ)tes* ' la seule di++rence que cette commande
permet dIinclure tous les enregistrements* m)me les doublons Ainsi* si un m)me enregistrement est
prsents normalement dans les rsultats des " requ)tes concatnes* alors lIunion des " a,ec
@43<4 ALL retournera " +ois ce m)me rsultat
A savoir ( tout comme la commande @43<4* il con,ient que les " requ)tes retournes eHactement le
m)me nombre de colonnes* a,ec les m)mes types de donnes et dans le m)me ordre
S0nta$e
La syntaHe de la requ)te SQL pour unir les rsultats des " tables est la sui,ante :
SELECT * FROM table1
!*)O* 'LL
SELECT * FROM table2
!$em%le
3maginons une entreprise qui possKde des bases de donnes dans chacun de ces magasins Sur
ces bases de donnes il y a une table de la liste des clients a,ec quelques in+ormations et le total
des achats dans lIentreprise
La table L magasin%_client M correspond au premier magasin :
prenom nom ville date_naissance total_achat
Lon 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 L magasin"_client M correspond au deuHiKme magasin :
prenom nom ville date_naissance total_achat
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
Bour concatner les tous les enregistrements de ces tables* il est possible dIe++ectuer une seule
requ)te utilisant la commande @43<4 ALL* comme lIeHemple ciGdessous :
2>/./ sql.sh
SELECT * FROM ma6a&in1_client
!*)O* 'LL
SELECT * FROM ma6a&in2_client
)*sultat (
prenom nom ville date_naissance total_achat
Lon 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 rsultat de cette requ)te montre quIil y a autant dIenregistrement que dans les " tables runis A
sa,oir* il y a quelques clients qui taient prsents dans les " tables dIorigines en consquent ils sont
prsent " +ois dans le rsultat de cette requ)te SQL
2././ sql.sh
SQL -"!)S!C"
La commande SQL 34T0:S01T permet dIobtenir lIintersection des rsultats de " requ)tes 1ette
commande permet donc de rcuprer les enregistrements communs ' " requ)tes 1ela peut sIa,rer
utile lorsquIil +aut trou,er sIil y a des donnes similaires sur " tables distinctes
A savoir ( pour lIutiliser con,enablement il +aut que les " requ)tes retourne le m)me nombre de
colonnes* a,ec les m)mes types et dans le m)me ordre
S0nta$e
La syntaHe ' adopter pour utiliser cette commande est la sui,ante :
SELECT * FROM table1
)*TERSECT
SELECT * FROM table2
!ans cet eHemple* il +aut que les " tables soient similaires 6m)mes colonnes* m)mes types et m)me
ordre7 Le rsultat correspondra auH enregistrements qui eHistent dans table% et dans table"
ScB*ma e$%licati5
LIintersection de " ensembles A et B correspond auH lments qui sont prsent dans A et dans B* et
seulement ceuHGl' 1ela peut )tre reprsent par un schma eHplicati+ simple ou lIintersection de A et
B correspond ' la Tone en bleu
Intersection de 2 ensembles
!$em%le
Brenons lIeHemple de " magasins qui appartiennent au m)me groupe 1haque magasin possKde sa
table de clients
La table du magasin n_% est L magasin%_client M :
prenom nom ville date_naissance total_achat
Lon Dupuis Paris 1983-03-06 135
Marie Bernard Paris 1993-07-03 75
2//./ sql.sh
Sophie Dupond Marseille 1986-02-22 27
Marcel Martin Paris 1976-11-24 39
La table du magasin n_" est L magasin"_client M :
prenom nom ville date_naissance total_achat
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
Bour obtenir la liste des clients qui sont prsents de +aRon identiques dans ces " tables* il est
possible dIutiliser la commande 34T0:S01T de la +aRon sui,ante :
SELECT * FROM ma6a&in1_client
)*TERSECT
SELECT * FROM ma6a&in2_client
)*sultat (
prenom nom ville date_naissance total_achat
Marie Bernard Paris 1993-07-03 75
Marcel Martin Paris 1976-11-24 39
Le rsultat prsente " enregistrements* il sIagit des clients qui sont ' la +ois dans la table L
magasin%_client M et dans la table L magasin"_client M Sur certains systKmes une telle requ)te
permet de dceler des erreurs et dIenregistrer seulement ' un seul endroit la m)me in+ormation
#$/./ sql.sh
SQL !CC!P" < M-US
!ans le langage SQL la commande 0D10BT sIutilise entre " instructions pour rcuprer les
enregistrements de la premiKre instruction sans inclure les rsultats de la seconde requ)te Si un
m)me enregistrement de,ait )tre prsent dans les rsultats des " syntaHes* ils ne seront pas prsent
dans le rsultat +inal
A savoir ( cette commande sIappelle di++remment selon les SystKmes de Aestion de Base de
!onnes 6SAB!7 :
!CC!P" ( BostgreSQL
M-US ( &ySQL et <racle
!Ks lors* il +aut remplacer tout le reste de ce cours par &34@S pour les SAB! correspondants
S0nta$e
La syntaHe dIune requ)te SQL est toute simple :
SELECT * FROM table1
E-CE"T
SELECT * FROM table2
1ette requ)te permet de lister les rsultats du table % sans inclure les enregistrements de la table %
qui sont aussi dans la table "
Attention ( les colonnes de la premiKre requ)te doi,ent )tre similaires entre la premiKre et la
deuHiKme requ)te 6m)me nombre* m)me type et m)me ordre7
ScB*ma e$%licati5
1ette commande permet de rcuprer les lments de lIensemble A sans prendre en compte les
lments de A qui sont aussi prsent dans lIensemble B !ans le schma ciGdessous seule la Tone
bleu sera retourne grJce ' la commande 0D10BT 6ou &34@S7
Slection dun ensemble avec exception
!$em%le
3maginons un systKme in+ormatique dIune entreprise 1e systKme contient " tables contenant des
#%/./ sql.sh
listes de clients :
@ne table L clients_inscrits M qui contient les prnoms* noms et date dIinscription de clients
@ne table L clients_re+us_email M qui contient les in+ormations des clients qui ne souhaitent
pas )tre contact par email
1et eHemple aura pour obPecti+ de slectionner les utilisateurs pour en,oyer un email dIin+ormation
Les utilisateurs de la deuHiKme table ne de,ront pas apparaNtre dans les rsultats
"able & clients;inscrits ' (
id prenom nom date_inscription
1 Lionel Martineau 2012-11-14
2 Paul Cornu 2012-12-15
3 Sarah Schmitt 2012-12-17
4 Sabine Lenoir 2012-12-18
"able & clients;re5us;email ' (
id prenom nom date_inscription
1 Paul Cornu 2013-01-27
2 Manuel Guillot 2013-01-27
3 Sabine Lenoir 2013-01-29
4 Natalie Petitjean 2013-02-03
Bour pou,oir slectionner uniquement le prnom et le nom des utilisateurs qui accepte de rece,oir
des emails in+ormati+s La requ)te SQL ' utiliser est la sui,ante :
SELECT prenom, nom FROM client&_in&crit&
E-CE"T
SELECT prenom, nom FROM client&_re4u&_email
)*sultats (
prenom nom
Lionel &artineau
Sarah Schmitt
1e tableau de rsultats montre bien les utilisateurs qui sont dans inscrits et qui ne sont pas prsent
dans le deuHiKme tableau Bar ailleurs* les rsultats du deuHiKme tableau ne sont pas prsent sur ce
rsultat +inal
#"/./ sql.sh
SQL -S!)" -"+
LIinsertion de donnes dans une table sIe++ectue ' lIaide de la commande 34S0:T 34T< 1ette
commande permet au choiH dIinclure une seule ligne ' la base eHistante ou plusieurs lignes dIun
coup
nsertion dune ligne 7 la 5ois
Bour insrer des donnes dans une base* il y a " syntaHes principales :
3nsrer une ligne en indiquant les in+ormations pour chaque colonne eHistante 6en respectant
lIordre7
3nsrer une ligne en spci+iant les colonnes que ,ous souhaiter complter 3l est possible
dIinsrer une ligne en renseigner seulement une partie des colonnes
ns*rer une ligne en s%*ci5iant toutes les colonnes
La syntaHe pour remplir une ligne a,ec cette mthode est la sui,ante :
)*SERT )*TO table
('L!ES <;valeur 1;, ;valeur 2;, 777>
1ette syntaHe possKde les a,antages et incon,nients sui,ants :
<bliger de remplir toutes les donnes* tout en respectant lIordre des colonnes
3l nIy a pas le nom de colonne* donc les +autes de +rappe sont limites Bar ailleurs* les
colonnes peu,ent )tre renommes sans a,oir ' changer la requ)te
LIordre des colonnes doit rest identique sinon certaines ,aleurs prennent le risque dI)tre
complte dans la mau,aise colonne
ns*rer une ligne en s%*ci5iant seulement les colonnes souBait*es
1ette deuHiKme solution est trKs similaire* eHcept quIil +aut indiquer le nom des colonnes a,ant L
(AL@0S M La syntaHe est la sui,ante :
)*SERT )*TO table
<nom_colonne_1, nom_colonne_2, 777
('L!ES <;valeur 1;, ;valeur 2;, 777>
A noter ( il est possible de ne pas renseigner toutes les colonnes !e plus* lIordre des colonnes nIest
pas important
nsertion de %lusieurs lignes 7 la 5ois
3l est possible dIaPouter plusieurs lignes ' un tableau a,ec une seule requ)te Bour ce +aire* il
con,ient dIutiliser la syntaHe sui,ante :
)*SERT )*TO client <prenom, nom, ville, a6e>
('L!ES
<;RBbecca;, ;'rmand;, ;SaintD/idierDde&D#oi&;, 2E>,
<;'imBe;, ;Hebert;, ;Mari6n:DleDChQtel;, =N>,
<;Marielle;, ;Ribeiro;, ;MaillRre&;, 2S>,
#2/./ sql.sh
<;Hilaire;, ;Savar:;, ;ConieDMolitard;, JO>K
A noter ( lorsque le champ ' remplir est de type (A:19A: ou T0DT il +aut indiquer le teHte entre
guillemet simple 0n re,anche* lorsque la colonne est un numrique tel que 34T ou B3A34T il nIy a
pas besoin dIutiliser de guillemet* il su++it Puste dIindiquer le nombre
@n tel eHemple sur une table ,ide ,a crer le tableau sui,ant :
id prenom nom ville age
1 Rbecca Armand Saint-Didier-des-Bois 24
2 Aime Hebert Marigny-le-Chtel 36
3 Marielle Ribeiro Maillres 27
4 Hilaire Savary Conie-Molitard 58
##/./ sql.sh
SQL +- ,UPLCA"! 8!? UP,A"!
LIinstruction <4 !@BL31AT0 ?0C @B!AT0 est une +onctionnalit de &ySQL qui permet de mettre '
Pour des donnes lorsquIun enregistrement eHiste dP' dans une table 1ela permet dIa,oir quIune
seule requ)te SQL pour e++ectuer selon la con,enance un 34S0:T ou un @B!AT0
S0nta$e
1ette commande sIe++ectue au sein de la requ)te 34S0:T 34T< a,ec la syntaHe sui,ante :
)*SERT )*TO table <a, b, c>
('L!ES <1, 2A, NO>
O* /!"L)C'TE GE$ !"/'TE a8aP1
A noter ( cette requ)te se traduit comme suit :
% insrer les donnes a* b et c a,ec les donnes respecti,es de %* "$ et 5.
" Si la cl primaire eHiste dP' pour ces ,aleurs alors seulement +aire une mise ' Pour de a ` aa%
!$em%le avec la commande 12!)!
ArJce ' la commande L <4 !@BL31AT0 ?0C M 3l est possible dIenregistrer la date ' laquelle la
donnes est insre pour la premiKre +ois et la date de derniKre mise ' Pour* comme le montre la
commande ciGdessous :
)*SERT )*TO table <a, b, c, date_in&ert>
('L!ES <1, 2A, 1, *OW<>>
O* /!"L)C'TE GE$ !"/'TE date_update8*OW
WHERE c81
A noter ( cette requ)te se traduit comme suit :
% insrer les donnes a* b* c et date_insert* a,ec les donnes respecti,es de %* "$* % ainsi que
la date et lIheure actuelle
" Si la cl primaire eHiste dP' pour ces ,aleurs alors mettre a Pour la date et lIheure du champ L
date_update M
2 0++ectuer la mise ' Pour uniquement sur les champs oV c ` %
!$em%le
3maginons une application qui laisse les utilisateurs ,oter pour les produits quIils pr+Krent Le
systKme de ,ote est trKs simple et est bas sur des a% La table des ,otes contient le nombre de
,otes par produits a,ec la date du premier ,ote et la date du dernier ,ote
"able vote (
id produit_id vote_count vote_first_date vote_last_date
1 46 2 2012-04-25 17:45:24 2013-02-16 09:47:02
2 39 4 2012-04-28 16:54:44 2013-02-14 21:04:35
3 49 1 2012-04-25 19:11:09 2013-01-06 20:32:57
#=/./ sql.sh
Bour nIutiliser quIune seule ligne qui permet dIaPouter des ,otes dans cette table* sans se proccuper
de sa,oir sIil +aut +aire un 34S0:T ou un @B!AT0* il est possible dIutiliser la requ)te SQL sui,ante :
)*SERT )*TO vote <produit_id, vote_count, vote_4ir&t_date, vote_la&t_date>
('L!ES <JA, 1, *OW<>, *OW<>>
O* /!"L)C'TE GE$ !"/'TE vote_count 8 vote_countP1, vote_la&t_date 8 *OW<>
!ans cette requ)te la date et lIheure est gnre automatiquement a,ec la +onction 4<867
:sultat aprKs la premiKre eHcution de la requ)te :
id produit_id vote_count vote_first_date vote_last_date
1 46 2 2012-04-25 17:45:24 2013-02-16 09:47:02
2 39 4 2012-04-28 16:54:44 2013-02-14 21:04:35
3 49 1 2012-04-25 19:11:09 2013-01-06 20:32:57
4 55 1 2013-04-02 15:06:34 2013-04-02 15:06:34
1e rsultat montre bien lIaPout dIune ligne en +in de table* donc la requ)te a t utilis sous la +orme
dIun 34S0:T AprKs une deuHiKme eHcution de cette m)me requ)te le lendemain* les donnes
seront cellesGci:
id produit_id vote_count vote_first_date vote_last_date
1 46 2 2012-04-25 17:45:24 2013-02-16 09:47:02
2 39 4 2012-04-28 16:54:44 2013-02-14 21:04:35
3 49 1 2012-04-25 19:11:09 2013-01-06 20:32:57
4 55 2 2013-04-02 15:06:34 2013-04-03 08:14:57
1es rsultats montre bien quIil y a eu un ,ote supplmentaire et que la date du dernier ,ote a t mis
' Pour
ns*rer une ligne ou ne rien 5aire
!ans certains cas il est intressant dIutiliser un 34S0:T mais de ne rien +aire si la commande a dP'
t insre prcdemment &alheureusement* si la cl primaire eHiste dP' la requ)te retournera une
erreur 0t sIil nIy a rien ' mettre ' Pour* la commande <4 !@BL31AT0 ?0C @B!AT0 6<!?@7 ne
semble pas con,enir Toute+ois il y a une astuce qui consiste ' utiliser une requ)te de ce type :
)*SERT )*TO table <a, b, c>
('L!ES <1, EJ, N>
O* /!"L)C'TE GE$ !"/'TE id 8 id
1ette requ)te insert les donnes et ne produit aucune erreur si lIenregistrement eHistait dP' dans la
table
A sa,oir : thoriquement il aurait t possible dIutiliser 34S0:T 3A4<:0 mais malheureusement cela
#5/./ sql.sh
emp)che de retourner des erreurs telles que des erreurs de con,ersions de donnes
Com%atibilit*
Bour le moment cette +onctionnalit nIest possible quIa,ec &ySQL depuis la ,ersion #% 6date de
"$$27 Les autres SystKmes de Aestion de Bases de !onnes 6SAB!7 nIintKgrent pas cette
+onctionnalit Bour simuler cette +onctionnalit il y a quelques alternati,es :
PostgreSQL ( il y a une astuce en utilisant une +onction LIastuce est eHplique dans la
documentation o++icielle : +onction 34S0:T/@B!AT0
+racle ( il est possible dIutiliser la commande &0:A0 pour e++ectuer la m)me chose
SQL Server ( il est possible dIutiliser une procdure
#>/./ sql.sh
SQL UP,A"!
La commande @B!AT0 permet dIe++ectuer des modi+ications sur des lignes eHistantes TrKs sou,ent
cette commande est utilise a,ec 890:0 pour spci+ier sur quelles lignes doi,ent porter la ou les
modi+ications
S0nta$e
La syntaHe basique dIune requ)te utilisant @B!AT0 est la sui,ante :
!"/'TE table
SET nom_colonne_1 8 ;nouvelle valeur;
WHERE condition
1ette syntaHe permet dIattribuer une nou,elle ,aleur ' la colonne nom_colonne_% pour les lignes qui
respectent la condition stipul a,ec 890:0 3l est aussi possible dIattribuer la m)me ,aleur ' la
colonne nom_colonne_% pour toutes les lignes dIune table si la condition 890:0 nItait pas utilise
A noter* pour spci+ier en une seule +ois plusieurs modi+ication* il +aut sparer les attributions de
,aleur par des ,irgules Ainsi la syntaHe de,iendrait la sui,ante :
!"/'TE table
SET colonne_1 8 ;valeur 1;, colonne_2 8 ;valeur 2;, colonne_= 8 ;valeur =;
WHERE condition
!$em%le
id nom rue ville code_postal pays
1 Chantal 12 Avenue du Petit Trianon Puteaux 92800 France
2 Pierre 18 Rue de l'Allier Ponthion 51300 France
3 Romain 3 Chemin du Chiron Trvrien 35190 France
3maginons une table L client M qui prsente les coordonnes de clients
Bour modi+ier lIadresse du client Bierre* il est possible dIutiliser la requ)te sui,ante :
!"/'TE client
SET rue 8 ;ET Rue 'meline;,
ville 8 ;SaintDEu&tacheDlaDForUt;,
code_po&tal 8 ;SN21A;
WHERE id 8 2
)*sultat (
id nom rue ville code_postal pays
1 Chantal 12 Avenue du Petit Trianon Puteaux 92800 France
2 Pierre 49 Rue Ameline Saint-Eustache-la-Fort 76210 France
3 Romain 3 Chemin du Chiron Trvrien 35190 France
#././ sql.sh
SQL ,!L!"!
La commande !0L0T0 en SQL permet de supprimer des lignes dans une table 0n utilisant cette
commande associ ' 890:0 il est possible de slectionner les lignes concernes qui seront
supprimes
Attention ( A,ant dIessayer de supprimer des lignes* il est recommand dIe++ectuer une sau,egarde
de la base de donnes* ou tout du moins de la table concerne par la suppression Ainsi* sIil y a une
mau,aise manipulation il est touPours possible de restaurer les donnes
S0nta$e
La syntaHe pour supprimer des lignes est la sui,ante :
/ELETE FROM table
WHERE condition
Attention ( sIil nIy a pas de condition 890:0 alors toutes les lignes seront supprimes et la table
sera alors ,ide
!$em%le
3maginons une table L utilisateur M qui contient des in+ormations sur les utilisateurs dIune application
id nom prenom date_inscription
1 Bazin Daniel 2012-02-13
2 Favre Constantin 2012-04-03
3 Clerc Guillaume 2012-04-12
4 Ricard Rosemonde 2012-06-24
5 Martin Natalie 2012-07-02
Si lIont souhaite supprimer les utilisateurs qui se sont inscrit a,ant le L %$/$#/"$%"\* il ,a +alloir
e++ectuer la requ)te sui,ante :
/ELETE FROM utili&ateur
WHERE date_in&cription @ ;2A12DAED1A;
La requ)te permettra alors de supprimer les utilisateurs L !aniel M et L 1onstantin M La table
contiendra alors les donnes sui,antes :
id nom prenom date_inscription
3 Clerc Guillaume 2012-04-12
4 Ricard Rosemonde 2012-06-24
5 Martin Natalie 2012-07-02
3l ne +aut pas oublier quIil est possible dIutiliser dIautres conditions pour slectionner les lignes '
supprimer
#//./ sql.sh
SQL M!)>!
!ans le langage SQL* la commande &0:A0 permet dIinsrer ou de mettre ' Pour des donnes dans
une table 1ette commande permet dI,iter dIe++ectuer plusieurs requ)tes pour sa,oir si une donne
est dP' dans la base de donnes et ainsi adapter lIutilisation dIune requ)te pour aPouter ou une autre
pour modi+ier la donne eHistante 1ette commande peut aussi sIappeler L upsert M
Attention ( bien que lIinstruction a t aPoute dans le standard SQL:"$$2* les di++rentes SAB!
nIutilisent pas toutes les m)mes mthodes pour e++ectuer un upsert
S0nta$e
La syntaHe standard pour e++ectuer un merge consiste ' utiliser une requ)te SQL semblable ' celle
ciGdessous :
MERE )*TO table1
!S)* table_re4erence
O* <condition&>
WHE* M'TCHE/ THE*
!"/'TE SET table17colonne1 8 valeur1, table17colonne2 8 valeur2
/ELETE WHERE condition&2
WHE* *OT M'TCHE/ THE*
)*SERT <colonne&1, colonne=>
('L!ES <valeur1, valeur=>
(oici les eHplications dtailles de cette requ)te :
&0:A0 34T< permet de slectionner la table ' modi+ier
@S34A et <4 permet de lister les donnes sources et la condition de correspondance
8904 &AT190! permet de d+inir la condition de mise ' Pour lorsque la condition est
,ri+ie
8904 4<T &AT190! permet de d+inir la condition dIinsertion lorsque la condition nIest pas
,ri+ie
Com%atibilit*
Les systKmes de gestion de bases de donnes peu,ent implmenter cette +onctionnalit soit de
+aRon standard* en utilisant une commande synonyme ou en utilisant une syntaHe non standard
S0nta$e standard ( SQL Ser,er* <racle* !B"* Teradata et 0DAS<L
Utilisation du terme UPS!)" ( &icroso+t SQL ATure et &ongo!B
Utilisation non standard ( &ySQL* SQLite* Firebird* 3B& !B" et &icroso+t SQL
=$/./ sql.sh
SQL ")U-CA"! "A4L!
0n SQL* la commande T:@41AT0 permet de supprimer toutes les donnes dIune table sans
supprimer la table en elleGm)me 0n dIautres mots* cela permet de purger la table 1ette instruction
di++Kre de la commande !:<B qui ' pour but de supprimer les donnes ainsi que la table qui les
contient
A noter ( lIinstruction T:@41AT0 est semblable ' lIinstruction !0L0T0 sans utilisation de 890:0
Barmi les petite di++rences T:@41AT0 est toute+ois plus rapide et utilise moins de ressource 1es
gains en per+ormance se Pusti+ie notamment parce que la requ)te nIindiquera pas le nombre
dIenregistrement supprims et quIil nIy aura pas dIenregistrement des modi+ications dans le Pournal
S0nta$e
1ette instruction sIutilise dans une requ)te SQL semblable ' celleGci :
TR!*C'TE T'#LE 3table3
!ans cet eHemple* les donnes de la table L table M seront perdues une +ois cette requ)te eHcute
!$em%le
Bour montrer un eHemple concret de lIutilisation de cette commande* nous pou,ons imagineT un
systKme in+ormatique contenant la liste des +ournitures dIune entreprise 1es donnes seraient tout
simplement stocQes dans une table L +ourniture M
"able & 5ourniture ' (
id nom date_aPout
% <rdinateur "$%2G$#G$=
" 1haise "$%2G$#G%#
2 Bureau "$%2G$>G%.
# Lampe "$%2G$/G">
3l est possible de supprimer toutes les donnes de cette table en utilisant la requ)te sui,ante :
TR!*C'TE T'#LE 34ourniture3
@ne +ois la requ)te eHcute* la table ne contiendra plus aucun enregistrement 0n dIautres mots*
toutes les lignes du tableau prsent ciGdessus auront t supprimes
=%/./ sql.sh
SQL C)!A"! ,A"A4AS!
La cration dIune base de donnes en SQL est possible en ligne de commande &)me si les
systKmes de gestion de base de donnes 6SAB!7 sont sou,ent utiliss pour crer une base* il
con,ient de connaNtre la commande ' utiliser* qui est trKs simple
S0nta$e
Bour crer une base de donnes qui sera appel L ma_base M il su++it dIutiliser la requ)te sui,ante
qui est trKs simple :
CRE'TE /'T'#'SE ma_ba&e
4ase du mme nom #ui e$iste d*D7
A,ec &ySQL* si une base de donnes porte dP' ce nom* la requ)te retournera une erreur Bour
,iter dIa,oir cette erreur* il con,ient dIutiliser la requ)te sui,ante pour &ySQL :
CRE'TE /'T'#'SE )F *OT E-)STS ma_ba&e
LIoption 3F 4<T 0D3STS permet Puste de ne pas retourner dIerreur si une base du m)me nom eHiste
dP' La base de donnes ne sera pas crase
+%tions
!ans le standard SQL la commande 1:0AT0 !ATABAS0 nIeHiste normalement pas 0n consquent
il re,ient de ,ri+ier la documentation des di++rents SAB! pour ,ri+ier les syntaHes possibles pour
d+inir des options 1es options permettent selon les cas* de d+inir les PeuH de caractKres* le
propritaire de la base ou m)me les limites de conneHion
="/./ sql.sh
SQL ,)+P ,A"A4AS!
0n SQL* la commande !:<B !ATABAS0 permet de supprimer totalement une base de donnes et
tout ce quIelle contient 1ette commande est ' utiliser a,ec beaucoup dIattention car elle permet de
supprimer tout ce qui est inclus dans une base: les tables* les donnes* les indeH S
S0nta$e
Bour supprimer la base de donnes L ma_base M* la requ)te est la sui,ante :
/RO" /'T'#'SE ma_ba&e
Attention : cela ,a supprimer toutes les tables et toutes les donnes de cette base Si ,ous nI)tes
pas sZr de ce que ,ous +aites* nIhsiteT pas ' e++ectuer une sau,egarde de la base a,ant de
supprimer
-e %as a55icBer derreur si la base ne$iste %as
Bar d+aut* si le nom de base utilis nIeHiste pas* la requ)te retournera une erreur Bour ,iter
dIobtenir cette erreur si ,ous nI)tes pas sZr du nom* il est possible dIutiliser lIoption 3F 0D3STS La
syntaHe sera alors la sui,ante :
/RO" /'T'#'SE )F E-)STS ma_ba&e
=2/./ sql.sh
SQL C)!A"! "A4L!
La commande 1:0AT0 TABL0 permet de crer une table en SQL @n tableau est une entit qui est
contenu dans une base de donnes pour stocQer des donnes ordonnes dans des colonnes La
cration dIune table sert ' d+inir les colonnes et le type de donnes qui seront contenus dans
chacun des colonne 6entier* chaNne de caractKres* date* ,aleur binaire S7
S0nta$e
La syntaHe gnrale pour crer une table est la sui,ante :
CRE'TE T'#LE nom_de_la_table
<
colonne1 t:pe_donnee&,
colonne2 t:pe_donnee&,
colonne= t:pe_donnee&,
colonneE t:pe_donnee&
>
!ans cette requ)te* # colonnes ont t d+inies Le motGcl L type_donnees M sera ' remplacer par
un motGcl pour d+inir le type de donnes 634T* !AT0* T0DT S7 Bour chaque colonne* il est
galement possible de d+inir des options telles que 6liste nonGeHhausti,e7 :
-+" -ULL ( emp)che dIenregistrer une ,aleur nulle pour une colonne
,!EAUL" ( attribuer une ,aleur par d+aut si aucune donnes nIest indique pour cette
colonne lors de lIaPout dIune ligne dans la table
P)MA)? 8!? ( indiquer si cette colonne est considre comme cl primaire pour un indeH
!$em%le
3maginons que lIont souhaite crer une table utilisateur* dans laquelle chaque ligne correspond ' un
utilisateur inscrit sur un site web La requ)te pour crer cette table peut ressembler ' ceci :
CRE'TE T'#LE utili&ateur
<
id )*T "R)M'R$ GE$ *OT *!LL,
nom ('RCH'R<1AA>,
prenom ('RCH'R<1AA>,
email ('RCH'R<2JJ>,
date_nai&&ance /'TE,
pa:& ('RCH'R<2JJ>,
ville ('RCH'R<2JJ>,
code_po&tal ('RCH'R<J>,
nombre_achat )*T
>
(oici des eHplications sur les colonnes cres :
id ( identi+iant unique qui est utilis comme cl primaire et qui nIest pas nulle
nom ( nom de lIutilisateur dans une colonne de type (A:19A: a,ec un maHimum de %$$
=#/./ sql.sh
caractKres au maHimum
%renom ( idem mais pour le prnom
email ( adresse email enregistr sous "== caractKres au maHimum
date;naissance ( date de naissance enregistr au +ormat AAAAG&&GEE 6eHemple : %/>2G%%G
%>7
%a0s ( nom du pays de lIutilisateur sous "== caractKres au maHimum
ville ( idem pour la ,ille
code;%ostal ( = caractKres du code postal
nombre;acBat ( nombre dIachat de cet utilisateur sur le site
==/./ sql.sh
SQL AL"!) "A4L!
La commande ALT0: TABL0 en SQL permet de modi+ier une table eHistante 3l est ainsi possible
dIaPouter une colonne* dIen supprimer une ou de modi+ier une colonne eHistante* par eHemple pour
changer le type
S0nta$e de base
!Iune maniKre gnrale* la commande sIutilise de la maniKre sui,ante :
'LTER T'#LE nom_table
in&truction
Le motGcl L instruction M ici sert ' dsigner une commande supplmentaire* qui sera dtaille ciG
dessous selon lIaction que lIont souhaite e++ectuer : aPouter* supprimer ou modi+ier une colonne
ADouter une colonne
S0nta$e
LIaPout dIune colonne dans une table est relati,ement simple et peut sIe++ectuer ' lIaide dIune requ)te
ressemblant ' ceci :
'LTER T'#LE nom_table
'// nom_colonne t:pe_donnee&
!$em%le
Bour aPouter une colonne qui correspond ' une rue sur une table utilisateur* il est possible dIutiliser la
requ)te sui,ante :
'LTER T'#LE utili&ateur
'// adre&&e_rue ('RCH'R<2JJ>
Su%%rimer une colonne
@ne syntaHe permet galement de supprimer une colonne pour une table 3l y a " maniKres
totalement qui,alente pour supprimer une colonne :
'LTER T'#LE nom_table
/RO" nom_colonne
<u 6le rsultat sera le m)me7
'LTER T'#LE nom_table
/RO" COL!M* nom_colonne
Modi5ier une colonne
Bour modi+ier une colonne* comme par eHemple changer le type dIune colonne* il y a di++rentes
syntaHes selon le SAB!
=5/./ sql.sh
M0SQL
'LTER T'#LE nom_table
MO/)F$ nom_colonne t:pe_donnee&
PostgreSQL
'LTER T'#LE nom_table
'LTER COL!M* nom_colonne T$"E t:pe_donnee&
3ci* le motGcl L type_donnees M est ' remplacer par un type de donnes tel que 34T* (A:19A:*
T0DT* !AT0 S
)enommer une colonne
Bour renommer une colonne* il con,ient dIindiquer lIancien nom de la colonne et le nou,eau nom de
celleGci
M0SQL
Bour &ySQL* il +aut galement indiquer le type de la colonne
'LTER T'#LE nom_table
CH'*E colonne_ancien_nom colonne_nouveau_nom t:pe_donnee&
3ci L type_donnees M peut correspondre par eHemple ' 34T* (A:19A:* T0DT* !AT0 S
PostgreSQL
Bour BostgreSQL la syntaHe est plus simple et ressemble ' ceci 6le type nIest pas demand7 :
'LTER T'#LE nom_table
RE*'ME COL!M* colonne_ancien_nom TO colonne_nouveau_nom
=>/./ sql.sh
SQL ,)+P "A4L!
La commande !:<B TABL0 en SQL permet de supprimer d+initi,ement une table dIune base de
donnes 1ela supprime en m)me temps les ,entuels indeH* trigger* contraintes et permissions
associes ' cette table
Attention ( il +aut utiliser cette commande a,ec attention car une +ois supprime* les donnes sont
perdues A,ant de lIutiliser sur une base importante il peut )tre PudicieuH dIe++ectuer un bacQup 6une
sau,egarde7 pour ,iter les mau,aises surprises
S0nta$e
Bour supprimer une table L nom_table M il su++it simplement dIutiliser la syntaHe sui,ante :
/RO" T'#LE nom_table
A savoir ( sIil y a une dpence a,ec une autre table* il est recommand de les supprimer a,ant de
supprimer la table 1Iest le cas par eHemple sIil y a des cls trangKres
nt*rts
3l arri,e quIune table soit cr temporairement pour stoquer des donnes qui nIont pas ,ocation '
)tre rGutiliser La suppression dIune table non utilise est a,antageuH sur plusieurs aspects :
Librer de la mmoire et allger le poids des bacQups
[,iter des erreurs dans le +utur si une table porte un nom similaire ou qui porte ' con+usion
LorsquIun d,eloppeur ou administrateur de base de donnes dcou,re une application* il est
plus rapide de comprendre le systKme sIil nIy a que les tables utilises qui sont prsente
!$em%le de re#ute
3maginons quIune base de donnes possKde une table L client_"$$/ M qui ne sera plus Pamais utilis
et qui eHiste dP' dans un ancien bacQup Bour supprimer cette table* il su++it dIe++ectuer la requ)te
sui,ante :
/RO" T'#LE client_2AAT
LIeHcution de cette requ)te ,a permettre de supprimer la table
=././ sql.sh
Fointure SQL
Les Pointures en SQL permettent dIassocier plusieurs tables dans une m)me requ)te 1ela permet
dIeHploiter la puissance des bases de donnes relationnelles pour obtenir des rsultats qui
combinent les donnes de plusieurs tables de maniKre e++icace
!$em%le
0n gnral* les Pointures consistent ' associer des lignes de " tables en associant lIgalit des
,aleurs dIune colonne dIune premiKre table par rapport ' la ,aleur dIune colonne dIune seconde
table 3maginons quIune base de " donnes possKde une table L utilisateur M et une autre table L
adresse M qui contient les adresses de ces utilisateurs A,ec une Pointure* il est possible dIobtenir les
donnes de lIutilisateur et de son adresse en une seule requ)te
<n peut aussi imaginer quIun site web possKde une table pour les articles 6titre* contenu* date de
publication S7 et une autre pour les rdacteurs 6nom* date dIinscription* date de naissance S7 A,ec
une Pointure il est possible dIe++ectuer une seule recherche pour a++icher un article et le nom du
rdacteur 1ela ,ite dIa,oir ' a++icher le nom du rdacteur dans la table L article M
3l y a dIautres cas de Pointures* incluant des Pointures sur la m)me table ou des Pointure dIingalit
1es cas tant asseT particulier et pas si simple ' comprendre* ils ne seront pas labor sur cette
page
"0%es de Dointures
3l y a plusieurs mthodes pour associer " tables ensemble (oici la liste des di++rentes techniques
qui sont utilises :
--!) F+- ( Pointure interne pour retourner les enregistrements quand la condition est ,rai
dans les " tables 1Iest lIune des Pointures les plus communes
C)+SS F+- ( Pointure croise permettant de +aire le produit cartsien de " tables 0n
dIautres mots* permet de Poindre chaque lignes dIune table a,ec chaque lignes dIune seconde
table Attention* le nombre de rsultats est en gnral trKs le,
L!E" F+- .ou L!E" +U"!) F+-/ ( Pointure eHterne pour retourner tous les
enregistrements de la table de gauche 6L0FT ` gauche7 m)me si la condition nIest pas ,ri+i
dans lIautre table
)>2" F+- .ou )>2" +U"!) F+-/ ( Pointure eHterne pour retourner tous les
enregistrements de la table de droite 6:3A9T ` droite7 m)me si la condition nIest pas ,ri+i
dans lIautre table
EULL F+- .ou EULL +U"!) F+-/ ( Pointure eHterne pour retourner les rsultats quand la
condition est ,rai dans au moins une des " tables
S!LE F+- ( permet dIe++ectuer une Pointure dIune table a,ec elleGm)me comme si cItait une
autre table
-A"U)AL F+- ( Pointure naturelle entre " tables sIil y a au moins une colonne qui porte le
m)me nom entre les " tables SQL
U-+- F+- ( Pointure dIunion
=//./ sql.sh
SQL --!) F+-
!ans le langage SQL la commande 3440: E<34* aussi appele 0Q@3E<34* est un type de Pointures
trKs communes pour lier plusieurs tables entreGelles 1ette commande retourne les enregistrements
lorsquIil y a au moins une ligne dans chaque colonne qui correspond ' la condition
S0nta$e
Bour utiliser ce type de Pointure il con,ient dIutiliser une requ)te SQL a,ec cette syntaHe :
SELECT *
FROM table1
)**ER 5O)* table2 O* table17id 8 table2749_id
La syntaHe ciGdessus stipule quIil +aut slectionner les enregistrements des tables table% et table"
lorsque les donnes de la colonne L id M de table% est gal auH donnes de la colonne +Q_id de
table"
La Pointure SQL peuH aussi )tre crite de la +aRon sui,ante :
SELECT *
FROM table1
)**ER 5O)* table2
WHERE table17id 8 table2749_id
La syntaHe a,ec la condition 890:0 est une maniKre alternati,e de +aire la Pointure mais qui
possKde lIincon,nient dI)tre moins +acile ' lire sIil y a dP' plusieurs conditions dans le 890:0
!$em%le
3maginons une application qui possKde une table utilisateur ainsi quIune table commande qui
contient toutes les commandes e++ectues par les utilisateurs
"able utilisateur (
id prenom nom email ville
1 Aime Marechal aime.marechal@example.com Paris
2 Esme Lefort esmee.lefort@example.com Lyon
3 Marine Prevost m.prevost@example.com Lille
4 Luc Rolland lucrolland@example.com Marseille
"able commande (
5$/./ sql.sh
utilisateur_id date_achat num_facture prix_total
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
Bour a++icher toutes les commandes associes auH utilisateurs* il est possible dIutiliser la requ)te
sui,ante :
SELECT id, prenom, nom, date_achat, num_4acture, pri%_total
FROM utili&ateur
)**ER 5O)* commande O* utili&ateur7id 8 commande7utili&ateur_id
)*sultats (
id prenom nom date_achat num_facture prix_total
1 Aime Marechal 2013-01-23 A00103 203.14
1 Aime Marechal 2013-02-14 A00104 124.00
2 Esme Lefort 2013-02-17 A00105 149.45
2 Esme Lefort 2013-02-21 A00106 235.35
Le rsultat de la requ)te montre par+aite la Pointure entre les " tables Les utilisateurs 2 et # ne sont
pas a++ichs puisquIil nIy a pas de commandes associs ' ces utilisateurs
Attention ( il est important de noter que si un utilisateur ' t supprim* alors on ne ,erra pas ses
commandes dans la liste puisque 3440: E<34 retourne uniquement les rsultats ou la condition est
,rai dans les " tables
5%/./ sql.sh
SQL C)+SS F+-
!ans le langage SQL* la commande 1:<SS E<34 est un type de Pointure sur " tables SQL qui
permet de retourner le produit cartsien Autrement dit* cela permet de retourner chaque ligne dIune
table a,ec chaque ligne dIune autre table Ainsi e++ectuer le produit cartsien dIune table A qui
contient 2$ rsultats a,ec une table B de #$ rsultats ,a produire %"$$ rsultats 62$ H #$ ` %"$$7 0n
gnral la commande 1:<SS E<34 est combine a,ec la commande 890:0 pour +iltrer les
rsultats qui respectent certaines conditions
Attention* le nombre de rsultat peut +acilement )tre trKs le, SIil est e++ectu sur des tables a,ec
beaucoup dIenregistrements* cela peut ralentir sensiblement le ser,eur
S0nta$e
Bour e++ectuer un Pointure a,ec 1:<SS E<34* il con,ient dIe++ectuer une requ)te SQL respectant la
syntaHe sui,ante :
SELECT *
FROM table1
CROSS 5O)* table2
&thode alternati,e pour retourner les m)mes rsultats :
SELECT *
FROM table1, table2
LIune ou lIautre de ces syntaHes permettent dIassocier tous les rsultats de table% a,ec chacun des
rsultats de table"
!$em%le
3maginons une application de recettes de cuisines qui contient " tables dIingrdients* la table legume
et la table +ruit
"able legume (
l_id l_nom_fr_fr l_nom_en_gb
45 Carotte Carott
46 Oignon Onion
47 Poireau Leek
"able 5ruit (
f_id f_nom_fr_fr f_nom_en_gb
87 Banane Banana
88 Kiwi Kiwi
89 Poire Pear
5"/./ sql.sh
Bour une raison quelconque lIapplication doit associer tous les lgumes a,ec tous les +ruits Toutes
les combinaisons doi,ent )tre a++iches Bour cela il con,ient dIe++ectuer lIune ou lIautre des requ)tes
sui,antes :
SELECT l_id, l_nom_4r_4r, 4_id, 4_nom_4r_4r
FROM le6ume
CROSS 5O)* 4ruit
ou :
SELECT l_id, l_nom_4r_4r, 4_id, 4_nom_4r_4r
FROM le6ume, 4ruit
)*sultats (
l_id l_nom_fr_fr f_id f_nom_fr_fr
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
47 Poireau 89 Poire
Le rsultat montre bien que chaque lgume est associ ' chaque +ruit A,ec 2 +ruits et 2 lgumes* il y
a donc / lignes de rsultats 62 H2 ` /7
52/./ sql.sh
SQL L!E" F+-
!ans le langage SQL* la commande L0FT E<34 6aussi appele L0FT <@T0: E<347 est un type de
Pointure entre " tables 1ela permet de lister tous les rsultats de la table de gauche 6le+t ` gauche7
m)me sIil nIy a pas de correspondance dans la deuHiKme tables
S0nta$e
Bour lister les enregistrement de table%* m)me sIil nIy a pas de correspondance a,ec table"* il
con,ient dIe++ectuer une requ)te SQL utilisant la syntaHe sui,ante
SELECT *
FROM table1
LEFT 5O)* table2 O* table17id 8 table2749_id
La requ)te peuH aussi sIcrire de la +aRon sui,ante :
SELECT *
FROM table1
LEFT O!TER 5O)* table2 O* table17id 8 table2749_id
1ette requ)te est particuliKrement intressante pour rcuprer les in+ormations de table% tout en
rcuprant les donnes associes* m)me sIil nIy a pas de correspondance a,ec table" A sa,oir* sIil
nIy a pas de correspondance les colonnes de table" ,audront toutes 4@LL
!$em%le
3maginons une application contenant des utilisateurs et des commandes pour chacun de ces
utilisateurs La base de donnes de cette application contient une table pour les utilisateurs et
sau,egarde leurs achats dans une seconde table Les " tables sont relies grJce ' la colonne
utilisateur_id de la table des commandes 1ela permet dIassocier une commande ' un utilisateur
"able utilisateur (
id prenom nom email ville
1 Aime Marechal aime.marechal@example.com Paris
2 Esme Lefort esmee.lefort@example.com Lyon
3 Marine Prevost m.prevost@example.com Lille
4 Luc Rolland lucrolland@example.com Marseille
"able commande (
5#/./ sql.sh
utilisateur_id date_achat num_facture prix_total
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
Bour lister tous les utilisateurs a,ec leurs commandes et a++icher galement les utilisateurs qui nIont
pas e++ectues dIachats* il est possible dIutiliser la requ)te sui,ante :
SELECT *
FROM utili&ateur
LEFT 5O)* commande O* utili&ateur7id 8 commande7utili&ateur_id
)*sultats (
id prenom nom date_achat num_facture prix_total
1 Aime Marechal 2013-01-23 A00103 203.14
1 Aime Marechal 2013-02-14 A00104 124.00
2 Esme Lefort 2013-02-17 A00105 149.45
2 Esme Lefort 2013-02-21 A00106 235.35
3 Marine Prevost NULL NULL NULL
4 Luc Rolland NULL NULL NULL
Les derniKres lignes montrent des utilisateurs qui nIont e++ectue aucune commande La ligne
retourne la ,aleur 4@LL pour les colonnes concernant les achats quIils nIont pas e++ectus
Eiltrer sur la valeur -ULL
Attention* la ,aleur 4@LL nIest pas une chaNne de caractKre Bour +iltrer sur ces caractKres il +aut
utiliser la commande 3S 4@LL Bar eHemple* pour lister les utilisateurs qui nIont pas e++ectus
dIachats il est possible dIutiliser la requ)te sui,ante
SELECT id, prenom, nom, utili&ateur_id
FROM utili&ateur
LEFT 5O)* commande O* utili&ateur7id 8 commande7utili&ateur_id
WHERE utili&ateur_id )S *!LL
)*sultats (
id prenom nom utilisateur_id
3 Marine Prevost NULL
4 Luc Rolland NULL
5=/./ sql.sh
SQL )>2" F+-
0n SQL* la commande :3A9T E<34 6ou :3A9T <@T0: E<347 est un type de Pointure entre " tables
qui permet de retourner tous les enregistrements de la table de droite 6right ` droite7 m)me sIil nIy a
pas de correspondance a,ec la table de gauche SIil y a un enregistrement de la table de droite qui
ne trou,e pas de correspondance dans la table de gauche* alors les colonnes de la table de gauche
auront 4@LL pour ,aleur
S0nta$e
LIutilisation de cette commande SQL sIe++ectue de la +aRon sui,ante :
SELECT *
FROM table1
R)HT 5O)* table2 O* table17id 8 table2749_id
La syntaHe de cette requ)te SQL peuH aussi sIcrire de la +aRon sui,ante :
SELECT *
FROM table1
R)HT O!TER 5O)* table2 O* table17id 8 table2749_id
1ette syntaHe stipule quIil +aut lister toutes les lignes du tableau table" 6tableau de droite7 et a++icher
les donnes associes du tableau table% sIil y a une correspondance entre 3! de table% et F?_3! de
table" SIil nIy a pas de correspondance* lIenregistrement de table" sera a++ich et les colonnes de
table% ,audront toutes 4@LL
!$em%le
Brenons lIeHemple dIune base de donnes qui contient des utilisateurs et un historique dIachat de
ces utilisateurs 1ette " tables sont relies entre grJce ' la colonne utilisateur_id de la table des
commandes 1ela permet de sa,oir ' quel utilisateur est associ un achat
"able utilisateur (
id prenom nom email ville actif
1 Aime Marechal aime.marechal@example.com Paris 1
2 Esme Lefort esmee.lefort@example.com Lyon 0
3 Marine Prevost m.prevost@example.com Lille 1
4 Luc Rolland lucrolland@example.com Marseille 1
"able commande (
55/./ sql.sh
utilisateur_id date_achat num_facture prix_total
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
Bour a++icher toutes les commandes a,ec le nom de lIutilisateur correspondant il est normalement
dIhabitude dIutiliser 3440: E<34 en SQL &alheureusement* si lIutilisateur a t supprim de la
table* alors Ra ne retourne pas lIachat LIutilisation de :3A9T E<34 permet de retourner tous les
achats et dIa++icher le nom de lIutilisateur sIil eHiste Bour cela il con,ient dIutiliser cette requ)te :
SELECT id, prenom, nom, utili&ateur_id, date_achat, num_4acture
FROM utili&ateur
R)HT 5O)* commande O* utili&ateur7id 8 commande7utili&ateur_id
)*sultats (
id prenom nom utilisateur_id date_achat num_facture
1 Aime Marechal 1 2013-01-23 A00103
1 Aime Marechal 1 2013-02-14 A00104
2 Esme Lefort 2 2013-02-17 A00105
3 Marine Prevost 3 2013-02-21 A00106
NULL NULL NULL 5 2013-03-02 A00107
1e rsultat montre que la +acture A$$%$> est lie ' lIutilisateur numro = <r* cet utilisateur nIeHiste
pas ou nIeHiste plus ArJce ' :3A9T E<34* lIachat est tout de m)me a++ich mais les in+ormations
lies ' lIutilisateur sont remplac par 4@LL
5>/./ sql.sh
SQL EULL F+-
!ans le langage SQL* la commande F@LL E<34 6ou F@LL <@T0: E<347 permet de +aire une
Pointure entre " tables LIutilisation de cette commande permet de combiner les rsultats des " tables*
les associer entre euH grJce ' une condition et remplir a,ec des ,aleurs 4@LL si la condition nIest
pas respecte
S0nta$e
Bour retourner les enregistrements de table% et table"* il con,ient dIutiliser une requ)te SQL a,ec
une syntaHe telle que celleGci :
SELECT *
FROM table1
F!LL 5O)* table2 O* table17id 8 table2749_id
1ette requ)te peut aussi )tre conRu de cette +aRon :
SELECT *
FROM table1
F!LL O!TER 5O)* table2 O* table17id 8 table2749_id
La condition prsente ici consiste ' lier les tables sur un identi+iant* mais la condition peut )tre
d+inie sur dIautres champs
!$em%le
Brenons lIeHemple dIune base de donnes qui contient une table utilisateur ainsi quIune table
commande qui contient toutes les ,entes
"able utilisateur (
id prenom nom email ville actif
1 Aime Marechal aime.marechal@example.com Paris 1
2 Esme Lefort esmee.lefort@example.com Lyon 0
3 Marine Prevost m.prevost@example.com Lille 1
4 Luc Rolland lucrolland@example.com Marseille 1
"able commande (
utilisateur_id date_achat num_facture prix_total
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
5././ sql.sh
3l est possible dIutiliser F@LL E<34 pour lister tous les utilisateurs ayant e++ectu ou non une ,ente* et
de lister toutes les ,entes qui sont associes ou non ' un utilisateur La requ)te SQL est la sui,ante :
SELECT id, prenom, nom, utili&ateur_id, date_achat, num_4acture
FROM utili&ateur
F!LL 5O)* commande O* utili&ateur7id 8 commande7utili&ateur_id
)*sultat (
id prenom nom utilisateur_id date_achat num_facture
1 Aime Marechal 1 2013-01-23 A00103
1 Aime Marechal 1 2013-02-14 A00104
2 Esme Lefort 2 2013-02-17 A00105
3 Marine Prevost 3 2013-02-21 A00106
4 Luc Rolland NULL NULL NULL
NULL NULL 5 2013-03-02 A00107
1e rsultat a++iche bien lIutilisateur numro # qui nIa e++ectu aucun achat Le rsultat retourne
galement la +acture A$$%$> qui est associe ' un utilisateur qui nIeHiste pas 6ou qui nIeHiste plus7
!ans les cas oV il nIy a pas de correspondance a,ec lIautre table* les ,aleurs des colonnes ,alent
4@LL
5//./ sql.sh
SQL S!LE F+-
0n SQL* un S0LF E<34 correspond ' une Pointure dIune table a,ec elleGm)me 1e type de requ)te
nIest pas si commun mais trKs pratique dans le cas oV une table lie des in+ormations a,ec des
enregistrements de la m)me table
S0nta$e
Bour e++ectuer un S0LF E<34* la syntaHe de la requ)te SQL est la sui,ante :
SELECT 3t1373nom_colonne13, 3t1373nom_colonne23, 3t2373nom_colonne13,
3t2373nom_colonne23
FROM 3table3 a& 3t13
LEFT O!TER 5O)* 3table3 a& 3t23 O* 3t237349_id3 8 3t1373id3
3ci la Pointure est e++ectue a,ec un L0FT E<34* mais il est aussi possible de lIe++ectuer a,ec dIautres
types de Pointures
!$em%le
@n eHemple potentiel pourrait )tre une application dIun intranet dIentreprise qui possKde la table des
employs a,ec la hirarchie entre euH Les employs peu,ent )tre dirig par un suprieur direct qui
se trou,e luiGm)me dans la table
"able utilisateur (
id prenom nom email manager_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
Les enregistrements de la table ciGdessus montre bien des employs Les premiers employs nIont
pas de suprieur* tandis que les employs n_2 et n_# ont respecti,ement pour suprieur lIemploy
n_% et lIemploy n_"
3l est possible de lister sur une m)me ligne les employs a,ec leurs suprieurs direct* grJce ' une
requ)te telle que celleGci :
SELECT 3u1373u_id3, 3u1373u_nom3, 3u2373u_id3, 3u2373u_nom3
FROM 3utili&ateur3 a& 3u13
LEFT O!TER 5O)* 3utili&ateur3 a& 3u23 O* 3u2373u_mana6er_id3 8 3u1373u_id3
)*sultat (
>$/./ sql.sh
u1_id u1_prenom u1_nom u1_email u1_manager_id u2_prenom u2_nom
1 Sebastien Martin s.martin@example.com NULL NULL NULL
2 Gustave Dubois g.dubois@example.com NULL NULL NULL
3 Georgette Leroy g.leroy@example.com 1 Sebastien Martin
4 Gregory Roux g.roux@example.com 2 Gustave Dubois
>%/./ sql.sh
SQL -A"U)AL F+-
!ans le langage SQL* la commande 4AT@:AL E<34 permet de +aire une Pointure naturelle entre "
tables 1ette Pointure sIe++ectue ' la condition quIil y ai des colonnes du m)me nom et de m)me type
dans les " tables Le rsultat dIune Pointure naturelle est la cration dIun tableau a,ec autant de
lignes quIil y a de paires correspondant ' lIassociation des colonnes de m)me nom
A noter ( puisquIil +aut le m)me nom de colonne sur les " tables* cela emp)che dIutiliser certaines
rKgles de nommages pour le nom des colonnes 3l nIest par eHemple pas possible de pr+iHer le nom
des colonnes sous peine dIa,oir malheureusement " nom de colonnes di++rents
S0nta$e
La Pointure naturelle de " tables peut sIe++ectuer +acilement* comme le montre la requ)te SQL
sui,ante :
SELECT *
FROM table1
*'T!R'L 5O)* table2
LIa,antage dIun 4AT@:AL E<34 cIest quIil nIy a pas besoin dIutiliser la clause <4
!$em%le
@ne utilisation classique dIune telle Pointure pourrait )tre lIutilisation dans une application qui utilise
une table utilisateur et une table pays Si la table utilisateur contient une colonne pour lIidenti+iant du
pays* il sera possible dIe++ectuer une Pointure naturelle
"able & utilisateur ' (
user_id user_prenom user_ville pays_id
1 Jrmie Paris 1
2 Damien Lyon 2
3 Sophie Marseille NULL
4 Yann Lille 9999
5 La Paris 1
"able & %a0s ' (
pays_id pays_nom
1 France
2 Canada
3 Belgique
4 Suisse
Bour a,oir la liste de tous les utilisateurs a,ec le pays correspondant* il est possible dIe++ectuer une
>"/./ sql.sh
requ)te SQL similaire ' celleGci :
SELECT *
FROM utili&ateur
*'T!R'L 5O)* pa:&
1ette requ)te retournera le rsultat sui,ant :
pays_id user_id user_prenom user_ville pays_nom
1 1 Jrmie Paris France
2 2 Damien Lyon Canada
NULL 3 Sophie Marseille NULL
9999 4 Yann Lille NULL
1 5 La Paris France
1et eHemple montre quIil y a bien eu une Pointure entre les " tables grJce ' la colonne L pays_id M
qui se trou,e dans lIune et lIautre des tables
>2/./ sql.sh
SQL Sous-re#ute
!ans le langage SQL une sousGrequ)te 6aussi appel L requ)te imbrique M ou L requ)te en
cascade M7 consiste ' eHcuter une requ)te ' lIintrieur dIune autre requ)te @ne requ)te imbrique
est sou,ent utilise au sein dIune clause 890:0 ou de 9A(34A pou remplacer une ou plusieurs
constante
S0nta$e
3l y a plusieurs +aRons dIutiliser les sousGrequ)tes !e cette +aRon il y a plusieurs syntaHes
en,isageables pour utiliser des requ)tes dans des requ)tes
)e#ute imbri#u*e #ui retourne un seul r*sultat
LIeHemple ciGdessous est une eHemple typique dIune sousGrequ)te qui retourne un seul rsultat ' la
requ)te principale
SELECT *
FROM 3table3
WHERE 3nom_colonne3 8 <
SELECT 3valeur3
FROM 3table23
L)M)T 1
>
1et eHemple montre une requ)te interne 6celle sur L table"\7 qui ren,oi une seule ,aleur La requ)te
eHterne quant ' elle* ,a chercher les rsultat de L table M et +iltre les rsultats ' partir de la ,aleur
retourne par la requ)te interne
A noter ( il est possible dIutiliser nIimporte quel oprateur dIgalit tel que `* b* c* b`* c` ou cb
)e#ute imbri#u*e #ui retourne une colonne
@ne requ)te imbrique peut galement retourne une colonne entiKre !Ks lors* la requ)te eHterne
peut utiliser la commande 34 pour +iltrer les lignes qui possKdent une des ,aleurs retournes par la
requ)te interne LIeHemple ciGdessous met en ,idence un tel cas de +igure :
SELECT *
FROM 3table3
WHERE 3nom_colonne3 )* <
SELECT 3colonne3
FROM 3table23
WHERE 3cle_etran6ere3 8 =N
>
!$em%le
La suite de cet article prsente des eHemples concrets utilisant les sousGrequ)tes
>#/./ sql.sh
3maginons un site web qui permet de poser des questions et dIy rpondre @n tel site possKde une
base de donnes a,ec une table pour les questions et une autre pour les rponses
"able & #uestion ' (
q_id q_date_ajout q_titre q_contenu
1 2013-03-24
12:54:32
Comment rparer un
ordinateur?
Bonjour, j'ai mon ordinateur de cass, comment puis-je
procder pour le rparer?
2 2013-03-26
19:27:41
Comment changer
un pneu?
Quel est la meilleur mthode pour changer un pneu
facilement ?
3 2013-04-18
20:09:56
Que faire si un
appareil est cass?
Est-il prfrable de rparer les appareils lectriques ou
d'en acheter de nouveaux?
4 2013-04-22
17:14:27
Comment faire
nettoyer un clavier
d'ordinateur?
Bonjour, sous mon clavier d'ordinateur il y a beaucoup
de poussire, comment faut-il procder pour le nettoyer?
Merci.
"able & re%onse ' (
r_id r_fk_question_id r_date_ajout r_contenu
1 1 2013-03-27
07:44:32
Bonjour. Pouvez-vous expliquer ce qui ne fonctionne pas
avec votre ordinateur? Merci.
2 1 2013-03-28
19:27:11
Bonsoir, le plus simple consiste faire appel un
professionnel pour rparer un ordinateur. Cordialement,
3 2 2013-05-09
22:10:09
Des conseils son disponible sur internet sur ce sujet.
4 3 2013-05-24
09:47:12
Bonjour. a dpend de vous, de votre budget et de vos
prfrence vis--vis de l'cologie. Cordialement,
)e#ute imbri#u*e #ui retourne un seul r*sultat
A,ec une telle application* il est peutG)tre utile de connaNtre la question lie ' la derniKre rponse
aPoute sur lIapplication 1ela peut )tre e++ectu ,ia la requ)te SQL sui,ante :
SELECT *
FROM 3?ue&tion3
WHERE ?_id 8 <
SELECT r_49_?ue&tion_id
FROM 3repon&e3
OR/ER #$ r_date_aVout /ESC
L)M)T 1
>
@ne telle requ)te ,a retourner la ligne sui,ante :
q_id q_date_ajout q_titre q_contenu
3 2013-04-18
20:09:56
Que faire si un
appareil est cass?
Est-il prfrable de rparer les appareils lectriques ou
d'en acheter de nouveaux?
>=/./ sql.sh
1e rsultat dmontre que la question lie ' la derniKre rponse sur le +orum est bien trou,e ' partir
de ce rsultat
)e#ute imbri#u*e #ui retourne une colonne
3maginons maintenant que lIont souhaite obtenir les questions lies ' toutes les rponses comprises
entre " dates 1es questions peu,ent )tre rcupre par la requ)te SQL sui,ante :
SELECT *
FROM 3?ue&tion3
WHERE ?_id )* <
SELECT r_49_?ue&tion_id
FROM 3repon&e3
WHERE r_date_aVout #ETWEE* ;2A1=DA1DA1; '*/ ;2A1=D12D=1;
>
)*sultats (
q_id q_date_ajout q_titre q_contenu
1 2013-03-24
12:54:32
Comment rparer un
ordinateur?
Bonjour, j'ai mon ordinateur de cass, comment puis-je
procder pour le rparer?
2 2013-03-26
19:27:41
Comment changer
un pneu?
Quel est la meilleur mthode pour changer un pneu
facilement ?
3 2013-04-18
20:09:56
Que faire si un
appareil est cass?
Est-il prfrable de rparer les appareils lectriques ou
d'en acheter de nouveaux?
@ne telle requ)te permet donc de rcuprer les questions qui ont eu des rponses entre " dates
1Iest pratique dans notre cas pour ,iter dIobtenir des rponses qui nIont pas eu de rponses du tout
ou pas de nou,elles rponses depuis longtemps
>5/./ sql.sh
SQL !CS"S
!ans le langage SQL* la commande 0D3STS sIutilise dans une clause conditionnelle pour sa,oir sIil y
a une prsence ou non de lignes lors de lIutilisation dIune sousGrequ)te
A noter ( cette commande nIest pas ' con+ondre a,ec la clause 34 La commande 0D3STS ,ri+ie si
la sousGrequ)te retourne un rsultat ou non* tandis que 34 ,ri+ie la concordance dIune ' plusieurs
donnes
S0nta$e
LIutilisation basique de la commande 0D3STS consiste ' ,ri+ier si une sousGrequ)te retourne un
rsultat ou non* en utilisant 0D3STS dans la clause conditionnelle La requ)te eHterne sIeHcutera
uniquement si la requ)te interne retourne au moins un rsultat
SELECT nom_colonne1
FROM 3table13
WHERE E-)STS <
SELECT nom_colonne2
FROM 3table23
WHERE nom_colonne= 8 1A
>
!ans lIeHemple ciGdessus* sIil y a au moins une ligne dans table" dont nom_colonne2 contient la
,aleur %$* alors la sousGrequ)te retournera au moins un rsultat !Ks lors* la condition sera ,ri+ie et
la requ)te principale retournera les rsultats de la colonne nom_colonne% de table%
!$em%le
!ans le but de montrer un eHemple concret dIapplication* imaginons un systKme compos dIune
table qui contient des commandes et dIune table contenant des produits
"able commande (
c_id c_date_achat c_produit_id c_quantite_produit
1 2014-01-08 2 1
2 2014-01-24 3 2
3 2014-02-14 8 1
4 2014-03-23 10 1
"able %roduit (
>>/./ sql.sh
p_id p_nom p_date_ajout p_prix
2 Ordinateur 2013-11-17 799.9
3 Clavier 2013-11-27 49.9
4 Souris 2013-12-04 15
5 Ecran 2013-12-15 250
3l est possible dIe++ectuer une requ)te SQL qui a++iche les commandes pour lesquels il y a
e++ecti,ement un produit 1ette requ)te peut )tre interprte de la +aRon sui,ante :
SELECT *
FROM commande
WHERE E-)STS <
SELECT *
FROM produit
WHERE c_produit_id 8 p_id
>
)*sultat (
c_id c_date_achat c_produit_id c_quantite_produit
1 2014-01-08 2 1
2 2014-01-24 3 2
Le rsultat dmontre bien que seul les commandes n_% et n_" ont un produit qui se trou,e dans la
table produit 6c+ la condition c_produit_id ` p_id7 1ette requ)te est intressante sachant quIelle
nIin+luence pas le rsultat de la requ)te principale* contrairement ' lIutilisation dIune Pointure qui ,a
concatner les colonnes des " tables Pointes
>././ sql.sh
SQL ALL
!ans le langage SQL* la commande ALL permet de comparer une ,aleur dans lIensemble de ,aleurs
dIune sousGrequ)te 0n dIautres mots* cette commande permet de sIassurer quIune condition est L
gale M* L di++rente M* L suprieure M* L in+rieure M* L suprieure ou gale M ou L in+rieure ou gale
M pour tous les rsultats retourn par une sousGrequ)te
S0nta$e
1ette commande sIutilise dans une clause conditionnelle entre lIoprateur de condition et la sousG
requ)te LIeHemple ciGdessous montre un eHemple basique :
SELECT *
FROM table1
WHERE condition I 'LL <
SELECT *
FROM table2
WHERE condition2
>
A savoir ( les oprateur conditionnels peu,ent )tre les sui,ants : `* c* b* cb* d`* c`* b`* db ou dc
!$em%le
3maginons une requ)te similaire ' la syntaHe de base prsente prcdemment :
SELECT colonne1
FROM table1
WHERE colonne1 I 'LL <
SELECT colonne1
FROM table2
>
A,ec cette requ)te* si nous supposons que dans table% il y a un rsultat a,ec la ,aleur %$* ,oici les
di++rents rsultats de la conditions selon le contenu de table" :
La condition est ,rai 6c+ T:@07 si table" contient eG=*$*a=f car toutes les ,aleurs sont
in+rieure ' %$
La condition est +ausse 6c+ FALS07 si table" contient e%"*5*4@LL*G%$$f car au moins une
,aleur est in+rieure ' %$
La condition est non connue 6c+ @4?4<87 si table" est ,ide
>//./ sql.sh
SQL A-? < S+M!
!ans le langage SQL* la commande A4C 6ou S<&07 permet de comparer une ,aleur a,ec le rsultat
dIune sousGrequ)te 3l est ainsi possible de ,ri+ier si une ,aleur est L gale M* L di++rente M* L
suprieur M* L suprieur ou gale M* L in+rieur M ou L in+rieur ou gale M pour au moins une des
,aleurs de la sousGrequ)te
A noter ( le motGcl S<&0 est un alias de A4C* lIun et lIautre des termes peut )tre utilis
S0nta$e
1ette commande sIutilise dans une clause conditionnelle Puste aprKs un oprateur conditionnel et
Puste a,ant une sousGrequ)te LIeHemple ciGdessous dmontre une utilisation basique de A4C dans
une requ)te SQL :
SELECT *
FROM table1
WHERE condition I '*$ <
SELECT *
FROM table2
WHERE condition2
>
1ette requ)te peut se traduire de la +aRon sui,ante : slectionner toutes les colonnes de table%* oV la
condition est suprieure ' nIimporte quel rsultat de la sousGrequ)te
A savoir ( les oprateur conditionnels peu,ent )tre les sui,ants : `* c* b* cb* d`*c`* b`* db ou dc
!$em%le
0n se basant sur lIeHemple relati,ement simple prsent ciGdessus* il est possible dIe++ectuer une
requ)te concrKte qui utilise la commande A4C :
SELECT colonne1
FROM table1
WHERE colonne1 I '*$ <
SELECT colonne1
FROM table2
>
Supposons que la table% possKde un seul rsultat dans lequel colonne% est gal ' %$
La condition est ,rai 6c+ T:@07 si table" contient e"%*%#*>f car il y a au moins une ,aleur
in+rieure ' %$
La condition est +ausse 6c+ FALS07 si table" contient e"$*%$f car aucune ,aleur est strictement
in+rieure ' %$
La condition est non connue 6c+ @4?4<87 si table" est ,ide
.$/./ sql.sh
Astuce
La commande 34 est qui,alent ' lIoprateur ` sui,i de A4C
.%/./ sql.sh
nde$ SQL
0n SQL* les indeH sont des ressources trKs utiles qui permettent dIaccder plus rapidement auH
donnes 1ette page eHplique le +onctionnement des indeH et leurs intr)ts pour accroNtre les
per+ormances de lectures des donnes
Analogie %our com%rendre les inde$ en SQL
@n indeH* dans le domaine bibliographique* permet de lister les motsGcls importants abords dans
un ou,rage et dIindiquer les pages oV le mot est mentionn Ainsi* un lecteur qui recherche une
thmatique spci+ique peut se baser sur cet indeH pour trou,er les pages qui abordent le suPet Ainsi
un indeH est une ressource non indispensable* mais cIest un un gain de temps terrible pour
lIutilisateur qui accKde +acilement ' lIin+ormation recherche
nde$ en SQL
@n indeH* dans une base de donnes se base sur le m)me principe quIun indeH dans un li,re A,ec
un indeH plac sur une ou plusieurs colonnes le systKme dIune base de donnes peut rechercher les
donnes dIabord sur lIindeH et sIil trou,e ce quIil cherche il saura plus rapidement oV se trou,e les
enregistrements concerns
1es petites ressources ont toute+ois leurs incon,nients car cela occupe de lIespace supplmentaire
dans la base de donnes Bar ailleurs* lIinsertion de donnes est plus long car les indeH sont mis '
Pour ' chaque +ois que des donnes sont insres
Anralement un indeH pourra )tre utilis dans les requ)tes utilisant les clauses 890:0* A:<@B
BC ou <:!0: BC LorsquIune base de donnes possKde un grand nombre dIenregistrements
6eHemple: plusieurs milliers ou plusieurs millions de lignes7 un indeH permet de gagner un temps
prcieuH pour la lecture de donnes
."/./ sql.sh
SQL C)!A"! -,!C
0n SQL* la commande 1:0AT0 34!0D permet de crer un indeH LIindeH est utile pour acclrer
lIeHcution dIune requ)te SQL qui lit des donnes et ainsi amliorer les per+ormances dIune
application utilisant une base de donnes
S0nta$e
Cr*er un inde$ ordinaire
La syntaHe basique pour crer un indeH est la sui,ante :
CRE'TE )*/E- 3inde%_nom3 O* 3table3K
3l est galement possible de crer un indeH sur une seule colonne en prcisant la colonne sur
laquelle doit sIappliquer lIindeH :
CRE'TE )*/E- 3inde%_nom3 O* 3table3 <3colonne13>K
LIeHemple ciGdessus ,a donc insrer lIindeH intitul L indeH_nom M sur la table nomme L table M
uniquement sur la colonne L colonne%\ Bour insrer un indeH sur plusieurs colonnes il est possible
dIutiliser la syntaHe sui,ante :
CRE'TE )*/E- 3inde%_nom3 O* 3table3 <3colonne13, 3colonne23>K
LIeHemple ciGdessus permet dIinsrer un indeH les " colonnes : colonne% et colonne"
Cr*er un inde$ uni#ue
@n indeH unique permet de spci+ier quIune ou plusieurs colonnes doi,ent contenir des ,aleurs
uniques ' chaque enregistrement Le systKme de base de donnes retournera une erreur si une
requ)te tente dIinsrer des donnes qui +eront doublons sur la cl dIunicit Bour insrer un tel indeH
il su++it dIeHcuter une requ)te SQL respectant la syntaHe sui,ante :
CRE'TE !*)0!E )*/E- 3inde%_nom3 O* 3table3 <3colonne13>K
!ans cet eHemple un indeH unique sera cr sur la colonne nomme colonne% 1ela signi+ie quIil ne
peut pas y a,oir plusieurs +ois la m)me ,aleur sur " enregistrements distincts contenus dans cette
table
3l est galement possible de crer un indeH dIunicit sur " colonnes* en respectant la syntaHe
sui,ante :
CRE'TE !*)0!E )*/E- 3inde%_nom3 O* 3table3 <3colonne13, 3colonne23>K
Convention de nommage
3l nIeHiste pas de con,ention de nommage spci+ique sur le nom des indeH* Puste des suggestions de
quelques d,eloppeurs et administrateurs de bases de donnes (oici une liste de suggestions de
pr+iHes ' utiliser pour nommer un indeH :
.2/./ sql.sh
Br+iHe L P8; M pour Primary 8ey 6traduction : cl primaire7
Br+iHe L E8; M pour Eoreign 8ey 6traduction : cl trangKre7
Br+iHe L U8; M pour Unique 8ey 6traduction : cl unique7
Br+iHe L UC; M pour Unique ndeH 6traduction : indeH unique7
Br+iHe L C; M pour chaque autre ndeC
.#/./ sql.sh
SQL !CPLA-
!ans le langage SQL* lIinstruction 0DBLA34 est ' utiliser Puste a,ant un S0L01T et permet dIa++icher
le plan dIeHcution dIune requ)te SQL 1ela permet de sa,oir de quelle maniKre le SystKme de
Aestion de Base de !onnes 6SAB!7 ,a eHcuter la requ)te et sIil ,a utiliser des indeH et lesquels
0n utilisant cette commande la requ)te ne ren,erra pas les rsultats du S0L01T mais plut^t une
analyse de cette requ)te
A noter ( le rsultat de cette instruction est di++rent selon les SAB!* tel que &ySQL ou BostgreSQL
Bar ailleurs* le nom de cette instruction di++Kre pour certains SAB! :
M0SQL ( 0DBLA34
PostgreSQL ( 0DBLA34
+racle ( 0DBLA34 BLA4
SQLite ( 0DBLA34 Q@0:C BLA4
SQL Server (
S0T S9<8BLA4_ALL : in+ormations estimes dIune requ)te SQL* a++ich au +ormat teHtuel
dtaill
S0T S9<8BLA4_T0DT : in+ormations estimes dIune requ)te SQL* a++ich au +ormat teHtuel
simple
S0T S9<8BLA4_D&L : in+ormations estimes dIune requ)te SQL* a++ich au +ormat D&L
S0T STAT3ST31S B:<F3L0 : statistiques sur lIeHcution dIune requ)te SQL* a++ich au +ormat
teHtuel
S0T STAT3ST31S D&L : statistiques sur lIeHcution dIune requ)te SQL* a++ich au +ormat D&L
Eirebird ( S0T BLA4<4LC <4g puis lIeHcution de la requ)te SQL ' analyser
S0nta$e
La syntaHe ciGdessous reprsente une requ)te SQL utilisant la commande 0DBLA34 pour &ySQL ou
BostgreSQL :
E-"L')* SELECT *
FROM 3u&er3
OR/ER #$ 3id3 /ESC
)a%%el ( dans cet eHemple* la requ)te retournera des in+ormations sur le plan dIeHcution* mais
nIa++ichera pas les L ,rai M rsultats de la requ)te
!$em%le
Bour eHpliquer concrKtement le +onctionnement de lIinstruction 0DBLA34 nous allons prendre une
table des +useauH horaires en B9B 1ette table peut )tre cr ' partir de la requ)te SQL sui,ante :
CRE'TE T'#LE )F *OT E-)STS 3timeWone&3 <
3timeWone_id3 int<1A> un&i6ned *OT *!LL '!TO_)*CREME*T,
3timeWone_6roupe_4r3 varchar<JA> /EF'!LT *!LL,
3timeWone_6roupe_en3 varchar<JA> /EF'!LT *!LL,
3timeWone_detail3 varchar<1AA> /EF'!LT *!LL,
"R)M'R$ GE$ <3timeWone_id3>
.=/./ sql.sh
> E*)*E8)nno/# /EF'!LT CH'RSET8ut4O '!TO_)*CREME*T8NTOK
La requ)te ciGdessous permet de mieuH comprendre la structure et les indeH de cette table
3maginons que lIont souhaite compter le nombre de +useauH horaires par groupe* pour cela il est
possible dIutiliser la requ)te SQL sui,ante :
SELECT timeWone_6roupe_4r, CO!*T<timeWone_detail> 'S total_timeWone
FROM 3timeWone&3
RO!" #$ timeWone_6roupe_4r
OR/ER #$ timeWone_6roupe_4r 'SC
Anal0se de la re#ute SQL
4ous allons ,oir dans notre eHemple comment &ySQL ,a eHcuter cette requ)te Bour cela* il +aut
utiliser lIinstruction 0DBLA34 :
E-"L')* SELECT timeWone_6roupe_4r, CO!*T<timeWone_detail> 'S total_timeWone
FROM 3timeWone&3
RO!" #$ timeWone_6roupe_4r
OR/ER #$ timeWone_6roupe_4r 'SC
Le retour de cette requ)te SQL est le sui,ant :
Requte SQL avec EXL!I" sans index
!ans cet eHemple on constate les champs sui,ants :
id ( identi+iant de S0L01T
select;t0%e ( type de cause S0L01T 6eHemple : S3&BL0* B:3&A:C* @43<4* !0B04!04T
@43<4* S@BQ@0:C* !0B04!04T S@BS0L01T ou !0:3(0!7
table ( table ' laquelle la ligne +ait r+rence
t0%e ( le type de Pointure utilis 6eHemple : system* const* eq_re+* re+* re+_or_null*
indeH_merge* unique_subquery* indeH_subquery* range* indeH ou ALL7
%ossible;Ge0s ( liste des indeH que &ySQL pourrait utiliser pour acclrer lIeHcution de la
requ)te !ans notre eHemple* aucun indeH nIest disponible pour acclrer lIeHcution de la
requ)te SQL
Ge0 ( cette colonne prsente les indeH que &ySQL a dcid dIutiliser pour lIeHcution de la
requ)te
Ge0;len ( indique la taille de la cl qui sera utilise SIil nIy a pas de cl* cette colonne ren,ois
4@LL
re5 ( indique quel colonne 6ou constante7 sont utiliss a,ec les lignes de la table
roHs ( estimation du nombre de ligne que &ySQL ,a de,oir analyser eHaminer pour eHcuter
la requ)te
!$tra ( in+ormation additionnelle sur la +aRon dont &ySQL ,a rsoudre la requ)te Si cette
colonne retourne des rsultats* cIest quIil y a potentiellement des indeH ' utiliser pour
.5/./ sql.sh
optimiser les per+ormances de la requ)te SQL Le message L using temporary M permet de
sa,oir que &ySQL ,a de,oir crer une table temporaire pour eHcuter la requ)te Le message
L using +ilesort M indique quant ' lui que &ySQL ,a de,oir +aire un autre passage pour
retourner les lignes dans le bon ordre
ADout dun inde$
3l est possible dIaPouter un indeH sur la colonne L timeTone_groupe_+r M ' la table qui nIen a,ait pas
'LTER T'#LE 3timeWone&3 '// )*/E- < 3timeWone_6roupe_4r3 >K
LIaPout de cet indeH ,a changer la +aRon dont &ySQL peut eHcuter une requ)te SQL 0n e++ectuant
la m)me requ)te que tout ' lIheure* les rsultats seront di++rent
Requte SQL avec EXL!I" avec index
!ans ce rsultat il est possible de constater que &ySQL ,a utiliser un lIindeH L
indeH_timeTone_groupe_+r M et quIil nIy a plus aucune in+ormation complmentaire dIindique dans la
colonne L 0Htra M
.>/./ sql.sh
Commentaires en SQL
3l peut )tre intressant dIinsrer des commentaires dans les requ)tes SQL pour mieuH sIy retrou,er
lorsquIil y a de grosses requ)tes compleHes 3l y a plusieurs +aRon de +aire des commentaires dans le
langage SQL* qui dpendent notamment du SystKme de Aestion de Base de !onnes utilises
6SAB!7 et de sa ,ersion
Commentaire double tiret ( I
Le double tiret permet de +aire un commentaire PusquI' la +in de la ligne
!$em%le
SELECT * DD tout &Blectionner
FROM table1 DD dan& la table Xtable1X
Com%atibilit*
!epuis la ,ersion 2"22 de &ySQL
BostgreSQL
<racle
SQLite
Commentaire diJse ( K
Le symbole diKse permet de +aire un commentaire PusquI' la +in de la ligne
!$em%le
SELECT * Y tout &Blectionner
FROM table1 Y dan& la table Xtable1X
Com%atibilit*
&ySQL
Commentaire multi-ligne ( <L et L<
Le commentaire multiGligne ' lIa,antage de pou,oir indiquer oV commence et oV se termine le
commentaire 3l est donc possible de lIutiliser en plein milieu dIune requ)te SQL sans problKme
!$em%le
SELECT * M* tout &Blectionner *M
FROM table1 M* dan& la table Xtable1X *M
WHERE 1 8 M* e%emple en milieu de re?uete *M 1
Com%atibilit*
&ySQL
BostgreSQL
<racle
.././ sql.sh
SQL Ser,er
SQLite
4ug %otentiel %our les commentaires sur une ligne
Attention* dans certains conteHtes* si ,ous utiliseT un systKme qui ,a supprimer les retours ' la ligne*
,otre requ)te sera uniquement sur une ligne !ans une telle situation* un commentaire e++ectu a,ec
L h M dans une requ)te peut donc crer un bug
)e#ute SQL sur %lusieurs lignes (
SELECT * DD tout &Blectionner
FROM table1 DD dan& la table Xtable1X
Mme re#ute SQL sur une ligne (
SELECT * DD tout &Blectionner FROM table1 DD dan& la table Xtable1X
0n consquent il +aut se m+ier de librairies eHternes qui peu,ent rGcrire les requ)tes SQL ou alors
tout simplement se m+ier de copier/coller
.//./ sql.sh