0% ont trouvé ce document utile (0 vote)
3 vues33 pages

Introduction au Langage SQL et ses Fonctions

Le document présente SQL comme un langage de définition, de manipulation et d'interrogation de données relationnelles. Il décrit brièvement l'historique de SQL et ses principales commandes.

Transféré par

astouinna
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
3 vues33 pages

Introduction au Langage SQL et ses Fonctions

Le document présente SQL comme un langage de définition, de manipulation et d'interrogation de données relationnelles. Il décrit brièvement l'historique de SQL et ses principales commandes.

Transféré par

astouinna
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Plan 2

Bases de données :
« Le Langage SQL »
1 Introduction

David Célestin FAYE


2 SQL comme LDD

UFR SAT/UGB
3 SQL comme LMD
4 novembre 2021

4 SQL comme Langage de Requêtes

Introduction Introduction
SQL comme LDD SQL comme LDD
SQL comme LMD SQL comme LMD
SQL comme Langage de Requêtes SQL comme Langage de Requêtes

Plan 3 Présentation de SQL 4


Langage de requête
ensemble de commandes permettant
1 Introduction l’interrogation de la base de données
la mise à jour de la base de données
2 SQL comme LDD
Z Classement des langages de requête suivant leur nature
3 SQL comme LMD procédurale :
langage « très procédural » : précise COMMENT obtenir ce
que l’on cherche. Ces langages sont employés dans les modèles
4 SQL comme Langage de Requêtes navigationnels (hiérarchique, réseau).
langage « peu procédural » : permet de DECRIRE ce qui est
recherché. Le modèle relationnel utilise ce type de langage que
nous appellerons langage relationnel( exemple SQL).

David Célestin FAYE Bases de données David Célestin FAYE Bases de données
Présentation de SQL 5 SQL : Quelques repères historiques 6

Z SQL : Structured Query Langage Z 1974 SEQUEL (Structured English Query Language) ancêtre
de SQL
Z Langage textuel aux règles syntaxiques précises et intégré au
sein du SGBD relationnel et composé de plusieurs parties Z 1979 premier SGBD basé sur SQL par Relational Software Inc.
un langage de définition de données (LDD) (rebaptisé Oracle)
un langage de d’interrogation de la base de données Z 1986 SQL1 1ière norme ISO
un langage de manipulation de données(LMD) Z 1989 ajout des contraintes d’intégrité de base (clé primaire et
clé étrangère)
un langage de contrôle de l’accès aux données de données
(LCD) Z 1992 SQL2 2ième norme extension de SQL1 (nouveaux types
et nouveaux opérateurs
un langage de contrôle des transactions (LCT)
Z 1999 SQL3 extension de SQL2 (introduction des types
SQL procedural qui est un ensemble d’outils pour que SQL
orientés objet)
s’interface avec des langages hôtes.

Utilisation de SQL 7 Tableau des commandes SQL 8

Z Trois types d’utilisateurs : SQL interactif SQL intégré SQL dynamique


Administrateur de BD (stockage, droits d’accès)
LDD LMD LCD
Administrateur d’applications (définitions des tables) CREATE INSERT GRANT DECLARE PREPARE
Développeur d’applications (écriture de programmes) DROP DELETE REVOKE CURSOR DESCRIBE
Z Deux modes d’utilisation : ALTER UPDATE CONNECT FETCH EXCECUTE
Interactif SELECT COMMIT
Intégré dans un programme ROLLBACK
SET
SQL dans les SGBD 9 Préliminaires 10

Le langage SQL est présent dans principaux SGBDR et chacun de


ces derniers a sa propre variante du langage.
Notations utilisées pour décrire la syntaxe du langage SQL :
Access DB2 Firebird
Les mots réservés du langage sont en majuscules ;
FoxPro - Visual Foxpro HyperFile Ingres
Informix Microsoft SQL Server MySQL les éléments terminaux sont représentés en minuscules ;
Oracle Paradox PostgreSQL les éléments non terminaux sont encadrés par <...>
SmallSQLb SQLite Sybase les parties optionnelles sont encadrées par [...] ;
... ... ... les parties alternatives sont séparées par des barres verticales
et encadrées par des accolades sous la forme {...|...|...} ;
Tous ces systèmes présentent certaines particularités dont une répétition d’éléments (liste) est notée {...}◦ .
certaines ne se retrouvent pas chez d’autres
se référer au manuel de référence du SGDBR, lors de requêtes
particulières ou complexes, ainsi que pour leur optimisation.

Base de travail 11 Exécuter des requêtes SQL en ligne 12

Nous prendrons comme exemple le schéma relationnel suivant :

Clients(codeClient, nomClient ,prenomClient, age,ville) Pour créer un schéma de bases de données (sous MySQL,
Produits(codeProduit ,designation ,prixUnitaire ,tauxTVA, poids, PostgreSQL ...) et l’interroger en ligne :
stock,couleur) [Link]
Commandes(numCommande, dateCommande, commandeReglee,codeClient) Pour exécuter des requêtes en ligne sur une base exemple :
LignesCommande(numCommande,codeProduit, quantite)
[Link]
Fournisseurs(codeFournisseur, nomFourn, prenomFourn, ville,
telephone) Rappels des commandes SQL : [Link]
Livraison(codeFournisseur, codeProduit,quantite)
Introduction Introduction
SQL comme LDD SQL comme LDD
SQL comme LMD SQL comme LMD
SQL comme Langage de Requêtes SQL comme Langage de Requêtes

Plan 13 Objets manipulés par SQL : tables 14


codeProduit designation prixUnitaire
12 savon 100
1 Introduction 04 sucre 220
11 lait 150
03 huile 170
2 SQL comme LDD
Table – Table PROD des produits
Chaque colonne est repérée par un identificateur
3 SQL comme LMD
Deux colonnes de deux tables différentes peuvent porter le
même nom
4 SQL comme Langage de Requêtes Une colonne peut porter le même nom que sa table
une colonne C dune table T se désigne par : T.C
quand il n’y a pas d’ambiguité, on peut abréger en : C
l’ensemble des colonnes d’une table T se désigne par : T.* ou
*
David Célestin FAYE Bases de données David Célestin FAYE Bases de données

Création d’une table 15 Création d’une table 16

CREATE TABLE nom-table ( {<élément-table>}◦ );


<élément-table>:= <définition-colonne>|<contrainte-table>
Remarques(suite)
<définition-colonne>:= nom-colonne <type>[<clause-défaut>] le nombre de caractères ne doit pas être trop grand (64 dans
[<contrainte-colonne>] Access, 18 à 30 dans d’autres SGBD) ;
<clause-défaut>:= DEFAULT valeur
seules les lettres, les nombres et le caractère de soulignement
Remarques sont autorisés. Access admet les caractères accentués. Il admet
aussi l’espace, mais le nom du champ doit alors être écrit entre
nom-Table est le nom de la table qu’on veut créer crochets ;
nom-colonne remplace un nom de colonne certains SGBD requièrent que le nom d’un champ commence
<type> est le type des données qui seront contenues dans la par une lettre, mais ce n’est pas le cas d’Access ;
colonne les termes faisant partie du vocabulaire du langage SQL sont
" ;" marque la fin de la commande interdits ("date" par exemple). Ce sont les mots réservés
les clauses peuvent être écrites aussi bien en majuscule qu’en
minuscule
Création d’une table 17 Types SQL 18
Les types de données varient d’un logiciel à un autre !
Dans Access nous avons les types suivants : vspace-0.5cm Types SQL

Booléen BIT
Nombre entier SHORT (entier), SMALLINT (entier), LONG (entier long), Chaînes de caractères Temporel Nombres Chaînes de bits
INTEGER (entier long), BYTE (octet)
Nombre réel SINGLE (réel simple), DOUBLE (réel double), NUMERIC (réel double)
DATE TIME BIT BIT VARYING
Monétaire CURRENCY, MONEY
Date/Heure DATE, TIME, DATETIME , TIMESTAMP TIMESTAMP Réels Entiers
Texte VARCHAR (255 caractères), CHAR(longueur) ou TEXT(longueur)
(longueur caractères), LONGTEXT (mémo, 32K max.) ASCII ASCII
Fichier binaire LONGBINARY (Objet OLE) INTEGER SMALLINT
Exact Approchés
Compteur COUNTER (NuméroAuto).

Dans Oracle, on a la liste suivante (non limitative) DECIMAL REAL FLOAT

NUMBER(n, m) (décimaux à n chiffres au total, m après la CHAR VARCHAR NCHAR NCHAR VARYING DOUBLE PRECISION

virgule) ,CHAR(n) (chaîne de longueur fixe) , VARCHAR(n) Attention : Les types CHAR(N) et NCHAR(N) complètent les données
(chaîne de longueur variable) , DATE (généralement au format par des blancs si la taille réelle est inférieure à N
’DD-MM-YY HH:MM:SSam’)

Types de la norme SQL 19 Création d’une table 20


smallint -entier (2 bytes)
integer-entier(4 bytes) ZExemple
bigint-entier(8 bytes)
CREATE TABLE Clients(
numeric(p,s) et decimal(p,s)-virgule fixe, ie, nombre fixe de codeClient INTEGER,
positions décimales(taille variable )
nomClient CHAR(15),
real-virgule flottante(4 bytes ) prenomClient CHAR(20),
double precision-virgule flottante (8 bytes) ville CHAR(16));
char(n)-chaine de caractères de longueur fixe n(n bytes)
Remarque :
varchar(n)-chaine de caractères de longueur variable maximum Les constantes chaînes de caractères sont entourées par des
n(n+2 bytes)
apostrophes (’). Si la chaîne contient une apostrophe celle-ci doit
date-YYYY-MM-DD(année, mois, jour)(4 bytes) être doublée.
time-HH :MM :SS(heures,mins,secs)(8 bytes) Exemple : ’aujourd”hui’
timestamp-YYYY-MM-DD HH :MM :[Link](8 bytes)
ffffff représente une fraction de seconde
boolean- booléen(1 bit)
Contraintes d’intégrité 21 Définition de contraintes d’intégrité 22

Interdiction des valeurs nulles


Clés primaires
Prédicats qui doivent toujours être satisfaits par les données Clés étrangères
stockées dans la BD.
Contraintes de domaine
But : maintenir la cohérence/l’intégrité de la BD :
Vérifier/valider automatiquement (en dehors de l’application) <contrainte-colonne>:=
les données lors des mises-à-jour (insertion, modification, [[CONSTRAINT nom-contrainte][NOT] NULL]]
[[CONSTRAINT nom-contrainte] {UNIQUE|PRIMARY KEY}]
effacement) [[CONSTRAINT nom-contrainte] REFERENCES <nom-table>
Déclencher automatiquement des mises-à-jour entre tables [({nomcolonne}◦ )][ON DELETE CASCADE] ]
pour maintenir la cohérence globale. [[CONSTRAINT nom-contrainte] CHECK (<condition>)]

<contrainte-table>:=
[[CONSTRAINT nom-contrainte]{UNIQUE|PRIMARY KEY}({nom-colonne}◦ )]
[[CONSTRAINT nom-contrainte] FOREIGN KEY ({nom-colonne}◦ )
REFERENCES <nom-table>[(nom-colonne◦ )][ON DELETE CASCADE]]
[[CONSTRAINT nom-contrainte] CHECK (<condition>)]

contraintes d’intégrité :Interdiction des valeurs nulles 23 Absence de valeur 24

NULL : représente l’absence de valeur pour tous les types de


données. Ce n’est pas une valeur
<contrainte-colonne>:=
[[CONSTRAINT nom-contrainte][NOT] NULL]] Z pour les types chaîne de caractères :
la chaîne vide ’ ’ représente aussi l’absence de valeur
ZExemple pour les types chaîne de caractères (taille fixe ou variable) une
chaîne remplie de blancs n’est pas équivalente à la chaîne vide
CREATE TABLE Clients( Z pour les types numériques
codeClient INTEGER, le nombre 0 ne représente pas l’absence de valeur
nomClient CHAR(20) NOT NULL,
prenomClient CHAR(20),
Z La valeur NULL n’est comparable à aucune autre valeur
ville CHAR(16)); Z Lorsque l’un des termes d’une expression à la valeur NULL,
l’expression entière prend la valeur NULL
NULL sera interdit dans le champ nomClient. Z Un prédicat comportant une comparaison avec une expression
ayant la valeur NULL prendra toujours la valeur faux
Z La clé primaire ne peut pas contenir des valeurs nulles.
contraintes d’intégrité :Enumération des valeurs possibles 25 Index sans doublons 26

<contrainte-colonne>:=
<contrainte-colonne>:= [[CONSTRAINT nom-contrainte]{UNIQUE}]
[ [CONSTRAINT nom-contrainte] CHECK (<condition>) ]
ZExemple (SQL Standard)
ZExemple CREATE TABLE Clients(
On restreint les valeurs possibles de l’attribut commandeReglee codeClient INTEGER,
dans la table Commandes. nomClient CHAR(20) UNIQUE,
prenomClient CHAR(20),
CREATE TABLE Commandes( ville CHAR(16));
numCommande INTEGER,
dateCommande CHAR(20) CREATE TABLE Clients(
commandeReglee CHAR(5) CHECK (commandeReglee IN (’oui’, ’non’) codeClient INTEGER,
); nomClient CHAR(20) CONSTRAINT nomContrainte UNIQUE,
prenomClient CHAR(20),
ville CHAR(16));

Clé primaire : clause PRIMARY KEY 27 Clé primaire : clause PRIMARY KEY 28
<contrainte-colonne>:=[[CONSTRAINT nom-contrainte]{PRIMARY KEY}]
<contrainte-colonne>:=[[CONSTRAINT nom-contrainte]PRIMARY KEY
(nom-colonne)
Pour appliquer la clé à deux champs, nous utilisons la syntaxe
ZExemple suivante :
ZExemple
CREATE TABLE Clients(
codeClient INTEGER PRIMARY KEY, CREATE TABLE ligneCommandes(
nomClient CHAR(20) NOT NULL, numCommande INTEGER ,
prenomClient CHAR(20) codeProduit CHAR(20),
ville CHAR(20)); quantite INTEGER,
CONSTRAINT pk PRIMARY KEY(numCommande, codeProduit));
CREATE TABLE Clients(
codeClient INTEGER CONSTRAINT clePrimaire PRIMARY KEY,
nomClient CHAR(20) NOT NULL,
prenomClient CHAR(20)
ville CHAR(20));

DEFAULT ne fonctionne pas dans certaines versions de ACCESS.


Index : Qu’est-ce qu’un index ? 29 Index :Qu’est-ce qu’un index ? 30

Un index est une table à deux champs. Le premier est le champ sur Un index sur un champ permet un accès rapide sur les valeurs
lequel porte l’index. Le second est le numéro d’enregistrement de ce champ.
correspondant dans la table. La table d’index est triée sur les
En effet, le temps moyen d’accès à un élément est de N/2 sans
valeurs du premier champ
index à comparer avec log2 N avec un index
Soit une table CLIENTS(numclient, nom, prénom, ...). Un Les index permettent d’accélérer les calculs de requêtes.
index sur le cham [Link] est une table : Cependant
1 ils doivent être mis à jour (par le SGBDR) lors de toute mise à
... ... jour de la table,
ba 235487 2 ils prennent de la place car c’est une nouvelle table. On parle
fall 3378 de compromis temps-espace.
sarr 457302
... ...

Définir un index ? 31 Création des index 32

Un index permet l’accélération des accès aux données par la


clé d’index (colonne) choisie.
Sur quels champs
CREATE [UNIQUE] INDEX nom-index ON <nom-table>( { nom-colonne
Règle 1 La table doit avoir un grand nombre de lignes [ASC | DESC ] }◦ )
Règle 2 l’attribut doit avoir beaucoup de valeurs différentes ASC et DESC ⇒ tri en ordre croissant ou décroissant
Règle 3 indexer les attributs servant aux jointures et donc les Pour créer un index sur une table déjà existante on a par
clés primaires et clés étrangères (souvent fait par le SGBDR) exemple :
Règle 4 indexer les attributs qui interviennent dans les clauses CREATE UNIQUE INDEX nom_index ON Clients (nomClient);
WHERE et ORDER BY de requêtes très souvent exécutées
Pour supprimer un index dans Access
et pas tous les champs à cause du compromis temps-espace ! DROP INDEX nom_index ON Clients
Mais en SQL standard il faudra écrire :
DROP INDEX Clients.nom_index;
Contrainte référentielle 33 Contrainte référentielle 34

Dans le cas d’une entité faible, on décide en général de détruire le


<contrainte-table>:=
référençant quand on détruit le référencé. ON DELETE CASCADE
[[CONSTRAINT nom-contrainte] FOREIGN KEY ({nom-colonne}◦ )
REFERENCES <nom-table>[(nom-colonne◦ )][ON DELETE CASCADE] ON UPDATE CASCADE
[ON UPDATE CASCADE]]
CREATE TABLE Commandes(
numCommande INTEGER PRIMARY KEY,
CREATE TABLE Commandes( dateCommande DATE,
numCommande INTEGER PRIMARY KEY, codeClient INTEGER,
dateCommande DATE, CONSTRAINT relation_commander FOREIGN KEY (codeClient)
codeClient INTEGER, REFERENCES Clients ON DELETE CASCADE ON UPDATE CASCADE);
CONSTRAINT relation_commander FOREIGN KEY (codeClient)
REFERENCES Clients(codeClient) );
clauses que l’on peut associer à l’intégrité référentielle
ON UPDATE {[NOACTION] | CASCADE | SET NULL | SET DEFAULT}
Si le champ de liaison porte le même nom dans Clients et ON DELETE {[NOACTION] | CASCADE | SET NULL | SET DEFAULT}
Commandes nous pouvons l’omettre dans la table référencée :

Suppression de table 35 Modification d’une table 36

Syntaxe

DROP TABLE nom_table;


ALTER TABLE nom_de_table <modification_de_table> ;
ZExemple <modification_de_table> :=
ADD COLUMN définition_de_colonne
DROP TABLE Clients; ADD CONSTRAINT contrainte_de_table
Quand une table est supprimée le système : DROP COLUMN nom_de_colonne
DROP CONSTRAINT nom_de_contrainte
efface tous les index qui y sont attachés quelque soit le
propriétaire
efface tous les privilèges qui y sont attachés
Modification d’une table 37 Modification d’une table 38
Z Suppression d’une colonne - DROP

ALTER TABLE nom_table DROP Colonne_a_supprimer


Exemple Ajout d’une colonne - ADD Ou encore
ALTER TABLE nom_table DROP COLUMN Colonne_a_supprimer ;
ALTER TABLE nom_table ADD nouveau_champ type_nouveau_champ ;
Ou encore
ZExemple
ALTER TABLE nom_table ADD COLUMN nouveau_champ type_nouveau_champ
; ALTER TABLE Clients DROP dateNaiss ;
Ou
ZExemple ALTER TABLE Clients DROP COLUMN dateNaiss ;
ALTER TABLE Clients ADD date_naiss DATE ; En SQL standard ALTER TABLE peut aussi être utilisée pour
Ou modifier les propriétés d’une colonne existante.
ALTER TABLE Clients ADD COLUMN date_naiss DATE ;
ALTER TABLE nom-table MODIFY ( { <définition-colonne> }◦ )

ZExemple
ALTER TABLE Clients MODIFY nomClient CHAR(25);

Mais la clause MODIFY n’est pas reconnue par Access,.

Modification d’une table 39 Modification d’une table 40

Z Ajout de contraintes dans une table


CREATE TABLE Clients( Z Ajout de contraintes dans une table
codeClient INTEGER,
nomClient CHAR(30), CREATE TABLE Commandes(
precomClient CHAR(30), numCommande INTEGER,
adresse CHAR(50)); dateCommande DATE,
CommandeReglee CHAR(30),
ALTER TABLE Clients codeClient INTEGER);
ADD CONSTRAINT cle_primaire PRIMARY KEY(codeClient);
ALTER TABLE Commandes
Si on ne veut pas donner de nom à la clé primaire on met ADD CONSTRAINT relation_commander FOREIGN KEY (codeClient)
simplement ( SQL standard) REFERENCES Clients(codeClient);

ALTER TABLE Clients


ADD PRIMARY KEY(codeClient);
Introduction
Modification d’une table 41 SQL comme LDD
SQL comme LMD
SQL comme Langage de Requêtes

Plan 42
Z Suppression de contraintes dans une table

ALTER TABLE nom-table DROP { PRIMARY KEY | UNIQUE ({nom-colonne}◦ )


| [CONSTRAINT nom-contrainte] } [CASCADE]
1 Introduction

ZExemple 2 SQL comme LDD


ALTER TABLE Commandes DROP CONSTRAINT relation_commander;

ZRenommer une table - RENAME 3 SQL comme LMD

RENAME NomAncienneTable TO NomNouvelleTable ;


4 SQL comme Langage de Requêtes

David Célestin FAYE Bases de données

Introduction
SQL comme LDD Ajout (ou insertion) d’un enregistrement 44
SQL comme LMD
SQL comme Langage de Requêtes

Ajout (ou insertion) d’un enregistrement 43


insertion d’un tuple ZExemple
INSERT INTO <nom-table>[{nom-colonne}◦ ] VALUES ({<atome>}◦ )
<atome>:= {constante | NULL } INSERT INTO lignesCommande(numCommande,codeProduit,quantite)
VALUES (1,’p1’,40)
ou encore
INSERT INTO nom_de_la_table (nom_colonne1,..., nom_colonnen) Si dans la table " Clients " numClient est de type
VALUES ( valeur1,...,valeurn); COUNTER(Numéroauto) ou SERIAL, nous insérons une nouvelle
valeur comme suit :
La liste des atomes de la clause VALUES doit correspondre à
celles des colonnes à insérer, tant en ce qui concerne le nombre INSERT INTO Clients (nomClient, prenomClient, ville)
que le type. VALUES ( ’Modou’ ,’ Pouye’,’Banjul’) ;
insertion d’un ensemble de tuples
INSERT INTO nom_de_la_table (nom_colonne1,..., nom_colonnen)
<requête SELECT dont le résultat a le même schéma que la
table >;

David Célestin FAYE Bases de données


Suppression d’un enregistrement 45 Mise à jour d’un enregistrement 46

DELETE FROM nom_table


[ WHERE <condition>] ;
ZExemple UPDATE nom-table
DELETE FROM Clients SET { nom-colonne = {<expression> | <requête-pleine>} }◦
WHERE nom_client=’Modou’ [WHERE <condition>]
Remarque :
ou
Les conditions peuvent être formées à partir d’opérateurs de
comparaison (=, >, <, >=, <=, <>) ou des opérateurs UPDATE nom-table
logiques AND, OR, NOT . SET <nom colonne 1> = <nouvelle valeur 1>
...... ........
DELETE * FROM Clients ;
<nom colonne n> = <nouvelle valeur n>
Supprime toutes les lignes de la table " Clients " [ WHERE <condition>] ;
La caractère * remplace l’énumération des conditions.
En l’absence de clause WHERE, tous les tuples de la table sont
supprimés.

Mise à jour d’un enregistrement 47 Terminaison des requêtes/mises- à-jours 48

ZExemple

UPDATE Clients
COMMIT
SET adresse=’dakar’
WHERE nom=’Modou’ ; pour rendre permanents les résultats des mises-à-jours
dans un programme (C, java...) :
UPDATE lignedeCommande EXEC SQL COMMIT;
SET quantite=quantite+10
ROLLBACK
WHERE codPrdouit=’P01’ ;
pour annuler les résultats des mises-à-jour
dans un programme :
Remarque :
EXEC SQL ROLLBACK;
Si la clause WHERE n’est pas indiquée, le champ précisé après
SET sera modifié pour toutes les lignes de la table La sémantique de ces commandes est supportée par les
transactions.
Chaque nom de colonne doit appartenir à la table précitée
Un même nom de colonne ne peut pas apparaître plus d’une
fois dans l’instruction SQL.
Introduction Introduction
SQL comme LDD SQL comme LDD
SQL comme LMD SQL comme LMD
SQL comme Langage de Requêtes SQL comme Langage de Requêtes

Plan 49 Syntaxe générale 50


SELECT [prédicat] <description de colonnes de colonnes résultat>
FROM <Nom d’une relation ou de plusieurs relations>
WHERE condition logique qui définit les tuples du résultat]
1 Introduction GROUP BY liste de nom_de_colonne]
[ HAVING critère]
2 SQL comme LDD [ ORDER BY critère]

Le Prédicat est utilisé pour décrire le traitement des lignes


3 SQL comme LMD
doublons en retour. Il peut prendre les valeurs :
ALL, DISTINCT, DISTINCT ROW, TOP[nombre ou pour-
4 SQL comme Langage de Requêtes centage]
La description de colonnes décrit les colonnes à retourner : *
indique toutes les colonnes

David Célestin FAYE Bases de données David Célestin FAYE Bases de données

Syntaxe générale 51 Comparaisons de chaînes 52


La condition logique qui définit les tuples du résultat
WHERE exp1 = exp2
WHERE exp1 != exp2
WHERE exp1 < exp2 Z Opérateur de comparaison approximative LIKE :
WHERE exp1 > exp2
chaine> LIKE ’<motif>’
WHERE exp1 <= exp2
où <motif> est une suite de caractères contenant
WHERE exp1 >= exp2
éventuellement les symboles %(parfois *) et_
WHERE exp1 BETWEEN exp2 AND exp3
WHERE exp1 LIKE exp2 %(*) remplace n’importe quelle suite de caractères
WHERE exp1 NOT LIKE exp2 _ remplace exactement un caractère
WHERE exp1 IN (exp2, exp3,...) ’abc%’ désigne tous les mots commençant par abc
WHERE exp1 NOT IN (exp2, exp3,...)
WHERE exp IS NULL
WHERE exp IS NOT NULL
La description de colonnes décrit les colonnes à retourner : *
indique toutes les colonnes
Etapes de l’interrogation 53 La sélection simple 54

Z Quels sont les coordonnées des clients de la ville de dakar ?


Z Analyse syntaxique SELECT * /* l’étoile signifie tous les attributs */
FROM Clients
Z Vérification de l’existence des tables, puis des colonnes et du
WHERE ville=’dakar’ ;
droit de les interroger
Z Quelles sont les commandes pour lesquelles les quantités
Z Mise au point du chemin d’accès aux données
commandées du produit ’P01’ sont supérieures à 15. ?
Z Exécution de la requête et présentation des données à SELECT numCommande
l’utilisateur FROM lingesCommande
WHERE codeProduit=’P01’
AND quantite >15 ;

La requête avec création de table 55 Le tri 56


Z Syntaxe
<order by> ::= ORDER BY <bycols>
<bycols> ::= <bycol>| <bycol>, <bycols>
<bycols> ::= <col> |<col> ASC| <col> DESC
Z L’ordre par défaut est ascendant (sauf avec DESC). La clause
ORDER BYest toujours placée en dernier dans la requête
Z Créer une requête qui extraie les noms, prénoms des clients
Z Le tri se fait d’abord selon le 1ier critère, puis les lignes ayant
SELECT nomClient, prenomClient INTO nouvelle_table
la même valeur pour le 1ier critère sont triées selon le 2ieme
FROM Clients;
critère, etc...
Z Si un attribut sur lequel porte un critère de tri contient la
valeur NULL, les lignes correspondantes sont affichées en
premier
Z Donner par ordre alphabétique croissant les noms et les villes
des clients du magasin
SELECT nomClient, ville
FROM Clients
ORDER BY nomClient ASC, ville ASC ;
L’élimination des doublons 57 L’élimination des doublons 58
Z Après une projection, il y a risque de doublons dans le résultat :
SELECT ville FROM Clients Z Nombre total de Clients
SELECT COUNT(*)
Ville FROM Clients ;
Dakar Z Nombre de clients habitant à dakar :
Thies SELECT COUNT(*)
Dakar FROM Clients
Zen SQL l’élimination des doublons n’est pas automatique et WHERE adresse=’dakar’ ;
doit être spécifiée par la clause DISTINCT) Z Nombre de valeurs de l’attribut nomClient dans la table
SELECT DISTINCT ville FROM Clients Clients :
SELECT COUNT(nomClient)
Ville FROM Clients ;
Dakar Nombre de valeurs distinctes de l’attribut nomClient :
Thies
SELECT COUNT(DISTINCT nomClient)
ZA un coût, donc à ne pas utiliser lorsque c’est inutile (pour FROM Clients ;
un attribut clé primaire par exemple)

La requête avec création de champ 59 Fonctions d’agrégat et regroupements 60

Z Exprimer une requête qui crée un nouveau champ NomComplet


qui est la concaténation des champ nomClient et Fonctions d’agrégat
prenomClient. Ensemble de fonctions qui permettent d’effectuer des statistiques
SELECT [nomClient] & " " & [prenomClient] AS NomComplet sur le résultat d’une requête (minimum, maximum, somme, etc. . . )
FROM Clients;
SELECT DISTINCT [nomClient] &" "& [prenomClient] AS Nom Regroupements
INTO ListeNoms Possibilité de regrouper plusieurs lignes d’une même requêtes
FROM Clients (souvent associés aux fonctions d’agrégat)
ORDER BY [nomClient] &" "& [prenomClient];
Fonctions d’agrégat et regroupements 61 Fonctions d’agrégat (de groupe) 62

Z Les fonctions de groupe calculent les résultats à partir d’une


collection de valeurs et restituent une valeur.
COUNT (*) comptage des lignes
Fonctions d’agrégat COUNT ([DISTINCT | ALL]<nom d’une colonne>)
Ensemble de fonctions qui permettent d’effectuer des statistiques comptage de toutes(ALL) ou des valeurs distinctes
sur le résultat d’une requête (minimum, maximum, somme, etc. . . ) (DISTINCT) des valeurs de la colonne spécifiée
MAX ([DISTINCT | ALL] expr ) maximum des valeurs
MIN ([DISTINCT | ALL] expr) minimum des valeurs
Regroupements SUM ([DISTINCT | ALL] expr) somme des valeurs
Possibilité de regrouper plusieurs lignes d’une même requêtes AVG ([DISTINCT | ALL] expr) moyenne des valeurs
(souvent associés aux fonctions d’agrégat) STDDEV ([DISTINCT | ALL] expr) écart-type des valeurs
VARIANCE ([DISTINCT | ALL] expr) variance des valeurs
Z Quel est le produit le moins cher ?
SELECT MIN(prixUnitaire)
FROM Produits;

La requête de regroupement 63 La requête de regroupement 64

Z Clause GROUP BY : permet de regrouper les lignes d’une


table ayant même valeur.
Client numéro nom prenom ville
SELECT liste d’expressions1 1 Diop Aly Dakar
FROM nom de table
GROUP BY liste d’expressions2 ;
2 Sarr Doudou Louga
3 Ba Fatou Thies
Z les expressions de liste d’expressions1 doivent être des 4 Diop Demba Dakar
expressions formées uniquement : 5 Fall Nafi Thies
d’expressions de liste d’expressions2
de fonctions de groupe
de constantes littérales
La requête de regroupement 65 La requête de regroupement 66

Client numéro nom prenom ville


1 Diop Aly Dakar
2 Sarr Doudou Louga Z Quelle est pour chaque produit la quantité totale commandée ?
3 Ba Fatou Thies SELECT codeProduit, SUM(quantite) AS quantiteTotale
4 Diop Demba Dakar FROM lignesCommande
5 Fall Nafi Thies GROUP BY codeProduit ;
Z Quel est le total des quantités commandées pour la commande
N◦ 5
SELECT ville
FROM Client SELECT numCommande, SUM(quantite) AS quantiteTotale
GROUP BY ville; FROM lignesCommande
WHERE numCommande = 5
Groupe 1, Groupe 2 et Groupe 3. Résultat : GROUP BY numCommande;

ville
Dakar
Louga
Thies

La requête de regroupement 67 La requête de regroupement 68

Conditions sur l’ensemble des lignes regroupées Z Quels sont les produits dont le total des quantités
Z Permet de sélectionner des groupes de la requête de commandées est supérieure à 150 ?
regroupement. SELECT codeProduit
SELECT liste_d_expressions FROM lignesCommande
FROM nom de table GROUP BY codeProduit ;
[ WHERE condition ] HAVING SUM(quantite) >150 ;
GROUP BY liste_d_expressions2 Z Combien de produits différents ont été commandées pour
HAVING condition_sur_lignes ; chaque commande, tels que la quantité totale de produits
Z les expressions de liste_ d_expressions et condition_ commandées pour cette commande soit supérieure à 1000 ?
sur_lignes doivent être formees uniquement : SELECT numCommande, COUNT( DISTINCT codeProduit)
d’expressions de liste_d_expressions2 FROM LignesCommandes
de fonctions de groupe GROUP BY numCommande
de constantes litérales HAVING SUM(quantite)>1000 ;
La requête de regroupement 69 Différence entre WHERE et HAVING 70

Z Quelles sont les commandes contenant au moins 3 produits


Z WHERE sélectionne les lignes de la requête avant de faire les
SELECT numCommande groupes.
FROM LignesCommandes Z HAVING sélectionne les groupes une fois qu’ils sont
GROUP BY numCommande constitués.
HAVING COUNT(DISTINCT codeProduit)>=3 ;
Z Trouver pour chaque ville la moyenne d’âge des clients de
Z Quels sont, pour la commande N◦ 2 et dans l’ordre décroissant moins de 40 ans :
des quantités, les produits pour lesquels le total des quantités SELECT ville , AVG(age) AS ageMoy
acceptées est supérieur à 220 ? FROM Client
WHERE age < 40
SELECT codeProduit , SUM(quantite) AS quantitetotale GROUP BY ville;
FROM ligneSCommande
WHERE numCommande = 2 Z Villes dont l’âge moyen des clients est inférieur à 40 ans :
GROUP BY codeProduit SELECT ville , AVG(age) AS ageMoy
HAVING SUM(quantite) > 220 FROM Client
ORDER BY SUM(quantite) DESC ; GROUP BY ville
HAVING AVG(age) < 40;

La jointure 71 La jointure 72

θ-jointure :
permet d’exprimer des requêtes portant sur les données SELECT *
FROM R1, R2
réparties dans plusieurs tables.
WHERE [Link] θ [Link]
On précise la liste des tables concernées dans la clause FROM, et
θ ∈ {<=>=! =}.
on exprime les critères de rapprochement dans la clause WHERE.
Jointure naturelle :
Syntaxe
SELECT *
SELECT * FROM R1, R2
FROM <liste_de_relations> WHERE [Link] = [Link]
WHERE <prédicat_de_jointure> Ai est un attribut commun à R1 et R2.
types de jointure : jointure naturelle, la θ-jointure et Auto-Jointure :
l’auto-jointure.
SELECT *
FROM R RA, R RB
WHERE [Link]θ [Link]
Ai ∈ R, Bj ∈ R
Jointure naturelle 73 74

S’il n’y a pas d’ambiguïté sur les noms des attributs, on peut
Z donner les noms, prénoms et villes des clients ayant commandé ne pas préfixer le nom de l’attribut par le nom de la table le
SELECT [Link],[Link],[Link] contenant.
FROM Clients ,Commandes
jointures non-équi : remplacer ’=’ par (<, <=, >, >=).
WHERE [Link] = [Link];
jointure interne : clause INNER JOIN. . Ne sont incluses dans
Z Nom des clients habitant Dakar, leurs commandes avec la date le résultat final que les lignes qui se correspondent dans les
de lancement deux tables.
SELECT nomClient, numCommande , dateCommande ZQuels sont les noms, prénoms et villes des clients ayant
FROM Clients , Commandes commandé ?
WHERE ville=’dakar’ SELECT [Link],[Link],[Link]
AND [Link] = [Link]; FROM Clients
INNER JOIN Commandes ON [Link]=[Link];

Jointures gauche et droite 75 Renommage d’une table 76

Z on peut associer un synonyme au nom d’une table et utiliser ce


• jointure externe gauche : INNER JOIN est remplacé par LEFT synonyme en tant que préfixe :
JOIN. Toutes les lignes de la première table sont incluses dans Z Syntaxe
le résultat de la requête, même s’il n’existe pas de ligne SELECT liste d’expressions
correspondante dans la seconde table ; FROM liste_de_(nom_de_table [ synonyme ])
• jointure externe droite : INNER JOIN est remplacé par RIGHT WHERE<condition>
JOIN. Toutes les lignes de la seconde table sont incluses dans Z Quels sont les noms, prénoms et villes des clients ayant
le résultat de la requête, même s’il n’existe pas de ligne commandé ?
correspondante dans la première table. SELECT [Link],[Link],[Link]
FROM Clients Cl, Commandes Co
WHERE [Link] = [Link];
Jointure d’une table à elle même 77 Jointure-Produit Cartésien 78

Il peut être utile de rassembler les informations venant d’une La norme SQL propose une syntaxe pour exprimer les jointures
ligne d’une table avec les informations venant d’une autre ligne dans la clause FROM avec CROSS JOIN.
de la même table. Le CROSS JOIN retourne le produit cartésien de deux tables.

Dans ce cas, on renomme au moins l’une des deux tables en lui SELECT ...
donnant un synonyme (voir slide ), afin de pouvoir préfixer FROM Commandes
sans ambiguïté chaque colonne. CROSS JOIN Clients;
Z Donner les couples de fournisseurs habitant dans la même ville.
est équivalent à
SELECT [Link], [Link]
FROM Fournisseurs f1, Fournisseurs f2 SELECT ...
WHERE [Link] = [Link] FROM Commandes,Clients
AND [Link]!=[Link]

79 Requêtes imbriquées 80

Requête imbriquée : Le prédicat employé dans la clause WHERE


comporte un SELECT. On parle alors de requête emboîtée.
Z Pour chaque produit, numéro et désignation de toutes les La forme la plus simple est :
pièces qui ont un poids supérieur :
SELECT *
SELECT [Link], [Link], [Link] FROM R1
FROM produit P1, produit P2 WHERE A IN ( SELECT B
WHERE [Link] < [Link] ; FROM R2)
Cette écriture revient a exprimer la jointure entre les tables R1
et R2 avec comme condition de jointure l’égalité entre les
valeurs de l’attribut A dans R1 et B dans R2.
Sous-requêtes 81 Sous-requêtes 82

alternative syntaxique à l’expression des jointures.


IN peut être remplacé par ’=’ si on est sûr que la sous-requête
Commandes qui ont été lancées par des clients lougatois ramène un et un seul tuple. Attention aux erreurs dans le cas
SELECT numCommande où aucun tuple n’est ramené.
FROM Clients , Commandes noms et prénoms des Clients 1, 2, 3
WHERE [Link] = [Link]
SELECT nomClient, prenomClient
AND ville=’louga’;
FROM Clients
ou WHERE codeClient=1 OR codeClient=2 OR codeClient=3;
SELECT numCommande Ou
FROM Commandes
SELECT nomClient, prenomClient
WHERE codeClient IN ( SELECT codeClient
FROM Clients
FROM Clients
WHERE codeClient IN (1, 2, 3);
WHERE ville = ’louga’)

Sous-requêtes 83 Sous interrogation à une ligne et une colonne 84

Z Quels sont les numéros des fournisseurs de savons ?


SELECT numFournisseur Dans ce cas, le SELECT imbriqué renvoie une valeur.
FROM Livraison
WHERE codeProduit IN( SELECT codeProduit SELECT
FROM Produits FROM
WHERE designation = ’savon’) WHERE exp op (SELECT....)

Pour répondre à la requête, le SGBD Où exp est toute expression légale et op ∈ {<=, >=, ! =}.
Exemple
exécute la requête interne ( calcul de l’ensemble des code des
’savons’) Soit le schéma relationnel suivant :
exécute la requête externe SELECT numFournisseur FROM Employe(numEmp„nomEmp,prenomEmp,poste,sal,nomDept)
Livraison WHERE codeProduit IN (...) en balayant Departement(nomDept,nomChef)
Livraison et en testant pour chaque tuple si son
codeProduit appartient à l’ensemble des codes de produits
’savon’
Sous interrogation à une ligne et une colonne 85 Sous interrogation ramenant plusieurs lignes 86

Z Liste des employés travaillant dans le même département que l’opérateur de comparaison admet à sa droite un ensemble de
l’employé n◦ 1 valeurs. Opérateurs de comparaison :
SELECT nomEmp t IN R où t est un tuple dont le type est celui de R. True si
FROM Employe t appartient à R, False sinon.
WHERE nomDept = ( SELECT nomDept
FROM Employe v cmp ANY R, où cmp ∈ {<=, >=, ! =}. Renvoie True si la
WHERE numEmp = 1) comparaison avec au moins un des tuples de la relation unaire
R renvoie True.
Z Liste des employés du département finances ayant même poste
que quelqu’un du département études v cmp ALL R, où cmp ∈ {<=, >=, ! =}. Renvoie True si la
comparaison avec tous les des tuples de la relation unaire R
SELECT nomEmp, poste
renvoie True.
FROM Employe
WHERE nomDept=’finances’ IN est équivalent à " = ANY " , "NOT IN" est équivalent à "
AND poste IN(SELECT poste !=ALL "
FROM Employe Le mot clé ALL ne permet pas d’exprimer toutes les requêtes
WHERE nomDep = ( SELECT nomDep
contenant un quantificateur du type quelque soit.
FROM Departement
WHERE nomDept=’études’ ))

Sous interrogation ramenant plusieurs lignes 87 Sous interrogation ramenant plusieurs lignes 88

Z Numéros des fournisseurs livrant le produit même produit que


le fournisseur 1 et en une quantité plus grande. Z Quel produit est le plus cher ?
SELECT numFournisseur SELECT CodeProduit, designation
FROM Livraison Livraison_X /* relation renommée */ FROM Produit
WHERE numProduit IN( SELECT numProduit WHERE prixUnitaire >= ALL( SELECT prixUnitaire
FROM Livraison
FROM Produit)
WHERE numFournisseur = 1 */
AND quantite < Livraison_X.quantite Z Liste des employés qui gagnent plus que tous les employés du
) département finances ?
Z Noms des fournisseurs ne livrant pas le produit P02 ?
SELECT nomEmp
SELECT nomFournisseur
FROM Employe
FROM Fournisseurs
WHERE ’P02’ NOT IN( SELECT codeProduit WHERE sal > ALL ( SELECT sal
FROM Livraison FROM Employe
WHERE [Link] = WHERE nomDept = ’finances’)
[Link])
Sous interrogation ramenant plusieurs lignes 89 Sous interrogation ramenant plusieurs colonnes 90
Z Ensemble des numéros de fournisseurs de savon ?
SELECT numFournisseur
Z Il est possible de comparer le résultat d’un SELECT ramenant
FROM FournisseurProduit
WHERE codeProduit = ANY( SELECT codeProduit plusieurs colonnes à une liste de colonnes.
FROM Produits Z La liste des colonnes figurera entre parenthèses à gauche de
WHERE designation =’savon’) l’opérateur de comparaison.
Z Ensemble des numéros de fournisseurs qui ne livrant que du Z Avec une seule ligne sélectionnée
savon ? WHERE (exp, exp ,...) op ANY (SELECT...)
SELECT numFournisseur
Z Avec plusieurs lignes sélectionnées
FROM Fournisseur
WHERE’savon’=ALL(SELECT designation WHERE (exp, exp ,...) op ANY ( SELECT...)
FROM Produits WHERE (exp, exp ,...) op ALL SELECT...)
WHERE codeProduit =ANY WHERE (exp, exp ,...) IN SELECT...)
( SELECT codeProduit WHERE (exp, exp ,...) NOT IN SELECT...)
FROM Livraison Où op ∈ {=, ! =}
WHERE Livraison .numFournisseur
= [Link]))

Sous interrogation ramenant plusieurs colonnes 91 Sous interrogations corrélées 92

Z requêtes corrélées : la sous requête est basée sur une ou


plusieurs valeurs issues des relations de la requête principale.
Z EXISTS est suivie d’une sous-interrogation entre parenthèses et
Z Employés ayant même poste et même salaire que l’employé n◦ 1 prend la valeur vrai s’il existe au moins une ligne satisfaisant
les conditions de la sous-interrogation. Cette condition teste si
SELECT nomEmp,poste,Sal un ensemble n’est pas vide
FROM Employe
WHERE (Poste,Sal) = ( SELECT Poste,Sal Z NOT EXISTS <ensemble> teste si l’ensemble est vide.
FROM Employe Z Quels sont les fournisseurs qui fournissent au moins 1 savon ?
WHERE nomEmp = 1 ) SELECT nomFournisseur
FROM Fournisseurs
WHERE EXISTS( SELECT *
FROM Livraison, Produit
WHERE numFournisseur = [Link]
AND designation = ’savon’
AND [Link]=[Link])
Sous interrogations corrélées 93 Equivalences 94

Z La condition
Z Caractéristiques de chaque pièce ayant un poids inférieur à la x θ ANY (SELECT Ri.y FROM R1 ,..., Rn WHERE p)
moyenne des poids des pièces de leur couleur : est équivalente à
SELECT * EXISTS ( SELECT * FROM R1 ,..., Rn WHERE p AND x
FROM Produits P
θ Ri.y)
WHERE poids <( SELECT AVG(poids)
FROM Produit Z La condition
WHERE couleur = [Link] x θ ALL ( SELECT Ri .y FROM R1 ,..., Rn WHERE p)
est équivalente à
Note : Pour chaque ligne de la question d’appel, la sous-question
NOT EXISTS( SELECT * FROM R1 ,..., Rn WHERE p AND
est réévaluée.
NOT ( x θ Ri .y))

Equivalences disjonctives 95 Equivalences conjonctives 96

Z expr NOT BETWEEN expr1 AND expr2 Z expr BETWEEN expr1 AND expr2
⇔ expr < expr1 OR expr > expr2 ⇔ expr >= expr1 AND expr<= expr2
Z expr IN (expr1 · · · exprN ) Z expr NOT IN (expr1 . . . exprN )
⇔ expr = expr1 OR . . . OR expr = exprN ⇔ expr <> expr1 AND . . . AND expr <> exprN
Z expr op ANY (expr1 · · · exprN ) Z expr op ALL (expr1 . . . exprN )
⇔ expr op expr1 OR . . .OR expr op exprN ⇔ expr op expr1 AND . . . AND expr op exprN
Traitement de l’absence de valeur 97 Traitement de l’absence de valeur 98

Z sur les expressions numériques


un calcul numérique ou de dates exprimé avec les opérateurs
+, -, -, / n’a pas de valeur lorsqu’au moins une des Z sur les comparaisons
composantes n’a pas de valeur toute comparaison exprimée avec les opérateurs =, <>, >, <,
Z sur les chaînes de caractères <=, >=, LIKE qui comporte une expression qui n’a pas de
un calcul de chaînes exprimé avec l’opérateur & ou || (suivant valeur prend la valeur logique INDEFINIE
le SGBD) n’a pas de valeur lorsque toutes ses composantes les comparaisons ignorent les lignes o‘u il y a absence de valeur
n’ont pas de valeur comparaisons indéfinies :
la chaîne vide et l’absence de valeur sont confondues SELECT *
SELECT codeClient, nomClient || ” || prenomClient AS FROM Clients
nomComplet WHERE NULL = NULL OR ” = ” OR ” LIKE ’%’
ou codeClient, nomClient || NULL || prenomClient AS OR ’A’ LIKE ” OR ’A’ NOT LIKE ” ;
nomComplet
FROM clients
WHERE codeClient= ’C103’ ;

Traitement de l’absence de valeur 99 Traitement de l’absence de valeur 100

Z table de vérité pour le connecteur ∨


∨ VRAI FAUX INDEFINI
Z table de vérité pour le connecteur ∧ VRAI VRAI VRAI VRAI
∧ VRAI FAUX INDEFINI FAUX VRAI FAUX INDEFINI
INDEFINI VRAI INDEFINI INDEFINI
VRAI VRAI FAUX INDEFINI
FAUX FAUX FAUX FAUX Z table de vérité pour le connecteur ¬
INDEFINI INDEFINI FAUX INDEFINI
¬
VRAI FAUX
FAUX VRAI
INDEFINI INDEFINI
Traitement de l’absence de valeur 101 Recherche avec des conditions sur des ensembles 102
Z Test d’égalité de deux ensembles :
<ensemble1> = <ensemble 2>
Z recherche de l’absence de valeur Z Test d’inclusion de deux ensembles :
<ensemble1> CONTAINS <ensemble 2>
SELECT <liste de nom de colonne>
FROM <nom de table> Z Test de non - inclusion :
WHERE expression IS [NOT] NULL ; <ensemble1> NOT CONTAINS <ensemble 2>
Z Noms des fournisseurs qui fournissent tous les savons
pour connaître toutes les commandes auxquelles on n’a pas
SELECT nomFournisseur
encore affecté clients FROM Fournisseurs
SELECT numCommande WHERE( SELECT codeProduit
FROM Commandes FROM Livraison
WHERE numClient IS NULL ; WHERE numFournisseur=[Link])
CONTAINS
SELECT codeProduit
FROM Produits /* ensemble des savons */
WHERE designation = ’ savon ’)

Les opérateurs ensemblistes en SQL 103 L’Union 104


Z Produits qui coûtent 10 000F ou ceux qui sont commandés par
Ali
SELECT codeProduit
FROM Produits
SELECT liste d’expressions1 WHERE prixUnitaire=10000
FROM nom_de_table UNION
[ WHERE condition ] SELECT codeProduit
[ GROUP BY liste d’expressions2] FROM LignesCommandes
{ UNION | UNION ALL | INTERSECT | MINUS} WHERE numCommande IN(SELECT numCommande
SELECT liste d’expressions3 FROM Commandes
FROM nom de table WHERE codeClient IN(SELECT codeClient
[ WHERE condition ] FROM Clients
[ GROUP BY liste d’expressions4] ; WHERE nomClient=’Ali’))
L’union élimine les dupliqués. Pour garder les dupliqués on
utilise l’opération UNION ALL : le résultat contient chaque
n-uplet a + b fois où a etb et le nombre d’occurrences du
n-uplet dans la première et la deuxième relation.
NB : Pas d’union sur une même relation !
La différence 105 L’intersection 106
Z L’intersection ne fait pas partie du standard.
Z La différence ne fait pas partie du standard. Z Départements ayant des employés qui gagnent plus de
Z Exemple 2OOOOF et qui se trouvent à Dakar
Employe(numEmp„nomEmp,prenomEmp,poste,sal,nomDept) SELECT nomDept
Departement(nomDept,nomChef,localisation) FROM Departement
WHERE localisation=’dakar’
Z Départements sans employés INTERSECT
SELECT nomDept SELECT [Link]
FROM Departement FROM Employe,Departement
EXCEPT
WHERE (sal> 20000) AND
SELECT nomDept
FROM Employe (Employe. nomDept= Departement. nomDept)
Z La différence élimine les dupliqués. Pour garder les dupliqués, Z L’intersection élimine les dupliqués. Pour garder les dupliqués,
on utilise l’opération EXCEPT ALL : le résultat contient chaque on utilise l’opération INTERSECT ALL : le résultat contient
n-uplet a-b fois où a et b et le nombre d’occurrences du chaque n-uplet min(a,b) fois où a et b et le nombre
n-uplet dans la première et la deuxième relation. d’occurrences du n-uplet dans la première et la deuxième
relation.
Z

La division 107 La division 108


Exemple (Suite) :

Z Il n’existe pas en SQL d’équivalent direct à la division ! Dakar boissons


=⇒ Recherche d’une autre solution
Exemple : Thies fruits
« Soit une entreprise de distribution possédant des dépots
dans différentes villes . Ces entrepôts peuvent abriter différents Louga
droguerie
types de produits. »Question : Quels sont les depôt capables
Saint-Louis
de servir TOUS types de produits ?
charcuterie
Fatick
La division 109 La division 110

Implémentation 1 : compter le nombre d’occurrences des types


de produits et le faire coïncider avec le dénombrement des types de
Réponse : Saint-Louis et fatick produits des différents dépôts :
Il suffit de trouver les dépôts qui sont reliés à TOUS les types de
SELECT villeDepot
produits.
FROM Depot
GROUP BY villeDepot
TypeProduit(codeType) HAVING COUNT(*) = (SELECT COUNT(*)
Depot(villeDepot,codeType) FROM TypeProduit)

Solution : division de Depot par TypeProduit Résultat : Saint-Louis et fatick

La division 111 La division 112


Implémentation 2 (double négation) :
Cette solution est correcte uniquement si :
SELECT DISTINCT villeDepot
1 il n’y a aucune redondance de données dans la table FROM Depot AS dep1
diviseur (codeType est unique) WHERE NOT EXISTS
(SELECT *
2 il n’y a pas de type de produit en sus pour un dépôt, non
FROM TypeProduit codeType
recensé dans la table TypeProduit WHERE NOT EXISTS (SELECT *
Résolution problème 1 : FROM Depot
WHERE villeDepot = [Link]
... HAVING COUNT(*) = (SELECT COUNT(DISTINCT codeType)
FROM TypeProduit) AND codeType=[Link]))

Cette requête recherche les depôt pour qui il n’existe pas de type
de produit qu’ils ne peuvent pas fournir
La division 113 La division 114

Implémentation 3 Solution plus rapide :

SELECT DISTINCT villeDepot Implémentation 3 (division exacte) Utilisation de la division


FROM Depot AS Dep1
"exacte", c’est à dire que la table dividende corresponde
WHERE (SELECT codeType
FROM TypeProduit
exactement avec les valeurs du diviseur, ni plus ni moins.
EXCEPT Trouver quels sont les dépôts qui disposent de tous les types
SELECT codeType de produits de la table TypeProduit, mais aussi d’aucun autre.
FROM Depot AS Dep2
Utilisation de la double négation :
WHERE [Link] = [Link] ) IS NULL

La division 115 Limiter le nombre de lignes renvoyées 116

Z Pas de méthode standardisée pour limiter le nombre de ligne


SELECT villeDepot renvoyées par un SELECT
FROM Depot Dep1
WHERE NOT EXISTS Z Mais la plupart des SGBDs offre cette facilité
(SELECT * FROM TypeProduit Z Exemple pour limiter le nombre de ligne à 15
WHERE NOT EXISTS
Avec MySQL et Postgresql
(SELECT *
FROM Depot Dep2 SELECT Codeclient, nom FROM Client LIMIT 10
WHERE [Link] = [Link] Avec Oracle
AND [Link] = [Link]))
SELECT Codeclient, nom FROM Client ROWNUM <=10
GROUP BY villeDepot
HAVING COUNT (*) = (SELECT COUNT(*) FROM TypeProduit) Avec SQL Server
SELECT TOP 10 Codeclient, nom FROM Client
Expressions et fonctions 117 Opérateurs arithmétiques 118
Z Une expression est un ensemble de variables (contenu d’une
colonne), de constantes et de fonctions combinées au moyen
d’opérateurs
Z Les expressions peuvent figurer :
en tant que colonne résultat d’un SELECT, Les opérateurs arithmétiques présents dans sql sont les suivants :
dans une clause WHERE,
Z + addition ou + unaire
dans une clause ORDER BY.
Z - soustraction ou - unaire
Z Trois types d’expressions correspondant chacun à un type de
données de SQL : arithmétique, chaîne de caractère, date. Z * multiplication
Z Les expressions SQL sont assez peu standardisée Z / division
Z Dans la suite : presentation des fonctions disponibles dans
Oracle.
Z ne sont pas toutes disponibles dans les autres SGBD ; elles
peuvent aussi avoir une syntaxe différente,ou même un autre
nom.
Z

Fonctions arithmétiques 119 Fonctions arithmétiques 120

ABS(n) valeur absolue de n


CEIL(nb) plus petit entier supérieur ou égal à nb. COS(n) cosinus de n
MOD(n1, n2 ) n1 modulo n2 COSH(n) cosinus hyperbolique de n.
POWER(n, e) n à la puissance e EXP(n) Renvoie e puissance n.
ROUND(n[, p]) arrondit n à la précision p (0 par défaut) FLOOR(nb) plus grand entier inférieur ou égal à nb.
SIGN(n) -1 si n<0, 0 si n=0, 1 si n>0 LN(n) logarithme népérien de n.
SQRT(n) racine carrée de n LOG(m,n) logarithme en base m de n. m > 1, et n > 0
TRUNC(n[, p]) tronque n à la précision p (0 par défaut) SIN(n) sinus de n
GREATEST(n1, n2,...) maximum de n1, n2,... . SINH(n) sinus hyperbolique de n.
LEAST(n1, n2,...) minimum de n1, n2,... TAN(n) tangente de n
TO_CHAR(n, format) convertit un nombre ou une date n en chaîne de caractères TANH(n) tangente hyperbolique de n.
TO_NUMBER(chaîne) convertit la chaîne de caractères en numérique
Expressions et fonctions sur les chaînes de caractères 121 Expressions et fonctions sur les chaînes de caractères 122

Z Opérateur sur les chaînes de caractères


Z UPPER(chaîne) convertit les minuscules en majuscules
concaténation : deux caractères |(barre verticale) accolés, ie
|| ou & sous Access Z LOWER(chaîne) convertit les majuscules en minuscules
Z Fonctions sur les chaînes de caractères Z INITCAP(chaîne) Renvoie chaîne en ayant mis la première
CONCAT(chaîne1,chaîne2) : concaténation de chaîne1 à
lettre de chaque mot en majuscule et toutes les autres en
chaîne2. minuscule. Les séparateurs de mots sont les espaces et les
LENGTH(chaîne) : longueur de la chaîne. caractères non alphanumériques.
SUBSTR(chaîne, m[,n]) : extrait de la chaîne chaîne une Z LPAD(chaîne, long [,car]) complète (ou tronque) chaîne
sous-chaîne de longueur n commençant en position m de la à la longueur long. La chaîne est complétée à gauche par le
chaîne.
caractère (ou la chaîne de caractères) car.
INSTR(chaîne, sous-chaîne [,pos [,n]]) Renvoie la
position du premier caractère de chaîne correspondant à Z RPAD(chaîne, long [,car]) est une fonction analogue à
l’occurrence n de souschaîne en commençant la recherche à LPAD, chaîne étant complétée à droite.
la position pos.

Expressions et fonctions sur les chaînes de caractères 123 Expressions et fonctions sur les chaînes de caractères 124
Z LTRIM(chaîne, car) supprime les caractères à l’extrémité
gauche de la chaîne chaîne tant qu’ils appartiennent à Z TO_CHAR (n, format) permet de convertir un nombre ou
l’ensemble de caractères car. Si l’ensemble des caractères une date n en chaîne de caractère en fonction d’un
n’est pas donné, ce sont les espaces qui sont enlevés. [Link] indique le format sous lequel sera affichée la
Z RTRIM(chaîne, car) : fonction analogue à LTRIM, les date ou le nombre.
caractères étant supprimés à l’extrémité droite de la chaîne. Si Z TO_NUMBER (chaîne) convertit une chaîne de caractères en
l’ensemble car n’est pas donné, les espaces sont enlevés. nombre (quand la chaîne de caractères est composée de
Z REPLACE(chaîne, ch1, ch2 ) remplace ch1 par ch2 dans caractères numériques.
chaîne. Z ASCII(chaîne) donne le code ASCII du premier caractère de
Z TRANSLATE(chaîne, avant, après) remplace chaque chaîne.
caractère de chaîne présent dans avant par le caractère situé Z CHR(n) donne le caractère de code ASCII n.
à la même position dans après. Les caractères de chaîne non Z TO_DATE(chaîne, format) permet de convertir une chaîne
présents dans avant ne sont pas modifiés. avant peut de caractères en donnée de type date. Le format est identique
contenir plus de caractères que après, dans ce cas les à celui de la fonction TO_CHAR.
caractères de avant sans correspondants dans après seront
supprimés de chaîne .
Expressions et fonctions sur les dates 125 Expressions et fonctions sur les dates 126
Z Opérateurs sur les dates Z NEXT_DAY(date, nom_du_jour)
date +/- nombre : le résultat est une date obtenue en Renvoie la date du prochain jour de la semaine dont le nom
ajoutant le nombre de jours nombre à la date date.
est nom_de_jour.
date2 - date1 : le résultat est le nombre de jours entre les
deux dates. Z ROUND(date[,précision])
Z Opérateurs sur les dates Renvoie date arrondie à l’unité spécifiée dans précision. L’unité
ADD_MONTHS(date, n) : Renvoie la date obtenue en ajoutant de précision est indiquée en utilisant un des masques de mise
n mois à date. n peut être un entier quelconque. Si le mois en forme de la date. On peut ainsi arrondir une date à l’année,
obtenu a moins de jours que le jour de date, le jour obtenu est au mois, à la minute,... Par défaut la précision est le jour.
le dernier du mois. Z SYSDATE
LAST_DAY(date) Renvoie la date du dernier jour du mois de
Renvoie la date et l’heure courantes du système d’exploitation
date.
MONTHS_BETWEEN(date2, date1) hôte.
Renvoie le nombre de mois entre date2 et date1, si date2 est Z TRUNC(date[,précision])
après date1 le résultat est positif, sinon le résultat est négatif. Renvoie date tronquée à l’unité spécifiée dans précision. Les
Si les jours date2 et date1 sont les mêmes, ou si ce sont les paramètres sont analogues à ceux de la fonction ROUND.
derniers jours du mois, le résultat est un entier.

Autres fonctions 127 Autres fonctions 128

Z NVL(expr_1, expr_2) Prend la valeur expr_1, sauf si


expr_1 est NULL auquel cas NVL prend la valeur expr_2.
Z NVL(expr_1, expr_2) Prend la valeur expr_1, sauf si
Z DECODE(crit, val_1, res_1 [, val_2, res_2 ...],
expr_1 est NULL auquel cas NVL prend la valeur expr_2.
def) Cette fonction permet de choisir une valeur parmi une
Z DECODE(crit, val_1, res_1 [, val_2, res_2 ...], liste d’expressions, en fonction de la condition crit
def) Cette fonction permet de choisir une valeur parmi une Cette fonction n’est pas dans la norme SQL2. Elle est
liste d’expressions, en fonction de la condition crit avantageusement remplacée par la fonction de choix case.
Cette fonction n’est pas dans la norme SQL2. Elle est Liste des employés avec leur catégorie (président = 1,
avantageusement remplacée par la fonction de choix case. directeur = 2, autre = 3) :
SELECT NOME, DECODE(POSTE, ’PRESIDENT’, 1, ’DIRECTEUR’,
2, 3)
FROM EMP
Autres fonctions 129 Autres fonctions 130
Syntaxe 2
Z Une fonction de choix existe dans la norme SQL2
Z correspond à la structure switch du langage C CASE expression
Z syntaxe 1 : WHEN valeur1 THEN expression1
[WHEN valeur2 THEN expression2 ]
CASE . . .
WHEN condition1 THEN expression1 [ELSE expression_défaut]
[WHEN condition2 THEN expression2 ] END
. . .
[ELSE expression_défaut ]
END Attention, ne fonctionne pas pour le cas où une des valeurs
n’est pas renseignée (when null then). Pour ce cas, il faut
condition : n’importe quelle expression booléenne. utiliser l’autre syntaxe de case : when colonne is null then.
Si aucune condition n’est remplie et s’il n’y a pas de ELSE, Si l’expression n’est égale à aucune valeur et s’il n’y a pas de
null est retourné
ELSE, null est retourné.
Les différentes expressions renvoyées doivent être de même
type. Les différentes expressions renvoyées doivent être de même
type.

Autres fonctions 131 Autres fonctions 132

Liste des employés avec leur catégorie (président = 1, directeur =


2, autre = 3), en appelant la colonne Niveau :
SELECT nome, CASE poste
SELECT nome,
WHEN ’Président’ THEN 1
CASE
WHEN ’Directeur’ THEN 2
WHEN (poste = ’Président’) THEN 1
ELSE 3
WHEN (poste = ’Directeur’) THEN 2
END Niveau FROM emp;
ELSE 3
END Niveau
FROM emp;

Vous aimerez peut-être aussi