Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Slides SQL

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

Bases de données :

 Le Langage SQL 

David Célestin FAYE

UFR SAT/UGB

2009-2010

David Célestin FAYE Bases de données


Plan 2

David Célestin FAYE Bases de données


Plan 3

David Célestin FAYE Bases de données


Présentation de SQL 4
Langage de requête
ensemble de commandes permettant
l'interrogation de la base de données
la mise à jour de la base de données

Z Classement des langages de requête suivant leur nature


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


Présentation de SQL 5
Z SQL : Structured Query Langage

Z Langage textuel aux règles syntaxiques précises et intégré au


sein du SGBD relationnel et composé de plusieurs parties
un langage de dénition de données (LDD)
un langage de d'interrogation de la base de données
un langage de manipulation de données(LMD)
un langage de contrôle de l'accès aux données de données
(LCD)
un langage de contrôle des transactions (LCT)
SQL procedural qui est un ensemble d'outils pour que SQL
s'interface avec des langages hôtes.

David Célestin FAYE Bases de données


SQL : Quelques repères historiques 6

Z 1974 SEQUEL (Structured English Query Language) ancêtre


de SQL

Z 1979 premier SGBD basé sur SQL par Relational Software Inc.
(rebaptisé Oracle)
Z 1986 SQL1 1ière norme ISO

Z 1989 ajout des contraintes d'intégrité de base (clé primaire et


clé étrangère)
Z 1992 SQL2 2ième norme extension de SQL1 (nouveaux types
et nouveaux opérateurs
Z 1999 SQL3 extension de SQL2 (introduction des types
orientés objet)

David Célestin FAYE Bases de données


Utilisation de SQL 7

Z Trois types d'utilisateurs :


Administrateur de BD (stockage, droits d'accès)
Administrateur d'applications (dénitions des tables)
Développeur d'applications (écriture de programmes)
Z Deux modes d'utilisation :
Interactif
Intégré dans un programme

David Célestin FAYE Bases de données


Tableau des commandes SQL 8

SQL interactif SQL intégré SQL dynamique


LDD LMD LCD
CREATE INSERT GRANT DECLARE PREPARE
DROP DELETE REVOKE CURSOR DESCRIBE
ALTER UPDATE CONNECT FETCH EXCECUTE
SELECT COMMIT
ROLLBACK
SET

David Célestin FAYE Bases de données


SQL dans les SGBD 9
Le langage SQL est présent dans principaux SGBDR et chacun de
ces derniers a sa propre variante du langage.
Access DB2 Firebird
FoxPro - Visual Foxpro HyperFile Ingres
Informix Microsoft SQL Server MySQL
Oracle Paradox PostgreSQL
SmallSQLb SQLite Sybase
... ... ...

Tous ces systèmes présentent certaines particularités dont


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.

David Célestin FAYE Bases de données


Préliminaires 10

Notations utilisées pour décrire la syntaxe du langage SQL :


Les mots réservés du langage sont en majuscules ;
les éléments terminaux sont représentés en minuscules ;
les éléments non terminaux sont encadrés par <...>
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 {...|...|...} ;
une répétition d'éléments (liste) est notée {...} .

David Célestin FAYE Bases de données


Base de travail 11

Nous prendrons comme exemple le schéma relationnel suivant :


Clients(codeClient, nomClient ,prenomClient, age,ville)
Produits(codeProduit ,designation ,prixUnitaire ,tauxTVA ,stock)
Commandes(numCommande, dateCommande, commandeReglee,codeClient)
LignesCommande(numCommande,codeProduit, quantite)
Fournisseurs(codeFournisseur, nomFourn, prenomFourn, ville,
telephone)
Livraison(codeFournisseur, codeProduit,quantite)

David Célestin FAYE Bases de données


Plan 12

David Célestin FAYE Bases de données


Objets manipulés par SQL : tables 13
codeProduit designation prixUnitaire
12 savon 100
04 sucre 220
11 lait 150
03 huile 170
Table: Table PROD des produits
Chaque colonne est repérée par un identicateur
Deux colonnes de deux tables diérentes peuvent porter le
même nom
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
Création d'une table 14
CREATE TABLE nom-table ( {<élément-table>} );
<élément-table>:= <définition-colonne>|<contrainte-table>
<définition-colonne>:= nom-colonne <type>[<clause-défaut>]
[<contrainte-colonne>]
<clause-défaut>:= DEFAULT valeur

Remarques

nom-Table est le nom de la table qu'on veut créer


nom-colonne remplace un nom de colonne
<type> est le type des données qui seront contenues dans la
colonne
" ;" marque la n de la commande
les clauses peuvent être écrites aussi bien en majuscule qu'en
minuscule

David Célestin FAYE Bases de données


Création d'une table 15

Remarques(suite)

le nombre de caractères ne doit pas être trop grand (64 dans


Access, 18 à 30 dans d'autres SGBD) ;
seules les lettres, les nombres et le caractère de soulignement
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
crochets ;
certains SGBD requièrent que le nom d'un champ commence
par une lettre, mais ce n'est pas le cas d'Access ;
les termes faisant partie du vocabulaire du langage SQL sont
interdits ("date" par exemple). Ce sont les mots réservés

David Célestin FAYE Bases de données


Création d'une table 16
Les types de données varient d'un logiciel à un autre !
Dans Access nous avons les types suivants : vspace-0.5cm

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

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


NUMBER(n, m) (décimaux à n chires au total, m après la
virgule) ,CHAR(n) (chaîne de longueur xe) , VARCHAR(n)
(chaîne de longueur variable) , DATE (généralement au format
'DD-MM-YY HH:MM:SSam')
David Célestin FAYE Bases de données
Création d'une table 17

ZExemple

CREATE TABLE Clients(


codeClient COUNTER,
nomClient CHAR(15),
prenomClient CHAR(20),
ville CHAR(16));

Remarque :
Les constantes chaînes de caractères sont entourées par des
apostrophes ('). Si la chaîne contient une apostrophe celle-ci doit
être doublée.
Exemple : 'aujourdhui'

David Célestin FAYE Bases de données


Dénition de contraintes d'intégrité 18
Interdiction des valeurs nulles
Clés primaires
Clés étrangères
Contraintes de domaine
<contrainte-colonne>:=
[[CONSTRAINT nom-contrainte][NOT] NULL]]
[[CONSTRAINT nom-contrainte] {UNIQUE|PRIMARY KEY}]
[[CONSTRAINT nom-contrainte] REFERENCES <nom-table>
[({nomcolonne})][ON DELETE CASCADE] ]
[[CONSTRAINT nom-contrainte] CHECK (<condition>)]

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

David Célestin FAYE Bases de données


contraintes d'intégrité :Interdiction des valeurs nulles 19

<contrainte-colonne>:=
[[CONSTRAINT nom-contrainte][NOT] NULL]]

ZExemple

CREATE TABLE Clients(


codeClient COUNTER,
nomClient CHAR(20) NOT NULL,
prenomClient CHAR(20),
ville CHAR(16));

NULL sera interdit dans le champ nomClient.

David Célestin FAYE Bases de données


Absence de valeur 20
NULL : représente l'absence de valeur pour tous les types de
données. Ce n'est pas une valeur
Z pour les types chaîne de caractères :
la chaîne vide ' ' représente aussi l'absence de valeur
pour les types chaîne de caractères (taille xe ou variable) une
chaîne remplie de blancs n'est pas équivalente à la chaîne vide
Z pour les types numériques
le nombre 0 ne représente pas l'absence de valeur
Z La valeur NULL n'est comparable à aucune autre valeur
Z Lorsque l'un des termes d'une expression à la valeur NULL,
l'expression entière prend la valeur NULL
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.

David Célestin FAYE Bases de données


contraintes d'intégrité :Enumération des valeurs possibles 21

<contrainte-colonne>:=
[ [CONSTRAINT nom-contrainte] CHECK (<condition>) ]

ZExemple
On restreint les valeurs possibles de l'attribut commandeReglee
dans la table Commandes.
CREATE TABLE Commandes(
numCommande COUNTER,
dateCommande CHAR(20)
commandeReglee CHAR(5) CHECK (commandeReglee IN ('oui', 'non')
);

David Célestin FAYE Bases de données


Index sans doublons 22
<contrainte-colonne>:=
[[CONSTRAINT nom-contrainte]{UNIQUE}]

ZExemple (SQL Standard)

CREATE TABLE Clients(


codeClient COUNTER,
nomClient CHAR(20) UNIQUE,
prenomClient CHAR(20),
ville CHAR(16));

CREATE TABLE Clients(


codeClient COUNTER,
nomClient CHAR(20) CONSTRAINT nomContrainte UNIQUE,
prenomClient CHAR(20),
ville CHAR(16));

David Célestin FAYE Bases de données


Clé primaire : clause PRIMARY KEY 23
<contrainte-colonne>:=[[CONSTRAINT nom-contrainte]{PRIMARY KEY}]
<contrainte-colonne>:=[[CONSTRAINT nom-contrainte]PRIMARY KEY
(nom-colonne)

ZExemple
CREATE TABLE Clients(
codeClient COUNTER PRIMARY KEY,
nomClient CHAR(20) NOT NULL,
prenomClient CHAR(20)
ville CHAR(20));

CREATE TABLE Clients(


codeClient COUNTER CONSTRAINT clePrimaire PRIMARY KEY,
nomClient CHAR(20) NOT NULL,
prenomClient CHAR(20)
ville CHAR(20));

DEFAULT ne fonctionne pas dans certaines versions de ACCESS.


David Célestin FAYE Bases de données
Clé primaire : clause PRIMARY KEY 24

Pour appliquer la clé à deux champs, nous utilisons la syntaxe


suivante :
ZExemple
CREATE TABLE ligneCommandes(
numCommande INTEGER ,
codeProduit CHAR(20),
CONSTRAINT pk PRIMARY KEY(numCommande, codeProduit));

David Célestin FAYE Bases de données


Création des index 25

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


clé d'index (colonne) choisie.
CREATE [UNIQUE] INDEX nom-index ON <nom-table>( { nom-colonn
[ASC | DESC ] } )
ASC et DESC ⇒ tri en ordre croissant ou décroissant
Pour créer un index sur une table déjà existante on a par
exemple :
CREATE UNIQUE INDEX nom_index ON Clients (nomClient);
Pour supprimer un index dans Access
DROP INDEX nom_index ON Clients
Mais en SQL standard il faudra écrire :
DROP INDEX Clients.nom_index;

David Célestin FAYE Bases de données


Contrainte référentielle 26
<contrainte-table>:=
[[CONSTRAINT nom-contrainte] FOREIGN KEY ({nom-colonne})
REFERENCES <nom-table>[(nom-colonne)][ON DELETE CASCADE]
[ON UPDATE CASCADE]]

CREATE TABLE Commandes(


numCommande COUNTER PRIMARY KEY,
dateCommande DATE,
codeClient INTEGER,
CONSTRAINT relation_commander FOREIGN KEY (codeClient)
REFERENCES Clients(codeClient) );

Si le champ de liaison porte le même nom dans Clients et


Commandes nous pouvons l'omettre dans la table référencée :

David Célestin FAYE Bases de données


Contrainte référentielle 27
Dans le cas d'une entité faible, on décide en général de détruire le
référençant quand on détruit le référencé. ON DELETE CASCADE
ON UPDATE CASCADE
CREATE TABLE Commandes(
numCommande COUNTER PRIMARY KEY,
dateCommande DATE,
codeClient INTEGER,
CONSTRAINT relation_commander FOREIGN KEY (codeClient)
REFERENCES Clients ON DELETE CASCADE ON UPDATE CASCADE);

clauses que l'on peut associer à l'intégrité référentielle


ON UPDATE {[NOACTION] | CASCADE | SET NULL | SET DEFAULT}
ON DELETE {[NOACTION] | CASCADE | SET NULL | SET DEFAULT}

David Célestin FAYE Bases de données


Suppression de table 28

Syntaxe

DROP TABLE nom_table;


ZExemple

DROP TABLE Clients;


Quand une table est supprimée le système :
eace tous les index qui y sont attachés quelque soit le
propriétaire
eace tous les privilèges qui y sont attachés

David Célestin FAYE Bases de données


Modication d'une table 29

ALTER TABLE nom_de_table <modification_de_table> ;


<modification_de_table> :=
ADD COLUMN définition_de_colonne
ADD CONSTRAINT contrainte_de_table
DROP COLUMN nom_de_colonne
DROP CONSTRAINT nom_de_contrainte

David Célestin FAYE Bases de données


Modication d'une table 30

Exemple Ajout d'une colonne - ADD

ALTER TABLE nom_table ADD nouveau_champ type_nouveau_champ ;


Ou encore
ALTER TABLE nom_table ADD COLUMN nouveau_champ type_nouveau_cham

ZExemple
ALTER TABLE Clients ADD date_naiss DATE ;
Ou
ALTER TABLE Clients ADD COLUMN date_naiss DATE ;

David Célestin FAYE Bases de données


Modication d'une table 31
Z Suppression d'une colonne - DROP

ALTER TABLE nom_table DROP Colonne_a_supprimer


Ou encore
ALTER TABLE nom_table DROP COLUMN Colonne_a_supprimer ;

ZExemple
ALTER TABLE Clients DROP dateNaiss ;
Ou
ALTER TABLE Clients DROP COLUMN dateNaiss ;
En SQL standard ALTER TABLE peut aussi être utilisée pour
modier les propriétés d'une colonne existante.
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,.
David Célestin FAYE Bases de données
Modication d'une table 32

Z Ajout de contraintes dans une table

CREATE TABLE Clients(


codeClient COUNTER,
nomClient CHAR(30),
precomClient CHAR(30),
adresse CHAR(50));

ALTER TABLE Clients


ADD CONSTRAINT cle_primaire PRIMARY KEY(codeClient);

Si on ne veut pas donner de nom à la clé primaire on met


simplement ( SQL standard)
ALTER TABLE Clients
ADD PRIMARY KEY(codeClient);

David Célestin FAYE Bases de données


Modication d'une table 33

Z Ajout de contraintes dans une table

CREATE TABLE Commandes(


numCommande COUNTER,
dateCommande DATE,
CommandeReglee CHAR(30),
codeClient INTEGER);

ALTER TABLE Commandes


ADD CONSTRAINT relation_commander FOREIGN KEY (codeClient)
REFERENCES Clients(codeClient);

David Célestin FAYE Bases de données


Modication d'une table 34

Z Suppression de contraintes dans une table

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


| [CONSTRAINT nom-contrainte] } [CASCADE]

ZExemple
ALTER TABLE Commandes DROP CONSTRAINT relation_commander;

ZRenommer une table - RENAME

RENAME NomAncienneTable TO NomNouvelleTable ;

David Célestin FAYE Bases de données


Ajout (ou insertion) d'un enregistrement 35
insertion d'un tuple
INSERT INTO <nom-table>[{nom-colonne}] VALUES ({<atome>})
<atome>:= {constante | NULL }
ou encore
INSERT INTO nom_de_la_table (nom_colonne1,..., nom_colonnen)
VALUES ( valeur1,...,valeurn);
La liste des atomes de la clause VALUES doit correspondre à
celles des colonnes à insérer, tant en ce qui concerne le nombre
que le type.
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


Ajout (ou insertion) d'un enregistrement 36

ZExemple
INSERT INTO lignesCommande(numCommande,codeProduit,quantite)
VALUES (1,'p1',40)

Si dans la table " Clients " numClient est de type


COUNTER(Numéroauto), nous insérons une nouvelle valeur comme
suit :
INSERT INTO Clients (nomClient, prenomClient, ville)
VALUES ( 'Modou' ,' Pouye','Banjul') ;

David Célestin FAYE Bases de données


Suppression d'un enregistrement 37
DELETE FROM nom_table
[ WHERE <condition>] ;
ZExemple
DELETE FROM Clients
WHERE nom_client='Modou'
Remarque :
Les conditions peuvent être formées à partir d'opérateurs de
comparaison (=, >, <, >=, <=, <>) ou des opérateurs
logiques AND , OR , NOT .
DELETE * FROM Clients ;
Supprime toutes les lignes de la table " Clients "
La caractère * remplace l'énumération des conditions.
En l'absence de clause WHERE, tous les tuples de la table sont
supprimés.

David Célestin FAYE Bases de données


Mise à jour d'un enregistrement 38

UPDATE nom-table
SET { nom-colonne = {<expression> | <requête-pleine>} }
[WHERE <condition>]

ou
UPDATE nom-table
SET <nom colonne 1> = <nouvelle valeur 1>
...... ........
<nom colonne n> = <nouvelle valeur n>
[ WHERE <condition>] ;

David Célestin FAYE Bases de données


Mise à jour d'un enregistrement 39
ZExemple

UPDATE Clients
SET adresse='dakar'
WHERE nom='Modou' ;

UPDATE lignedeCommande
SET quantite=quantite+10
WHERE codPrdouit='P01' ;

Remarque :

Si la clause WHERE n'est pas indiquée, le champ précisé après


SET sera modié pour toutes les lignes de la table
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.
David Célestin FAYE Bases de données
Plan 40

David Célestin FAYE Bases de données


Syntaxe générale 41

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]
GROUP BY liste de nom_de_colonne]
[ HAVING critère]
[ ORDER BY critère]

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


doublons en retour. Il peut prendre les valeurs :
ALL, DISTINCT, DISTINCT ROW, TOP[nombre ou pour-
centage]

La description de colonnes décrit les colonnes à retourner : *


indique toutes les colonnes

David Célestin FAYE Bases de données


Syntaxe générale 42
La condition logique qui dénit les tuples du résultat
WHERE exp1 = exp2
WHERE exp1 != exp2
WHERE exp1 < exp2
WHERE exp1 > exp2
WHERE exp1 <= exp2
WHERE exp1 >= exp2
WHERE exp1 BETWEEN exp2 AND exp3
WHERE exp1 LIKE exp2
WHERE exp1 NOT LIKE exp2
WHERE exp1 IN (exp2, exp3,...)
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

David Célestin FAYE Bases de données


Comparaisons de chaînes 43

Z Opérateur de comparaison approximative LIKE :


chaine> LIKE '<motif>'
où <motif> est une suite de caractères contenant
éventuellement les symboles %(parfois *) et_
%(*) remplace n'importe quelle suite de caractères
_ remplace exactement un caractère
'abc%' désigne tous les mots commençant par abc

David Célestin FAYE Bases de données


Etapes de l'interrogation 44

Z Analyse syntaxique
Z Vérication de l'existence des tables, puis des colonnes et du
droit de les interroger
Z Mise au point du chemin d'accès aux données
Z Exécution de la requête et présentation des données à
l'utilisateur

David Célestin FAYE Bases de données


La sélection simple 45

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


SELECT * /* l'étoile signifie tous les attributs */
FROM Clients
WHERE ville='dakar' ;
Z Quelles sont les commandes pour lesquelles les quantités
commandées du produit 'P01' sont supérieures à 15. ?
SELECT numCommande
FROM lingesCommande
WHERE codeProduit='P01'
AND quantite >15 ;

David Célestin FAYE Bases de données


La requête avec création de table 46

Z Créer une requête qui extraie les noms, prénoms des clients
SELECT nomClient, prenomClient INTO nouvelle_table
FROM Clients;

David Célestin FAYE Bases de données


Le tri 47
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 Le tri se fait d'abord selon le 1ier critère, puis les lignes ayant
la même valeur pour le 1ier critère sont triées selon le 2ieme
critère, etc...
Z Si un attribut sur lequel porte un critère de tri contient la
valeur NULL, les lignes correspondantes sont aché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 ;
David Célestin FAYE Bases de données
L'élimination des doublons 48
Z Après une projection, il y a risque de doublons dans le résultat :
SELECT ville FROM Clients
Ville
Dakar
Thies
Dakar
Zen SQL l'élimination des doublons n'est pas automatique et
doit être spéciée par la clause DISTINCT)
SELECT DISTINCT ville FROM Clients
Ville
Dakar
Thies
ZA un coût, donc à ne pas utiliser lorsque c'est inutile (pour
un attribut clé primaire par exemple)

David Célestin FAYE Bases de données


L'élimination des doublons 49
Z Nombre total de Clients
SELECT COUNT(*)
FROM Clients ;
Z Nombre de clients habitant à dakar :
SELECT COUNT(*)
FROM Clients
WHERE adresse='dakar' ;
Z Nombre de valeurs de l'attribut nomClient dans la table
Clients :
SELECT COUNT(nomClient)
FROM Clients ;
Nombre de valeurs distinctes de l'attribut nomClient :
SELECT COUNT(DISTINCT nomClient)
FROM Clients ;

David Célestin FAYE Bases de données


La requête avec création de champ 50

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


qui est la concaténation des champ nomClient et
prenomClient.
SELECT [nomClient] & " " & [prenomClient] AS NomComplet
FROM Clients;
SELECT DISTINCT [nomClient] &" "& [prenomClient] AS Nom
INTO ListeNoms
FROM Clients
ORDER BY [nomClient] &" "& [prenomClient];

David Célestin FAYE Bases de données


Fonctions d'agrégat et regroupements 51

Fonctions d'agrégat
Ensemble de fonctions qui permettent d'eectuer des statistiques
sur le résultat d'une requête (minimum, maximum, somme, etc. . . )

Regroupements
Possibilité de regrouper plusieurs lignes d'une même requêtes
(souvent associés aux fonctions d'agrégat)

David Célestin FAYE Bases de données


Fonctions d'agrégat et regroupements 52

Fonctions d'agrégat
Ensemble de fonctions qui permettent d'eectuer des statistiques
sur le résultat d'une requête (minimum, maximum, somme, etc. . . )

Regroupements
Possibilité de regrouper plusieurs lignes d'une même requêtes
(souvent associés aux fonctions d'agrégat)

David Célestin FAYE Bases de données


Fonctions d'agrégat (de groupe) 53
Z Les fonctions de groupe calculent les résultats à partir d'une
collection de valeurs et restituent une valeur.
COUNT (*) comptage des lignes
COUNT ([DISTINCT | ALL]<nom d'une colonne>)
comptage de toutes(ALL) ou des valeurs distinctes
(DISTINCT) des valeurs de la colonne spéciée
MAX ([DISTINCT | ALL] expr ) maximum des valeurs
MIN ([DISTINCT | ALL] expr) minimum des valeurs
SUM ([DISTINCT | ALL] expr) somme des valeurs
AVG ([DISTINCT | ALL] expr) moyenne des valeurs
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;

David Célestin FAYE Bases de données


La requête de regroupement 54

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


table ayant même valeur.
SELECT liste d'expressions1
FROM nom de table
GROUP BY liste d'expressions2 ;
Z les expressions de liste d'expressions1 doivent être des
expressions formées uniquement :
d'expressions de liste d'expressions2
de fonctions de groupe
de constantes littérales

David Célestin FAYE Bases de données


La requête de regroupement 55

Client numéro nom prenom ville


1 Diop Aly Dakar
2 Sarr Doudou Louga
3 Ba Fatou Thies
4 Diop Demba Dakar
5 Fall Na Thies

David Célestin FAYE Bases de données


La requête de regroupement 56
Client numéro nom prenom ville
1 Diop Aly Dakar
2 Sarr Doudou Louga
3 Ba Fatou Thies
4 Diop Demba Dakar
5 Fall Na Thies

SELECT ville
FROM Client
GROUP BY ville;

Groupe 1, Groupe 2 et Groupe 3. Résultat :


ville
Dakar
Louga
Thies
David Célestin FAYE Bases de données
La requête de regroupement 57

Z Quelle est pour chaque produit la quantité totale commandée ?


SELECT codeProduit, SUM(quantite) AS quantiteTotale
FROM lignesCommande
GROUP BY codeProduit ;
Z Quel est le total des quantités commandées pour la commande
N5
SELECT numCommande, SUM(quantite) AS quantiteTotale
FROM lignesCommande
WHERE numCommande = 5
GROUP BY numCommande;

David Célestin FAYE Bases de données


La requête de regroupement 58

Conditions sur l'ensemble des lignes regroupées


Z Permet de sélectionner des groupes de la requête de
regroupement.
SELECT liste_d_expressions
FROM nom de table
[ WHERE condition ]
GROUP BY liste_d_expressions2
HAVING condition_sur_lignes ;
Z les expressions de liste_ d_expressions et condition_
sur_lignes doivent être formees uniquement :
d'expressions de liste_d_expressions2
de fonctions de groupe
de constantes litérales

David Célestin FAYE Bases de données


La requête de regroupement 59

Z Quels sont les produits dont le total des quantités


commandées est supérieure à 150 ?
SELECT codeProduit
FROM lignesCommande
GROUP BY codeProduit ;
HAVING SUM(quantite) >150 ;
Z Combien de produits diérents ont été commandées pour
chaque commande, tels que la quantité totale de produits
commandées pour cette commande soit supérieure à 1000 ?
SELECT numCommande, COUNT( DISTINCT codeProduit)
FROM LignesCommandes
GROUP BY numCommande
HAVING SUM(quantite)>1000 ;

David Célestin FAYE Bases de données


La requête de regroupement 60
Z Quelles sont les commandes contenant au moins 3 produits
SELECT numCommande
FROM LignesCommandes
GROUP BY numCommande
HAVING COUNT(DISTINCT codeProduit)>=3 ;
Z Quels sont, pour la commande N2 et dans l'ordre décroissant
des quantités, les produits pour lesquels le total des quantités
acceptées est supérieur à 220 ?
SELECT codeProduit , SUM(quantite) AS quantitetotale
FROM ligneSCommande
WHERE numCommande = 2
GROUP BY codeProduit
HAVING SUM(quantite) > 220
ORDER BY SUM(quantite) DESC ;

David Célestin FAYE Bases de données


Diérence entre WHERE et HAVING 61

Z WHERE sélectionne les lignes de la requête avant de faire les


groupes.
Z HAVING sélectionne les groupes une fois qu'ils sont
constitués.
Z Trouver pour chaque ville la moyenne d'âge des clients de
moins de 40 ans :
SELECT ville , AVG(age) AS ageMoy
FROM Client
WHERE age < 40
GROUP BY ville;
Z Villes dont l'âge moyen des clients est inférieur à 40 ans :
SELECT ville , AVG(age) AS ageMoy
FROM Client
GROUP BY ville
HAVING AVG(age) < 40;

David Célestin FAYE Bases de données


La jointure 62

permet d'exprimer des requêtes portant sur les données


réparties dans plusieurs tables.
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.
Syntaxe

SELECT *
FROM <liste_de_relations>
WHERE <prédicat_de_jointure>
types de jointure : jointure naturelle, la θ-jointure et
l'auto-jointure.

David Célestin FAYE Bases de données


La jointure 63
θ-jointure :
SELECT *
FROM R1, R2
WHERE R1.Ai θ R2.Bj
θ ∈ {<=>=! =}.
Jointure naturelle :
SELECT *
FROM R1, R2
WHERE R1.Ai = R2.Ai
Ai est un attribut commun à R1 et R2.
Auto-Jointure :

SELECT *
FROM R RA, R RB
WHERE RA.Aiθ RB.Bj
Ai ∈ R , Bj ∈ R
David Célestin FAYE Bases de données
Jointure naturelle 64

Z donner les noms, prénoms et villes des clients ayant commandé


SELECT Clients.nomClient,Clients.prenomClient,Clients.ville
FROM Clients ,Commandes
WHERE Clients.codeClient = Commandes.codeClient;
Z Nom des clients habitant Dakar, leurs commandes avec la date
de lancement
SELECT nomClient, numCommande , dateCommande
FROM Clients , Commandes
WHERE ville='dakar'
AND Clients.codeClient = Commandes.codeClient;

David Célestin FAYE Bases de données


65

S'il n'y a pas d'ambiguïté sur les noms des attributs, on peut
ne pas préxer le nom de l'attribut par le nom de la table le
contenant.
jointures non-équi : remplacer '=' par (<, <=, >, >=).
jointure interne : clause INNER JOIN. . Ne sont incluses dans
le résultat nal que les lignes qui se correspondent dans les
deux tables.
ZQuelssont les noms, prénoms et villes des clients ayant
commandé ?
SELECT Clients.nomClient,Clients.prenomClient,Clients.ville
FROM Clients
INNER JOIN Commandes ON Clients.codeClient=Commandes.codeCli

David Célestin FAYE Bases de données


Jointures gauche et droite 66

• jointure externe gauche : INNER JOIN est remplacé par LEFT


JOIN. Toutes les lignes de la première table sont incluses dans
le résultat de la requête, même s'il n'existe pas de ligne
correspondante dans la seconde table ;
• jointure externe droite : INNER JOIN est remplacé par RIGHT
JOIN. Toutes les lignes de la seconde table sont incluses dans
le résultat de la requête, même s'il n'existe pas de ligne
correspondante dans la première table.

David Célestin FAYE Bases de données


Renommage d'une table 67

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


synonyme en tant que préxe :
Z Syntaxe
SELECT liste d'expressions
FROM liste_de_(nom_de_table [ synonyme ])
WHERE<condition>
Z Quels sont les noms, prénoms et villes des clients ayant
commandé ?
SELECT Clients.nomClient,Clients.prenomClient,Clients.ville
FROM Clients Cl, Commandes Co
WHERE Cl.codeClient = Co.codeClient;

David Célestin FAYE Bases de données


Jointure d'une table à elle même 68

Il peut être utile de rassembler les informations venant d'une


ligne d'une table avec les informations venant d'une autre ligne
de la même table.
Dans ce cas, on renomme au moins l'une des deux tables en lui
donnant un synonyme (voir slide ), an de pouvoir préxer
sans ambiguïté chaque colonne.
Z Donner les couples de fournisseurs habitant dans la même ville.
SELECT f1.nomFourn, f2.nomFourn
FROM Fournisseurs f1, Fournisseurs f2
WHERE f1.ville = f2.ville
AND f1.numFourn!=f2.numFourn

David Célestin FAYE Bases de données


Requêtes imbriquées 69

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


comporte un SELECT. On parle alors de requête emboîtée.
La forme la plus simple est :
SELECT *
FROM R1
WHERE A IN ( SELECT B
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.

David Célestin FAYE Bases de données


Sous-requêtes 70
alternative syntaxique à l'expression des jointures.
Commandes qui ont été lancées par des clients lougatois
SELECT numCommande
FROM Clients , Commandes
WHERE Clients.codeClient = Commandes.codeClient
AND ville='louga';
ou
SELECT numCommande
FROM Commandes
WHERE codeClient IN ( SELECT codeClient
FROM Clients
WHERE ville = 'louga')

David Célestin FAYE Bases de données


Sous-requêtes 71

IN peut être remplacé par '=' si on est sûr que la sous-requête


ramène un et un seul tuple. Attention aux erreurs dans le cas
où aucun tuple n'est ramené.
noms et prénoms des Clients 1, 2, 3
SELECT nomClient, prenomClient
FROM Clients
WHERE codeClient=1 OR codeClient=2 OR codeClient=3;
Ou
SELECT nomClient, prenomClient
FROM Clients
WHERE codeClient IN (1, 2, 3);

David Célestin FAYE Bases de données


Sous-requêtes 72
Z Quels sont les numéros des fournisseurs de savons ?
SELECT numFournisseur
FROM Livraison
WHERE codeProduit IN( SELECT codeProduit
FROM Produits
WHERE designation = 'savon')
Pour répondre à la requête, le SGBD
exécute la requête interne ( calcul de l'ensemble des code des
'savons')
exécute la requête externe SELECT numFournisseur FROM
Livraison WHERE codeProduit IN (...) en balayant
Livraison et en testant pour chaque tuple si son
codeProduit appartient à l'ensemble des codes de produits
'savon'

David Célestin FAYE Bases de données


Sous interrogation à une ligne et une colonne 73

Dans ce cas, le SELECT imbriqué renvoie une valeur.


SELECT
FROM
WHERE exp op (SELECT....)
Où exp est toute expression légale et op ∈ {<=, >=, ! =}.
Exemple
Soit le schéma relationnel suivant :
Employe(numEmpnomEmp,prenomEmp,poste,sal,nomDept)
Departement(nomDept,nomChef)

David Célestin FAYE Bases de données


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

David Célestin FAYE Bases de données


Sous interrogation ramenant plusieurs lignes 76
Z Numéros des fournisseurs livrant le produit même produit que
le fournisseur 1 et en une quantité plus grande.
SELECT numFournisseur
FROM Livraison Livraison_X /* relation renommée */
WHERE numProduit IN( SELECT numProduit
FROM Livraison
WHERE numFournisseur = 1 */
AND quantite < Livraison_X.quantite
)
Z Noms des fournisseurs ne livrant pas le produit P02 ?
SELECT nomFournisseur
FROM Fournisseurs
WHERE 'P02' NOT IN( SELECT codeProduit
FROM Livraison
WHERE Livraison.numFournisseur =
Fournisseurs.numFournisseur)

David Célestin FAYE Bases de données


Sous interrogation ramenant plusieurs lignes 77
Z Quel produit est le plus cher ?
SELECT CodeProduit, designation
FROM Produit
WHERE prixUnitaire >= ALL( SELECT prixUnitaire
FROM Produit)
Z Liste des employés qui gagnent plus que tous les employés du
département nances ?
SELECT nomEmp
FROM Employe
WHERE sal > ALL ( SELECT sal
FROM Employe
WHERE nomDept = 'finances')

David Célestin FAYE Bases de données


Sous interrogation ramenant plusieurs lignes 78
Z Ensemble des numéros de fournisseurs de savon ?
SELECT numFournisseur
FROM FournisseurProduit
WHERE codeProduit = ANY( SELECT codeProduit
FROM Produits
WHERE designation ='savon')
Z Ensemble des numéros de fournisseurs qui ne livrant que du
savon ?
SELECT numFournisseur
FROM Fournisseur
WHERE'savon'=ALL(SELECT designation
FROM Produits
WHERE codeProduit =ANY
( SELECT codeProduit
FROM Livraison
WHERE Livraison .numFournisseur
= Fournisseur.numFournisseur))

David Célestin FAYE Bases de données


Sous interrogation ramenant plusieurs colonnes 79

Z Il est possible de comparer le résultat d'un SELECT ramenant


plusieurs colonnes à une liste de colonnes.
Z La liste des colonnes gurera entre parenthèses à gauche de
l'opérateur de comparaison.
Z Avec une seule ligne sélectionnée
WHERE (exp, exp ,...) op ANY (SELECT...)
Z Avec plusieurs lignes sélectionnées
WHERE (exp, exp ,...) op ANY ( SELECT...)
WHERE (exp, exp ,...) op ALL SELECT...)
WHERE (exp, exp ,...) IN SELECT...)
WHERE (exp, exp ,...) NOT IN SELECT...)
Où op ∈ {=, ! =}

David Célestin FAYE Bases de données


Sous interrogation ramenant plusieurs colonnes 80

Z Employés ayant même poste et même salaire que l'employé n1


SELECT nomEmp,poste,Sal
FROM Employe
WHERE (Poste,Sal) = ( SELECT Poste,Sal
FROM Employe
WHERE nomEmp = 1 )

David Célestin FAYE Bases de données


Sous interrogations corrélées 81
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
prend la valeur vrai s'il existe au moins une ligne satisfaisant
les conditions de la sous-interrogation. Cette condition teste si
un ensemble n'est pas vide
Z NOT EXISTS <ensemble> teste si l'ensemble est vide.
Z Quels sont les fournisseurs qui fournissent au moins 1 savon ?
SELECT nomFournisseur
FROM Fournisseurs
WHERE EXISTS( SELECT *
FROM Livraison, Produit
WHERE numFournisseur = Fournisseurs.numFourniss
AND designation = 'savon'
AND Livraison.codeProduit=Produit.codeProduit)

David Célestin FAYE Bases de données


Equivalences 82

Z La condition
x θ ANY (SELECT Ri.y FROM R1 ,..., Rn WHERE p)
est équivalente à
EXISTS ( SELECT * FROM R1 ,..., Rn WHERE p AND x
θ Ri.y)
Z La condition
x θ ALL ( SELECT Ri .y FROM R1 ,..., Rn WHERE p)
est équivalente à
NOT EXISTS( SELECT * FROM R1 ,..., Rn WHERE p AND
NOT ( x θ Ri .y))

David Célestin FAYE Bases de données


Equivalences disjonctives 83

Z expr NOT BETWEEN expr1 AND expr2


⇔ expr < expr1 OR expr > expr2
Z expr IN (expr1 · · · exprN )
⇔ expr = expr1 OR . . . OR expr = exprN
Z expr op ANY (expr1 · · · exprN )
⇔ expr op expr1 OR . . .OR expr op exprN

David Célestin FAYE Bases de données


Equivalences conjonctives 84

Z expr BETWEEN expr1 AND expr2


⇔ expr >= expr1 AND expr<= expr2
Z expr NOT IN (expr1 . . . exprN )
⇔ expr <> expr1 AND . . . AND expr <> exprN
Z expr op ALL (expr1 . . . exprN )
⇔ expr op expr1 AND . . . AND expr op exprN

David Célestin FAYE Bases de données


Traitement de l'absence de valeur 85
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
composantes n'a pas de valeur
Z sur les chaînes de caractères
un calcul de chaînes exprimé avec l'opérateur & ou || (suivant
le SGBD) n'a pas de valeur lorsque toutes ses composantes
n'ont pas de valeur
la chaîne vide et l'absence de valeur sont confondues
SELECT codeClient, nomClient ||  || prenomClient AS
nomComplet
ou codeClient, nomClient || NULL || prenomClient AS
nomComplet
FROM clients
WHERE codeClient= 'C103' ;

David Célestin FAYE Bases de données


Traitement de l'absence de valeur 86

Z sur les comparaisons


toute comparaison exprimée avec les opérateurs =, <>, >, <,
<=, >=, LIKE qui comporte une expression qui n'a pas de
valeur prend la valeur logique INDEFINIE
les comparaisons ignorent les lignes o`u il y a absence de valeur
comparaisons indénies :
SELECT *
FROM Clients
WHERE NULL = NULL OR  =  OR  LIKE '%'
OR 'A' LIKE  OR 'A' NOT LIKE  ;

David Célestin FAYE Bases de données


Traitement de l'absence de valeur 87

Z table de vérité pour le connecteur ∧


∧ VRAI FAUX INDEFINI
VRAI VRAI FAUX INDEFINI
FAUX FAUX FAUX FAUX
INDEFINI INDEFINI FAUX INDEFINI

David Célestin FAYE Bases de données


Traitement de l'absence de valeur 88

Z table de vérité pour le connecteur ∨


∨ VRAI FAUX INDEFINI
VRAI VRAI VRAI VRAI
FAUX VRAI FAUX INDEFINI
INDEFINI VRAI INDEFINI INDEFINI
Z table de vérité pour le connecteur ¬
¬
VRAI FAUX
FAUX VRAI
INDEFINI INDEFINI

David Célestin FAYE Bases de données


Traitement de l'absence de valeur 89

Z recherche de l'absence de valeur


SELECT <liste de nom de colonne>
FROM <nom de table>
WHERE expression IS [NOT] NULL ;
pour connaître toutes les commandes auxquelles on n'a pas
encore aecté clients
SELECT numCommande
FROM Commandes
WHERE numClient IS NULL ;

David Célestin FAYE Bases de données


Recherche avec des conditions sur des ensembles 90
Z Test d'égalité de deux ensembles :
<ensemble1> = <ensemble 2>
Z Test d'inclusion de deux ensembles :
<ensemble1> CONTAINS <ensemble 2>
Z Test de non - inclusion :
<ensemble1> NOT CONTAINS <ensemble 2>
Z Noms des fournisseurs qui fournissent tous les savons
SELECT nomFournisseur
FROM Fournisseurs
WHERE( SELECT codeProduit
FROM Livraison
WHERE numFournisseur=Fournisseurs.numFournisseur)
CONTAINS
SELECT codeProduit
FROM Produits /* ensemble des savons */
WHERE designation = ' savon ')

David Célestin FAYE Bases de données


Les opérateurs ensemblistes en SQL 91

SELECT liste d'expressions1


FROM nom_de_table
[ WHERE condition ]
[ GROUP BY liste d'expressions2]
{ UNION | UNION ALL | INTERSECT | MINUS}
SELECT liste d'expressions3
FROM nom de table
[ WHERE condition ]
[ GROUP BY liste d'expressions4] ;

David Célestin FAYE Bases de données


L'Union 92
Z Produits qui coûtent 10 000F ou ceux qui sont commandés par
Ali
SELECT codeProduit
FROM Produits
WHERE prixUnitaire=10000
UNION
SELECT codeProduit
FROM LignesCommandes
WHERE numCommande IN(SELECT numCommande
FROM Commandes
WHERE codeClient IN(SELECT codeClient
FROM Clients
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.
David Célestin FAYE Bases de données
La diérence 93
Z La diérence ne fait pas partie du standard.
Z Exemple

Employe(numEmpnomEmp,prenomEmp,poste,sal,nomDept)
Departement(nomDept,nomChef,localisation)
Z Départements sans employés
SELECT nomDept
FROM Departement
EXCEPT
SELECT nomDept
FROM Employe
Z La diérence élimine les dupliqués. Pour garder les dupliqués,
on utilise l'opération EXCEPT ALL : le résultat contient chaque
n-uplet a-b fois où a et b et le nombre d'occurrences du
n-uplet dans la première et la deuxième relation.

David Célestin FAYE Bases de données


L'intersection 94
Z L'intersection ne fait pas partie du standard.
Z Départements ayant des employés qui gagnent plus de
2OOOOF et qui se trouvent à Dakar
SELECT nomDept
FROM Departement
WHERE localisation='dakar'
INTERSECT
SELECT Departement.nomDept
FROM Employe,Departement
WHERE (sal> 20000) AND
(Employe. nomDept= Departement. nomDept)
Z L'intersection élimine les dupliqués. Pour garder les dupliqués,
on utilise l'opération INTERSECT ALL : le résultat contient
chaque n-uplet min(a,b) fois où a et b et le nombre
d'occurrences du n-uplet dans la première et la deuxième
relation.
Z
David Célestin FAYE Bases de données
Expressions et fonctions 95
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 gurer :
en tant que colonne résultat d'un SELECT,
dans une clause WHERE,
dans une clause ORDER BY.
Z Trois types d'expressions correspondant chacun à un type de
données de SQL : arithmétique, chaîne de caractère, date.
Z Les expressions SQL sont assez peu standardisée
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 diérente,ou même un autre
nom.
Z
David Célestin FAYE Bases de données
Opérateurs arithmétiques 96

Les opérateurs arithmétiques présents dans sql sont les suivants :


Z + addition ou + unaire
Z - soustraction ou - unaire
Z * multiplication
Z / division

David Célestin FAYE Bases de données


Fonctions arithmétiques 97

ABS(n) valeur absolue de n


CEIL(nb) plus petit entier supérieur ou égal à nb.
MOD(n1, n2 ) n1 modulo n2
POWER(n, e) n à la puissance e
ROUND(n[, p]) arrondit n à la précision p (0 par défaut)
SIGN(n) -1 si n<0, 0 si n=0, 1 si n>0
SQRT(n) racine carrée de n
TRUNC(n[, p]) tronque n à la précision p (0 par défaut)
GREATEST(n1, n2,...) maximum de n1, n2,...
LEAST(n1, n2,...) minimum de n1, n2,...
TO_CHAR(n, format) convertit un nombre ou une date n en chaîne d
TO_NUMBER(chaîne) convertit la chaîne de caractères en numérique

David Célestin FAYE Bases de données


Fonctions arithmétiques 98

COS(n) cosinus de n
COSH(n) cosinus hyperbolique de n.
EXP(n) Renvoie e puissance n.
FLOOR(nb) plus grand entier inférieur ou égal à nb.
LN(n) logarithme népérien de n.
LOG(m,n) logarithme en base m de n. m > 1, et n > 0
SIN(n) sinus de n
. SINH(n) sinus hyperbolique de n.
TAN(n) tangente de n
TANH(n) tangente hyperbolique de n.

David Célestin FAYE Bases de données


Expressions et fonctions sur les chaînes de caractères 99
Z Opérateur sur les chaînes de caractères
concaténation : deux caractères |(barre verticale) accolés, ie
|| ou & sous Access
Z Fonctions sur les chaînes de caractères
CONCAT(chaîne1,chaîne2) : concaténation de chaîne1 à
chaîne2.
LENGTH(chaîne) : longueur de la chaîne.
SUBSTR(chaîne, m[,n]) : extrait de la chaîne chaîne une
sous-chaîne de longueur n commençant en position m de la
chaîne.
INSTR(chaîne, sous-chaîne [,pos [,n]]) Renvoie la
position du premier caractère de chaîne correspondant à
l'occurrence n de souschaîne en commençant la recherche à
la position pos.

David Célestin FAYE Bases de données


Expressions et fonctions sur les chaînes de caractères 100

Z UPPER(chaîne) convertit les minuscules en majuscules


Z LOWER(chaîne) convertit les majuscules en minuscules
Z INITCAP(chaîne) Renvoie chaîne en ayant mis la première
lettre de chaque mot en majuscule et toutes les autres en
minuscule. Les séparateurs de mots sont les espaces et les
caractères non alphanumériques.
Z LPAD(chaîne, long [,car]) complète (ou tronque) chaîne
à la longueur long. La chaîne est complétée à gauche par le
caractère (ou la chaîne de caractères) car.
Z RPAD(chaîne, long [,car]) est une fonction analogue à
LPAD, chaîne étant complétée à droite.

David Célestin FAYE Bases de données


Expressions et fonctions sur les chaînes de caractères 101
Z LTRIM(chaîne, car) supprime les caractères à l'extrémité
gauche de la chaîne chaîne tant qu'ils appartiennent à
l'ensemble de caractères car. Si l'ensemble des caractères
n'est pas donné, ce sont les espaces qui sont enlevés.
Z RTRIM(chaîne, car) : fonction analogue à LTRIM, les
caractères étant supprimés à l'extrémité droite de la chaîne. Si
l'ensemble car n'est pas donné, les espaces sont enlevés.
Z REPLACE(chaîne, ch1, ch2 ) remplace ch1 par ch2 dans
chaîne.
Z TRANSLATE(chaîne, avant, après) remplace chaque
caractère de chaîne présent dans avant par le caractère situé
à la même position dans après. Les caractères de chaîne non
présents dans avant ne sont pas modiés. avant peut
contenir plus de caractères que après, dans ce cas les
caractères de avant sans correspondants dans après seront
supprimés de chaîne .
David Célestin FAYE Bases de données
Expressions et fonctions sur les chaînes de caractères 102
Z TO_CHAR (n, format) permet de convertir un nombre ou
une date n en chaîne de caractère en fonction d'un
format.format indique le format sous lequel sera achée la
date ou le nombre.
Z TO_NUMBER (chaîne) convertit une chaîne de caractères en
nombre (quand la chaîne de caractères est composée de
caractères numériques.
Z ASCII(chaîne) donne le code ASCII du premier caractère de
chaîne.
Z CHR(n) donne le caractère de code ASCII n.
Z TO_DATE(chaîne, format) permet de convertir une chaîne
de caractères en donnée de type date. Le format est identique
à celui de la fonction TO_CHAR.

David Célestin FAYE Bases de données


Expressions et fonctions sur les dates 103
Z Opérateurs sur les dates
date +/- nombre : le résultat est une date obtenue en
ajoutant le nombre de jours nombre à la date date.
date2 - date1 : le résultat est le nombre de jours entre les
deux dates.
Z Opérateurs sur les dates
ADD_MONTHS(date, n) : Renvoie la date obtenue en ajoutant
n mois à date. n peut être un entier quelconque. Si le mois
obtenu a moins de jours que le jour de date, le jour obtenu est
le dernier du mois.
LAST_DAY(date) Renvoie la date du dernier jour du mois de
date.
MONTHS_BETWEEN(date2, date1)
Renvoie le nombre de mois entre date2 et date1, si date2 est
après date1 le résultat est positif, sinon le résultat est négatif.
Si les jours date2 et date1 sont les mêmes, ou si ce sont les
derniers jours du mois, le résultat est un entier.

David Célestin FAYE Bases de données


Expressions et fonctions sur les dates 104
Z NEXT_DAY(date, nom_du_jour)
Renvoie la date du prochain jour de la semaine dont le nom
est nom_de_jour.
Z ROUND(date[,précision])
Renvoie date arrondie à l'unité spéciée dans précision. L'unité
de précision est indiquée en utilisant un des masques de mise
en forme de la date. On peut ainsi arrondir une date à l'année,
au mois, à la minute,... Par défaut la précision est le jour.
Z SYSDATE
Renvoie la date et l'heure courantes du système d'exploitation
hôte.
Z TRUNC(date[,précision])
Renvoie date tronquée à l'unité spéciée dans précision. Les
paramètres sont analogues à ceux de la fonction ROUND.

David Célestin FAYE Bases de données


Autres fonctions 105

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 DECODE(crit, val_1, res_1 [, val_2, res_2 ...],
def) Cette fonction permet de choisir une valeur parmi une
liste d'expressions, en fonction de la condition crit
Cette fonction n'est pas dans la norme SQL2. Elle est
avantageusement remplacée par la fonction de choix case.

David Célestin FAYE Bases de données


Autres fonctions 106

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 DECODE(crit, val_1, res_1 [, val_2, res_2 ...],
def) Cette fonction permet de choisir une valeur parmi une
liste d'expressions, en fonction de la condition crit
Cette fonction n'est pas dans la norme SQL2. Elle est
avantageusement remplacée par la fonction de choix case.
Liste des employés avec leur catégorie (président = 1,
directeur = 2, autre = 3) :
SELECT NOME, DECODE(POSTE, 'PRESIDENT', 1, 'DIRECTEUR',
2, 3)
FROM EMP

David Célestin FAYE Bases de données


Autres fonctions 107
Z Une fonction de choix existe dans la norme SQL2
Z correspond à la structure switch du langage C
Z syntaxe 1 :
CASE
WHEN condition1 THEN expression1
[WHEN condition2 THEN expression2 ]
. . .
[ELSE expression_défaut ]
END

condition : n'importe quelle expression booléenne.


Si aucune condition n'est remplie et s'il n'y a pas de ELSE,
null est retourné
Les diérentes expressions renvoyées doivent être de même
type.

David Célestin FAYE Bases de données


Autres fonctions 108
Syntaxe 2

CASE expression
WHEN valeur1 THEN expression1
[WHEN valeur2 THEN expression2 ]
. . .
[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
utiliser l'autre syntaxe de case : when colonne is null then.
Si l'expression n'est égale à aucune valeur et s'il n'y a pas de
ELSE, null est retourné.
Les diérentes expressions renvoyées doivent être de même
type.
David Célestin FAYE Bases de données
Autres fonctions 109

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


2, autre = 3), en appelant la colonne Niveau :

SELECT nome,
CASE
WHEN (poste = 'Président') THEN 1
WHEN (poste = 'Directeur') THEN 2
ELSE 3
END Niveau
FROM emp;

David Célestin FAYE Bases de données


Autres fonctions 110

SELECT nome, CASE poste


WHEN 'Président' THEN 1
WHEN 'Directeur' THEN 2
ELSE 3
END Niveau FROM emp;

David Célestin FAYE Bases de données


Les vues 111
Dénition
Une vue est une table virtuelle résultat d'une requête. Elle ne
stocke donc aucune donnée dans la base, mais qui utilise les
informations extraites de la requête.
Z rôle d'une vue
réduire la complexité syntaxique des requêtes
dénir les schémas externes.
dénir des contraintes d'intégrité.
dénir un niveau additionnel de sécurité en restreignant l'accès
à un sous ensemble de lignes et/ ou de colonnes.
Z Vue : comparable à une table, en on peut l'interroger par SQL.
Z diérence : une vue est le résultat d'une requête, avec la
caractéristique essentielle que ce résultat est réévalué à chaque
fois que l'on accède à la vue. Une vue est donc dynamique

David Célestin FAYE Bases de données


Les vues : création 112
Z Création d'une vue
CREATE VIEW <nomVue>[(nom_col1,...)]
AS <requêteSQL>
[WITH CHECK OPTION]

Z Le nom de la vue doit être un nom d'objet unique dans la BD


Z Par défaut les noms des colonnes de la vue sont les mêmes que
les noms des colonnes du résultat SELECT
Z Si certaines colonnes résultat du SELECT sont des expressions,
il faut renommer ces colonnes dans le SELECT ou spécier les
noms de colonne de la vue.
Z RequêteSQL instruction SELECT ne comprenant pas de clause
ORDER BY, UNION ou INTO
Z [WITH CHECK OPTION] permet de ne pas autoriser
d'insertion ou de modication de données ne répondant pas
aux critères de la requête
Z Une vue permet de donner un nom à une requête
David Célestin FAYE Bases de données
Les vues : création 113

Z Vue SQL 6=Vue ANSI-SPARC = Base virtuelle


Z Vue SQL : Une expression de sélection mémorisée
Z création de la vue correspondant aux clients de dakar
CREATE VIEW ClientsDeDakar
AS SELECT numClient, nomClient
FROM Clients
WHERE Ville= 'Dakar' ;

David Célestin FAYE Bases de données


Les vues : interrogation 114

Z Interroger une vue


interrogation de la vue correspondant aux clients qui habitent
Dakar
SELECT * FROM ClientsDeDakar;
Z Supprimer une vue
DROP VIEW nomDeVue ;
suppression de la vue correspondant aux clients qui habitent
Dakar
DROP VIEW ClientsDeDakar ;
Z Renommer une vue RENAME ancien_nom TO
nouveau_nom;

David Célestin FAYE Bases de données


Requêtes avec vues 115

Z pour connaître les clients qui ont fait le plus grand nombre de
commandes
CREATE VIEW nbCommandesParClients
AS SELECT codeClient, count(*) AS nbCommandes
FROM Commandes C
GROUP BY codeClient;

SELECT codeClient FROM nbCommandesParClients


WHERE nbCommandes =
(SELECT max( nbCommandes)
(FROM nbreCommandesParClients) ;

David Célestin FAYE Bases de données


Les vues : mise à jour 116

Z opérations sur les vues


INSERT
UPDATE
DELETE
Z Restrictions : Ces instructions ne s'appliquent pas aux vues qui
contiennent :
une jointure
un opérateur ensembliste : UNION, INTERSECT, MINUS
une clause GROUP BY, ORDER BY ou
la clause DISTINCT,

David Célestin FAYE Bases de données


Requêtes avec vues 117
Z création de la vue pour la personne qui dénit les commandes
CREATE VIEW defCommandes
AS SELECT numCommande, dateCommande
FROM Commandes
WHERE numCommande IS NULL AND codeClient IS NULL ;
Z dénir une nouvelle commande
INSERT INTO defCommandes
VALUES('CO9', #10/03/2009#) ;
Z supprimer une commande non attribuée
DELETE FROM defCommandes
WHERE numCommande = 'C18' ;
Z modier une commande non attribuée
UPDATE defCommandes
SET dateCommande= dateCommande+ 1 WHERE
numCommande = 'C18' ;
Z connaître les commandes non attribuées
SELECT * FROM defCommandes ;
David Célestin FAYE Bases de données
Requêtes avec vues 118

Z création de la vue pour la personne qui aecte une commande


à un client
CREATE VIEW attribCommande
AS SELECT numCommande, codeClient,dateCommande
FROM Commandes ;
Z attribuer une nouvelle commande à un client
UPDATE attribCommande
SET codeClient = 1,dateCommande=#17/04/2009#
WHERE numCommande = 'C15'
AND codeClient IS NULL AND dateCommande IS NULL;

David Célestin FAYE Bases de données


Requêtes avec vues 119

Z aecter un nouveau client à une commande


UPDATE attribCommande
SET codeClient = 202
WHERE numCommande = 'C15' ;
Z permuter l'attribution des clients à 2 commandes
UPDATE attribCommandes A1
SET codeClient =
(SELECT codeClient
FROM attribCommandes A2
WHERE A1.numCommande = 'C10' AND A2.numCommande = 'C20')
OR (A1.numCommande = 'C20' AND A2.numCommande = 'C10'))
WHERE numCommande = 'C10' OR numCommande = 'C20' ;

David Célestin FAYE Bases de données


Les vues : contrôle de mise à jour 120
Z création d'une vue de vérication : contrôle de l'insertion ou
de la modicaion de ligne
CREATE VIEW nom de vue
AS requête
WITH CHECK OPTION;
Z vérication des contraintes de domaine (interdiction des
valeurs inconnues)
CREATE VIEW V_Petit_Dejeuner
AS SELECT * FROM Produits
WHERE
codeProduit > 0
AND prix > 100
AND designation IN ('lait', 'sucre', 'beurre')
WITH CHECK OPTION;

David Célestin FAYE Bases de données


SQL : langage de contrôle de données (LCD) 121

Sécurité des données


Z condentialité
gestion des rôles et des utilisateurs
attribution de privilèges aux rôles et aux utilisateurs
dénition de ltres (protection de donées condentielles,
contrôle d'intégrité)
Z pérennité
gestion des transactions
Z intégrité
gestion des transactions

David Célestin FAYE Bases de données


SQL : langage de contrôle de données (LCD) 122

Transaction
séquence d'opérations manipulant des données

Z : vérient les propriétés suivantes :


atomicité
cohérence
indépendance
permanence
Z contrôle des transactions :
COMMIT : valide la transaction en cours
ROLLBACK : annule la transaction en cours

David Célestin FAYE Bases de données


SQL : langage de contrôle de données (LCD) 123
Z attribution de privilèges sur des objets
GRANT liste-droits
ON nom-composant
TO liste-roles-utilisateurs
[WITH GRANT OPTION ] ;
Z liste-droits :
SELECT
INSERT
UPDATE
DELETE
ALTER
ALL [PRIVILEGES ]
Z Un utilisateur ayant reçu un privilège avec l'option facultative
[WITH GRANT OPTION] peut la transmettre à son tour.

David Célestin FAYE Bases de données


SQL : langage de contrôle de données (LCD) 124

Z suppression de privilèges
REVOKE liste-systeme-privileges
FROM liste-roles-utilisateurs
Z suppression de privilèges sur des objets
REVOKE liste-privileges
ON nom-composant
FROM liste-roles-utilisateurs
Z Un utilisateur ayant accordé un privilège peut le reprendre avec
l'ordre
REVOKE privilege ON table/vue FROM utilisateur

David Célestin FAYE Bases de données

Vous aimerez peut-être aussi