Académique Documents
Professionnel Documents
Culture Documents
a. Entité (Table)
C’est l’ensemble d'éléments informatif relatif à un même concept dans un
modèle. Cet ensemble correspond généralement à une table dans l'univers des bases de
données.
b. Attribut
C’est la propriété d'une entité dans un modèle correspondant généralement à
une colonne dans une table de la base.
c. Colonne
C’est l’élément vertical dans une table représentant un ensemble de valeurs
d'un attribut.
d. Ligne
C’est l’élément horizontal dans une table représentant une énumération des
valeurs des différents attributs (colonne) pour une même référence (identifiant).
f. Clef étrangère
C’est la colonne, ou groupe de colonnes représentant une clef d'une table,
insérée dans une autre table afin d'assurer la relation entre les deux tables.
Exemple : L’attribut Produit_id peut être considéré comme clé étrangère pour l’entité
Commande qui, à son tour, possède l’attribut Numéro_commande comme
clé primaire.
1
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
g. Relation
C’est le lien logique entre deux entités, représentées dans l'univers des SGBDR
par l'insertion d'une clef étrangère.
j. Transaction
C’est le mécanisme permettant de cumuler différentes instructions qui seront
vues comme une tâche unique, dont l'enchaînement est structuré, et pour laquelle chaque
instruction est indissociable.
k. Clause
C’est la partie d'un ordre SQL précisant un fonctionnement particulier. La clause
ORDER BY, par exemple, est la dernière clause de tout ordre SQL et ne doit figurer qu'une
seule fois dans le SELECT, même s'il existe des requêtes imbriquées ou des requêtes
ensemblistes.
l. Prédicat
C’est la construction logique dont la valeur peut être évaluée à vrai ou faux.
m. SQL
Structured Query Language, en sigle, SQL signifie en français langage de
requête structurée, un langage informatique normalisé servant à exploiter des bases de
données relationnelles.
2
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
Dans Microsoft SQL Server, par exemple, tous les éléments (serveurs, bases de
données, tables, vues, colonnes, procédures, contraintes, etc,…) peuvent avoir un
identificateur. L'identificateur d'un objet est donc créé lors de la définition de l'objet et est
ensuite utilisé pour référencer l'objet. Il existe deux classes d'identificateurs :
Identificateurs réguliers
Les identificateurs réguliers sont ceux qui respectent les règles relatives au
format des identificateurs.
Exemple: TableX
Identificateurs délimités
Les identificateurs délimités sont mis entre guillemets (") ou entre crochets ([ ])
et sont utilisés pour ceux qui ne respectent pas les règles de nomenclature.
SELECT *
FROM [My Table]
WHERE [order] = 10
Ainsi, les noms des objets d'un modèle ou d'un schéma devront être significatifs
et pertinents. Ils devront être constitué uniquement des caractères suivants :[a .. z] + [A
.. Z] + [0 .. 9] +[ _ ] avec les annotations suivantes suivant le SGBD:
Ne pas dépasser 128 caractères
Ne pas commencer par un chiffre
Ne peut avoir plusieurs caractères "blanc souligné" de suite
La casse n'a pas d'importance
Le nom ne doit pas être un mot réservé de SQL
3
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
Exemples :
Objet Commentaire
_ETUDIANT Autorisé
123Client Interdit
Nom__Clent Interdit
_etudiant Autorisé (mais identique au premier)
NB : Liste de mots réservés de SQL, voir Annexe
Les règles ci-dessous établissent la manière dont les requêtes doivent s’écrire
ainsi que le code afférent aux objets d'une base de données.
Exemple :
SELECT CLI_ID, CLI_NOM, CLI_ENSEIGNE, CLI_PRENOM
FROM T_CLIENT
WHERE CLI_ADR_PAYS = 'F' AND CLI_ENSEIGNE IS NULL OR CLI_ENSEIGNE =''
ORDER BY CLI_NOM;
Contre-exemple:
SELECT CLI_ID, CLI_NOM, CLI_ENSEIGNE,
CLI_PRENOM FROM T_CLIENT WHERE CLI_ADR_PAYS = 'F'
AND CLI_ENSEIGNE IS NULL OR CLI_ENSEIGNE =''ORDER BY CLI_NOM
4
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
Les noms des colonnes renvoyées ne doivent pas comporter de doublons (en
particulier l'usage de l'étoile dans la clause SELECT est à utiliser avec délicatesse) :
Exemple :
SELECT CLI.CLI_ID, CLI.CLI_NOM, CLI.CLI_PRENOM, FAC.FAC_ID, FAC.FAC_DATE,
FAC.FAC_PROD
FROM T_CLIENT_CLI CLI
INNER JOIN T_FACTURE_FAC FAC ON CLI.CLI_ID = FAC.CLI_ID
Contre-exemple :
SELECT *
FROM T_CLIENT_CLI CLI
INNER JOIN T_FACTURE_FAC FAC
ON CLI.CLI_ID = FAC.CLI_ID
Les commentaires sont importants pour mieux se retrouver lorsqu’on traite des
requêtes complexes. On procède de plusieurs façons pour commenter les requêtes SQL,
bien sûr en tenant compte notamment du Système de Gestion de Base de Données
(SGBD) utilisé et de sa version.
Exemple :
SELECT Product_name --- sélectionner le nom du produit
FROM produit ----- dans la table "produit"
b. Commentaire multi-ligne : /* et */
Le commentaire multi-ligne à l’avantage de pouvoir indiquer où commence et
où se termine le commentaire. Il est donc possible de l’utiliser en plein milieu d’une
requête SQL sans problème.
Exemple :
SELECT product_name /* tout sélectionner */
FROM produit /* dans la table "produit" */
WHERE PU = /* exemple en milieu de la requête
sur plusieurs lignes */ 50000
5
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
Exemple :
NOM_CLIENT CHAR(32)
OBSERVATIONS VARCHAR2(1500)
Number :
Ce type de données permet de stocker les entiers ainsi que les réels, sans
précision aucune
Smalling :
Ce type de données permet de stocker les entiers courts
Float :
Ce type de données permet de stocker les valeurs réelles à virgule flottante,
échelle et précision obligatoire
Real :
Ce type de données permet de stocker les valeurs réelles à virgule flottante de
faible précision
Date :
Ce type de données permet de stocker des données constituées de dates
Time :
Ce type de données permet de stocker les données constituées de l’heure sur
24 heures
6
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
Timestamp :
Ce type de données permet de stocker les données constituées d’une date et
d’une heure
NB : Pour le type date, le standard ISO adopté pour le SQL repose sur le format AAAA-
MM-JJ. Il est ainsi valable jusqu'en l'an 9999 ou AAAA est l'année sur 4 chiffres, MM
le mois sur deux chiffres, et JJ le jour.
Boolean:
Ce type de données permet de stocker des valeurs booléennes
Money :
Ce type de données permet de stocker des valeurs monétaires avec une échelle
maximale et une précision de deux chiffres après la virgule.
Text :
Ce type de données permet de stocker des chaînes de caractères de longueur
variable
7
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
Exemple
CREATE TABLE T_PERSONNE1
(PRS_ID INTEGER NOT NULL
PRS_NOM VARCHAR(32) NOT NULL,
PRS_PRENOM VARCHAR(32) NULL,
PRS_DATE_NAISSANCE DATE)
b.1.2 DEFAULT
La contrainte DEFAULT permet de préciser une valeur qui sera insérée par
défaut en l'absence de précision d'une valeur explicite dans un ordre d'insertion. Seule une
valeur explicite, un marqueur NULL ou la valeur retournée par les fonctions suivantes sont
acceptées : CURRENT_DATE, CURRENT_TIME[(p)], CURRENT_TIMESTAMP[(p)],
LOCALTIME[(p)], LOCALTIMESTAMP[(p)], USER, CURRENT_USER, SESSION_USER,
SYSTEM_USER.
Exemple
CREATE TABLE T_PERSONNE2
(PRS_ID INTEGER,
PRS_NOM VARCHAR(32),
PRS_PRENOM VARCHAR(32),
PRS_SEXE CHAR(1) DEFAULT 'M',
PRS_DATE_NAISSANCE DATE DEFAULT CURRENT_DATE)
Nota : Il n'est pas possible de préciser une valeur par défaut qui soit le résultat d'une
expression de requête.
9
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
Exemple
CREATE TABLE T_PERSONNE3
(PRS_ID INTEGER DEFAULT (SELECT MAX(PRS_ID) + 1
FROM T_PERSONNE3),
PRS_NOM VARCHAR(32),
PRS_PRENOM VARCHAR(32)) ;
Exemple
CREATE TABLE T_PERSONNE5
(PRS_ID INTEGER NOT NULL PRIMARY KEY,
PRS_NOM VARCHAR(32),
PRS_PRENOM VARCHAR(32)) ;
Ou
CREATE TABLE T_PERSONNE5
(PRS_ID INTEGER PRIMARY KEY NOT NULL,
PRS_NOM VARCHAR(32),
PRS_PRENOM VARCHAR(32)) ;
Exemple
--- clef primaire sur PRS_NOM et PRS_PRENOM
CREATE TABLE T_PERSONNE9
(PRS_NOM VARCHAR(32) NOT NULL,
PRS_PRENOM VARCHAR(32) NOT NULL,
PRS_TELEPHONE CHAR(14),
CONSTRAINT PK_PRS PRIMARY KEY (PRS_NOM, PRS_PRENOM)) ;
b.1.4 UNIQUE
La contrainte d'unicité exige que toutes les valeurs explicites contenues dans la
colonne soient uniques au sein de la table à l'exception du marqueur NULL car la colonne
peut ne pas être renseignée.
Exemple
CREATE TABLE T_PERSONNE7
(PRS_NOM VARCHAR(32),
PRS_PRENOM VARCHAR(32),
PRS_TELEPHONE CHAR(14) UNIQUE) ;
10
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
Dans cet exemple Mukendi n'a pas été inséré car son numéro de téléphone est identique à
Durand.
b.1.5 CHECK
La contrainte CHECK permet de définir un prédicat complexe, basé sur une
comparaison pouvant contenir une requête de type SELECT. Pour valider la contrainte, le
prédicat doit être évalué à TRUE ou UNKNOWN (présence de NULL).
Exemple
CREATE TABLE T_PERSONNE8
(PRS_ID INTEGER CHECK (VALUE > 0),
PRS_NOM VARCHAR(32) CHECK (CHARACTER_LENGTH(VALUE) > 2),
PRS_PRENOM VARCHAR(32) CHECK (COALESCE(SUBSTRING(VALUE, 1, 1), 'X')
BETWEEN 'A' AND 'Z'),
PRS_SEXE CHAR(1) CHECK (VALUE IN ('M', 'F')),
PRS_TELEPHONE CHAR(14) CHECK (VALUE >0);
Sous Oracle
CREATE TABLE T_PERSONNE8
(PRS_ID INTEGER CHECK (PRS_ID > 0),
PRS_NOM VARCHAR(32) CHECK (LENGTH(PRS_NOM) > 2),
PRS_PRENOM VARCHAR(32) CHECK (COALESCE(SUBSTR(PRS_PRENOM, 1, 1), 'X')
BETWEEN 'A' AND 'Z'),
PRS_SEXE CHAR(1) CHECK (PRS_SEXE IN ('M', 'F')),
PRS_TELEPHONE CHAR(14) CHECK (PRS_TELEPHONE >0));
11
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
Exemple
CREATE TABLE T_COMPTE
(CPT_ID INTEGER,
CPT_DATE DATE,
CPT_CREDIT DECIMAL (16,2),
CPT_DEBIT DECIMAL (16,2),
CLI_ID INTEGER,
CONSTRAINT CHK_OPERATION CHECK((CPT_CREDIT >= 0 AND CPT_DEBIT IS NOT
NULL) OR (CPT_DEBIT >= 0 AND CPT_CREDIT IS NOT NULL)))
Toute tentative d'insérer une ligne avec des valeurs non renseignées pour les colonnes
debit et credit, ou bien avec des valeurs négative se soldera par un refus.
Exemple
CREATE TABLE T_FACTURE1
(FTC_ID INTEGER,
PRS_ID INTEGER FOREIGN KEY REFERENCES T_PERSONNE5 (PRS_ID),
FCT_DATE DATE,
FCT_MONTANT DECIMAL(16,2)) ;
Sous Oracle
La table T_FACTURE1 est liée à la table T_PERSONNE5 et ce lien se fait entre la clef
étrangère PRS_ID de la table T_FACTURE1. Cette même colonne, PRS_ID, est aussi
renseignée comme clef de la table T_PERSONNE5. Toute tentative d'insertion d'une
facture dont la référence de client est inexistante se soldera par un échec. De même toute
tentative de supprimer un client pour lequel les données d'une ou de plusieurs factures
sont présente se soldera par un arrêt sans effet de l'ordre SQL.
REMARQUE : Les noms des colonnes de jointure, lorsqu’ils sont identiques facilitent,
comme nous le verrons plus tard, le NATURAL JOIN ; mais cette règle de
nomenclature n’est pas obligatoire.
NB : Toutes les contraintes vues ici être placées dans plusieurs colonnes, à l'exception de
la contrainte de clef PRIMARY KEY qui ne peut être placée que sur une seule
colonne.
12
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
Exemple
CREATE DOMAIN D_NUM_ID INTEGER
CONSTRAINT C_CLEF CHECK (VALUE > 0);
Une table de clients similaire à l'exemple précédente à base de domaines mais la clef ne
peut être négative.
Exemple
CREATE TABLE T_CLIENT
(CLI_ID INTEGER NOT NULL PRIMARY KEY,
CLI_NOM CHAR(32) NOT NULL CHECK (SUBSTRING(VALUE, 1, 1) <> ' ' AND
UPPER(VALUE) = VALUE),
CLI_PRENOM VARCHAR(32) REFERENCES TR_PRENOM (PRN_PRENOM)) ;
Une table de clients dont le nom ne peut commencer par un blanc, doit être en majuscule
et dont le prénom doit figurer dans la table de référence TR_PRENOM à la colonne
PRN_PRENOM.
Exemple
CREATE TABLE T_VOITURE
(VTR_ID INTEGER NOT NULL PRIMARY KEY,
VTR_MARQUE CHAR(32) NOT NULL,
VTR_MODELE VARCHAR(16),
VTR_IMMATRICULATION CHAR(10) NOT NULL UNIQUE,
VTR_COULEUR CHAR(16) CHECK (VALUE IN ('BLANC', 'NOIR', 'ROUGE', 'VERT',
'BLEU')))
Une table de voiture avec immatriculation unique et couleur limitée à 'BLANC', 'NOIR',
'ROUGE', 'VERT', 'BLEU'.
13
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
L’intégrité référentielle, utile pour la cohérence des données, peut être gérée en
plusieurs modes à savoir :
NOTA : Certains SGBDR n'ont pas implémenté le mode de gestion de l'intégrité. C'est le
cas en particulier de MS SQL Server. En revanche, il est courant de trouver dans
les SGBDR des options plus limitées que celles fournies par la norme.
c. CREATION DE VUES
Les vues ne sont autres que des requêtes instanciées. Elles sont nécessaires
pour gérer finement les privilèges, pour masquer la complexité de certains modèles
relationnels et pour restreindre l'accès aux données.
Une vue peut être utilisée comme une table dans toute requête de type
SELECT. Mais à la différence des tables, une vue peut être mise à jour (INSERT, UPDATE,
DELETE) que si elle obéit à un certain nombre de conditions :
Ne porter que sur une table (pas de jointure)
Ne pas contenir de dédoublonnage (pas de mot clef DISTINCT) si la table n'a pas
de clef
contenir la clef de la table si la table en a une
15
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
Une vue peut porter sur une autre vue et pour que la nouvelle vue construite à
partir d'une autre vue puisse être modifié, il faut que les deux vues répondent aussi à ces
critères.
-- elle ne peut être mise à jour car la clef ne s'y trouve pas
-- elle ne peut être mise à jour à cause des transformations de données (concaténation au
niveau du nom)
16
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
La clause WITH CHECK OPTION implique que si la vue peut être mise à jour,
alors les valeurs modifiées insérées ou supprimées doivent répondre à la validation de la
clause WHERE comme s'il s'agissait d'une contrainte.
Par exemple dans le cadre de la vue pour le service comptable, il n'est pas possible de
faire :
UPDATE T_EMPLOYE
SET EMP_SALAIRE = EMP_SALAIRE + 100
WHERE STATUT = 'CADRE'
Exemple :
ALTER TABLE Utilisateur
ADD adresse_rue varchar(250) NOT NULL;
Remarque : Il n’est conseillé d’ajouter une colonne avec l’attribut ou contrainte NOT
NULL lorsque la table contient déjà de données
POSTGRESQL
ALTER TABLE nom_table
ALTER COLUN nom_colonne TYPE type_de_données ;
Ici type_de_données est à remplacer par un type de données tel que INT, VARCHAR,
DATE,…
18
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
Remarque : En cas d’une modification d’une table contenant déjà des données, les
éléments ci-dessous doivent être pris en compte :
- il faut se rassurer que le nouveau type soit compatible avec les données
existantes dans la colonne ;
- il convient de s'assurer que la colonne ne fait l'objet d'aucune référence
interne (contraintes de table par exemple) ou externe (vue, triggers...). Si
c'est le cas, il faut impérativement modifier, désactiver ou supprimer ces
éléments avant la modification de la colonne.
Exemple
SELECT CLI_NOM, CLI_PRENOM
FROM T_CLIENT
WHERE TIT_CODE = 'M'
19
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
a. LA CLAUSE SELECT
a.1 L'opérateur *
L'utilisation du caractère étoile ramène dans la réponse toutes les colonnes de
la table ou de différentes tables utilisées en cas de jointures. Dans le cas contraire il faut
expressément nommer chacune des colonnes et les séparer par des virgules.
Exemple
SELECT *
FROM T_CLIENT
WHERE TIT_CODE = 'M'
Exemple
SELECT distinct CLI_PRENOM
FROM T_CLIENT
WHERE TIT_CODE = 'M.'
a.3 L’opérateur AS
En principe l'opérateur AS sert à donner un nom à de nouvelles colonnes créées
par la requête.
Exemple
SELECT CLI_NOM as NOM, 'homme' as SEXE
FROM T_CLIENT
WHERE TIT_CODE = 'M.'
Exemple
SELECT TIT_CODE ||' '|| CLI_PRENOM || ' ' || CLI_NOM as NOM FROM T_CLIENT
20
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
Exemple
SELECT id, nom, postnom, CASE
WHEN age<18 THEN 'Mineur'
WHEN age>=18 and age <=120 THEN 'Majeur'
ELSE 'Encore vivant!'
END Age
FROM T_Etudiant
Ou
Remarque : Il est possible d’utiliser une autre requête dans la clause case
Exemple :
SELECT id, nom, postnom,
CASE WHEN id in (SELECT id FROM T_Client WHERE age<18) THEN 'Mineur'
Else 'Majeur'
END statut
FROM T_Etudiant
21
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
b. LA CLAUSE FROM
Après la clause FROM il est question de lister la(es) table(s) interrogée(s). Les
tables mentionnées dans la clause FROM peuvent être soient des tables proprement dites,
soient des tables résultant d'une requête spécifiée entre parenthèses. Il est possible de
surnommer une table dans la clause FROM, dans ce cas, la syntaxe de la partie FROM de
la commande SELECT est la suivante :
Remarque : En lieu et place d’une table après la clause FROM, Il est aussi possible
qu’une requête proprement dite la remplace.
Exemple :
SELECT CLI_NOM, CLI_PRENOM
From (SELECT CLI_NOM, CLI_PRENOM, CLI_SEXE
From T_CLIENT
where CLI_SEXE='M')
NOTA: Comme cela a été dit précédemment, après la clause FROM, plusieurs tables
peuvent être référencées. Cela sera étudié ultérieurement dans la partie
consacrée sur les JOINTURES.
c. LA CLAUSE 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.
Le prédicat doit contenir n’importe quelle expression logique renvoyant une valeur vraie.
Les opérateurs
Il existe plusieurs opérateurs de comparaisons pour le prédicat simple et le
prédicat composé. Un prédicat simple peut être le résultat de la comparaison de deux
expressions simples au moyen de l'un des opérateurs suivants : =, <>, <, <=, >, >=, IN,
BETWEEN, LIKE, IS NULL, IS NOT NULL,…
Les prédicats simples peuvent être combinés au sein d'expressions logiques en utilisant les
opérateurs logiques AND (et logique), OR (ou logique) et NOT (négation logique).
- Pour les erreurs, il faut penser à utiliser des parenthèses lorsque c’est
nécessaire.
22
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
Exemple
SELECT CLI_NOM, CLI_PRENOM
FROM T_CLIENT
WHERE CLI_NOM >= 'A' AND CLI_NOM <'E'
ou
Ici on obtient tous les noms et prénoms des clients dont le nom commence par les lettres
A, B, C ou D.
c.1 L’opérateur IN
L'opérateur IN permet de rechercher si une valeur se trouve dans un ensemble
donné.
Exemple
SELECT TIT_CODE, CLI_NOM, CLI_PRENOM
FROM T_CLIENT
WHERE TIT_CODE IN ('Mme', 'Melle')
Remarque:
- Cette syntaxe peut être associée à l’opérateur NOT pour recherche toutes les
lignes qui ne sont pas égales à l’une des valeurs stipulées ;
- Le contenu de la parenthèse peut être remplacé par le résultat d'une requête
possédant une colonne unique. Dans ce cas on parle de requêtes imbriquées, ce
que nous verrons plus loin.
Exemple:
SELECT Cli_id, nom, postnom,
From Client
WHERE Cli_id in (SELECT Cli_id FROM T_Commande WHERE C_code=18)
Exemple
SELECT CLI_NOM, CLI_PRENOM
FROM T_CLIENT
WHERE CLI_NOM BETWEEN 'A' AND 'E'
23
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
Exemple
SELECT CLI_NOM, CLI_PRENOM
FROM T_CLIENT
WHERE CLI_NOM LIKE 'B%'
Remarque : Si les données sont susceptibles de contenir un des deux caractères joker,
alors il faut recourir à une séquence d’échappement à l’aide du mot clef
ESCAPE
Exemple
SELECT *
FROM T_CLIENT
WHERE CLI_ENSEIGNE LIKE '%_%'
SELECT *
FROM T_CLIENT
WHERE CLI_ENSEIGNE LIKE '%#_%' ESCAPE '#'
Pour traiter ce cas, on définit « # » comme caractère d’échappement. Le caractère qui suit
ce caractère d’échappement est donc interprété comme un caractère et non comme un
joker.
NOTA : L’opérateur LIKE effectue une recherche en tenant compte de la différence entre
lettres majuscules et minuscules. Si vous voulez effectuer une recherche en ne
tenant aucunement compte de la différence entre majuscules et minuscules, il
convient d’utiliser les opérateurs LOWER et UPPER (voir ci-dessous).
Syntaxe
SELECT nom_colonne1
FROM table1
WHERE EXISTS (
SELECT nom_colonne2
FROM table2
WHERE nom_colonne3 = 10
)
24
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
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 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
Soient les tables suivantes :
Table commande (C_id, C_date_achat, C_produit_id, c_ qu an tite _ produ it)
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 )
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)
NB : Les opérateur conditionnels peuvent être les suivants : =, <, >, <>, !=, <=, >=, !>
ou !<.
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 :
25
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
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
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)
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.
NB: Les opérateur conditionnels peuvent être les suivants : =, <, >, <>, !=,<=, >=,…
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
26
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
Exemple
SELECT CLI_NOM
FROM T_CLIENT
WHERE CLI_NOM NOT LIKE 'DU%'
COUNT ()
Elle permet de compter le nombre d’enregistrement dans une table.
Exemple
SELECT COUNT(*)
FROM utilisateur ;
SELECT COUNT(*)
FROM utilisateur
WHERE nombre_achat > 0 ;
SELECT COUNT(id_dernier_achat)
27
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
FROM utilisateur ;
MAX ()
Elle permet de retourner la valeur maximale d’une colonne dans un set
d’enregistrement. La fonction peut s’appliquée à des données numériques
ou alphanumériques.
Exemple
SELECT MAX(prix)
FROM produit
Il est aussi possible d’afficher le nom du produit le plus cher en même temps
que d’afficher son prix. La requête SQL est alors la suivante :
MIN ()
Elle permet de retourner la plus petite valeur d’une colonne sélectionnée. Cette
fonction s’applique aussi bien à des données numériques qu’à des données
alphanumériques.
Exemple : Soit la Table produits (id, categorie, nom, prix, date_ajout). Pour extraire le prix
du produit le moins cher de la catégorie « maison », on effectue la requête SQL
ci-dessous:
28
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
SELECT MIN(prix)
FROM produits
WHERE categorie= 'maison'
Pour connaître la date du premier ajout dans chaque catégorie, on exécute la requête
suivante:
SELECT categorie, MIN(date_ajout)
FROM produits
GROUP BY categorie
SUM ()
Elle permet de calculer la somme totale d’une colonne contenant des valeurs
numériques. Cette fonction ne fonction que sur des colonnes de types numériques (INT,
FLOAT …) et n’additionne pas les valeurs NULL.
Syntaxe
SELECT SUM(nom_colonne)
FROM table
Exemple : Soit la table facture (id, facture_id, produit, prix). Pour calculer le montant de la
facture n°1 il est possible d’utiliser la requête SQL suivante:
Pour calculer la somme de chaque facture, on se base sur la colonne « facture_id ». Un tel
résultat peut être obtenu en utilisant la requête suivante:
AVG ()
Elle permet de calculer une valeur moyenne sur un ensemble d’enregistrement
de type numérique et non nul.
GROUP BY client
CONCAT ()
Elle permet de concaténer les valeurs de plusieurs colonnes pour ne former
qu’une seule chaîne de caractère.
Syntaxe : CONCAT (colonne1, colonne2)
Exemple : Soit la table utilisateur (id, prenom, nom, date_inscription) : un identifiant, le prénom,
le nom et la date d’ajout (sous le format DATETIME).
LENGTH ()
Elle permet de calculer la longueur d’une chaîne de caractères. Cette fonction
s’écrit différemment selon le SGBD :
LENGTH() pour MySQL, PostgreSQL et Oracle
LEN() pour SQL Server
Exemple :
SELECT LENGTH('exemple');
Résultat : 7
Exemple : Nous considérons une table utilisateur qui contient l’id, le login, la ville et le
numéro de téléphone d’un utilisateur.
Sy nt a xe basiqu e
La fonction comporte 3 paramètres :
1. Chaîne d’entrée
2. Texte à remplacer
3. Texte qui sert de remplacement
Exemple
SELECT REPLACE('Hello tout le monde', 'Hello', 'Bonjour');
Résultat : Bonjour tout le monde
Ex e mpl e : Soit une table qui possède une liste de sites web populaires.
Table site :
id d a t e_ a jo ut Sit e url
1 2013-02-05 Wikipedia http://fr.wikipedia.org/
Pour remplacer certains caractères du tableau, par exemple : le nom de domaine pour
toutes les URLs de Facebook :
UPDATE site
SET url = REPLACE(url, 'www.facebook.com', 'fr-fr.facebook.com')
WHERE url LIKE '%www.facebook.com%'
Résultat:
id d a t e_ a jo ut Sit e url
1 2013-02-05 Wikipedia http://fr.wikipedia.org/
http://fr-
5 2013-03-16 Facebook
fr.facebook.com/feed/friends
SUBSTRING ()
31
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
Syntaxe
La fonction SUBSTRING() peut s’utiliser de 4 façons différentes, que voici :
SUBSTRING(chaine, debut) : retourne la chaîne de caractère de « chaine » à partir
de la position définie par « debut » (position en nombre de caractères)
SUBSTRING(chaine FROM debut) : idem que précédent
SUBSTRING(chaine, debut, longueur) : retourne la chaîne de caractère « chaine » en
partant de la position définie par « debut » et sur la longueur définie par
« longueur »
SUBSTRING(chaine FROM debut FOR longueur) : idem que précédent
Exemple
SELECT SUBSTR(nom_colonne, 3, 10)
FROM tableau
Exemple : Soit une base de données qui contient une liste de pays en français et en
anglais.
Table pays :
Id no m_ en _ fr no m_ en_ a ng
1 France FRANCE
2 Espagne SPAIN
3 Allemagne GERMANY
4 CHINE CHINA
Une requête SQL va être construite pour extraire les informations suivantes :
L’identifiant du pays
Le nom du pays en français
Les 2 premiers caractères du nom en français (soit à partir du 1er caractère et sur
une longueur de 2 caractères)
Tout le nom en français, sans les 2 premiers caractères (soit tout le nom à partir du
3ème caractère)
Pour récupérer toutes ces données, il convient d’utiliser la requête SQL suivante :
SELECT id, nom_en_fr, SUBSTR(nom_en_fr, 1, 2) as prefixe, SUBSTR(nom_en_fr, 3) reste
FROM pays
Résultat :
32
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
Id no m_ en _ fr prefi xe rest e
1 FRANCE FR ANCE
2 ESPAGNE ES PAGNE
3 ALLEMAGNE AL LEMAGNE
4 CHINE CH INE
REVERSE ()
Elle permet de retourner une chaîne de caractère en inversant l’ordre des
caractères. Le premier caractère devient le dernier, le deuxième devient l’avant dernier, et
ainsi de suite.
Exemple
SELECT REVERSE ('123'); -- retourne : 321
SELECT REVERSE ('bonjour le monde'); -- retourne : ednom el ruojnob
SELECT REVERSE ('lierappa'); -- retourne : appareil
TRIM()
Elle permet de supprimer des caractères au début et en fin d’une chaîne de
caractère. Le plus souvent, dans le souci d’afficher proprement des données, on l’utilise
pour supprimer les caractères invisibles, c’est-à-dire les caractères tels que l’espace, la
tabulation, le retour à la ligne ou bien même le retour chariot.
Exemple
SELECT TRIM (' Exemple '); Résultat : « Exemple » sans les espaces de début et de fin.
LTRIM ()
Elle permet de supprimer des caractères au début d’une chaîne de caractères.
Exemple
L’utilisation la plus courante consiste à supprimer les caractères invisibles tels
que l’espace, la tabulation ou le retour à la ligne.
Pour certains SGBD tels que PostgreSQL, Oracle et SQLite, il est possible de
spécifier les caractères à supprimer au début de la chaîne de caractère.
Exemple
33
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
RTRIM()
Elle permet de supprimer des caractères à la fin d’une chaîne de caractères.
Certains SGBD tels que PostgreSQL, Oracle et SQLite permettent de choisir les caractères
à supprimer. L’utilisation la plus courante consiste à supprimer à la fin d’une chaîne les
caractères invisibles tels que l’espace, la tabulation ou le retour à la ligne.
UPPER ()
Elle permet de transformer tous les caractères minuscules d’une chaîne de
caractère en majuscules. Sous MySQL et Oracle la fonction peut aussi être appelée grâce à
l’alias UCASE().
Exemple
SELECT UPPER('Exemple'); résultat :EXEMPLE
LOWER ()
Elle permet de transformer tous les caractères d’une chaîne de caractère en
minuscules. Sous MySQL et Oracle la fonction peut aussi être appelé grâce à l’alias
LCASE().
Exemple
SELECT LOWER('BONJOUR tout le monde'); Résultat :bonjour tout le monde
SELECT id, LOWER(prenom) AS prenom_lower, LOWER(nom) AS nom_lower, ville
FROM utilisateur
LOCATE ()
Elle permet de chercher la position d’une chaîne de caractère dans un
enregistrement. La fonction retourne zéro si la chaîne de caractère n’a pas été trouvée.
Pour les utilisateurs de SQL Server la fonction s’appelle CHARINDEX() et fonctionne de la
même façon.
34
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
Exemple : Soit la table contenant les différentes unités liées aux mètres (kilomètre,
millimètre, centimètre …)
Table « metre » :
id U nit e P uissanc e dat e_ ajo ut
1 Kilomètre 1000 2013-07-16
3 Mètre 1 2013-09-02
5 Mm 0.001 2013-11-29
Résultats :
id U nit e lo c at e_ unit e puissanc e
1 Kilomètre 5 1000
2 Millimètre 6 0.001
3 Mètre 1 1
4 Centimètre 6 0.01
5 Mm 0 0.001
35
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
RAND ()
Elle permet de sélectionner un nombre aléatoire à virgule, compris entre 0 et 1.
Le résultat de cette fonction sera différent à chaque fois que la fonction est exécutée dans
une requête SQL.
Table ville :
id Ville D epart ement
1 Paris Paris
2 Marseille Bouches-du-Rhône
3 Lyon Rhône
4 Toulouse Haute-Garonne
5 Nice Alpes-Maritimes
6 Nantes Loire-Atlantique
7 Strasbourg Bas-Rhin
8 Montpellier Hérault
9 Bordeaux Gironde
10 Lille Nord
ROUND ()
Elle permet d’arrondir un résultat numérique, soit d’arrondir sans utiliser de
décimal pour retourner un nombre entier (c’est-à-dire : aucun chiffre après la virgule), ou
de choisir le nombre de chiffre après la virgule.
Syntaxe
SELECT ROUND(nom_colonne)
FROM table
36
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
CAST
Elle permet de transtyper un type de données contenues dans une colonne
dans un autre type compatible. Sa syntaxe est CAST(colonne AS nouveau type).
Exemple
SELECT ADR_VILLE, CAST (ADR_CP AS INTEGER) + 1
FROM T_ADRESSE
Exemple
SELECT CHB_ID, CHB_NUMERO, CHB_POSTE_TEL
FROM T_CHAMBRE
WHERE CAST(CHB_POSTE_TEL AS INTEGER)/ 10> CHB_NUMERO
Cette requête renvoi les chambres réservées entre la date du jour et pour les deux
semaines à venir.
Remarque : La plupart des SGBDR n'acceptent pas encore cette version normalisée des
fonctions de recherche de temps courant. Voici les fonctions spécifiques aux
différents serveurs SQL :
37
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
Cette table représente des noms d’artistes suivi d’un code renseignant s’il s’agit
d’écrivains (code 1), de musiciens (code 2) ou de peintres (code 3). Nous n’avons pas
renseigné le champ code pour 2 personnes, les champs ont donc la valeur NULL. Nous
constatons que nous avons 8 enregistrements.
38
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
Si nous désirons avoir tous les peintres de la liste il nous suffit de définir la requête
suivante :
SELECT *
FROM test
WHERE code=3.
Si maintenant, nous désirons récupérer tous les artistes qui ne sont pas peintres (code <>
3) nous devrions récupérer tous les autres enregistrements, c’est à dire 7 enregistrement
(8 - 1 = 7) en définissant la requête suivante :
SELECT *
FROM test WHERE code <> 3.
Cela est due au fait que NULL n’est pas une valeur normale puisque cela indique l’absence
de donnée dans le champ. Ce qu’il faut savoir, c’est que lorsqu’un test est effectué sur un
champ contenant NULL, le résultat ne correspond ni à vrai (TRUE) ni à faux (FALSE) mais
une valeur particulière : UNKNOWN (inconnu).
Si nous désirons récupérer la liste de toutes les personnes pour lesquels nous n’avons pas
spécifié qu’elles étaient peintre, nous devons modifier notre requête comme suit :
SELECT *
FROM test
WHERE (code <> 3) OR (code IS NULL)
39
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
d. La clause 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. 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, définir de
groupes, de sous-ensembles.
Exemple
SELECT client, SUM(tarif)
FROM achat
GROUP BY client
e. La clause 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(). Elle permet donc de spécifier un filtre (condition de
regroupement des n-uplets) portant sur le résultat
Syntaxe
SELECT colonne1, SUM(colonne2)
FROM nom_table
GROUP BY colonne1
HAVING fonction(colonne2) operateur valeur
NB: La clause HAVING est très souvent utilisée en même temps que GROUP BY bien que
ça ne soit pas obligatoire.
Exemple
SELECT client, SUM(tarif)
FROM achat
GROUP BY client
HAVING SUM(tarif) > 40
f. La clause ORDER BY
Elle permet de définir le tri des colonnes de la réponse, soit en précisant le nom
littéral de la colonne, soit en précisant son n° d'ordre dans l'énumération qui suit le mot
clef SELECT. Elle permet de trier le résultat final de la requête, elle est donc la dernière
clause de tout ordre SQL et ne doit figurer qu'une seule fois dans le SELECT, même s'il
existe des requêtes imbriquées ou un jeu de requêtes ensemblistes
40
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
Exemple
SELECT CLI_NOM, CLI_PRENOM
FROM T_CLIENT
ORDER BY CLI_NOM, CLI_PRENOM
ou
REMARQUE :
- Par défaut les résultats sont classés par ordre ascendant ;
- Les valeurs nulles, lorsqu’elles existent dans le résultat, se situent en premier dans
l'ordre ainsi établit ;
- Le tri est un tri interne sur le résultat final de la requête, il ne faut donc placer dans
cette clause que les noms des colonnes mentionnés dans la clause SELECT
Cette syntaxe possède la contrainte principale qui est celle d’obliger de remplir
toutes les données de la table tout en respectant l’ordre des colonnes sinon certaines
valeurs prennent le risque d’être insérée dans la mauvaise colonne.
Remarque : Lorsque le champ à remplir est de type VARCHAR ou TEXT il faut indiquer le
texte entre guillemet simple. En revanche, lorsque la colonne est un
numérique il n’y a pas besoin d’utiliser de guillemet, il suffit juste d’indiquer
le nombre.
NB :Il est aussi possible d’insérer des données dans une table lors de sa création par la
commande suivante :
CREATE TABLE nom_table [(nom_col1, nom_col2, ...)] AS SELECT ...
On peut ainsi, en un seul ordre SQL créer une table et la remplir avec des données
provenant du résultat d'un SELECT. Si les types des colonnes ne sont pas spécifiés, ils
correspondront à ceux du SELECT. Il en va de même pour les noms des colonnes.
Syntaxe :
DELETE FROM Nom_table
WHERE condition
Exemple : Soit la table Utilisateur (id, Nom, Prenom, date_inscription) qui contient des
informations sur les utilisateurs d’une application.
Syntaxe :
UPDATE table
SET nom_colonne_1 = 'nouvelle valeur'
WHERE condition
Cette syntaxe permet d’attribuer une nouvelle valeur à la colonne nom_colonne_1 pour les
lignes qui respectent la condition stipulée 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.
NB : Pour spécifier en une seule fois plusieurs modifications, 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 condition
Table « client » :
id No m R ue ville c o de_ po st al pay s
1 Chantal 12 Avenue du Petit Trianon Puteaux 92800 France
43
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
Résultats :
i d N om Ru e v ille code _ pos tal pay s
1 Chantal 12 Avenue du Petit Trianon Puteaux 92800 FRANCE
UPDATE achat
SET quantite= (CASE
WHEN surcharge < 1 THEN quantite + 1
WHEN surcharge > 1 THEN quantite - 1
ELSE quantite
END )
Syntaxe :
MERGE INTO table1
USING table_reference ou requite
ON (conditions)
WHEN MATCHED THEN
UPDATE SET table1.colonne1 = valeur1, table1.colonne2 = valeur2,…
44
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
a. L’UNION
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 hachurée correspond à la zone que l’on
souhaite obtenir (dans notre cas : tous les éléments).
Syntaxe
SELECT * FROM table1
UNION
SELECT * FROM table2
Exemple : Soit une entreprise qui possède plusieurs magasins et dans chacun de ces
magasins il y a une table qui liste les clients. Les tables (magasin1_client,
magasin2_client) sont de la forme (prenom, nom, ville, date_naissance,
total_achat). Sachant que certains clients peuvent fréquenter les deux
magasins, pour éviter de doublons, 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
SELECT *
FROM magasin1_client
UNION ALL
SELECT *
FROM magasin2_client
b. L’INTERSECTION
L’intersection de 2 ensembles A et B correspond aux éléments qui sont présent
dans A et dans B. Cela peut être représenté par un schéma explicatif simple ou
l’intersection de A et B correspond à la zone hachurée.
Syntaxe
SELECT *
FROM table1
INTERSECT
SELECT *
FROM table2
c. LA DIFFERENCE
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 hachurée sera retournée grâce à la commande EXCEPT
(ou MINUS).
46
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
seconde requête. Si un même enregistrement devait être présent dans les résultats des 2
syntaxes, ils ne seront pas présents dans le résultat final. Cette commande s’appelle
différemment selon les Systèmes de Gestion de Base de Données (SGBD) :
EXCEPT : PostgreSQL
MINUS : MySQL et Oracle
Syntaxe
SELECT *
FROM table1
EXCEPT
SELECT *
FROM table2
Exemple : Soit un système informatique d’une entreprise contenant des listes de clients:
Une table « clients_inscrits » qui contient les prénoms, noms et date d’inscription de
clients
Une table « clients_refus_email » qui contient les informations des clients qui ne
souhaitent pas être contacté par email
Pour sélectionner les clients pour envoyer un email d’information, il faut exclure les clients
de la deuxième table ne devront pas apparaître dans les résultats de la manière suivante :
Syntaxe
SELECT colonne1, colonne2,…
FROM Nom_de_la_table
WHERE nom_colonne opérateur (SELECT colonne
FROM Nom_de_la_table_2
Where prédicats)
47
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
NB :
- Il est possible d’utiliser n’importe quel opérateur d’égalité tel que =, >, <, >=, <=
ou <>, IN, NOT IN
- Il est impératif que la sous-requête ne renvoie qu’un seul résultat.
Exemple
SELECT Prod_id, categorie, fournisseur
FROM Produit
WHERE Prod_id NOT IN (SELECT Prod_id
FROM Commande
WHERE C_date between 2014-01-01’ and ‘2014-12-31’)
Remarque : Les jointures ne sont pas la seule manière de mettre en relation différentes
tables au sein d'une même requête SQL. On peut aussi joindre plusieurs
tables à l'aide des sous-requêtes ainsi qu'à l'aide des opérateurs
ensemblistes que nous avons vus précédemment.
Syntaxe
SELECT colonne1 AS c1, colonne2
FROM table
NB : 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.
L’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.
Exemple :
SELECT *
FROM nom_table t1
48
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
b. TYPE DE JOINTURE
Selon les tables qui participent à la construction de résultats, selon le contenu
du résultat en soi, nous distinguons les types de jointures ci-dessous :
Syntaxe :
SELECT [DISTINCT ou ALL] * ou liste de colonnes
FROM laTable t1, laTable t2
WHERE t1.laClef = t2.laPseudoClefEtrangère
Exemple
Select a.prod_id, a._name, a.fournisseur
From produit a, produit b
Where a.fournisseur=b.fournisseur;
Exemple
SELECT cl1.Nom, cl1.Prenom, cl2.Nom, cl2.Prenom
FROM Client AS cl1, Client AS cl2
WHERE cl1.Num_Client = cl2.Num_Client
Ou
49
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
Syntaxe :
SELECT [DISTINCT ou ALL] * ou liste de colonnes
FROM table1 NATURAL JOIN table2 [USING (colonne1 [, colonne2 ...])]
Exemple
SELECT CLI_NOM, TEL_NUMERO
FROM T_CLIENT NATURAL JOIN T_TELEPHONE
Ou
Exemple : Recherche des clients dont le nom est celui d'une ville dans la table des
adresses :
SELECT DISTINCT C.CLI_ID, C.CLI_NOM, A.ADR_VILLE
FROM T_CLIENT C, T_ADRESSE A
WHERE C.CLI_NOM = A.ADR_VILLE
Syntaxe :
SELECT [DISTINCT ou ALL] * ou liste de colonnes
FROM table1 [INNER] JOIN table2 ON condition de jointure
Exemple : Soit une table UTILISATEUR ainsi qu’une table COMMANDE qui contient toutes
les commandes effectuées par les utilisateurs.
Pour afficher toutes les commandes associées aux utilisateurs, on utilise la requête
suivante :
Exemple :
SELECT DISTINCT C.CLI_ID, C.CLI_NOM, A.ADR_VILLE
FROM T_CLIENT C INNER JOIN T_ADRESSE A ON C.CLI_NOM = A.ADR_VILLE
50
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
Remarque :
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 la clause WHERE. En effet, les jointures faites dans la clause WHERE ne
permettent pas de faire la distinction, de prime abord, entre ce qui relève de la sélection
et ce qui relève de la jointure puisque tout est regroupé dans une seule clause. La lisibilité
des requêtes est plus grande en utilisant la syntaxe de l'opérateur JOIN qui permet d'isoler
les conditions de sélections (clause WHERE) de celles de jointures (clauses JOIN), et qui
permet également de cloisonner les conditions de jointures entre chaque couple de tables.
De plus, l'optimisation d'exécution de la requête est souvent plus pointue lorsque l'on
utilise l'opérateur JOIN.
Exemple : Pour obtenir les détails de factures qui ont été émises avant que le prix des
petits déjeunés n'atteigne 4500 Fc, la requête s’écrira :
SELECT F.*
FROM T_FACTURE F, T_TARIF T
WHERE F.FAC_DATE < T.TRF_DATE_DEBUT
AND TRF_PETIT_DEJEUNE < 4500
ou
SELECT F.*
FROM T_FACTURE F INNER JOIN T_TARIF T
ON F.FAC_DATE < T.TRF_DATE_DEBUT
WHERE TRF_PETIT_DEJEUNE < 4500
Syntaxe
SELECT *
FROM table1
CROSS JOIN table2
51
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
Exemple : Soit une application de gestion des cours suivis par des étudiants qui contient 2
tables : ETUDIANT et COURS.
Pour associer tous les étudiants avec tous les cours, il convient d’effectuer l’une ou l’autre
des requêtes suivantes:
SELECT ET_id, ET_nom, C_id, C_nom
FROM ETUDIANT
CROSS JOIN COURS
ou
SELECT ET_id, ET_nom, C_id, C_nom
FROM ETUDIANT, COURS
Syntaxe
SELECT *
FROM table1
LEFT JOIN (LEFT OUTER JOIN) table2 ON table1.id = table2.fk_id
Cette requête permet de récupérer les informations de table1 tout en récupérant les
données associées, même s’il n’y a pas de correspondance avec table2. A savoir, s’il n’y a
pas de correspondance les colonnes de table2 vaudront toutes NULL.
Exemple : Soit une application contenant des utilisateurs et des commandes pour chacun
de ces utilisateurs.
Table utilisateur :
Id P reno m No m E mail ville
1 Aimée Marechal aime.marechal@example.com Paris
52
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
Table commande :
ut ilisa t eur_ id dat e_ ac hat num_ fac t ure prix_ t o t al
1 2013-01-23 A00103 203.14
Pour lister tous les utilisateurs avec leurs commandes et afficher également les utilisateurs
qui n’ont pas effectuées d’achats, il est possible d’utiliser la requête suivante:
SELECT *
FROM utilisateur
LEFT JOIN commande ON utilisateur.id = commande.utilisateur_id
Résultats :
Id P reno m No m dat e_ ac hat num_ fac t ure prix_ t o t al
1 Aimée Marechal 2013-01-23 A00103 203.14
Exemple
SELECT cl.Nom, cl.Prenom, cmd. Num_Client
FROM Client AS cl, Commande AS c
WHERE cl.Num_Client (+) = cmd.Num_Client
Ou :
53
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
Syntaxe
SELECT *
FROM table1
RIGHT JOIN (RIGHT OUTER JOIN) table2 ON table1.id = table2.fk_id
Cette syntaxe stipule qu’il faut lister toutes les lignes du tableau table2 (tableau de
droite) et afficher les données associées du tableau table1 s’il y a une correspondance
entre ID de table1 et FK_ID de table2. S’il n’y a pas de correspondance,
l’enregistrement de table2 sera affiché et les colonnes de table1 vaudront toutes NULL.
Exemple : Soit une base de données qui contient des utilisateurs et leur historique d’achat.
Table utilisateur :
Id P reno m No m Ville ac t if
1 Aimée Marechal Paris 1
Table commande :
ut ilisa t eur_ id dat e_ ac hat num_ fac t ure prix_ t o t al
1 2013-01-23 A00103 203.14
Pour afficher toutes les commandes avec le nom de l’utilisateur correspondant il est
normalement d’habitude d’utiliser INNER JOIN en SQL. Malheureusement, si l’utilisateur a
été supprimé de la table, alors ça ne retourne pas l’achat. L’utilisation de RIGHT JOIN
permet de retourner tous les achats et d’afficher le nom de l’utilisateur s’il existe. Ainsi la
requête s’écrira:
54
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
Résultats :
Id p reno m no m ut ilisat eur_ id dat e_ ac hat num_ fac t ure
1 Aimée Marechal 1 2013-01-23 A00103
Syntaxe
SELECT *
FROM table1
FULL JOIN (FULL OUTER JOIN) table2 ON table1.id = table2.fk_id
Exemple : Soit une base de données qui contient une table utilisateur ainsi qu’une table
commande qui contient toutes les ventes.
Table commande :
id d a t e_ a c hat num_ fac t ure prix_ t o t al
1 2013-01-23 A00103 203.14
55
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
Table utilisateur :
id P reno m No m Ville ac t if
1 Aimée Marechal Paris 1
Pour lister tous les utilisateurs ayant effectué ou non une vente, et de lister toutes les
ventes qui sont associées ou non à un utilisateur. La requête est la suivante :
Résultat :
id P reno m no m ut ilisat eur_ id dat e_ ac hat num_ fac t ure
1 Aimée Marechal 1 2013-01-23 A00103
56
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
A Atomicité : Une transaction s'effectue ou pas (tout ou rien), il n'y a pas de demi-
mesure. Par exemple l'augmentation des prix de 10% de tous les articles d'une table des
produits ne saurait être effectuée partiellement, même si le système connaît une panne en
cours d'exécution de la requête.
I Isolation : les transactions sont isolées les unes des autres. Par exemple la mise à
jour des prix des articles ne sera visible pour d'autres transactions que si ces dernières ont
démarrées après la validation de la transaction de mise à jour des données. Il n'y aura
donc pas de vue partielle des données pendant toute la durée de la transaction de mise à
jour.
D Durabilité : une fois validée, une transaction doit perdurer, c'est à dire que les
données sont persistantes même s'il s'ensuit une défaillance dans le système. Par
exemple, dès lors qu'une transaction a été validée, comme la mise à jour des prix, les
données modifiées doivent être physiquement stockées pour qu'en cas de panne, ces
données soient conservées dans l'état où elles ont été spécifiées à la fin de la transaction.
57
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
58
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
59
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
BIBLIOGRAPHIE
4. Didier Banos and Michel Mouyssinat. De Merise aux bases de données. Eyrolles,
1990.
9. John Kauffman, Brian Matsik, and Kevin Spencer. Maîtrisez SQL. CampusPress, 20
August 2001.
10. Michael J. Hernandez and John L. Viescas. Introduction aux requêtes SQL. Eyrolles,
6 June 2001
60
Langage de Gestion : Le Langage SQL
UNIKIN/FAC DES SCIENCES/G3 INFO
BIBLIOGRAPHIE ............................................................................................................................................ 60
61
Langage de Gestion : Le Langage SQL