Introduction au SQL pour débutants
Introduction au SQL pour débutants
1
SQL SELECT
L’utilisation la plus courante de SQL consiste à lire
des données issues de la base de données. Cela
s’effectue grâce à la commande SELECT, qui
retourne des enregistrements dans un tableau de
résultat. Cette commande peut sélectionner une ou
plusieurs colonnes d’une table.
2
Commande basique
L’utilisation basique de cette commande s’effectue de
la manière suivante :
SELECT nom_du_champ
FROM nom_du_tableau
Cette requête va sélectionner (SELECT) le champ
«nom_du_champ » provenant (FROM) du tableau
appelé « nom_du_tableau ».
Exemple
Imaginons une base de données appelée « client »
qui contient des informations sur les clients d’une
entreprise.
3
Table « client » :
4
Si on veut avoir la liste de toutes les villes des clients,
il suffit d’effectuer la requête suivante :
SELECT ville
FROM client
Résultat :
ville
Paris
Nantes
Lyon
Marseille
Grenoble
5
Obtenir plusieurs colonnes
Avec la même table client il est possible de lire
plusieurs colonnes à la fois. Il suffit tout simplement
de séparer les noms des champs souhaités par une
virgule. Pour obtenir les prénoms et les noms des
clients il faut alors faire la requête suivante :
SELECT prenom, nom
FROM client
6
Résultat :
prenom nom
Pierre Dupond
Sabrina Durand
Julien Martin
David Bernard
Marie Leroy
8
Identifiant prenom nom ville
1 Pierre Dupond Paris
2 Sabrina Durand Nantes
3 Julien Martin Lyon
4 David Bernard Marseille
5 Marie Leroy Grenoble
9
Cours avancé : ordre des commandes du SELECT
Cette commande SQL est relativement commune car
il est très fréquent de devoir lire les données issues
d’une base de données. Il existe plusieurs
commandes qui permettent de mieux gérer les
données que l’on souhaite lire. Voici un petit aperçu
des fonctionnalités possibles :
10
• Joindre un autre tableau aux résultats
• Filtrer pour ne sélectionner que certains
enregistrements
• Classer les résultats
• Grouper les résultats pour faire
uniquement des statistiques (note
moyenne, prix le plus élevé … )
Une requête « SELECT » peut devenir assez
longue. Juste à titre informatif, voici une
requête « SELECT » qui possède presque
toutes les commandes possibles :
11
SELECT *
FROM table
WHERE condition
GROUP BY expression
HAVING condition
{ UNION | INTERSECT | EXCEPT }
ORDER BY expression
LIMIT count
OFFSET start
12
A noter : cette requête sert d’aide-mémoire pour
savoir dans quel ordre sont utilisé chacun des
commandes au sein d’une requête SELECT.
13
SQL DISTINCT
L’utilisation de la commande SELECT en SQL permet
de lire les données d’une ou plusieurs colonnes.
Cette commande peut potentiellement afficher
des lignes en doubles. Pour éviter des
redondances dans les résultats il faut simplement
ajouter DISTINCT après le mot SELECT.
14
Commande basique
L’utilisation basique de cette commande consiste
alors à effectuer la requête suivante :
SELECT DISTINCT ma_colonne
FROM nom_du_tableau
15
Requête pour Oracle
Pour le Système de Gestion de Bases de Données
(SGBD) Oracle, cette requête est remplacée par la
commande « UNIQUE » :
SELECT UNIQUE ma_colonne
FROM nom_du_tableau
16
Exemple
Prenons le cas d’une table « client » qui contient des
noms et prénoms :
17
En utilisant seulement SELECT tout les noms sont
retournés, or la table contient plusieurs fois le
même prénom (cf. Pierre). Pour sélectionner
uniquement les prénoms uniques il faut utiliser la
requête suivante :
SELECT DISTINCT prenom
FROM client
18
Résultat :
prenom
Pierre
Sabrina
David
Marie
19
Intérêt
L’utilisation de la commande DISTINCT est très
pratique pour éviter les résultats en doubles.
Cependant, pour optimiser les performances il est
préférable d’utiliser la commande SQL GROUP BY
lorsque c’est possible.
20
SQL AS (alias)
Dans le langage SQL il est possible d’utiliser des
alias pour renommer temporairement une colonne
ou une table dans une requête. Cette astuce est
particulièrement utile pour faciliter la lecture des
requêtes.
Intérêts et utilités - Alias sur une colonne
Permet de renommer le nom d’une colonne dans les
résultats d’une requête SQL. C’est pratique pour
avoir un nom facilement identifiable dans une
application qui doit ensuite exploiter les résultats
d’une recherche.
21
Cas concrets d’utilisations :
• Une colonne qui s’appelle normalement
c_iso_3166 peut être renommée « code_pays »
(cf. le code ISO 3166 correspond au code des
pays), ce qui est plus simple à comprendre dans
le reste du code par un développeur.
• Une requête qui utilise la commande UNION sur
22
• Lorsqu’une fonction est utilisée, le nom d’une
colonne peut-être un peu complexe. Il est ainsi
possible de renommer la colonne sur laquelle il y
a une fonction SQL. Exemple : SELECT
COUNT(*) AS nombre_de_resultats FROM
`table`.
• Lorsque plusieurs colonnes sont combinées il est
plus simple de renommer la nouvelle colonne qui
est une concaténation de plusieurs champs.
23
4
1
SQL GROUP BY
La commande GROUP BY est utilisée en SQL pour
grouper plusieurs résultats et utiliser une fonction de
totaux sur un groupe de résultat. Sur une table qui
contient toutes les ventes d’un magasin, il est par
exemple possible de liste regrouper les ventes par
clients identiques et d’obtenir le coût total des achats
pour chaque client.
2
SELECT colonne1,
fonction(colonne2) FROM
table
GROUP BY colonne1
Exemple d’utilisation
Prenons en considération une table « achat » qui
résume les ventes d’une boutique :
3
id client tarif date
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
6
La manière simple de comprendre le GROUP BY
c’est tout simplement d’assimiler qu’il va éviter de
présenter plusieurs fois les mêmes lignes. C’est une
méthode pour éviter les doublons.
Juste à titre informatif, voici ce qu’on obtient de la
requête sans utiliser GROUP BY.
Requête :
SELECT client, SUM(tarif)
FROM achat
Résultat :
7
client SUM(tarif)
Pierre 262
Simon 47
Marie 38
Marie 38
Pierre 262
8
valeur. Permet de connaître le prix du panier
moyen pour de chaque client
• COUNT() pour compter le nombre de lignes
concernées. Permet de savoir combien d’achats a
été effectué par chaque client
• MAX() pour récupérer la plus haute valeur.
Pratique pour savoir l’achat le plus cher
• MIN() pour récupérer la plus petite valeur. Utile
Syntaxe
L’utilisation de HAVING s’utilise de la manière
suivante:
10
SELECT colonne1,
SUM(colonne2) FROM
nom_table
GROUP BY colonne1
HAVING fonction(colonne2) operateur valeur
Exemple
Pour utiliser un exemple concret, imaginons une
table « achat » qui contient les achats de différents
clients avec le coût du panier pour chaque achat.
Résultat :
13
client SUM(tarif)
Pierre 162
Simon 47
14
La cliente « Marie » a cumulée
38€ d’achat (un achat de 18€ et
un autre de 20€) ce qui est
inférieur à la limite de 40€
imposée par HAVING. En
conséquent cette ligne n’est pas
affichée dans le résultat.
15
SQL ORDER BY
La commande ORDER BY permet de trier les lignes
dans un résultat d’une requête SQL. Il est possible
de trier les données sur une ou plusieurs colonnes,
par ordre ascendant ou descendant.
Syntaxe
Une requête où l’ont souhaite filtrer l’ordre des
résultats utilise la commande ORDER BY de la sorte :
SELECT colonne1,
colonne2 FROM table
ORDER BY colonne1
16
Par défaut les résultats sont classés par ordre
ascendant, toutefois il est possible d’inverser l’ordre
en utilisant le suffixe DESC après le nom de la
colonne. Par ailleurs, il est possible de trier sur
plusieurs colonnes en les séparant par une virgule.
Une requête plus élaboré ressemblerais alors cela :
SELECT colonne1,
colonne2, colonne3 FROM
table
ORDER BY colonne1 DESC, colonne2 ASC
17
A noter : il n’est pas obligé d’utiliser le suffixe « ASC »
sachant que les résultats sont toujours classé par
ordre ascendant par défaut. Toutefois, c’est plus
pratique pour mieux s’y retrouver, surtout si on a
oublié l’ordre par défaut.
Exemple
Pour l’ensemble de nos exemple, nous allons
prendre une base « utilisateur » de test, qui contient
les données suivantes :
18
id nom prenom date_inscription tarif_total
Résultat :
20
id nom prenom date_inscription tarif_tot
al
4 Dubois Chloé 2012- 98
02-16
5 Dubois Simon 2012- 27
02-23
2 Dupond Fabrice 2012- 65
02-07
1 Durand Maurice 2012- 145
02-05
3 Durand Fabienn 2012- 90
e 02-13
Résultat :
22
id nom prenom date_inscription tarif_tot
al
5 Dubois Simon 2012- 27
02-23
4 Dubois Chloé 2012- 98
02-16
2 Dupond Fabrice 2012- 65
02-07
3 Durand Fabienn 2012- 90
e 02-13
1 Durand Maurice 2012- 145
02-05
23
SQL CASE
Dans le langage SQL, la commande « CASE … WHEN … »
permet d’utiliser des conditions de type
« si / sinon » (cf. if / else) similaire à un langage de
programmation pour retourner un résultat disponible
entre plusieurs possibilités. Le CASE peut être utilisé
dans n’importe quelle instruction ou clause, telle que
SELECT, UPDATE, DELETE, WHERE, ORDER BY ou HAVING.
Syntaxe
L’utilisation du CASE est possible de 2 manières
différentes:
24
• Comparer une colonne à un set de résultat possible
• Élaborer une série de conditions booléennes pour
déterminer un résultat
Comparer une colonne à un set de résultat
25
Voici la syntaxe nécessaire pour comparer une colonne à
CASE a
WHEN 1 THEN 'un'
WHEN 2 THEN 'deux'
WHEN 3 THEN 'trois'
ELSE 'autre'
END
un set d’enregistrement :
Dans cet exemple les valeurs contenus dans la colonne
«a» sont comparé à 1, 2 ou 3. Si la condition est vrai,
26
alors la valeur située après le THEN sera retournée.
A noter : la condition ELSE est facultative et sert de
ramasse-miette. Si les conditions précédentes ne sont
pas respectées alors ce sera la valeur du ELSE qui sera
retournée par défaut.
27
CASE
WHEN a=b THEN 'A égal à B'
WHEN a>b THEN 'A supérieur à B' ELSE 'A
inférieuràB'
END
29
Exemple
Pour présenter le CASE dans le langage SQL il est
possible d’imaginer une base de données utilisées par un
site de vente en ligne. Dans cette base il y a une table
contenant les achats, cette table contient le nom des
produits, le prix unitaire, la quantité achetée et une
colonne consacrée à une marge fictive sur certains
produits.
Table « achat » :
30
id nom surcharge prix_unitaire quantite
1 Produit 1.3 6 3
A
2 Produit 1.5 8 2
B
3 Produit 0.75 7 4
C
4 Produit 1 15 2
D
31
Il est possible d’effectuer une requête qui va afficher un
message personnalisé en fonction de la valeur de la
marge. Le message sera différent selon que la marge soit
égale à 1, supérieur à 1 ou inférieure à 1. La requête
peut se présenter de la façon suivante :
32
égale à 1, supérieur à 1 ou inférieure à 1. La requête
peut se présenter de la façon suivante :
END
FROM `achat`
Résultat :
34
Ce résultat montre qu’il est possible d’afficher
facilement des messages personnalisés selon des
conditions simples.
35
Afficher un prix unitaire différent selon une
condition
Avec un CASE il est aussi possible d’utiliser des requêtes
13
SELECT id, nom, marge_pourcentage,
prix_unitaire, quantite, CASE
WHEN marge_pourcentage=1 THEN
prix_unitaire WHEN
marge_pourcentage>1 THEN
prix_unitaire*2 ELSE
prix_unitaire/2
End FROM `achat`
plus élaborées. Imaginons maintenant que nous
souhaitions multiplier le prix unitaire par 2 si la marge
est supérieur à 1, la diviser par 2 si la marge est inférieure
à 1 et laisser le prix unitaire tel quel si la marge est égale
à 1. C’est possible grâce à la requête SQL :
Résultat :
37
id nom surcharge prix_unitaire quantite CASE
1 Produit 1.3 6 3 12
A
2 Produit 1.5 8 2 16
B
3 Produit 0.75 7 4 3.5
C
4 Produit 1 15 2 15
D
38
réductions selon le nombre de produits achetés :
• 1 produit acheté permet d’obtenir une réduction de -
40
18
SELECT id, nom, marge_pourcentage,
prix_unitaire, quantite, CASE quantite
WHEN 0 THEN 'Erreur'
WHEN 1 THEN 'Offre de -5% pour le
prochain achat' WHEN 2 THEN 'Offre
de -6% pour le prochain achat' WHEN
3 THEN 'Offre de -8% pour le
prochain achat' ELSE 'Offre de -10%
pour le prochain achat'
END
FROM `achat`
Résultat :
19
i nom surcharge prix_unitaire quantite CASE
d
1 Prod 1.3 6 3 Offre de -8% pour
uit A le prochain achat
2 Prod 1.5 8 2 Offre de -6% pour
uit B le prochain achat
3 Prod 0.75 7 4 Offre de -
uit C 10% pour le
prochain achat
4 Prod 1 15 2 Offre de -6% pour
uit D le prochain achat
Syntaxe
La syntaxe pour unir les résultats de 2 tableaux sans
afficher les doublons est la suivante :
SELECT * FROM table1
SELECT
4
Schéma explicatif
L’union de 2 ensembles A et B est un concept qui
consiste à obtenir tous les éléments qui correspondent à
la fois à l’ensemble A ou à l’ensemble B. Cela se résume
très simplement par un petit schéma où la zone en bleu
correspond à la zone que l’ont souhaite obtenir (dans
notre cas : tous les éléments).
5
Union de 2 ensembles
Exemple
Imaginons une entreprise qui possède plusieurs
magasins et dans chacun de ces magasins il y a une table
qui liste les clients.
La table du magasin n°1 s’appelle « magasin1_client » et
contient les données suivantes :
6
prenom nom ville date_naissance total_achat
Léon Dupuis Paris 1983-03-06 135
Marie Bernard Paris 1993-07-03 75
Sophie Dupond Marseill 1986-02-22 27
e
Marcel Martin Paris 1976-11-24 39
5
7
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
Syntaxe
La syntaxe de la requête SQL pour unir les résultats des 2
tables est la suivante :
SELECT * FROM
table1 UNION ALL
SELECT * FROM table2
Exemple
Imaginons une entreprise qui possède des bases de
données dans chacun de ces magasins. Sur ces bases de
données il y a une table de la liste des clients avec
quelques informations et le total des achats dans
l’entreprise.
La table « magasin1_client » correspond au premier
magasin :
prenom nom ville date_na total_ac
issance hat
Léon Dupuis Paris 1983-03- 135
06
Marie Bernard Paris 1993-07- 75
03
Sophie Dupond Marseill 1986-02- 27
e 22
Marcel Martin Paris 1976-11- 39
24
Syntaxe
La syntaxe à adopter pour utiliser cette
commande est la suivante :
SELECT * FROM
table1INTERSECT
SELECT * FROM table2
2
3
Dans cet exemple, il faut que les 2 tables soient similaires
(mêmes colonnes, mêmes types et même ordre). Le
résultat correspondra aux enregistrements qui existent
dans table1 et dans table2.
Schéma explicatif
L’intersection de 2 ensembles A et B correspond aux
éléments qui sont présent dans A et dans B, et seulement
ceux-là. Cela peut être représenté par un schéma
explicatif simple ou l’intersection de A et B correspond à la
zone en bleu.
Intersection de 2 ensembles
Exemple
Prenons l’exemple de 2 magasins qui appartiennent au
même groupe. Chaque magasin possède sa table de
clients.
La table du magasin n°1 est « magasin1_client » :
prenom nom ville date_na total_ac
issance hat
Léon Dupuis Paris 1983-03- 135
06
Marie Bernard Paris 1993-07- 75
03
Sophie Dupond Marseill 1986-02- 27
e 22
Marcel Martin Paris 1976-11- 39
24
2
8
Résultat :
prenom nom ville date_na total_ac
issance hat
Marie Bernard Paris 1993-07- 75
03
Marcel Martin Paris 1976-11- 39
24
31
SQL EXCEPT / MINUS
Dans le langage SQL la commande EXCEPT s’utilise entre 2
instructions pour récupérer les enregistrements de la
première instruction sans inclure les résultats de la
seconde requête. Si un même enregistrement devait être
présent dans les résultats des 2 syntaxes, ils ne seront pas
présent dans le résultat final.
A savoir : cette commande s’appelle différemment selon
les Systèmes de Gestion de Base de Données (SGBD) :
• EXCEPT : PostgreSQL
33
Cette requête permet de lister les résultats du table 1
sans inclure les enregistrements de la table 1 qui sont
aussi dans la table 2.
Attention : les colonnes de la première requête
doivent être similaires entre la première et la
deuxième requête (même nombre, même type et
même ordre).
Schéma explicatif
Cette commande permet de récupérer les éléments de
l’ensemble A sans prendre en compte les éléments de A
qui sont aussi présent dans l’ensemble B. Dans le
schéma ci-dessous seule la zone bleu sera retournée
grâce à la commande EXCEPT (ou MINUS).
Table « clients_refus_email » :
id prenom nom date_inscri
ption
1 Paul Cornu 2013-01-27
2 Manuel Guillot 2013-01-27
3 Sabine Lenoir 2013-01-29
4 Natalie Petitjean 2013-02-03
40
SQL INSERT INTO
L’insertion de données dans une table s’effectue à
l’aide de la commande INSERT INTO. Cette commande
permet au choix d’inclure une seule ligne à la base
existante ou plusieurs lignes d’un coup.
20
42
Cette syntaxe possède les avantages et inconvénients
suivants :
• Obliger de remplir toutes les données, tout en
respectant l’ordre des colonnes
• Il n’y a pas le nom de colonne, donc les fautes de
44
A noter : il est possible de ne pas renseigner toutes les
colonnes. De plus, l’ordre des colonnes n’est pas
important.
Syntaxe
Cette commande s’effectue au sein de la requête INSERT
INTO avec la syntaxe suivante :
INSERT INTO table (a, b, c)
VALUES (1, 20, 68)
ON DUPLICATE KEY UPDATE a=a+1
49
A noter : cette requête se traduit comme suit :
1. insérer les données a, b et c avec les données
respectives de 1, 20 et 68
2. Si la clé primaire existe déjà pour ces valeurs alors
c=1
Exemple
Imaginons une application qui laisse les utilisateurs voter
pour les produits qu’ils préfèrent. Le système de vote est
très simple et est basé sur des +1. La table des votes
contient le nombre de votes par produits avec la date du
premier vote et la date du dernier vote.
Table vote :
54
Dans cette requête la date et l’heure est générée
automatiquement avec la fonction NOW(). Résultat
après la première exécution de la requête :
id produit vote_co vote_first_da vote_last_da
_id unt te te
1 46 2 2012-04-25 2013-02-16
[Link] [Link]
2 39 4 2012-04-28 2013-02-14
[Link] [Link]
3 49 1 2012-04-25 2013-01-06
[Link] [Link]
4 55 1 2013-04-02 2013-04-02
[Link] [Link] 55
Ce résultat montre bien l’ajout d’une ligne en fin de table,
donc la requête a été utilisé sous la forme d’un INSERT.
Après une deuxième exécution de cette même requête le
lendemain, les données seront celles-ci:
58
Cette requête insert les données et ne produit aucune
erreur si l’enregistrement existait déjà dans la table.
A savoir : théoriquement il aurait été possible d’utiliser
INSERT IGNORE mais malheureusement cela
empêche de retourner des erreurs telles que des erreurs
de conversions de données.
Compatibilité
Pour le moment cette fonctionnalité n’est possible
qu’avec MySQL depuis la version 4.1 (date de 2003). Les
autres Systèmes de Gestion de Bases de Données
(SGBD) n’intègrent pas cette fonctionnalité. Pour
simuler cette fonctionnalité il y a quelques alternatives:
• PostgreSQL : il y a une astuce en utilisant une
Syntaxe
La syntaxe basique d’une requête utilisant UPDATE est la
suivante :
UPDATE table
SET nom_colonne_1 = 'nouvelle
valeur' WHERE condition
40
62
Cette syntaxe permet d’attribuer une nouvelle valeur à la
colonne nom_colonne_1 pour les lignes qui respectent la
condition stipulé avec WHERE. Il est aussi possible
d’attribuer la même valeur à la colonne nom_colonne_1
pour toutes les lignes d’une table si la condition WHERE
n’était pas utilisée.
A noter, pour spécifier en une seule fois plusieurs
modification, il faut séparer les attributions de valeur par
des virgules. Ainsi la syntaxe deviendrait la suivante :
UPDATE table
SET colonne_1 = 'valeur 1', colonne_2 =
'valeur 2', colonne_3 = 'valeur 3' WHERE 63
condition
Exemple
id nom rue ville code_p pays
ostal
1 Chan 12 Avenue du Puteau 92800 France
tal Petit Trianon x
2 Pierr 18 Rue de Ponthi 51300 France
e l'Allier on
3 Rom 3 Chemin du Trévéri 35190 France
ain Chiron en
66
SQL DELETE
La commande DELETE en SQL permet de supprimer des
lignes dans une table. En utilisant cette commande
associé à WHERE il est possible de sélectionner les
lignes concernées qui seront supprimées.
Attention : Avant d’essayer de supprimer des lignes, il est
recommandé d’effectuer une sauvegarde de la base de
données, ou tout du moins de la table concernée par la
suppression. Ainsi, s’il y a une mauvaise manipulation il
est toujours possible de restaurer les données.
Syntaxe
La syntaxe pour supprimer des lignes est la
suivante :
68
Attention : s’il n’y a pas de condition WHERE alors
toutes les lignes seront supprimées et la table sera alors
vide.
Exemple
Imaginons une table « utilisateur » qui contient des
informations sur les utilisateurs d’une application.
id nom prenom date_inscri
ption
1 Bazin Daniel 2012-02-13
2 Favre Constantin 2012-04-03
3 Clerc Guillaume 2012-04-12
4 Ricard Rosemond 2012-06-24
e
5 Martin Natalie 2012-07-02
70
La requête permettra alors de supprimer les utilisateurs «
Daniel » et « Constantin ». La table contiendra alors les
données suivantes :
et EXASOL
• Utilisation du terme UPSERT : Microsoft SQL Azure et
MongoDB
• Utilisation non standard : MySQL, SQLite, Firebird, IBM
Syntaxe
Cette instruction s’utilise dans une requête SQL semblable
à celle-ci :
TRUNCATE TABLE `table`
Exemple 77
Pour montrer un exemple concret de l’utilisation de
cette commande, nous pouvons imaginez un système
informatique contenant la liste des fournitures d’une
entreprise. Ces données seraient tout simplement
stockées dans une table « fourniture ».
Table « fourniture » :
id nom date_ajout
1 Ordinateur 2013-04-05
2 Chaise 2013-04-14
3 Bureau 2013-07-18
4 Lampe 2013-09-27
Il est possible de supprimer toutes les données de cette
table en utilisant la requête suivante :
TRUNCATE TABLE `fourniture`
79
SQL CREATE DATABASE
La création d’une base de données en SQL est possible
en ligne de commande. Même si les systèmes de gestion
de base de données (SGBD) sont souvent utilisés pour
créer une base, il convient de connaître la commande à
utiliser, qui est très simple.
Syntaxe
Pour créer une base de données qui sera appelé «
ma_base » il suffit d’utiliser la requête suivante qui est
très simple :
CREATE DATABASE ma_base 80
Base du même nom qui existe déjà
Avec MySQL, si une base de données porte déjà ce
nom, la requête retournera une erreur. Pour éviter
d’avoir cette erreur, il convient d’utiliser la requête
suivante pour MySQL :
CREATE DATABASE IF NOT EXISTS ma_base
60
82
SQL DROP DATABASE
En SQL, la commande DROP DATABASE permet de
supprimer totalement une base de données et tout ce
qu’elle contient. Cette commande est à utiliser avec
beaucoup d’attention car elle permet de supprimer tout
ce qui est inclus dans une base: les tables, les données,
les index …
Syntaxe
Pour supprimer la base de données « ma_base », la
requête est la suivante :
DROP DATABASE ma_base 83
Attention : cela va supprimer toutes les tables et toutes
les données de cette base. Si vous n’êtes pas sûr de ce
que vous faites, n’hésitez pas à effectuer une sauvegarde
de la base avant de supprimer.
84
SQL CREATE TABLE
La commande CREATE TABLE permet de créer une table
en SQL. Un tableau est une entité qui est contenu dans
une base de données pour stocker des données
ordonnées dans des colonnes. La création d’une table
sert à définir les colonnes et le type de données qui
seront contenus dans chacun des colonne (entier, chaîne
de caractères, date, valeur binaire …).
Syntaxe
La syntaxe générale pour créer une table est la suivante :
CREATE TABLE
nom_de_la_table (
colonne1 type_donnees,
colonne2 type_donnees,
colonne3 type_donnees,
colonne4 type_donnees
)
Dans cette requête, 4 colonnes ont été définies. Le mot-
clé « type_donnees » sera à remplacer par un mot-clé
pour définir le type de données (INT, DATE, TEXT …). Pour
chaque colonne, il est également possible de définir des
options telles que (liste non-exhaustive) :
• NOT NULL : empêche d’enregistrer une valeur nulle
pour une colonne.
• DEFAULT : attribuer une valeur par défaut si
aucune données n’est indiquée pour cette colonne
lors de l’ajout d’une ligne dans la table.
• PRIMARY KEY : indiquer si cette colonne est considérée
Syntaxe de base
D’une manière générale, la commande s’utilise de la
manière suivante :
ALTER TABLE
nom_table 91
instruction
Le mot-clé « instruction » ici sert à désigner une
commande supplémentaire, qui sera détaillée ci-
dessous selon l’action que l’ont souhaite effectuer :
ajouter, supprimer ou modifier une colonne.
93
Supprimer une colonne
Une syntaxe permet également de supprimer une
colonne pour une table. Il y a 2 manières totalement
équivalente pour supprimer une colonne :
ALTER TABLE nom_table
DROP nom_colonne
nom_colonne
Modifier une colonne
Pour modifier une colonne, comme par exemple
changer le type d’une colonne, il y a différentes
syntaxes selon le SGBD.
MySQL
ALTER TABLE nom_table
MODIFY nom_colonne type_donnees
PostgreSQL
ALTER TABLE nom_table
ALTER COLUMN nom_colonne TYPE type_donnees
97
Ici « type_donnees » peut correspondre par exemple à
INT, VARCHAR, TEXT, DATE …
PostgreSQL
Pour PostgreSQL la syntaxe est plus simple et ressemble à
ceci (le type n’est pas demandé) :
ALTER TABLE nom_table
RENAME COLUMN colonne_ancien_nom TO colonne_nouveau_nom
98
SQL DROP TABLE
La commande DROP TABLE en SQL permet de supprimer
définitivement une table d’une base de données. Cela
supprime en même temps les éventuels index, trigger,
contraintes et permissions associées à cette table.
Attention : il faut utiliser cette commande avec attention
car une fois supprimée, les données sont perdues. Avant
de l’utiliser sur une base importante il peut être judicieux
d’effectuer un backup (une sauvegarde) pour éviter les
mauvaises surprises.
Syntaxe
Pour supprimer une table « nom_table » il suffit
simplement d’utiliser la syntaxe suivante :
DROP TABLE nom_table
80
102
Jointure SQL
Les jointures en SQL permettent d’associer plusieurs
tables dans une même requête. Cela permet d’exploiter
la puissance des bases de données relationnelles pour
obtenir des résultats qui combinent les données de
plusieurs tables de manière efficace.
Exemple
En général, les jointures consistent à associer des lignes
de 2 tables en associant l’égalité des valeurs d’une
colonne d’une première table par rapport à la valeur
d’une colonne d’une seconde table. Imaginons qu’une
base de 2 données possède une table « utilisateur » et
une autre table « adresse » qui contient les adresses de
ces utilisateurs. Avec une jointure, il est possible d’obtenir
les données de l’utilisateur et de son adresse en une seule
requête.
On peut aussi imaginer qu’un site web possède une table
pour les articles (titre, contenu, date de publication …) et
une autre pour les rédacteurs (nom, date d’inscription,
date de naissance …). Avec une jointure il est possible
d’effectuer une seule recherche pour afficher un article et
le nom du rédacteur. Cela évite d’avoir à afficher le nom
du rédacteur dans la table « article ».
Il y a d’autres cas de jointures, incluant des jointures sur
la même table ou des jointure d’inégalité. Ces cas étant
assez particulier et pas si simple à comprendre, ils ne
seront pas élaboré sur cette page.
Types de jointures
Il y a plusieurs méthodes pour associer 2 tables
ensemble. Voici la liste des différentes techniques qui
sont utilisées :
• INNER JOIN : jointure interne pour retourner les
Syntaxe
Pour utiliser ce type de jointure il convient d’utiliser une
requête SQL avec cette syntaxe :
10
8
SELECT *
FROM table1
INNER JOIN table2 ON [Link] = table2.fk_id
Exemple
Imaginons une application qui possède une table
utilisateur ainsi qu’une table commande qui contient
toutes les commandes effectuées par les utilisateurs.
Table utilisateur :
id preno nom email ville
m
1 Aimée Marec [Link]@ex Paris
hal [Link]
2 Esmée Lefort [Link]@exam Lyon
[Link]
3 Marine Prevost [Link]@exampl Lille
[Link]
4 Luc Rolland lucrolland@exampl Marse
[Link] ille
Table commande :
90
112
utilisateur_ date_achat num_factu prix_total
id re
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
Syntaxe
Pour effectuer un jointure avec CROSS JOIN, il convient
d’effectuer une requête SQL respectant la syntaxe
suivante :
SELECT *
FROM table1
CROSS JOIN table2
11
7
Méthode alternative pour retourner les
SELECT *
FROM table1, table2
mêmes résultats :
L’une ou l’autre de ces syntaxes permettent d’associer
tous les résultats de table1 avec chacun des résultats de
table2.
Exemple
Imaginons une application de recettes de cuisines qui
contient 2 tables d’ingrédients, la table legume et la table
fruit.
11
Table legume : 8
l_id l_nom_fr_fr l_nom_en_gb
45 Carotte Carott
46 Oignon Onion
47 Poireau Leek
Table fruit :
ou :
SELECT l_id, l_nom_fr_fr, f_id, f_nom_fr_fr
FROM legume, fruit
12
0
Résultats :
l_id l_nom_fr_f f_id f_nom_fr_f
r r
45 Carotte 87 Banane
45 Carotte 88 Kiwi
45 Carotte 89 Poire
46 Oignon 87 Banane
46 Oignon 88 Kiwi
46 Oignon 89 Poire
47 Poireau 87 Banane
12
1
47 Poireau 88 Kiwi
47 Poireau 89 Poire
100
122
SQL LEFT JOIN
Dans le langage SQL, la commande LEFT JOIN (aussi
appelée LEFT OUTER JOIN) est un type de jointure entre 2
tables. Cela permet de lister tous les résultats de la table
de gauche (left = gauche) même s’il n’y a pas de
correspondance dans la deuxième tables.
Syntaxe
Pour lister les enregistrement de table1, même s’il n’y
a pas de correspondance avec table2, il convient
d’effectuer une requête SQL utilisant la syntaxe
suivante.
101
123
SELECT *
FROM table1
LEFT JOIN table2 ON [Link] = table2.fk_id
Exemple
Imaginons une application contenant des utilisateurs et
des commandes pour chacun de ces utilisateurs. La base
de données de cette application contient une table pour
les utilisateurs et sauvegarde leurs achats dans une
seconde table. Les 2 tables sont reliées grâce à la colonne
utilisateur_id de la table des commandes. Cela permet
d’associer une commande à un utilisateur.
Table utilisateur :
id preno nom email ville
m
1 Aimée Marec [Link]@ex Paris
hal [Link]
2 Esmée Lefort [Link]@exam Lyon
[Link]
3 Marine Prevost [Link]@exampl Lille
[Link]
4 Luc Rolland lucrolland@exampl Marse
[Link] ille
Table commande :
utilisateur_ date_achat num_factu prix_total
id re
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
Résultats :
Résultats :
130
id prenom nom utilisateur_
id
3 Marine Prevost NULL
4 Luc Rolland NULL
132
SQL RIGHT JOIN
En SQL, la commande RIGHT JOIN (ou RIGHT OUTER JOIN)
est un type de jointure entre 2 tables qui permet de
retourner tous les enregistrements de la table de droite
(right = droite) même s’il n’y a pas de correspondance
avec la table de gauche. S’il y a un enregistrement de la
table de droite qui ne trouve pas de correspondance dans
la table de gauche, alors les colonnes de la table de
gauche auront NULL pour valeur.
Syntaxe
L’utilisation de cette commande SQL s’effectue de la façon
110
133
suivante :
SELECT *
FROM table1
RIGHT JOIN table2 ON [Link] = table2.fk_id
Exemple
Prenons l’exemple d’une base de données qui contient
des utilisateurs et un historique d’achat de ces
utilisateurs. Cette 2 tables sont reliées entre grâce à la
colonne utilisateur_id de la table des commandes. Cela
permet de savoir à quel utilisateur est associé un achat.
Table utilisateur :
id preno nom email ville actif
m
1 Aimé Marec [Link] Paris 1
e hal @[Link]
2 Esmé Lefort [Link]@e Lyon 0
e [Link]
3 Marin Prevo [Link]@exa Lille 1
e st [Link]
4 Luc Rollan lucrolland@exa Marse 1
d [Link] ille
Table commande :
utilisateur_ date_achat num_factu prix_total
id re
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
Résultats : 138
id preno nom utilisate date_ac num_factu
m ur_id hat re
1 Aimé Marec 1 2013- A00103
e hal 01-23
1 Aimé Marec 1 2013- A00104
e hal 02-14
2 Esmé Lefort 2 2013- A00105
e 02-17
3 Marin Prevo 3 2013- A00106
e st 02-21
NU NULL NULL 5 2013- A00107
LL 03-02
Ce résultat montre que la facture A00107 est liée à
l’utilisateur numéro 5. Or, cet utilisateur n’existe pas ou
n’existe plus. Grâce à RIGHT JOIN, l’achat est tout de
même affiché mais les informations liées à l’utilisateur
sont remplacé par NULL.
SQL FULL JOIN
Dans le langage SQL, la commande FULL JOIN (ou FULL
OUTER JOIN) permet de faire une jointure entre 2 tables.
L’utilisation de cette commande permet de combiner les
résultats des 2 tables, les associer entre eux grâce à une
condition et remplir avec des valeurs NULL si la condition
n’est pas respectée.
Syntaxe
Pour retourner les enregistrements de table1 et table2,
il convient d’utiliser une requête SQL avec une syntaxe
telle que celle-ci :
SELECT *
FROM table1
FULL JOIN table2 ON [Link] = table2.fk_id
Table commande :
Résultat :
146
id preno nom utilisate date_ac num_factu
m ur_id hat re
1 Aimé Marec 1 2013- A00103
e hal 01-23
1 Aimé Marec 1 2013- A00104
e hal 02-14
2 Esmé Lefort 2 2013- A00105
e 02-17
3 Marin Prevo 3 2013- A00106
e st 02-21
4 Luc Rollan NULL NULL NULL
d
NU NULL 5 2013- A00107
LL 03-02
Syntaxe
Pour effectuer un SELF JOIN, la syntaxe de la requête SQL
est la suivante :
SELECT `t1`.`nom_colonne1`, `t1`.`nom_colonne2`, `t2`.`nom_colonne1`,
`t2`.`nom_colonne2`
FROM `table` as `t1`
LEFT OUTER JOIN `table` as `t2` ON `t2`.`fk_id` = `t1`.`id`
Exemple
Un exemple potentiel pourrait être une application d’un
intranet d’entreprise qui possède la table des employés
avec la hiérarchie entre eux. Les employés peuvent être
dirigé par un supérieur direct qui se trouve lui-même
dans la table.
Table utilisateur :
Résultat :
130
153
u1 u1_pr u1_ u1_email u1_ma u2_pr u2_
_i enom nom nager_i enom nom
d d
1 Seba Mar [Link]@e NULL NULL NUL
stien tin [Link] L
m
2 Gust Dub [Link]@e NULL NULL NUL
ave ois [Link] L
m
3 Geor Lero [Link]@ex 1 Sebas Mar
gette y [Link] tien tin
4 Greg Rou [Link]@ex 2 Gusta Dub
ory x [Link] ve ois
SQL NATURAL JOIN
Dans le langage SQL, la commande NATURAL JOIN
permet de faire une jointure naturelle entre 2 tables.
Cette jointure s’effectue à la condition qu’il y ai des
colonnes du même nom et de même type dans les 2
tables. Le résultat d’une jointure naturelle est la création
d’un tableau avec autant de lignes qu’il y a de paires
correspondant à l’association des colonnes de même
nom.
A noter : puisqu’il faut le même nom de colonne sur les 2
tables, cela empêche d’utiliser certaines règles de
nommages pour le nom des colonnes. Il n’est par exemple
pas possible de préfixer le nom des colonnes sous peine
d’avoir malheureusement 2 nom de colonnes différents.
Syntaxe
La jointure naturelle de 2 tables peut s’effectuer
facilement, comme le montre la requête SQL suivante
:
SELECT *
FROM table1
NATURAL JOIN table2
156
L’avantage d’un NATURAL JOIN c’est qu’il n’y a pas besoin
d’utiliser la clause ON.
Exemple
Une utilisation classique d’une telle jointure pourrait être
l’utilisation dans une application qui utilise une table
utilisateur et une table pays. Si la table utilisateur
contient une colonne pour l’identifiant du pays, il sera
possible d’effectuer une jointure naturelle.
Table « utilisateur » :
Table « pays » :
pays_id pays_nom
1 France
2 Canada
3 Belgique 158
4 Suisse
Syntaxe
Il y a plusieurs façons d’utiliser les sous-requêtes. De cette
façon il y a plusieurs syntaxes envisageables pour utiliser
des requêtes dans des requêtes.
Requête imbriquée qui retourne un seul
résultat
L’exemple ci-dessous est une exemple typique d’une
sous-requête qui retourne un seul résultat à la requête
principale.
SELECT *
FROM `table`
WHERE `nom_colonne` = (
SELECT `valeur`
FROM `table2`
LIMIT 1
)
162
Cet exemple montre une requête interne (celle sur «
table2″) qui renvoi une seule valeur. La requête externe
quant à elle, va chercher les résultat de « table » et filtre
les résultats à partir de la valeur retournée par la requête
interne.
A noter : il est possible d’utiliser n’importe quel opérateur
d’égalité tel que =, >, <, >=, <= ou <>.
figure :
WHERE `nom_colonne` IN (
SELECT `colonne`
FROM `table2`
WHERE `cle_etrangere` = 36
)
Exemple
La suite de cet article présente des exemples concrets
164
utilisant les sous-requêtes.
Imaginons un site web qui permet de poser des questions
et d’y répondre. Un tel site possède une base de données
avec une table pour les questions et une autre pour les
réponses.
Table « question » :
Table « reponse » :
169
Une telle requête va retourner la ligne
suivante :
q_ q_dat q_titre q_contenu
id e_ajo
ut
3 2013- Que faire Est-il préférable de
04-18 si un réparer les appareils
électriques ou
[Link] appareil d'en acheter de
56 est nouveaux?
cassé?
170
Ce résultat démontre que la question liée à la dernière
réponse sur le forum est bien trouvée à partir de ce
résultat.
Résultats :
q_ q_dat q_titre q_contenu
id e_ajo
ut
1 2013- Commen Bonjour, j'ai mon
03-24 t réparer ordinateur de cassé,
[Link] un comment puis-je
32 ordinate procéder pour le
ur? réparer?
2 2013- Commen Quel est la meilleur
03-26 t changer méthode pour changer
[Link] un pneu? un pneu facilement ?
41
3 2013- Que faire Est-il préférable de
150
173