Vous êtes sur la page 1sur 96

Le langage SQL

Idrissa SARR- UCAD

Master RETEL

Février 2017

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 1


Plan

l Introduction
l Catégories de commandes SQL
n DDL, DML, DCL et TCL
l Définition des données
n CREATE TABLE, ALTER TABLE
l Manipulation des données
n SELECT, INSERT, DELETE, UPDATE
l Exercices

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 2


Introduction

l Fonctions d’un SGBD relationnel


n Définition et manipulation des données à l’aide du
langage SQL
n Intégrité des données: contraintes d’intégrité,
déclencheurs (“triggers”)
n Contrôle et amélioration des performances
n Confidentialité des données (privilèges d’accès)
n Sauvegarde et restauration à la suite de pannes
n Gestion des accès concurrents
n Interopérabilité (ex. ODBC)

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 3


Introduction

l SQL : Structured Query Language


l Standard ANSI avec des extensions
l Langage non procédural
l offert par divers systèmes de gestion de BD
n Oracle, DB2, Sybase, SQL Server, Informix
l Possibilité d’avoir du SQL enchâssé (embedded
SQL)
n Commandes SQL incorporées à un programme écrit
dans un langage hôte (C, C++, Java, ..)
l Quatre catégories de commandes SQL
n DDL, DML, DCL et TCL
Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 4
Langage SQL

l Quatre catégories de commandes


n DDL : Data Definition Language
w CREATE, ALTER, DROP pour la création, la modification
et la suppression d’un objet (ex. table) de la base
n DML : Data Manipulation Language
w INSERT, UPDATE, DELETE, SELECT pour l’insertion, la
mise à jour, la supression et la recherche de données
n DCL : Data Control Language
w GRANT et REVOKE pour l’octroi et le retrait de
privilèges
n TCL : Transaction Control Language
w BEGIN TRANSACTION, COMMIT, ROLLBACK pour le
démarrage, la confirmation ou l’annulation d’une
transaction
Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 5
Langage SQL

l SQL peut être appelé via


n des interfaces
n un script
n un langage hôte (ex. C, C++, ..)
n des procédures stockées

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 6


Définition des données - BD
CREATE DATABASE <Nom_BD>
Ex.
CREATE DATABASE BD_Auteur ON
(NAME = BD_Auteur,
FILENAME = 'c:\program files\microsoft sql server
\mssql\data\BD_Auteur.mdf',
MAXSIZE = 2,
/* taille max. de 2 meg. Par défaut, la taille initiale est
d’un meg. */
FILEGROWTH = 5% )
DROP DATABASE <Nom_BD> /* détruire une BD */
USE <Nom_BD> /* utiliser une BD */
Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 7
Commandes DDL
l Création de schémas :
CREATE SCHEMA nom_schema AUTHORIZATION nom_utilisateur
l Création de tables :
n Spécifie un nouveau schéma de relation
n Forme :
CREATE TABLE nom_table
(Attribute_1 <Type>[DEFAULT <value>],
Attribute_2 <Type>[DEFAULT <value>],

Attribute_n <Type>[DEFAULT <value>]
[<Constraints>])

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 8


Exemple

l Définition de la relation Project

CREATE TABLE Project


( Pno CHAR(3),
Pname VARCHAR(20),
Budget DECIMAL(10,2)DEFAULT 0.00
City CHAR(9));

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 9


Définition des données – Types de données

CHAR(n) : chaîne de caractères de longueur fixe n


VARCHAR(n) : chaîne de caractères de longueur
variable dont le max. = n
INT et SMALLINT : nombre entier
DECIMAL : nombre décimal
MONEY : donnée monétaire
DATETIME : date et temps
IDENTITY : donnée générée d’une manière
incrémentale
Etc.
Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 10
Autres commandes DDL
l DROP SCHEMA nom_schema [,…] [CASCADE | RESTRICT]
n supprime les schémas indiqués
n CASCADE : toutes les tables du schéma
n RESTRICT : seulement les tables vides (par défaut)
l DROP TABLE nom_table [,…] [CASCADE | RESTRICT]
n RESTRICT : supprime la table seulement si elle n’est référencée par
aucune contrainte (clé étrangère) ou vue
n CASCADE : supprime aussi toutes les tables qui « dépendent » de
nom_table
l ALTER TABLE nom_table OPERATION
n modifie la définition de la table
n opérations:
w Ajouter (ADD), effacer (DROP), changer (MODIFY) attributs et
contrainte
Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 11
Modification des
tables :exemple

l Pour ajouter une colonne


ALTER TABLE Produits
ADD annee_fab DATE;
Ou bien
ALTER TABLE Produits
ADD COLUMN annee_fab DATE;

l Pour supprimer une colonne


ALTER TABLE Produits
DROP annee_fab;

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 12 12


Un exemple complet (1/4)
l Création d’une table personne et d’une table ville.
CREATE TABLE Personnes (
Nom TEXT(30),
Prénom TEXT(30),
Code_Ville LONG);

CREATE TABLE Villes


(Code_Ville COUNTER,
Ville TEXT(30));

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 13 13


Un exemple complet (2/4)

l Modification de la table Ville en plaçant une clé primaire


sur code_ville

ALTER TABLE Villes


ADD CONSTRAINT clé_primaire PRIMARY KEY(Code_Ville);

l Notons que, si nous ne désirons pas donner un nom à la


clé (ici "clé_primaire"), nous pouvons simplifier la
commande précédente en l'écrivant ainsi :

ALTER TABLE Villes


ADD PRIMARY KEY(Code_Ville);

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 14 14


Un exemple complet (3/4)

l Modification de la table personne en plaçant une clé


étrangère, nommée relation_ville sur le champ code_ville.
ALTER TABLE Personnes
ADD CONSTRAINT relation_ville FOREIGN KEY (Code_Ville)
REFERENCES Villes (Code_Ville);

l On pourrait ajouter la contrainte sans donner de nom en


écrivant

ALTER TABLE Personnes


ADD FOREIGN KEY (Code_Ville) REFERENCES Villes;

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 15 15


Un exemple complet (4/4)
l On pourrait aussi résumer tout le travail effectué en
écrivant comme suit:
CREATE TABLE Villes
(Code_Ville COUNTER PRIMARY KEY,
Ville TEXT(30));

CREATE TABLE Personnes


(Nom TEXT(30),
Prénom TEXT(30),
Code_Ville LONG,
CONSTRAINT relation_ville FOREIGN KEY (Code_Ville) REFERENCES
Villes);

l On supprime une contrainte par :


l ALTER TABLE Personnes
DROP CONSTRAINT relation_ville;

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 16 16


Insertion de tuples

l INSERT INTO table [ ( column [, ...] ) ]


{VALUES ( { expression | DEFAULT } [, ...] ) | query }
l en spécifiant des valeurs différentes pour tous les attributs dans l’ordre
utilisé dans CREATE TABLE :
INSERT INTO R
VALUES (value(A1), …, value(An))
l en spécifiant les noms d’attributs (indépendant de l’ordre) :
INSERT INTO R(Ai, …, Ak)
VALUES (value(Ai), …, value(Ak))
l insertion du résultat d’une requête (copie) :
INSERT INTO R (requête_SQL)

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 17


Insertion : exemples
l Insertion d’une ligne dans Produit :

INSERT INTO Produit (pnom, prix)


VALUES (’Ojax’, 15)

l Insertion de deux fournisseurs :

INSERT INTO Fournisseur (fnom, ville)


VALUES (’Samsung’, ’Paris’), (’Casto’, ’Paris’)

l Il est possible avec copie


INSERT INTO NomsProd (pnom)
SELECT DISTINCT pnom FROM Produit

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 18 18


Modification
l On modifie une table avec la commande UPDATE dont voici la
syntaxe.

UPDATE table
SET Ai=value, …, Ak = value
WHERE condition

l Contrairement à INSERT, UPDATE s’applique à un


ensemble de lignes.
n On énumère les attributs que l’on veut modifier.
n On indique à chaque fois la nouvelle valeur.
n La clause WHERE condition permet de spécifier les lignes
aux quelles s’applique la mise à jour. Elle est identique au
WHERE du SELECT
l Bien entendu, on ne peut pas violer les contraintes sur la
table.
I.SARR
Idrissa SARR - UCAD SQL: DDL- et
M1 RETEL Contraintes
Langage SQL Février 2017 19 19
d'intégrité
Modification : exemples

l Mise à jour du prix du produit Ojax :


UPDATE Produit SET prix=17
WHERE pnom = ’Ojax’

l Augmenter les prix de tous les produits fournis par BHV par
20% :
UPDATE Produit SET prix = prix*1.2
WHERE pnom in (SELECT pnom
FROM Fourniture
WHERE fnom = ’Samsung’)

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 20 20


Suppression
l On supprime une ou plusieurs lignes dans une table avec
la commande DELETE

DELETE FROM table


WHERE condition

l C’est la plus simple des commandes de mise-à-jour


puisque elle s’applique à des lignes et pas à des attributs.

l Comme précédemment, la clause WHERE condition est


identique à celle du SELECT

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 21 21


Suppression : exemples
l Suppression des produits fournis par le Samsung:

DELETE FROM Produit


WHERE pnom in (SELECT pnom
FROM Fourniture
WHERE fnom = ‘Samsung’)

l Suppression du fournisseur Samsung


DELETE FROM Fournisseur
WHERE fnom = ’Samsung’

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 22 22


Exercice

l Créer la base de données de BD auteur vu dans


le chapitre précédent

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 23


Commande SELECT

l Sélection: choix de tuples (lignes) d’une table


Exemple. Liste des éditeurs résidant à Paris
SELECT *
FROM editeur
WHERE lieu = 'PARIS'

code_ed nom_ed lieu


----------------------------------------------
33 Flammarion Paris
44 Eyrolles Paris
Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 24
Commande SELECT
l Projection : choix de colonnes d’une table
SELECT id_a, nom, ville FROM auteur
id_a nom ville
--------------------------------------------
10 Alain Dubuc Hull
20 Pierre Lebrun Montreal
30 Amina Missaoui Quebec
40 Brian Adams Toronto
50 Luc Nadeau Moncton
60 Laks Agrawal Toronto
70 Michel Montignac Paris
80 C-J Date Washington
90 jacques Dupont Paris

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 25


Commande SELECT
Ville de résidence des auteurs
SELECT DISTINCT ville FROM auteur
ville
---------------
Hull
Moncton
Montreal
Paris
Quebec
Toronto
Washington

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 26


Commande SELECT
Liste de livres non publiés par l’éditeur 44
SELECT * FROM livre WHERE code_ed != 44
Livres dont les droits sont >= 16 (pour cent) ou
l’éditeur a pour code_ed 33
SELECT id_livre, titre, code_ed, droits FROM livre
WHERE droits >= 16 OR code_ed=33
id_livre titre code_ed droits
------------------------------------------------------
3000 Bases de donnees 44 16
5000 A guide to SQL 22 20
6000 Je maigris 33 15
Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 27
Commande SELECT
Nom des auteurs ne résidant pas à Montréal, Québec ou
Paris
SELECT nom
FROM auteur
WHERE ville NOT IN ('Montreal', 'Quebec', 'Paris')
nom
----------------
Alain Dubuc
Brian Adams
Luc Nadeau
Laks Agrawal
C-J Date

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 28


Commande SELECT
Droits d’auteurs sur les livres
SELECT id_livre, prix * droits * .01 AS Droits_auteur
FROM livre
id_livre Droits_auteur
----------------------------
1000 2.099000
2000 9.750000
3000 9.278400
4000 6.148500
5000 8.798000
6000 1.348500
Que remarquez-vous?

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 29


Commande SELECT
l Numéro des livres dont le prix est compris entre 40 et 60$
SELECT id_livre, prix
FROM livre WHERE prix BETWEEN 40 AND 60
OU
SELECT id_livre, prix
FROM livre WHERE prix >=40 AND prix <=60
id_livre prix
---------------------
3000 57.99
4000 40.99
5000 43.99

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 30


Commande SELECT

Liste des auteurs pour lesquels la province n’est pas


renseignée
SELECT id_a, nom, ville
FROM auteur
WHERE province IS NULL

id_a nom ville


-------------------------------------------
70 Michel Montignac Paris
90 jacques Dupont Paris

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 31


Commande SELECT
Nom des auteurs commençant par la lettre L
SELECT nom
FROM auteur
WHERE nom LIKE 'L%'
nom
--------------------
Luc Nadeau
Laks Agrawal

N.B. Le symbole % remplace 0 ou plusieurs caractères, ‘_’


remplace un seul caractère, et [A-D] par ex. signifie un
caractère égal à A, B, C ou D.

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 32


Commande SELECT
Nom des auteurs dont le nom de famille commence par L ou N
SELECT nom FROM auteur
WHERE nom LIKE '% [LN]%'
NB. Il y a un espace avant [. Pourquoi?
nom
--------------------
Pierre Lebrun
Luc Nadeau
Liste des auteurs dont le nom de famille commence par une lettre
incluse dans l’intervalle [L-N]
SELECT nom
FROM auteur
WHERE nom LIKE '% [L-N]%'

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 33


Commande SELECT

Liste des noms d’auteurs dont le 2ème caractère du prénom


est i.
SELECT nom
FROM auteur
WHERE nom LIKE '_i%'
nom
--------------------
Pierre Lebrun
Michel Montignac

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 34


Commande SELECT
Titre des livres dont le prix dépasse 40 $ ou les droits sont de 15
(pour cent) et la catégorie est informatique
SELECT titre
FROM livre
WHERE prix > 40 OR droits=15 AND categorie='informatique’
titre
--------------------
SQL Server 6.5
Bases de donnees
Management
A guide to SQL

L’ordre de priorité des opérateurs logiques est : NOT, AND, OR.

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 35


Commande SELECT

Titre des livres dont le prix dépasse 40 $ ou les droits


sont de 15 (pour cent) et la catégorie est informatique
SELECT titre
FROM livre
WHERE (prix > 40 OR droits=15) AND
categorie='informatique'
titre
--------------------
SQL Server 6.5
Bases de donnees
A guide to SQL
Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 36
Jointure de tables

l Opération relationnelle
n portant sur deux ou plusieurs tables ayant des attributs
de jointure appartenant à des domaines compatibles
l Deux types de jointure
n Jointure interne (inner join)
n Jointure externe (outer join)
* Peu répandue
* gauche, droite ou complète

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 37


Jointure de tables
l Inner join
n donne comme résultat un sous-ensemble du produit
cartésien (des tables) vérifiant la condition de jointure
n suppose une unification des valeurs des attributs de
jointure des tables concernées
n Formes
* Équi-jointure : cas spécial de la jointure interne où
l’opérateur de comparaison est ‘=’
* Jointure naturelle (la plus répandue) : équi-jointure
dans laquelle les attributs de jointure n’apparaissent
qu’une seule fois dans la partie SELECT.
N.B. La quasi-totalité des exemples et exercices de ce
document porte sur la jointure interne dite naturelle (la plus
répandue).
Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 38
Jointure de tables

Ex. Liste des livres publiés par des éditeurs habitant à


Paris
Éditeur Livre
Id_livre titre Code_ed
code_Ed Nom_ed lieu 1000 Menus … 11
11 Gaetan Morin Montreal
22 Addison New York 2000 SQL Server 55
Wesley 6.5
33 Flammarion Paris
3000 Bases de 44
44 Eyrolles Paris donnees
4000 Manag. 44
55 MS Press Boston
5000 A guide … 22
6000 Je maigris 33
Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 39
Jointure de tables

Liste des livres publiés par des éditeurs habitant à Paris.


SELECT id_livre, titre
FROM livre
WHERE code_ed in (SELECT code_ed
FROM editeur
WHERE lieu='Paris')
OU
SELECT id_livre, titre
FROM livre, editeur
WHERE livre.code_ed= editeur.code_ed
AND lieu='Paris‘
id_livre titre
-------------------------------
3000 Bases de donnees
4000 Management
6000 Je maigris
Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 40
Jointure de tables

Nom et ville des auteurs du livre numéro 4000

SELECT nom, ville


FROM auteur, auteurLivre
WHERE auteur.id_a=auteurLivre.id_a
AND id_livre=4000

nom ville
-----------------------------------
Amina Missaoui Quebec
Luc Nadeau Moncton
Laks Agrawal Toronto

N.B. Observez comment SQL Server a exécuté cette


requête en choisissant l’option Execution Plan.
Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 41
Jointure de tables
Nom et ville des auteurs du livre numéro 4000.
Formulation sous forme imbriquée :
SELECT nom, ville
FROM auteur
WHERE id_a IN
(SELECT id_a
FROM auteurLivre
WHERE id_livre=4000)
nom ville
----------------------------------
Amina Missaoui Quebec
Luc Nadeau Moncton
Laks Agrawal Toronto

Exercice. Titre et prix des livres rédigés par l'auteur dont


id_a est 80.
Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 42
Jointure de tables
Titre et prix des livres rédigés par l'auteur dont id_a est 80.
SELECT titre, prix
FROM livre, auteurLivre
WHERE livre.id_livre =
auteurLivre.id_livre AND id_a=80
OU
SELECT titre, prix
FROM livre INNER JOIN auteurLivre
ON livre.id_livre = auteurLivre.id_livre
WHERE Id_a=80
OU
SELECT titre, prix FROM livre
WHERE id_livre IN
(SELECT id_livre
FROM auteurLivre
WHERE id_a=80)
Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 43
Jointure de tables
Nom des auteurs ayant rédigé des livres d’informatique.
SELECT DISTINCT T1.id_a, nom
FROM auteur T1, auteurLivre T2, livre T3
WHERE T1.id_a=T2.id_a
AND T2.id_livre=T3.id_livre
AND categorie = 'informatique'
id_a nom
----------------------------
10 Alain Dubuc
40 Brian Adams
80 C-J Date
90 Jacques Dupont

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 44


Jointure de tables
Nom des auteurs ayant rédigé des livres d’informatique
(formulation imbriquée)

SELECT id_a, nom FROM auteur


WHERE id_a IN
(SELECT id_a FROM auteurLivre
WHERE id_livre IN
(SELECT id_livre FROM livre
WHERE categorie='informatique' ) )

Exercice. Fournir le nom des auteurs ayant rédigé des livres publiés par des
éditeurs résidant à Paris.
Il y a plusieurs formulations possibles!

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 45


Jointure de tables
Jointure d’une table avec elle-même (self-join)
Ex. Liste des livres de même catégorie que le livre 5000
Livre Livre
Id_livre titre catégorie Id_livre titre catégorie
1000 Menus … cuisine 1000 Menus … cuisine

2000 SQL Server informatique


6.5 2000 SQL Server informatique
6.5
3000 Bases de informatique
donnees 3000 Bases de informatique
donnees
4000 Manag. gestion
4000 Manag. gestion
5000 A guide … informatique
5000 A guide … informatique
6000 Je maigris dietetique
6000 Je maigris dietetique
Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 46
Jointure de tables
Code et titre des livres de même catégorie que le livre
d'identifiant 5000. Ne pas afficher l’information sur le livre
5000.
SELECT T1.id_livre, T1.titre
FROM livre T1, livre T2
WHERE T1.categorie=T2.categorie
AND T2.id_livre = 5000
AND T1.id_livre != 5000
id_livre titre
-------------------------------
2000 SQL Server 6.5
3000 Bases de donnees

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 47


Jointure de tables
Code et titre des livres de même catégorie que le livre d'identifiant
5000. Ne pas afficher l'information sur le livre 5000 (formulation
imbriquée).
SELECT id_livre, titre
FROM livre
WHERE categorie =
(SELECT categorie
FROM livre
WHERE id_livre = 5000)
AND id_livre != 5000

Exercice. Liste des livres dont le prix dépasse celui du livre de


“Management”.

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 48


Jointure de tables

l Outer join
n Left Outer Join (jointure externe gauche) retourne
comme résultat de la jointure de DEUX tables TOUS
les tuples de la table de GAUCHE mais uniquement les
tuples de la table de DROITE qui s'unifient avec ceux
de la table de GAUCHE
n Right Outer Join: jointure externe droite
n Full outer join: jointure externe complète (gauche et
droite)

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 49


Jointure de tables
Exemple. Les 2 tables suivantes sont à joindre
Livre PetitePart
id_livre titre catégorie id_a id_livre ordre part
1000 Menus … cuisine 10 1000 1 5

2000 SQL Server informatique 20 1000 2 5


6.5
3000 Bases de informatique 30 4000 2 5
donnees

4000 Manag. gestion 50 4000 1 5

5000 A guide … informatique 60 4000 3 5


6000 Je maigris dietetique

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 50


Jointure de tables – jointure externe gauche
Ex. Code de tous les livres, même ceux pour lesquels des
auteurs n’ont pas une petite part
SELECT A.id_livre, id_a, part
FROM livre A LEFT OUTER JOIN
petitePart B ON A.id_livre = B.id_livre
OU SELECT A.id_livre, id_a, part FROM livre A,
petitePart B WHERE A.id_livre*= B.id_livre
id_livre id_a part
1000 10 5
1000 20 5
2000 (null) (null)
3000 (null) (null)
4000 30 5
4000 50 5
4000 60 5
5000 (null) (null)
6000 (null) (null) M1 RETEL - Langage SQL
Idrissa SARR - UCAD Février 2017 51
Jointure de tables
Comparez l’exemple précédent avec le suivant :
Titre et code des livres ainsi que l’identifiant des auteurs ayant une
petite part (=5).
SELECT titre, A.id_livre, id_a
FROM livre A, petitePart B
WHERE A.id_livre = B.id_livre
titre id_livre id_a
-------------------------------------------
Menus quebecois 1000 10
Menus quebecois 1000 20
Management 4000 30
Management 4000 50
Management 4000 60
Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 52
Jointure de tables – jointure externe droite
Quelle est la signification de cette requête ?
SELECT nom, ville, lieu, nom_ed
FROM editeur RIGHT OUTER JOIN auteur ON ville = lieu
nom ville lieu nom_ed
----------------------------------------------------------------------------
Alain Dubuc Hull NULL NULL
Pierre Lebrun Montreal Montreal Gaetan Morin
Amina Missaoui Quebec NULL NULL
Brian Adams Toronto NULL NULL
Luc Nadeau Moncton NULL NULL
Laks Agrawal Toronto NULL NULL
Michel Montignac Paris Paris Flammarion
Michel Montignac Paris Paris Eyrolles
C-J Date Washington NULL NULL
jacques Dupont Paris Paris Flammarion
jacques Dupont Paris Paris Eyrolles
Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 53
Fonctions d’agrégation

Elles permettent d’obtenir des résumés statistiques par le biais


de COUNT, SUM, MIN, MAX ...
Ex. Nombre total de livres
SELECT COUNT(*) Nb_livres FROM livre
Nb_livres
-----------
6
Ex. Nombre de catégories de livres
SELECT COUNT(DISTINCT categorie) Nb_categories
FROM livre
Nb_categories
-------------
4
Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 54
Fonctions d’agrégation

Ex. Prix mimimum, maximum et moyen des livres:


SELECT MIN(prix) Prix_min, MAX(prix) Prix_max,
AVG(prix) Prix_moyen
FROM livre

Prix_min Prix_max Prix_moyen


---------------------------------------------------
8.99 65.00 39.66

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 55


Fonctions d’agrégation

Donner la signification de la requête suivante :

SELECT id_a, id_livre, part


FROM auteurLivre T1
WHERE part =
(SELECT MAX(part)
FROM auteurLivre
WHERE id_a=T1.id_a)

N.B. Il est bien important de noter la présence du SELECT


avant MAX(part).

Exercice. Trouver une formulation apparentée (mais non


équivalente) à la requête précédente en faisant usage du
GROUP BY (voir plus loin).
Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 56
Fonctions d’agrégation

Donner la signification de la requête suivante :

SELECT id_a, id_livre, part


FROM auteurLivre
WHERE part =
(SELECT MAX(part)
FROM auteurLivre)

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 57


Commande SELECT – ORDER BY

À l’intérieur d’une commande SELECT, la clause


ORDER BY permet de trier le résultat de la requête
dans un certain ordre.
SELECT id_livre, titre, categorie, prix
FROM livre
WHERE prix > 40
ORDER BY titre

id_livre titre categorie prix


---------------------------------------------------------
5000 A guide to SQL informatique 43.99
3000 Bases de donnees informatique 57.99
4000 Management gestion 40.99
2000 SQL Server 6.5 informatique 65.00

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 58


Commande SELECT – ORDER BY
Code, catégorie et titre des livres à trier selon un ordre
ascendant de la catégorie et un ordre descendant du titre
SELECT id_livre, categorie, titre FROM livre
ORDER BY categorie , titre DESC
OU
SELECT id_livre, categorie, titre FROM livre
ORDER BY 2 , 3 DESC
id_livre categorie titre
-----------------------------------------------------
1000 cuisine Menus quebecois
6000 dietetique Je maigris
4000 gestion Management
2000 informatique SQL Server 6.5
3000 informatique Bases de donnees
5000 informatique A guide to SQL

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 59


Commande SELECT – GROUP BY
l La clause GROUP BY
n se trouve dans la commande SELECT
n permet de constituer des groupes de données
auxquels des fonctions d’agrégation (ex. MIN, MAX,
AVG, COUNT) sont appliquées.
n peut être suivie de la clause HAVING qui impose des
conditions sur des groupes de tuples
n Peut être combinée avec la clause WHERE laquelle
impose des conditions sur les tuples pris
individuellement

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 60


Commande SELECT – GROUP BY

SELECT * FROM auteurLivre ORDER BY id_a


id_a id_livre ordre part
---------------------------------
10 1000 1 5
10 3000 3 17 Observez les groupes d’id_a!
20 1000 2 5
30 4000 2 5
40 2000 1 15
50 4000 1 5
60 4000 3 5
70 6000 1 15
80 3000 1 8
80 5000 1 13
90 2000 2 10
90 3000 2 7
Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 61
Commande SELECT – GROUP BY

Part maximale détenue par chaque auteur


SELECT id_a, MAX(part) Part_max
FROM auteurLivre
GROUP BY id_a
id_a Part_max
--------------------
10 17
20 5
30 5
40 15
50 5
60 5
70 15
80 13
90 10
Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 62
Commande SELECT – GROUP BY

Nombre d’auteurs par indicatif régional


SELECT SUBSTRING(telephone,1,3) Indicatif, count(*) Nb
FROM auteur
GROUP BY SUBSTRING(telephone, 1, 3)

Indicatif Nb
----------------------
202 1
331 2
416 2
418 1
506 1
514 1
819 1

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 63


Commande SELECT – GROUP BY

Liste et comptage des livres rédigés par plus d’un auteur. Le


résultat sera trié dans un ordre croissant des effectifs

SELECT id_livre, COUNT(*) Nb_auteurs


FROM auteurLivre
GROUP BY id_livre
HAVING COUNT(*) > 1
ORDER BY Nb_auteurs
id_livre Nb_auteurs
---------------------------
1000 2
2000 2
3000 3
4000 3

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 64


Commande SELECT – GROUP BY

Liste des auteurs et part maximale pour tous ceux


qui ont une part maximale comprise entre 10 et 15

SELECT id_a, MAX(part) Part_max


FROM auteurLivre
GROUP BY id_a
HAVING MAX(part) BETWEEN 10 AND 15

id_a Part_max
------ -----------
40 15
70 15
80 13
90 10
Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 65
Commande SELECT – GROUP BY

Produire le code des livres ayant plus d’un


auteur, après avoir écarté les tuples n’ayant pas
une part supérieure à 5.

SELECT id_livre, COUNT(*) Nb_auteurs


FROM auteurLivre
WHERE part > 5
GROUP BY id_livre
HAVING COUNT(*) > 1

id_livre Nb_auteurs
--------------------------
2000 2
3000 3

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 66


Commande SELECT – GROUP BY
Quelle est la signification de cette requête ?
SELECT auteur.id_a, nom, ville
FROM auteur, auteurLivre
WHERE auteur.id_a=auteurLivre.id_a
GROUP BY auteur.id_a, nom, ville
HAVING MIN(part) >=8

N.B. La présence de nom et ville après le GROUP BY est


nécessaire!
id_a nom ville
-----------------------------------------
40 Brian Adams Toronto
70 Michel Montignac Paris
80 C-J Date Washington

Exercice. Proposer une formulation imbriquée.


Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 67
Commande SELECT – GROUP BY

Formulation imbriquée

SELECT id_a, nom, ville


FROM auteur
WHERE id_a IN (SELECT id_a
FROM auteurLivre
GROUP BY id_a
HAVING MIN(part) >=8)

id_a nom ville


-----------------------------------------
40 Brian Adams Toronto
70 Michel Montignac Paris
80 C-J Date Washington

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 68


Opérateurs ensemblistes

l SQL offre trois opérateurs


n UNION fait l’union de deux ou plusieurs tables
n INTERSECT fait l’intersection de deux tables
n MINUS calcule la différence entre deux tables en
déterminant les tuples de la 1ère table qui ne se
retrouvent pas dans la 2ème table
l Les opérandes doivent être compatibles
l INTERSECT et MINUS n’existent pas dans
SQL Server

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 69


Opérateurs ensemblistes
Supposons que la table editeurAnglophone a été
construite comme suit :
SELECT * INTO editeurAnglophone
FROM editeur
WHERE lieu IN ('New York', 'Boston')

INSERT INTO editeurAnglophone


VALUES (66, 'Prentice Hall', 'Detroit')

SELECT * FROM editeurAnglophone


code_ed nom_ed lieu
----------------------------------------------
66 Prentice Hall Detroit
22 Addison Wesley New York
55 MS Press Boston
Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 70
Opérateurs ensemblistes

Union : collecte des tuples de la table editeur et de


ceux provenant de editeurAnglophone

SELECT * FROM editeur


UNION
SELECT * FROM editeurAnglophone

code_ed nom_ed lieu


----------------------------------------------
66 Prentice Hall Detroit
55 MS Press Boston
33 Flammarion Paris
44 Eyrolles Paris
22 Addison Wesley New York
11 Gaetan Morin Montreal
Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 71
Opérateurs ensemblistes

Intersection : ensemble des tuples se retrouvant à la


fois dans editeur et dans editeurAnglophone

SELECT *
FROM editeur
WHERE EXISTS
(SELECT *
FROM editeurAnglophone
WHERE editeur.code_ed =
editeurAnglophone.code_ed)

code_ed nom_ed lieu


----------------------------------------------
22 Addison Wesley New York
55 MS Press Boston
Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 72
Opérateurs ensemblistes

Autre formulation (plus intuitive) de l’intersection

SELECT *
FROM editeur
WHERE code_ed IN
(SELECT code_ed
FROM editeurAnglophone)

code_ed nom_ed lieu


----------------------------------------------
22 Addison Wesley New York
55 MS Press Boston

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 73


Opérateurs ensemblistes
Différence : ensemble des tuples figurant dans
editeur sans être dans editeurAnglophone
SELECT *
FROM editeur
WHERE NOT EXISTS
(SELECT *
FROM editeurAnglophone
WHERE editeur.code_ed =
editeurAnglophone.code_ed)

code_ed nom_ed lieu


----------------------------------------------
11 Gaetan Morin Montreal
33 Flammarion Paris
44 Eyrolles Paris
Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 74
Quelques fonctions
Droits d’auteurs sur les livres :
SELECT id_livre, STR(prix * droits * .01, 5, 2) AS Droits_auteur
FROM livre
id_livre Droits_auteur
----------------------------
1000 2.10
2000 9.75
3000 9.28
4000 6.15
5000 8.80
6000 1.35
On a utilisé la fonction STR pour retourner une valeur de 5
positions dont 2 décimales (y compris le point décimal).

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 75


Quelques fonctions
Exemple. Mettre en majuscule la première lettre de
l’attribut nom de la table auteur.
UPDATE auteur
SET nom =
UPPER(SUBSTRING(nom,1, 1)) + SUBSTRING(nom, 2,
20)
n La fonction UPPER (resp. LOWER) convertit en majuscule
(resp. minuscule) une chaîne de caractères
n SUBSTRING(nom, 2, 20) extrait une sous-chaîne de 20
caractères à partir de la position 2 du nom
n Le symbole ‘+’ effectue une concaténation de chaînes de
caractères.
n CAST et CONVERT permettent de convertir une expression
d’un type vers un autre (Cf. exemples plus loin).

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 76


Quelques fonctions
Exemple. Mettre en majuscule la première lettre du nom de famille
(2ème champ de l’attribut nom) de la table auteur.
DECLARE @POS INT
DECLARE @LONG INT
UPDATE auteur
SET @POS = CHARINDEX(' ', nom),
@LONG = LEN(nom),
nom = SUBSTRING(nom,1, @POS) + UPPER(SUBSTRING(nom,
@POS+1, 1)) + SUBSTRING(nom,@POS+2, @LONG - @POS-1)
n Ici, la fonction CHARINDEX retrouve la position de l’espace (entre
le nom et le prénom) dans le champ nom
n Ici, DECLARE permet de déclarer localement la variable POS
comme étant de type INT (c-à-d, entier).

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 77


Quelques fonctions
Fournir l’année de parution des livres :
SELECT id_livre, DATENAME(year, date) Année FROM livre
id_livre Année
-----------------------
1000 1987
2000 1995
3000 1998
4000 1990
5000 1991
6000 1999
Exercice. Que fait la requête suivante ?
SELECT id_livre, DATENAME(dayofyear, date) FROM livre

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 78


Quelques fonctions
Nombre d’années écoulées entre la date de parution de chacun
des livres et le 1er janvier 1999

SELECT id_livre, date, DATEDIFF(year, date, '01/01/99')


Nb_années
FROM livre

id_livre date Nb_années


----------------------------------------------------
1000 Jun 17 1987 12:00AM 12
2000 Apr 21 1995 12:00AM 4
3000 Feb 4 1998 12:00AM 1
4000 Oct 30 1990 12:00AM 9
5000 Feb 24 1991 12:00AM 8
6000 Jan 15 1999 12:00AM 0

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 79


Quelques fonctions

Mois de parution de chacun des livres


SELECT id_livre, date, DATEPART(month, date) Mois
FROM livre

id_livre date Mois


-----------------------------------------------
1000 Jun 17 1987 12:00AM 6
2000 Apr 21 1995 12:00AM 4
3000 Feb 4 1998 12:00AM 2
4000 Oct 30 1990 12:00AM 10
5000 Feb 24 1991 12:00AM 2
6000 Jan 15 1999 12:00AM 1

N.B. DATEPART est une fonction moins expressive que


DATENAME. Vérifiez-le!
Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 80
Quelques fonctions

Date de parution des livres selon le style 5 (c-à-d jour-mois-


année)
SELECT id_livre, CONVERT(CHAR(8),date, 5)
'Jour-Mois-An' FROM livre
id_livre Jour-Mois-An
------------------------------
1000 17-06-87
2000 21-04-95
3000 04-02-98
4000 30-10-90
5000 24-02-91
6000 15-01-99
N.B. Le style 5 du 3ème paramètre de CONVERT indique que
l’affichage de la date sera sous forme dd-mm-yy
(Cf. documentation sur SQL Server)
Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 81
Exercices – Schéma relationnel

SERVICE (Num_S, Libellé, Étage, Chef)


EMPLOYÉ (Num_E, Nom_E, Fonction, Salaire, Num_S)
PROJET (Num_P, Titre, Début_P, Fin_P, Num_S)
AGIT (Num_E, Num_P, Rôle)

N.B. Les clés primaires sont soulignées et les clés étrangères


sont en italique.

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 82


Exercices – Contenu de la base

Num_S Libellé Étage Chef


SERVICE 1 Personnel 5 1000
2 Finances 4 3000
3 Achats 4 7000

Num_E Nom_E Fonction Salaire Num_S


1000 Alain Latour Analyste 55 000.00 1
EMPLOYÉ 2000 Pierre Plante Programmeur 45 000.00 2
3000 Lyne Boivin Analyste 60 000.00 2
4000 Luc Nadeau Opérateur 37 000.00 1
5000 Nabil Mili Programmeur 42 000.00 2
6000 Jean Delorme Programmeur 40 000.00 3
7000 Nadia Tazi Analyste 52 000.00 3
8000 Nha Nguyen Opérateur 35 000.00 3
Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 83
Num_P Titre Début_P Fin_P Num_S
P1 Paie 1995-06-21 1995-10-03 1
P2 Stock 1995-01-31 1995-03-13 3
P3 Personnel 1994-12-22 1995-04-26 1
PROJET P4 Location 1995-07-17 1995-10-13 2
P5 Vente 1996-04-24 1996-08-09 2
P6 Achat 1996-02-27 1996-07-21 2
Num_E Num_P Rôle
1000 P2 Responsable
1000 P4 Responsable
2000 P2 Programmeur
AGIT
2000 P4 Superviseur
3000 P1 Responsable
3000 P6 Adjoint
4000 P5 Opérateur
5000 P6 Prog-analyste
6000 P3 Prog-analyste
7000 P3 Responsable
7000
Idrissa SARR - UCAD
P5 ResponsableFévrier 2017
M1 RETEL - Langage SQL 84
8000 P5 Opérateur
Exercices

Écrire les commandes SQL de description


de chacune des quatre tables de la BD.

Créer une nouvelle table EmployeSpecial


contenant les employés ayant Num _E < 8000

Mettre à jour la table EmployeSpecial en


remplaçant la valeur Num_E par 7777 pour
l’employé 'Nadia Tazi'

Insérer dans EmployeSpecial le tuple suivant:


8888, 'Lien Nguyen', 'Analyste', 57000, 3

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 85


Exercices

Formuler en SQL les requêtes ci-après :

l Liste des employés ayant un salaire compris entre 30 000$ et 40


000$.

l Nom des employés commençant par la lettre N.

l Liste des projets gérés par le service 1.

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 86


Exercices

l Liste des employés qui sont des analystes ou des


programmeurs.
Proposer 2 formulations équivalentes.

l Nom, fonction et salaire des employés qui sont soit des


programmeurs, soit des employés ayant un salaire < 45
000$ et appartenant au service 1.

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 87


Exercices

l Liste des projets dont la date de fin est la plus tardive?

l Quel est le salaire minimum par fonction?

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 88


Exercices

l Quelle est la masse salariale payée par chaque service


pour ses employés?

l Quelle est la masse salariale payée par chaque service


pour les employés de type analyste ou programmeur?

l Salaire moyen des employés par service pour tous les


services ayant au moins 3 employés
Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 89
Exercices

l Liste des employés ayant un salaire supérieur au salaire


moyen de tous les employés.

l Liste des services qui sont situés au même étage que le


service des achats.

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 90


Exercices

l Titre des projets gérés par le service du personnel

l Dans combien de projets est impliqué chacun des


employés?

l Liste des employés responsables de projets

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 91


Exercices

l Début et fin des projets auxquels participent Nabil Mili.


Proposer au moins deux formulations.

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 92


Exercices

l Quel est le rôle assumé par Lyne Boivin dans chacun des
projets dans lesquels elle est impliquée? Afficher le
numéro du projet et le rôle.

l Quel est le rôle assumé par Lyne Boivin dans chacun des
projets dans lesquels elle est impliquée? Afficher le titre
du projet et le rôle.

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 93


Exercices

l En utilisant la fonction CONVERT, exprimer la date de début de projet


(DEBUT_P) dans chacun des formats suivants :
n Jour/mois/année
n Mois
n Jour

l En sachant que GETDATE() retourne la date d’aujourd’hui, et que


DATEDIFF retourne la différence entre deux dates en terme d’une
unité de temps (ex. mois ou année), depuis combien de jours les projets
ont-ils été achevés?

l Utiliser la fonction DATEADD pour ajouter 2 jours à la date


DEBUT_P et un mois à la date FIN_P.

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 94


Exercices

l Quel est le nombre de mois écoulés entre la date de début


du projet (DEBUT_P) et le 1er janvier 1999? Utilisez la
fonction DATEDIFF.

l Effectuer les opérations suivantes de jointure externe sur


les tables EmployeSpecial et Agit :
n LEFT OUTER JOIN
n RIGHT OUTER JOIN
n FULL OUTER JOIN.

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 95


Références

• Date, C. J. An Introduction to Database Systems, 8ème édition,


Addison- Wesley, 2004

• Elmasri, R. & Navathe, S.B. Fundamentals of Database Systems,


6ème édition, Addison-Wesley, 2011.

• Godin, R. Systèmes de gestion de bases de données par l’exemple,


2ème édition. Loze-Dion, 2006.

• Molinaro, A. SQL par l’exemple, O’Reilly, 2007.

• Documentation en ligne sur Microsoft SQL Server 2008


http://msdn.microsoft.com/fr-fr/library/bb500155(v=SQL.100).aspx

Idrissa SARR - UCAD M1 RETEL - Langage SQL Février 2017 96

Vous aimerez peut-être aussi