cours_SQL

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 44

LANGAGE SQL (STRUCTURED QUERY LANGUAGE)

Introduction :

SQL est un langage d’extraction pour des bases de données relationnelles. Dans
un SGBD, SQL remplace le langage de manipulation des données pour consulter
et modifier les données et le langage de définition de données pour créer les
tables.

Comme exercice d’application on va utiliser les données d’une gestion de stock


dont le schéma de base données est le suivant :

Produit (idProd, code, libelle, prix, quantite, #idCategorie)


Categorie (idCategorie, nom, dateCreation)

1. OPERATIONS SUR LA BASE DE DONNEES:

 Création de base de données

Syntaxe :

CREATE DATABASE nom_base_de_données ;

Exemple : créer une BD appelée mabase

Create database mabase ;

 Afficher les bases déjà crées :

SHOW DATABASES;

 Ouvrir une base de données :

START DATABASE nom_base_de_données;

 Effacer une Bd non active :

DROP DATABASE nom_base_de_données;

Mlle DIAGNE Aicha J.


[email protected] 77 766 73 27
1
 Utiliser une BD :

USE nom_base_de_données;

Exemple : USE mabase ;

2. OPERATIONS SUR LES TABLES :


 Création d’une table :

CREATE TABLE nom_table (


colonne1 type,
colonne2 type,
colonne3 type,
....
);
Exemple:

CREATE TABLE produit (

idProd int,

code varchar(30),

libelle varchar(255),

prix int,

quantite int ,

idCategorie int

);
 Contraintes

Les contraintes sont utilisées pour spécifier les règles pour chaque donnée de la
table. Les principales contraintes utilisées en SQL sont les suivantes :

NOT NULL, UNIQUE, PRIMARY KEY, FOREIGN KEY, CHECK, DEFAULT, INDEX

 NOT NULL

Cette contrainte assure que la colonne spécifiée ne prenne pas de valeur nulle

Exemple :
Mlle DIAGNE Aicha J.
[email protected] 77 766 73 27
2
CREATE TABLE produit (
idProd int NOT NULL,
code varchar(30) NOT NULL,
libelle varchar(255) NOT NULL,
prix int,
quantite int,
idCategorie int NOT NULL
);

 UNIQUE

La colonne concernée doit être unique

Exemple :

CREATE TABLE produit (


idProd int NOT NULL,
code varchar(30) NOT NULL,
libelle varchar(255) NOT NULL,
prix int,
quantite int,
idCategorie int,
UNIQUE (code),
UNIQUE (libelle)
);

 PRIMARY KEY

C’est la combinaison de NOT NULL et UNIQUE. Il permet d’identifier un seul tuple


de la table.

Mlle DIAGNE Aicha J.


[email protected] 77 766 73 27
3
Exemple :

CREATE TABLE produit (


idProd int NOT NULL,
code varchar(30) NOT NULL,
libelle varchar(255) NOT NULL,
prix int,
quantite int,
idCategorie int,
UNIQUE (code),
UNIQUE (libelle),
PRIMARY KEY (idProd)
);

 FOREIGN KEY

Identifie une ligne d’une autre table. La clé étrangère permet de créer un lien
entre deux (2) tables

Exemple :

CREATE TABLE produit (


idProd int NOT NULL,
code varchar(30) NOT NULL,
libelle varchar(255) NOT NULL,
prix int,
quantite int,
idCategorie int,
UNIQUE (code),
UNIQUE (libelle),
PRIMARY KEY (idProd),
FOREIGN KEY idCategorie REFERENCES categorie (idCategorie)
);

 CHECK

Assure que la valeur de la colonne concernée satisfasse la condition spécifiée

Mlle DIAGNE Aicha J.


[email protected] 77 766 73 27
4
Exemple :

CREATE TABLE produit (


idProd int NOT NULL,
code varchar(30) NOT NULL,
libelle varchar(255) NOT NULL,
prix int,
quantite int,
idCategorie int,
UNIQUE (code),
UNIQUE (libelle),
PRIMARY KEY (idProd),
FOREIGN KEY idCategorie REFERENCES categorie (idCategorie),
CHECK (quantite >=10)
);

 DEFAULT

Attribue une valeur par défaut à la colonne si aucune valeur n’est spécifiée

Exemple :

CREATE TABLE categorie (


idCategorie int NOT NULL,
nom varchar (50) NOT NULL,
dateCreation date DEFAULT NOW(),
PRIMARY KEY (idCategorie)
);
NB : Pour les clés primaires de type int, la valeur est souvent auto-incrément c’est-
à-dire une valeur est attribuée directement à la colonne lors d’une insertion par
pas de 1

Exemple :
CREATE TABLE categorie (
idCategorie int NOT NULL auto_increment,
nom varchar (50) NOT NULL,
dateCreation date DEFAULT NOW(),
PRIMARY KEY (idCategorie)
);

Mlle DIAGNE Aicha J.


[email protected] 77 766 73 27
5
 Ajouter des champs à une table.
ALTER TABLE nom_table
ADD nom_colonne;

Exemple : ajouter la colonne stock d’alerte à la table produit


(Stalert)

ALTER TABLE produit ADD (Stalert int) ;

 Supprimer une table :

DROP TABLE nom_table;

Exemple : DROP TABLE produit ;

 Saisie des données dans les tables :

INSERT INTO nom_table (colonne1, colonne2, colonne3, ...)


VALUES (valeurColonne1, valeurColonne2, valeurColonne3, ...);

NB : les colonnes ayant la contrainte NOT NULL lors de la création de table doivent
obligatoirement avoir une valeur.

Si toutes les colonnes doivent avoir une valeur, on est pas obligé de citer les
colonnes, il faudra utiliser la syntaxe suivante en respectant l’ordre des colonnes
lors de la création:

INSERT INTO nom_table


VALUES (valeur1, valeur2, valeur3, ...);

Exemple : Ajouter la catégorie de nom « Informatique »

INSERT INTO categorie (nom, idCategorie) VALUES (‘Informatique’, 2) ;

Ou

INSERT INTO categorie (idCategorie, nom) VALUES (2,‘Informatique’) ;

Ou INSERT INTO categorie VALUES ( 2, ‘Informatique’) ;

NB : Dans le cas où l’identifiant est auto-incrément sa valeur lors de l’insertion est


null.

Mlle DIAGNE Aicha J.


[email protected] 77 766 73 27
6
Exemple :

INSERT INTO categorie (idCategorie, nom) VALUES (null,‘Informatique’) ;

 Supprimer un tuple d’une table :

DELETE FROM nom_table WHERE condition ;


Exemple: supprimer le produit de code P0431

DELETE FROM produit WHERE code=’P0431’;

 Modifier les données d’une table :

UPDATE nom_table

SET colonne1 = valeur1, colonne2 = valeur2, ...


WHERE condition;

Exemple :

Augmenter de 10 la quantite du produit « Ordinateur »

UPDATE produit SET quantite = quantite + 10 WHERE libelle = ‘Ordinateur’ ;

3. INTERROGATION D’UNE BASE DE DONNEES:

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.

Commande basique
L’utilisation basique de cette commande s’effectue de la manière suivante :

SELECT nom_du_champ FROM nom_table ;


Cette requête va sélectionner (SELECT) le champ « nom_du_champ » provenant
(FROM) du tableau appelé « nom_table».

Mlle DIAGNE Aicha J.


[email protected] 77 766 73 27
7
Exemple
Imaginons une table appelée « client » qui contient des informations sur les
clients d’une entreprise.
Table « client » :
Identifiant Prenom nom Ville
1 Pierre Dupond Paris
2 Sabrina Durand Nantes
3 Julien Martin Lyon
4 David Bernard Marseille
5 Marie Leroy Grenoble

 Si l’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

 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 ;

Mlle DIAGNE Aicha J.


[email protected] 77 766 73 27
8
Résultat :

Prenom Nom
Pierre Dupond
Sabrina Durand
Julien Martin
David Bernard
Marie Leroy

 Obtenir toutes les colonnes d’un tableau


Il est possible de retourner automatiquement toutes les colonnes d’un tableau
sans avoir à connaître le nom de toutes les colonnes. Au lieu de lister toutes les
colonnes, il faut simplement utiliser le caractère « * » (étoile). C’est un joker qui
permet de sélectionner toutes les colonnes. Il s’utilise de la manière suivante :

SELECT * FROM client ;

Cette requête retourne exactement les mêmes colonnes qu’il y a dans la base de
données. Dans notre cas, le résultat 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

Une requête SELECT peut devenir assez longue. Juste à titre informatif, voici une
requête SELECT qui possède presque toutes les commandes possibles :

SELECT * FROM table WHERE condition


GROUP BY expression
HAVING condition
{ UNION | INTERSECT | EXCEPT } ORDER BY expression ;

Mlle DIAGNE Aicha J.


[email protected] 77 766 73 27
9
 SQL DISTINCT

L’utilisation de la commande SELECT en SQL permet de lire toutes 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.

Commande basique
L’utilisation basique de cette commande consiste alors à effectuer la requête
suivante :

SELECT DISTINCT nom_colonne FROM nom_table ;


Cette requête sélectionne le champ « nom_colonne » de la table « nom_table »
en évitant de retourner des doublons.

Exemple
Prenons le cas concret d’une table « client » qui contient des noms et prénoms :

Identifiant prenom nom


1 Pierre Dupond
2 Sabrina Bernard
3 David Durand
4 Pierre Leroy
5 Marie Leroy

En utilisant seulement SELECT tous les pré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 ;

Mlle DIAGNE Aicha J.


[email protected] 77 766 73 27
1
0
Résultat :

Prenom
Pierre
Sabrina
David
Marie

Ce résultat affiche volontairement qu’une seule fois le prénom « Pierre » grâce à


l’utilisation de la commande DISTINCT qui n’affiche que les résultats distincts.

 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.

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 des champs aux noms
différents peut être ambiguë pour un développeur. En renommant les
champs avec un même nom il est plus simple de traiter les résultats.
- 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.
 Alias sur une table
Permet d’attribuer un autre nom à une table dans une requête SQL. Cela peut
aider à avoir des noms plus court, plus simple et plus facilement compréhensible.
Ceci est particulièrement vrai lorsqu’il y a des jointures.

Mlle DIAGNE Aicha J.


[email protected] 77 766 73 27
1
1
Syntaxe
La syntaxe pour renommer une table dans une requête est la suivante :

SELECT * FROM nom_table AS t1 ;


Cette requête peut également s’écrire de la façon suivante :

SELECT * FROM table t1 ;

 Alias sur une colonne


La syntaxe pour renommer une colonne de colonne1 à c1 est la suivante :

SELECT colonne1 AS c1, colonne2


FROM nom_table ;

Cette syntaxe peut également s’afficher de la façon suivante :

SELECT colonne1 c1, colonne2 FROM nom_table ;


A noter : à choisir il est préférable d’utiliser la commande « AS » pour que ce soit
plus explicite (plus simple à lire qu’un simple espace), d’autant plus que c’est
recommandé dans le standard ISO pour concevoir une requête SQL.

 SQL WHERE

La commande WHERE dans une requête SQL permet d’extraire les lignes d’une
base de données qui respectent une condition. Cela permet d’obtenir
uniquement les informations désirées.

Syntaxe
La commande WHERE s’utilise en complément à une requête utilisant SELECT. La
façon la plus simple de l’utiliser est la suivante :

SELECT nom_colonne
FROM nom_table
WHERE condition ;

Mlle DIAGNE Aicha J.


[email protected] 77 766 73 27
1
2
Exemple
Imaginons une base de données appelée « client » qui contient le nom des clients,
le nombre de commandes qu’ils ont effectués et leur ville :

Id Nom nbr_commande ville


1 Paul 3 paris
2 Maurice 0 rennes
3 Joséphine 1 toulouse
4 Gérard 7 paris

Pour obtenir seulement la liste des clients qui habitent à Paris, il faut effectuer la
requête suivante :

SELECT *
FROM client
WHERE ville = 'paris'

Résultat :

id Nom nbr_commande nbr_commande


1 Paul 3 paris
4 Gérard 7 paris

Attention : dans notre cas tout est en minuscule donc il n’y a pas eu de problème.
Cependant, si une table est sensible à la casse, il faut faire attention aux
majuscules et minuscules.

 Opérateurs de comparaisons
Il existe plusieurs opérateurs de comparaisons. La liste ci-jointe présente
quelques uns des opérateurs les plus couramment utilisés.

Mlle DIAGNE Aicha J.


[email protected] 77 766 73 27
1
3
Opérateur Description
= Égale
<> Pas égale
!= Pas égale
> Supérieur à
< Inférieur à
>= Supérieur ou égale à
<= Inférieur ou égale à
IN Liste de plusieurs valeurs possibles
BETWEEN Valeur comprise dans un intervalle donnée (utile pour les nombres ou
dates)
LIKE Recherche en spécifiant le début, milieu ou fin d'un mot.
IS NULL Valeur est nulle
IS NOT NULL Valeur n'est pas nulle

Attention : il y a quelques opérateurs qui n’existent pas dans des vieilles versions
de système de gestion de bases de données (SGBD). De plus, il y a de nouveaux
opérateurs non indiqués ici qui sont disponibles avec certains SGBD.

 SQL AND & OR

Une requête SQL peut être restreinte à l’aide de la condition WHERE. Les
opérateurs logiques AND et OR peuvent être utilisées au sein de la commande
WHERE pour combiner des conditions.

Syntaxe d’utilisation des opérateurs AND et OR


Les opérateurs sont à ajoutés dans la condition WHERE. Ils peuvent être combinés
à l’infini pour filtrer les données comme souhaités.

L’opérateur AND permet de s’assurer que la condition1 ET la condition2 sont vrai :

Mlle DIAGNE Aicha J.


[email protected] 77 766 73 27
1
4
SELECT nom_colonne
FROM nom_table
WHERE condition1 AND condition2 ;

L’opérateur OR vérifie quant à lui que la condition1 OU la condition2 est vrai :

SELECT nom_colonnes FROM nom_table


WHERE condition1 OR condition2 ;

Ces opérateurs peuvent être combinés à l’infini et mélangés. L’exemple ci-


dessous filtre les résultats de la table « nom_table » si condition1 ET condition2
OU condition3 est vrai :

SELECT nom_colonnes FROM nom_table


WHERE condition1 AND (condition2 OR condition3) ;

Attention : il faut penser à utiliser des parenthèses lorsque c’est nécessaire. Cela
permet d’éviter les erreurs car et ça améliore la lecture d’une requête par un
humain.

Exemple de données
Pour illustrer les prochaines commandes, nous allons considérer la table « produit
» suivante :

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

 Opérateur AND
L’opérateur AND permet de joindre plusieurs conditions dans une requête. En
gardant la même table que précédemment, pour filtrer uniquement les produits
informatiques qui sont presque en rupture de stock (moins de 20 produits
disponibles) il faut exécuter la requête suivante :

Mlle DIAGNE Aicha J.


[email protected] 77 766 73 27
1
5
SELECT * FROM produit
WHERE categorie = 'informatique' AND stock < 20 ;
Résultat :

Id Nom categorie stock prix


1 Ordinateur informatique 5 950
3 Souris informatique 16 30

 Opérateur OR
Pour filtrer les données pour avoir uniquement les données sur les produits «
ordinateur » ou « clavier » il faut effectuer la recherche suivante :

SELECT * FROM produit


WHERE nom = 'ordinateur' OR nom = 'clavier' ;

Résultats :

Id nom Categorie stock prix


1 ordinateur Informatique 5 950
2 clavier Informatique 32 35

 Combiner AND et OR
Il ne faut pas oublier que les opérateurs peuvent être combinés pour effectuer de
puissantes recherche. Il est possible de filtrer les produits « informatique » avec
un stock inférieur à 20 et les produits « fourniture » avec un stock inférieur à 200
avec la recherche suivante :

SELECT * FROM produit


WHERE ( categorie = 'informatique' AND stock < 20 )
OR ( categorie = 'fourniture' AND stock < 200 ) ;

Mlle DIAGNE Aicha J.


[email protected] 77 766 73 27
1
6
Résultats :
Id nom categorie stock prix
1 ordinateur informatique 5 950
2 clavier informatique 32 35
4 crayon fourniture 147 2

 SQL IN

L’opérateur logique IN dans SQL s’utilise avec la commande WHERE pour vérifier
si une colonne est égale à une des valeurs comprise dans set de valeurs
déterminées. C’est une méthode simple pour vérifier si une colonne est égale à
une valeur OU une autre valeur OU une autre valeur et ainsi de suite, sans avoir
à utiliser de multiple fois l’opérateur OR.

Syntaxe
Pour chercher toutes les lignes où la colonne « nom_colonne » est égale à ‘valeur
1′ OU ‘valeur 2′ ou ‘valeur 3′, il est possible d’utiliser la syntaxe suivante :

SELECT nom_colonne
FROM nom_table
WHERE nom_colonne IN ( valeur1, valeur2, valeur3, ... ) ;

A savoir : entre les parenthèses il n’y a pas de limite du nombre d’arguments. Il


est possible d’ajouter encore d’autres valeurs.

Cette syntaxe peut être associée à l’opérateur NOT pour recherche toutes les
lignes qui ne sont pas égales à l’une des valeurs énumérées.

Simplicité de l’opérateur IN
La syntaxe utilisée avec l’opérateur est plus simple que d’utiliser une succession
d’opérateur OR. Pour le montrer concrètement avec un exemple, voici 2 requêtes
qui retourneront les mêmes résultats, l’une utilise l’opérateur IN, tandis que
l’autre utilise plusieurs OR.

Mlle DIAGNE Aicha J.


[email protected] 77 766 73 27
1
7
Requête avec plusieurs OR
SELECT prenom FROM utilisateur WHERE prenom=’Maurice’ OR
prenom = ‘Marie’ OR prenom =’Thimoté’ ;
Requête équivalent avec l’opérateur IN

SELECT prenom FROM utilisateur WHERE prenom IN ( 'Maurice',


'Marie', 'Thimoté' )
SELECT *
FROM adresse
WHERE addr_ville IN ( 'Paris', 'Graimbouville' )

 SQL BETWEEN

L’opérateur BETWEEN est utilisé dans une requête SQL pour sélectionner un
intervalle de données dans une requête utilisant WHERE. L’intervalle peut être
constitué de chaînes de caractères, de nombres ou de dates. L’exemple le plus
concret consiste par exemple à récupérer uniquement les enregistrements entre
2 dates définies.

Syntaxe
L’utilisation de la commande BETWEEN s’effectue de la manière suivante :

SELECT *
FROM table
WHERE nom_colonne BETWEEN 'valeur1' AND 'valeur2' ;

La requête suivante retournera toutes les lignes dont la valeur de la colonne «


nom_colonne » sera comprise entre valeur1 et valeur2.

Exemple : filtrer entre 2 dates


Imaginons une table « utilisateur » qui contient les membres d’une application en
ligne.

Mlle DIAGNE Aicha J.


[email protected] 77 766 73 27
1
8
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 Clémentine 2012-04-26

Si l’on souhaite obtenir les membres qui se sont inscrit entre le 1 avril 2012 et le
20 avril 2012 il est possible d’effectuer la requête suivante :

SELECT * FROM utilisateur WHERE date_inscription BETWEEN ’2012-04-01′ AND


’2012-04-20′ ;
Résultat :

Id nom date_inscription
3 Chloé 2012-04-14
4 Marie 2012-04-15

Exemple : filtrer entre 2 entiers


Si l’on souhaite obtenir tous les résultats dont l’identifiant n’est pas situé entre 4
et 10, il faudra alors utiliser la requête suivante :

SELECT * FROM utilisateur WHERE id NOT BETWEEN 4 AND 10 ;


Résultat :
Id nom date_inscription
1 Maurice 2012-03-02
2 Simon 2012-03-05
3 Chloé 2012-04-14
Bon à savoir
Certaines vieilles versions de systèmes de gestion de bases de données ne
prennent pas en compte la commande BETWEEN. Mais si vous utilisez une
version récente de MySQL ou PostgreSQL, cela ne cause aucun problème.

L’autre élément important à savoir c’est que toutes les bases de données ne
gèrent pas l’opérateur BETWEEN de la même manière. Certains systèmes vont

Mlle DIAGNE Aicha J.


[email protected] 77 766 73 27
1
9
inclurent les valeurs qui définissent l’intervalle tandis que d’autres systèmes
considèrent ces valeurs sont exclues. Il est important de consulter la
documentation officielle de la base de données.

 SQL LIKE

L’opérateur LIKE est utilisé dans la clause WHERE des requêtes SQL. Ce mot-clé
permet d’effectuer une recherche sur un modèle particulier. Il est par exemple
possible de rechercher les enregistrements dont la valeur d’une colonne
commence par telle ou telle lettre. Les modèles de recherches sont multiples.

Syntaxe
La syntaxe à utiliser pour utiliser l’opérateur LIKE est la suivante :

SELECT * FROM nom_table WHERE colonne LIKE modele ;


Dans cet exemple le « modèle » n’a pas été défini, mais il ressemble très
généralement à l’un des exemples suivants :
• LIKE ‘%a’ : le caractère « % » est un caractère joker qui remplace tous les
autres caractères. Ainsi, ce modèle permet de rechercher toutes les
chaines de caractère qui se termine par un « a ».
• LIKE ‘a%’ : ce modèle permet de rechercher toutes les lignes de « colonne
» qui commence par un « a ».
• LIKE ‘%a%’ : ce modèle est utilisé pour rechercher tous les enregistrements
qui utilisent le caractère « a ».
• LIKE ‘pa%on’ : ce modèle permet de rechercher les chaines qui commence
par « pa » et qui se terminent par « on », comme « pantalon » ou « pardon
».
• LIKE ‘a_c’ : peu utilisé, le caractère « _ » (underscore) peut être remplacé
par n’importe quel caractère, mais un seul caractère uniquement (alors
que le symbole pourcentage « % » peut être remplacé par un nombre
incalculable de caractères . Ainsi, ce modèle permet de retourner les lignes
« aac », « abc » ou même « azc ».

Exemple
Imaginons une table « client » qui contient les enregistrements d’utilisateurs :

Mlle DIAGNE Aicha J.


[email protected] 77 766 73 27
2
0
Id nom ville
1 Léon Lyon
2 Odette Nice
3 Vivien Nantes
4 Etienne Lille

 Obtenir les résultats qui commencent par « N »


Si l’on souhaite obtenir uniquement les clients des villes qui commencent par un
« N », il est possible d’utiliser la requête suivante :

SELECT * FROM client WHERE ville LIKE 'N%' ;


Avec cette requête, seuls les enregistrements suivants seront retournés :

Id Nom Ville
2 Odette Nice
3 Vivien Nantes
 Obtenir les résultats terminent par « e »
Requête :

SELECT * FROM client WHERE ville LIKE '%e' ;


Résultat :

Id Nom ville
2 Odette Nice
4 Etienne Lille

 SQL IS NULL / IS NOT NULL

Dans le langage SQL, l’opérateur IS permet de filtrer les résultats qui contiennent
la valeur NULL. Cet opérateur est indispensable car la valeur NULL est une valeur
inconnue et ne peut par conséquent pas être filtrée par les opérateurs de
comparaison (cf. égal, inférieur, supérieur ou différent).

Mlle DIAGNE Aicha J.


[email protected] 77 766 73 27
2
1
Syntaxe
Pour filtrer les résultats où les champs d’une colonne sont à NULL il convient
d’utiliser la syntaxe suivante :

SELECT * FROM nom_table WHERE nom_colonne IS NULL ;

A l’inverse, pour filtrer les résultats et obtenir uniquement les enregistrements


qui ne sont pas null, il convient d’utiliser la syntaxe suivante :

SELECT * FROM nom_table WHERE nom_colonne IS NOT NULL ;


A savoir : l’opérateur IS retourne en réalité un booléen, c’est à dire une valeur
TRUE si la condition est vrai ou FALSE si la condition n’est pas respectée. Cet
opérateur est souvent utilisé avec la condition WHERE mais peut aussi trouver
son utilité lorsqu’une sous-requête est utilisée.

Exemple
Imaginons une application qui possède une table contenant les utilisateurs. Cette
table possède 2 colonnes pour associer les adresses de livraison et de facturation
à un utilisateur (grâce à une clé étrangère). Si cet utilisateur n’a pas d’adresse de
facturation ou de livraison, alors le champ reste à

NULL.

Table « utilisateur » :

id Nom date_inscription fk_adresse_livraison_id fk_adresse_facturation_id


23 Grégoire 2013-02-12 12 12
24 Sarah 2013-02-17 NULL NULL
25 Anne 2013-02-21 13 14
26 Frédérique 2013-03-02 NULL NULL

Exemple 1 : utilisateurs sans adresse de livraison


Il est possible d’obtenir la liste des utilisateurs qui ne possèdent pas d’adresse de
livraison en utilisant la requête SQL suivante :

SELECT * FROM utilisateur WHERE fk_adresse_livraison_id IS NULL ;

Mlle DIAGNE Aicha J.


[email protected] 77 766 73 27
2
2
Résultat :

id Nom date_inscription fk_adresse_livraison_id fk_adresse_facturation_id


24 Sarah 2013-02-17 NULL NULL
26 Frédérique 2013-03-02 NULL NULL
Les enregistrements retournés montrent bien que seul les utilisateurs ayant la
valeur NULL pour le champ de l’adresse de livraison.

Exemple 2 : utilisateurs avec une adresse de livraison


Pour obtenir uniquement les utilisateurs qui possèdent une adresse de livraison
il convient de lancer la requête SQL suivante :

SELECT * FROM utilisateur WHERE fk_adresse_livraison_id IS NOT NULL ;


Résultat :

id Nom date_inscription fk_adresse_livraison_id fk_adresse_facturation_id


23 Grégoire 2013-02-12 12 12
25 Anne 2013-02-21 13 14
Les lignes retournés sont exclusivement celles qui n’ont pas une valeur NULL pour
le champ de l’adresse de livraison.

 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 regrouper
les ventes par client identique et d’obtenir le coût total des achats pour chaque
client.

Syntaxe d’utilisation de GROUP BY


De façon générale, la commande GROUP BY s’utilise de la façon suivante :

SELECT colonne1, fonction(colonne2) FROM table GROUP BY colonne1 ;


A noter : cette commande doit toujours s’utiliser après la commande WHERE et
avant la commande HAVING.

Mlle DIAGNE Aicha J.


[email protected] 77 766 73 27
2
3
Exemple d’utilisation
Prenons en considération une table « achat » qui résume les ventes d’une
boutique :

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
Ce tableau contient une colonne qui sert d’identifiant pour chaque ligne, une
autre qui contient le nom du client, le coût de la vente et la date d’achat.

Pour obtenir le coût total de chaque client en regroupant les commandes des
mêmes clients, il faut utiliser la requête suivante :

SELECT client, SUM(tarif) FROM achat GROUP BY client ;


La fonction SUM() permet d’additionner la valeur de chaque tarif pour un même
client. Le résultat sera donc le suivant :

Client SUM(tarif)
Pierre 262
Simon 47
Marie 38
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 ;

Mlle DIAGNE Aicha J.


[email protected] 77 766 73 27
2
4
Résultat :

Client SUM(tarif)
Pierre 262
Simon 47
Marie 38
Marie 38
Pierre 262
 Utilisation d’autres fonctions de statistiques
Il existe plusieurs fonctions qui peuvent être utilisées pour manipuler plusieurs
enregistrements, il s’agit des fonctions d’agrégations statistiques, les principales
sont les suivantes :
- AVG() pour calculer la moyenne d’un set de 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 ont é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 par exemple pour
connaître la date du premier achat d’un client
- SUM() pour calculer la somme de plusieurs lignes. Permet par exemple de
connaître le total de tous les achats d’un client
Ces petites fonctions se révèlent rapidement indispensable pour travailler sur des
données.

 SQL HAVING

La condition HAVING en SQL est presque similaire à WHERE à la seule différence


que HAVING permet de filtrer en utilisant des fonctions telles que SUM(),
COUNT(), AVG(), MIN() ou MAX().

Syntaxe
L’utilisation de HAVING s’utilise de la manière suivante :

SELECT colonne1, fonction(colonne2) FROM nom_table GROUP BY colonne1


HAVING fonction(colonne2) operateur valeur ;

Mlle DIAGNE Aicha J.


[email protected] 77 766 73 27
2
5
Cela permet donc de sélectionner les colonnes de la table « nom_table » en
GROUPANT les lignes qui ont des valeurs identiques sur la colonne « colonne1″ et
que la condition de HAVING soit respectée.

Important : HAVING est très souvent utilisé en même temps que GROUP BY bien
que ce ne soit pas obligatoire.

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.

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 récupérer la liste des clients qui ont commandé
plus de 40€, toutes commandes confondues alors il est possible d’utiliser la
requête suivante :

SELECT client, SUM(tarif) FROM achat GROUP BY client HAVING SUM(tarif) > 40 ;
Résultat :

Client SUM(tarif)
Pierre 162
Simon 47
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.

Mlle DIAGNE Aicha J.


[email protected] 77 766 73 27
2
6
 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’on souhaite filtrer l’ordre des résultats utilise la commande
ORDER BY de la sorte :

SELECT colonne1, colonne2 FROM table ORDER BY colonne1 ;


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 nom_table ORDER BY colonne1


DESC, colonne2 ASC ;
A noter : il n’est pas obligé d’utiliser le suffixe « ASC » sachant que les résultats
sont toujours classés 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 exemples, nous allons prendre une table « utilisateur »
de test, qui contient les données suivantes :

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
Pour récupérer la liste de ces utilisateurs par ordre alphabétique du nom de
famille, il est possible d’utiliser la requête suivante :

SELECT * FROM utilisateur ORDER BY Nom ;

Mlle DIAGNE Aicha J.


[email protected] 77 766 73 27
2
7
Résultat :

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
En utilisant deux méthodes de tri, il est possible de retourner les utilisateurs par
ordre alphabétique ET pour ceux qui ont le même nom de famille, les trier par
ordre décroissant d’inscription. La requête serait alors la suivante :

SELECT * FROM utilisateur ORDER BY nom, date_inscription DESC ;


Ré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 LIMIT

La clause LIMIT est à utiliser dans une requête SQL pour spécifier le nombre.

Syntaxe
La syntaxe commune aux principaux systèmes de gestion de bases de données
est la suivante :

SELECT * FROM table LIMIT 10 ;


Cette requête permet de récupérer seulement les 10 premiers résultats d’une
table. Bien entendu, si la table contient moins de 10 résultats, alors la requête
retournera toutes les lignes.

Bon à savoir : la bonne pratique lorsque l’on utilise LIMIT consiste à utiliser
également la clause ORDER BY pour s’assurer que quoi qu’il en soit ce sont

Mlle DIAGNE Aicha J.


[email protected] 77 766 73 27
2
8
toujours les bonnes données qui sont présentées. En effet, si le système de tri est
non spécifié, alors il est en principe inconnu et les résultats peuvent être
imprévisibles.

 SQL UNION

La commande UNION de SQL permet de mettre bout-à-bout les résultats de


plusieurs requêtes utilisant elles-mêmes la commande SELECT. C’est donc une
commande qui permet de concaténer les résultats de 2 requêtes ou plus. Pour
l’utiliser il est nécessaire que chacune des requêtes à concaténer retournes le
même nombre de colonnes, avec les mêmes types de données et dans le même
ordre.

A savoir : par défaut, les enregistrements exactement identiques ne seront pas


répétés dans les résultats. Pour effectuer une union dans laquelle même les lignes
dupliquées sont affichées il faut plutôt utiliser la commande UNION ALL.

Syntaxe
La syntaxe pour unir les résultats de 2 tableaux sans afficher les doublons est la
suivante :

SELECT * FROM table1 UNION SELECT * FROM table2 ;


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 :

prenom Nom ville date_naissance total_achat


Léon Dupuis Paris 1983-03-06 135
Marie Bernard Paris 1993-07-03 75
Sophie Dupond Marseille 1986-02-22 27
Marcel Martin Paris 1976-11-24 39
La table du magasin n°2 s’appelle « magasin2_client » et contient les données
suivantes :

Mlle DIAGNE Aicha J.


[email protected] 77 766 73 27
2
9
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 présents dans les 2 tables, pour éviter de
retourner plusieurs fois les mêmes enregistrements, il convient d’utiliser la
requête UNION. La requête SQL est alors la suivante :

SELECT * FROM magasin1_client UNION SELECT * FROM magasin2_client ;


Résultat :

prenom nom ville date_naissance total_achat


Léon Dupuis Paris 1983-03-06 135
Marie Bernard Paris 1993-07-03 75
Sophie Dupond Marseille 1986-02-22 27
Marcel Martin Paris 1976-11-24 39
Marion Leroy Lyon 1982-10-27 285
Paul Moreau Lyon 1976-04-19 133
Le résultat de cette requête montre bien que les enregistrements des 2 requêtes
sont affichés mais sans inclure plusieurs fois les mêmes lignes.

 SQL UNION ALL

La commande UNION ALL de SQL est très similaire à la commande UNION. Elle
permet de concaténer les enregistrements de plusieurs requêtes, à la seule
différence que cette commande permet d’inclure tous les enregistrements,
même les doublons. Ainsi, si un même enregistrement est présent normalement
dans les résultats des 2 requêtes concaténées, alors l’union des 2 avec UNION ALL
retournera 2 fois ce même résultat.

A savoir : tout comme la commande UNION, il convient que les 2 requêtes


retournent exactement le même nombre de colonnes, avec les mêmes types de
données et dans le même ordre.

Mlle DIAGNE Aicha J.


[email protected] 77 766 73 27
3
0
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_naissance total_achat


Léon Dupuis Paris 1983-03-06 135
Marie Bernard Paris 1993-07-03 75
Sophie Dupond Marseille 1986-02-22 27
Marcel Martin Paris 1976-11-24 39
La table « magasin2_client » correspond au deuxième magasin :

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
Pour concaténer les tous les enregistrements de ces tables, il est possible
d’effectuer une seule requête utilisant la commande UNION ALL, comme
l’exemple ci-dessous :

SELECT * FROM magasin1_client UNION ALL SELECT * FROM magasin2_client ;

Mlle DIAGNE Aicha J.


[email protected] 77 766 73 27
3
1
Résultat :

prenom Nom ville date_naissance total_achat


Léon Dupuis Paris 1983-03-06 135
Marie Bernard Paris 1993-07-03 75
Sophie Dupond Marseille 1986-02-22 27
Marcel Martin Paris 1976-11-24 39
Marion Leroy Lyon 1982-10-27 285
Paul Moreau Lyon 1976-04-19 133
Marie Bernard Paris 1993-07-03 75
Marcel Martin Paris 1976-11-24 39
Le résultat de cette requête montre qu’il y a autant d’enregistrement que dans
les 2 tables réunis. A savoir, il y a quelques clients qui étaient présents dans les 2
tables d’origines en conséquent ils sont présent 2 fois dans le résultat de cette
requête SQL.

 SQL INTERSECT

La commande SQL INTERSECT permet d’obtenir l’intersection des résultats de 2


requêtes. Cette commande permet donc de récupérer les enregistrements
communs à 2 requêtes. Cela peut s’avérer utile lorsqu’il faut trouver s’il y a des
données similaires sur 2 tables distinctes.

A savoir : pour l’utiliser convenablement il faut que les 2 requêtes retournent le


même nombre de colonnes, avec les mêmes types et dans le même ordre.

Syntaxe
La syntaxe à adopter pour utiliser cette commande est la suivante :

SELECT * FROM table1 INTERSECT SELECT * FROM table2 ;


Dans cet exemple, il faut que les 2 tables soient similaires (mêmes colonnes,
mêmes types et même ordre). Le résultat correspondra aux enregistrements qui
existent dans table1 et dans table2.

Mlle DIAGNE Aicha J.


[email protected] 77 766 73 27
3
2
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_naissance total_achat


Léon Dupuis Paris 1983-03-06 135
Marie Bernard Paris 1993-07-03 75
Sophie Dupond Marseille 1986-02-22 27
Marcel Martin Paris 1976-11-24 39
La table du magasin n°2 est « magasin2_client » :

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
Pour obtenir la liste des clients qui sont présents de façon identique dans ces 2
tables, il est possible d’utiliser la commande INTERSECT de la façon suivante :

SELECT * FROM magasin1_client INTERSECT SELECT * FROM magasin2_client ;


Résultat :

prenom nom Ville date_naissance total_achat


Marie Bernard Paris 1993-07-03 75
Marcel Martin Paris 1976-11-24 39
Le résultat présente 2 enregistrements, il s’agit des clients qui sont à la fois dans
la table « magasin1_client » et dans la table « magasin2_client ». Sur certains
systèmes une telle requête permet de déceler des erreurs et d’enregistrer
seulement à un seul endroit la même information.

 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

Mlle DIAGNE Aicha J.


[email protected] 77 766 73 27
3
3
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 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
jointures d’inégalité. Ces cas étant assez particuliers et pas si simples à
comprendre.

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 enregistrements quand la
condition est vrai dans les 2 tables. C’est l’une des jointures les plus
communes.
• CROSS JOIN : jointure croisée permettant de faire le produit cartésien de 2
tables. En d’autres mots, permet de joindre chaque lignes d’une table avec
chaque lignes d’une seconde table. Attention, le nombre de résultats est
en général très élevé.
• LEFT JOIN (ou LEFT OUTER JOIN) : jointure externe pour retourner tous les
enregistrements de la table de gauche (LEFT = gauche) même si la
condition n’est pas vérifié dans l’autre table.

Mlle DIAGNE Aicha J.


[email protected] 77 766 73 27
3
4
• RIGHT JOIN (ou RIGHT OUTER JOIN) : jointure externe pour retourner tous
les enregistrements de la table de droite (RIGHT = droite) même si la
condition n’est pas vérifié dans l’autre table.
• FULL JOIN (ou FULL OUTER JOIN) : jointure externe pour retourner les
résultats quand la condition est vrai dans au moins une des 2 tables.
• SELF JOIN : permet d’effectuer une jointure d’une table avec elle-même
comme si c’était une autre table.
• NATURAL JOIN : jointure naturelle entre 2 tables s’il y a au moins une
colonne qui porte le même nom entre les 2 tables SQL
• UNION JOIN : jointure d’union

 SQL INNER JOIN

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

Syntaxe
Pour utiliser ce type de jointure il convient d’utiliser une requête SQL avec cette
syntaxe :

SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.fk_id ;


La syntaxe ci-dessus stipule qu’il faut sélectionner les enregistrements des tables
table1 et table2 lorsque les données de la colonne « id » de table1 est égal aux
données de la colonne fk_id de table2.

La jointure SQL peut aussi être écrite de la façon suivante :

SELECT * FROM table1 INNER JOIN table2 WHERE table1.id = table2.fk_id ;


La syntaxe avec la condition WHERE est une manière alternative de faire la
jointure mais qui possède l’inconvénient d’être moins facile à lire s’il y a déjà
plusieurs conditions dans le WHERE.

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.

Mlle DIAGNE Aicha J.


[email protected] 77 766 73 27
3
5
Table utilisateur :

Id Prenom nom Email ville


1 Aimée Marechal [email protected] Paris
2 Esmée Lefort [email protected] Lyon
3 Marine Prevost [email protected] Lille
4 Luc Rolland [email protected] Marseille

Table 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
2 2013-02-21 A00106 235.35
5 2013-03-02 A00107 47.58
Pour afficher toutes les commandes associées aux utilisateurs, il est possible
d’utiliser la requête suivante :

SELECT id, prenom, nom, date_achat, num_facture, prix_total FROM utilisateur


INNER JOIN commande ON utilisateur.id = commande.utilisateur_id ;

Résultats :

Id prenom nom date_achat num_facture prix_total


1 Aimée Marechal 2013-01-23 A00103 203.14
1 Aimée Marechal 2013-02-14 A00104 124.00
2 Esmée Lefort 2013-02-17 A00105 149.45
2 Esmée Lefort 2013-02-21 A00106 235.35
Le résultat de la requête montre la jointure entre les 2 tables. Les utilisateurs 3 et
4 ne sont pas affichés puisqu’il n’y a pas de commandes associés à ces utilisateurs.

Attention : il est important de noter que si un utilisateur a été supprimé, alors on


ne verra pas ses commandes dans la liste puisque INNER JOIN retourne
uniquement les résultats ou la condition est vraie dans les 2 tables.

Mlle DIAGNE Aicha J.


[email protected] 77 766 73 27
3
6
4. SOUS-REQUETES

Dans le langage SQL une sous-requête (aussi appelé « requête imbriquée » ou «


requête en cascade ») consiste à exécuter une requête à l’intérieur d’une autre
requête. Une requête imbriquée est souvent utilisée au sein d’une clause WHERE
ou de HAVING pour remplacer une ou plusieurs constantes.

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 typique d’une sous-requête qui retourne un seul
résultat à la requête principale.

SELECT *
FROM nom_table
WHERE nom_colonne = (
SELECT nom_colonne_table2
FROM table2
LIMIT 1
);

Cet exemple montre une requête interne (celle sur « table2″) qui renvoie une
seule valeur. La requête externe quant à elle, va chercher les résultats de «
nom_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 <>.

Exemple
La suite de cet article présente des exemples concrets 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.

Mlle DIAGNE Aicha J.


[email protected] 77 766 73 27
3
7
Table « question » :

q_id q_date_ajout q_titre q_contenu


1 2013-03-24 Comment réparer Bonjour, j'ai mon ordinateur de cassé, comment
12:54:32 un ordinateur? puis-je procéder pour le réparer?
2 2013-03-26 Comment Quel est la meilleur méthode pour changer un
19:27:41 changer un pneu? pneu facilement ?
3 2013-04-18 Que faire si un Est-il préférable de réparer les appareils
20:09:56 appareil est électriques ou d'en acheter de nouveaux?
cassé?
4 2013-04-22 Comment faire Bonjour, sous mon clavier d'ordinateur il y a
17:14:27 nettoyer un beaucoup de poussière, comment faut-il procéder
clavier pour le nettoyer? Merci.
d'ordinateur?
Table « reponse » :

 Requête imbriquée qui retourne un seul résultat


Avec une telle application, il est peut-être utile de connaître la question liée à la
dernière réponse ajoutée sur l’application. Cela peut être effectué via la requête
SQL suivante :

SELECT *
FROM question
WHERE q_id = (
SELECT r_fk_question_id
FROM reponse
ORDER BY r_date_ajout DESC
LIMIT 1
);

Mlle DIAGNE Aicha J.


[email protected] 77 766 73 27
3
8
Une telle requête va retourner la ligne suivante :

q_id q_date_ajout q_titre q_contenu


3 2013-04-18 Que faire si un Est-il préférable de réparer les appareils
20:09:56 appareil est électriques ou d'en acheter de nouveaux?
cassé?
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.

 SQL EXISTS

Dans le langage SQL, la commande EXISTS s’utilise dans une clause conditionnelle
pour savoir s’il y a une présence ou non de lignes lors de l’utilisation d’une sous-
requête.

A noter : cette commande n’est pas à confondre avec la clause IN. La commande
EXISTS vérifie si la sous-requête retourne un résultat ou non, tandis que IN vérifie
la concordance d’une à plusieurs données.

Syntaxe
L’utilisation basique de la commande EXISTS consiste à vérifier si une sous-
requête retourne un résultat ou non, en utilisant EXISTS dans la clause
conditionnelle. La requête externe s’exécutera uniquement si la requête interne
retourne au moins un résultat.

SELECT nom_colonne1
FROM table1
WHERE EXISTS (
SELECT nom_colonne2
FROM table2
WHERE nom_colonne3 = 10
);

Dans l’exemple ci-dessus, s’il y a au moins une ligne dans table2 dont
nom_colonne3 contient la valeur 10, alors la sous-requête retournera au moins

Mlle DIAGNE Aicha J.


[email protected] 77 766 73 27
3
9
un résultat. Dès lors, la condition sera vérifiée et la requête principale retournera
les résultats de la colonne nom_colonne1 de table1.

Exemple
Dans le but de montrer un exemple concret d’application, imaginons un système
composé d’une table qui contient des commandes et d’une table contenant des
produits.

Table 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
Table produit :

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
Il est possible d’effectuer une requête SQL qui affiche les commandes pour
lesquels il y a effectivement un produit. Cette requête peut être interprétée de la
façon suivante :

SELECT *
FROM commande
WHERE EXISTS (
SELECT *
FROM produit
WHERE c_produit_id = p_id
);

Mlle DIAGNE Aicha J.


[email protected] 77 766 73 27
4
0
Ré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 résultat démontre bien que seul les commandes n°1 et n°2 ont un produit qui
se trouve dans la table produit (cf. la condition c_produit_id = p_id). Cette
requête est intéressante sachant qu’elle n’influence pas le résultat de la requête
principale, contrairement à l’utilisation d’une jointure qui va concaténer les
colonnes des 2 tables jointes.

 SQL ALL

Dans le langage SQL, la commande ALL permet de comparer une valeur dans
l’ensemble de valeurs d’une sous-requête. En d’autres mots, cette commande
permet de s’assurer qu’une condition est « égale », « différente », « supérieure
», « inférieure », « supérieure ou égale » ou « inférieure ou égale » pour tous les
résultats retourné par une sous-requête.

Syntaxe
Cette commande s’utilise dans une clause conditionnelle entre l’opérateur de
condition et la sous-requête. L’exemple ci-dessous montre un exemple basique :

SELECT *
FROM table1
WHERE condition > ALL (
SELECT *
FROM table2
WHERE condition2
);

A savoir : les opérateurs conditionnels peuvent être les suivants : =, <, >, <>, !=,
<=, >=, !> ou !<.

Exemple
Imaginons une requête similaire à la syntaxe de base présentée précédemment :
Mlle DIAGNE Aicha J.
[email protected] 77 766 73 27
4
1
SELECT colonne1
FROM table1
WHERE colonne1 > ALL (
SELECT colonne1
FROM table2
);

Avec cette requête, si nous supposons que dans table1 il y a un résultat avec la
valeur 10, voici les différents résultats de la condition selon le contenu de table2
:
• La condition est vrai (cf. TRUE) si table2 contient {-5, 0, +5} car toutes les
valeurs sont inférieure à 10
• La condition est fausse (cf. FALSE) si table2 contient {12, 6, NULL,-100} car
au moins une valeur est inférieure à 10
• La condition est non connue (cf. UNKNOW) si table2 est vide

 SQL ANY

Dans le langage SQL, la commande ANY permet de comparer une valeur avec le
résultat d’une sous-requête. Il est ainsi possible de vérifier si une valeur est «
égale », « différente », « supérieur », « supérieur ou égale », « inférieur » ou «
inférieur ou égale » pour au moins une des valeurs de la sous-requête.

Syntaxe
Cette commande s’utilise dans une clause conditionnelle juste après un opérateur
conditionnel et juste avant une sous-requête. L’exemple ci-dessous démontre
une utilisation basique de ANY dans une requête SQL :

SELECT *
FROM table1
WHERE condition > ANY (
SELECT * FROM table2 WHERE condition2) ;

Mlle DIAGNE Aicha J.


[email protected] 77 766 73 27
4
2
Cette requête peut se traduire de la façon suivante : sélectionner toutes les
colonnes de table1, où la condition est supérieure à n’importe quel résultat de la
sous-requête.

A savoir : les opérateur conditionnels peuvent être les suivants : =, <, >, <>, !=,<=,
>=, !> ou !<.

Exemple
En se basant sur l’exemple relativement simple présenté ci-dessus, il est possible
d’effectuer une requête concrète qui utilise la commande ANY :

SELECT colonne1
FROM table1
WHERE colonne1 > ANY (
SELECT colonne1
FROM table2
);

Supposons que la table1 possède un seul résultat dans lequel colonne1 est égal à
10.
• La condition est vrai (cf. TRUE) si table2 contient {21, 14,7} car il y a au
moins une valeur inférieure à 10
• La condition est fausse (cf. FALSE) si table2 contient {20,10} car aucune
valeur est strictement inférieure à 10
• La condition est non connue (cf. UNKNOW) si table2 est vide

5. ENVIRONNEMENT MULTIUTILISATEUR :

 Création d’une vue

CREATE VIEW nom_vue AS


SELECT colonne2, colonne2, ...
FROM nom_table WHERE condition;

WITH CHECK OPTION permet d’appliquer les contraintes d’intégrité


référentielles.

Mlle DIAGNE Aicha J.


[email protected] 77 766 73 27
4
3
 Suppression d’une vue

DROP VIEW nom_vue ;

 Les privilèges (autorisations d’accès).


 Accorder des privilèges aux utilisateurs :

GRANT All|<liste de privilèges> ON <nomtable> To (Public|<liste


d’identificateurs>) With Grant Option ;

Public : pour accorder tous les privilèges.

With Grant Option : permet aux utilisateurs de transmettre leurs privilèges à


d’autres utilisateurs.

Exemple : donner à tous les utilisateurs la possibilité de lire et de modifier les


données de la table Article.

Grant Select, Update ON Article TO Public ;

- suppression de privilèges :

REVOKE ALL|<liste de privilèges> On <nomtable> From Public|<identificateur> ;

Exemple : enlever la possibilité de mise à jour de Article à Mamadou.

Revoke Update On Article from Mamadou@localhost;

Mlle DIAGNE Aicha J.


[email protected] 77 766 73 27
4
4

Vous aimerez peut-être aussi