Vous êtes sur la page 1sur 34

Cours 4 et 5: Le langage SQL Origine

Structured Query Language


•Origine – caractéristiques des langages déclaratifs
•Définition des structures – origine : IBM, System R, milieu des années 70
•Définition des contraintes –implémenté dans de nombreux SGBD
•Modification des structures Plusieurs versions :
•Création
Création dd'index
index
•Création de vues – SQL1 initial : ANSI* —1986
•Définition d'un schéma – SQL1 avec intégrité référentielle, ANSI —1989

– SQL2 ANSI —1992


Parallèle avec le monde objet
– SQL3 ANSI — 1999 incorpore la notion d’objet
* ANSI = American National Standard Institute
Philippe LAHIRE – Cours Base de Données L2I Cours 4 Janvier 2012 83 Philippe LAHIRE – Cours Base de Données L2I Cours 4 Janvier 2012 84

1
Caractéristiques de SQL Principales Instructions
• Fonctionnalités : • Définitions (LDD)
– Définition des objets de la base de données (LDD) CREATE DROP,
CREATE, DROP ALTER
– Manipulation de données (LMD)
• Mises à jour (LMD)
– Contrôle des accès aux données
– Gestion de transactions INSERT, UPDATE , DELETE
• Interrogations (LMD)
• Utilisé par : DBA, développeurs, quelques utilisateurs SELECT
• Contrôle d'accés aux données
GRANT, REVOKE
• Gestion de transactions
Parallèle avec mySQL
COMMIT, ROLLBACK

Philippe LAHIRE – Cours Base de Données L2I Cours 4 Janvier 2012 85 Philippe LAHIRE – Cours Base de Données L2I Cours 4 Janvier 2012 86

2
Consultation des données Exemple pour les requêtes
CLIENT
• Hypothèse: numéro nom adresse numéro_téléphone
101 Durand NICE 0493456743
– un schéma
hé d
de b
base d
de d
données
é estt créé
éé
108 Fabre PARIS NULL
– Une base de données a été remplie 110 Prosper PARIS NULL
125 Antonin MARSEILLE NULL
• La création a été faite par une interface QBE
PRODUIT
(mySQL) référence marque Prix HT

• On expérimente la consultation avec SQL 153 BMW 1000


589 PEUGEOT 1800
• On expérimentera la création du schéma et le 158 TOYOTA 1500

remplissage de la base avec SQL plus tard VENTE


numéro référence_produit numéro_client date
00102 153 101 12/10/04
Langage algébrique en SQL
00809 589 108 20/01/05
Requêtes mono et multi table(s) 11005 158 108 15/03/05
12005 589 125 30/03/05

Philippe LAHIRE – Cours Base de Données L2I Cours 4 Janvier 2012 87 Philippe LAHIRE – Cours Base de Données L2I Cours 4 Janvier 2012 88

3
Opérateur Projection Elimination des doublons
SELECT xx yy : définition du format du résultat • Afficher l’adresse de tous les clients
+ spécifier la cible SELECT adresse
d SELECT ALL adresse
d
FROM Client ; FROM Client;
• Afficher le nom et l’adresse des clients
SELECT nom , adresse • Afficher toutes les adresses existantes (sans doublons)
FROM Client ; SELECT DISTINCT adresse
FROM Client ;
Par défaut
• Afficher toutes les informations des clients Projection
SELECT *
Relationnel : On doit pouvoir distinguer chaque tuple !
FROM Client ;
SQL : le résultat peut ne pas être une relation

Philippe LAHIRE – Cours Base de Données L2I Cours 4 Janvier 2012 89 Philippe LAHIRE – Cours Base de Données L2I Cours 4 Janvier 2012 90

4
Opérateur Sélection Opérations possibles (mySQL)
• Booléennes
….
+ spécifier la cible + and, or, xor, =, !=, <, >, <=, >=
where expression : définition des tuples du résultat • Arithmétiques
+, -, *, /
• Quels sont les clients dont l’adresse est Paris +, - opérateurs unaires
• Fonctions numériques
SELECT * abs, log, cos, sin, mod, power ...
• Arithmétiques sur date U grand
Un d nombre
b
FROM Client +, -
WHERE adresse = ‘Paris
Paris’; • Fonctions sur chaînes
length, concat, ...
• Quels sont les produits dont le prix TTC est supérieur à 1000
SELECT * Dans Select: attribut calculé (résultat)
FROM Produit
Dans Where: participer à la sélection
WHERE prix_HT + prix_HT * 0.195 > 1000
1000;
Philippe LAHIRE – Cours Base de Données L2I Cours 4 Janvier 2012 91 Philippe LAHIRE – Cours Base de Données L2I Cours 4 Janvier 2012 92

5
Précédence des opérateurs Utilisation des opérateurs
‰ := + faible
• SELECT ABS (-32); 32 Bien sur on peut
‰ ||, OR, XOR
utiliser des attributs
‰ &&, AND • SELECT FLOOR (1.23); 1
‰ BETWEEN, CASE, WHEN, THEN, ELSE
‰ =, <=>, >=, >, <=, <, <>, !=, IS, LIKE, REGEXP, IN • SELECT MOD (234, 10); 4 Peut se trouver
‰| • SELECT 253 % 7; 1 dans Where
‰& WHERE 3 / 5 < 1 1;
‰ <<, >> • SELECT ROUND (1.298, 1); 1,3
SELECT 1+2*3;
‰ -, +
7 • SELECT ROUND (1.298, 0); 1
‰ *, /, DIV, %, MOD
‰^ • SELECT SIGN (234) SIGN (-32) SIGN (0); 1 / -1 / 0
‰ - (unary minus), ~ (unary bit inversion) • SELECT 3 / 5; 0,60
‰ !, NOT
‰ BINARY, COLLATE + forte
Philippe LAHIRE – Cours Base de Données L2I Cours 4 Janvier 2012 93 Philippe LAHIRE – Cours Base de Données L2I Cours 4 Janvier 2012 94

6
Utilisation des opérateurs (Chaînes) Combinaison Sélection + projection
• SELECT CONCAT ('My', 'S', 'QL'); ‘MySQL’ Attributs recherchés / calculés
• SELECT CHAR_LENGTH (‘MySQL’); 5 d’attributs ou *
SELECT liste d’
• SELECT LOCATE ('bar', 'foobarbar'); 4 FROM liste des relations
• SELECT LOCATE ('bar', 'foobarbar', 5); 7 WHERE condition ; Si plusieurs: il faut une jointure
• SELECT INSERT (('Quadratic'
Quadratic , 3,
3 44, 'What');
What ); 'QuWhattic'
QuWhattic
• SELECT LOWER (‘MySQL’); ‘mysql’ Test sur chaque tuple: résultat vrai ou faux
• SELECT SUBSTRING ('Quadratically',5,6); ‘ratica'
Utilise des fonctions, opérateurs…
• SELECT 'David!'
David! LIKE ‘David
David_';; 1 _ et %
• SELECT 'David!' LIKE ‘%D%v%'; 1 0 (false), 1 (true) Autres clauses possibles
• SELECT STRCMP (S1, S2); -1,0,1
Philippe LAHIRE – Cours Base de Données L2I Cours 4 Janvier 2012 95 Philippe LAHIRE – Cours Base de Données L2I Cours 4 Janvier 2012 96

7
Requêtes simples (1) Requêtes simples (2)
• Y a-t-il des produits dont le nom est « XBOX » • Quels sont les ventes dont le montant HT est entre 1000 et
SELECT * 3000 euros et dont le client n'est pas le numéro 101?
FROM Produit SELECT *
WHERE nom = ‘XBOX XBOX' ; FROM Vente
• Quels sont les ventes réalisés il y a plus de 30 jours? WHERE (prix_ht between 1000 and 3000) and
SELECT * (numero !!= 101);
FROM Vente
WHERE CURRENT_DATE () > 30 + date ; • Quels sont les clients dont le nom est soit Prosper, soit
Durand, soit Anthonin ?
• Quels sont les ventes faites après le 1er janvier 2007?
SELECT *
SELECT *
FROM Client
FROM Vente
WHERE nom in (‘Prosper
Prosper', 'Durand
Durand', ‘Anthonin
Anthonin') ;
WHERE date > DATE ('2007-01-01‘) ;
Philippe LAHIRE – Cours Base de Données L2I Cours 4 Janvier 2012 97 Philippe LAHIRE – Cours Base de Données L2I Cours 4 Janvier 2012 98

8
Requêtes simples (3) Requêtes et valeurs nulles (1)
• Quels sont les clients dont le nom commence par ‘P' • Quels sont les ventes dont la date de réalisation est
inconnue?
SELECT *
SELECT *
FROM Employe
FROM Vente Ou : IS NOT NULL
WHERE nom LIKE ‘P
P %' ;
WHERE date is null ;
• Quels
Q sont les clients dont le nom commence par ‘P'
‘ Attention :
et a un ‘S' comme 4ème lettre Whatever comparé avec NULL
WHERE date = NULL
SELECT * → Ni vrai ni faux

FROM Client COUNT, MIN, SUM Ignore les valeurs NULL


→ sauf
sa f COUNT (*)
WHERE nom LIKE ‘P
P__S
S%' ;
Toute opération appliquée à NULL donne pour résultat NULL

Philippe LAHIRE – Cours Base de Données L2I Cours 4 Janvier 2012 99 Philippe LAHIRE – Cours Base de Données L2I Cours 4 Janvier 2012 100

9
Requêtes et valeurs nulles (2) Les autres clauses (tri)
SELECT nom SELECT attribut1…
FROM Produit FROM Affichage!
WHERE prix_ht > 1000 ; WHERE expression
ORDER BY attribut1 [ASC] [DESC]…

SELECT nom • Donner le numero, le prix HT et la marque des produits selon


FROM Produit ll'ordre
ordre décroissant des marques et l'ordre
l ordre croissant des prix HT
WHERE prix_ht > 1000 or prix_ht <= 2500 ; SELECT marque, prix_ht, numero
FROM Produit
Que se passe-t-il si certains produits
ORDER BY marque DESC, prix_ht ASC;
ont un prix HT inconnu? Ordre d’affichage!
Mais aussi:
ORDER BY 1 DESC, 2 ASC;

Philippe LAHIRE – Cours Base de Données L2I Cours 4 Janvier 2012 101 Philippe LAHIRE – Cours Base de Données L2I Cours 4 Janvier 2012 102

10
Requêtes multi- tables (Opérateur Jointure) Définition de la jointure
Deux points de vue: SELECT Client.nom, Vente.prix_ht
• exécuter des boucles imbriquées (une table par boucle) FROM Client,
Client Vente ;
appliquer la clause WHERE dans les boucles → tous les tuples (nom, prix_ht)
• calculer le produit cartésien (une nouvelle table) → nom est un nom de client et prix_ht est un prix de vente
Appliquer la clause WHERE sur chaque ligne
Pas de critère de jointure → Produit cartésien
Donner le nom d’un produit et le montant de la vente
Intérêt?
SELECT Produit.nom, Vente.prix_HT
FROM Produit , Vente
WHERE Vente.reference_produit
Vente.reference produit = Produit.numero ;
Critères de jointure Mots-clés pour exprimer le critère de sélection

Il faut joindre les tables (jointure)


Philippe LAHIRE – Cours Base de Données L2I Cours 4 Janvier 2012 103 Philippe LAHIRE – Cours Base de Données L2I Cours 4 Janvier 2012 104

11
Jointure (compléments) SQL et les différentes jointures
• Donner la marque des produits dont le prix HT est
p
supérieur à celui d’une BMW SELECT ... FROM <table gauche> [INNER] JOIN
Jointure interne
Renommage <table droite> ON <condition de jointure>
SELECT Produit.marque
SELECT ... FROM <table gauche> LEFT | RIGHT |
FROM Produit Produit_reference, Produit
Jointure externe FULL OUTER JOIN <table droite> ON condition de
WHERE Produit_reference.marque = ‘BMW‘ AND jointure dans mysql pas reconnu
Produit prix HT > Produit_reference.prix_HT
Produit.prix_HT Produit reference prix HT ; SELECT ... FROM <table
t bl gauche>
h NATURAL JOIN
Jointure naturelle
Ou de même prix HT: <table droite> [USING <noms de colonnes>]
SELECT Produit.marque SELECT ... FROM <table gauche> CROSS JOIN
Jointure croisée
FROM Produit Produit_reference, Produit <table droite> dans mysql = INNER JOIN
WHERE Produit_reference.marque
Prod it reference marq e = ‘BMW‘ AND
SELECT ... FROM <table gauche> UNION JOIN
Jointure d'union
Produit.prix_ht = Produit_reference.prix_ht AND <table droite>
Produit.marque != Produit_reference.marque ;
Philippe LAHIRE – Cours Base de Données L2I Cours 4 Janvier 2012 105 Philippe LAHIRE – Cours Base de Données L2I Cours 4 Janvier 2012 106

12
Quelques jointures Quelques jointures (compléments)
• Donner le nom des client et le prix HT Que deviennent les tuples non sélectionnés de R1 ou R2?
SELECT Client.nom,
Client nom Vente.prix_ht
Vente prix ht • dans la jointure (interne INNER JOIN) les tuples qui ne
Jointure naturelle
FROM Vente, Client peuvent pas être joints sont éliminés du résultat
WHERE Vente.numero_client = Client.numero • dans la jointure externe (OUTER JOIN) les tuples qui ne
peuvent pas être joints sont conservés dans le résultat
• Donner la marque des produits dont le prix HT est Pour les tuples de la relation de
supérieur à celui d’une BMW gauche (R1) et / ou de droite (R2) Défaut
SELECT Produit.marque Theta Jointure
R1 FULL OUTER JOIN R2 : Remplit R1.* et R2.*
FROM Produit Produit_reference, Produit R1 LEFT OUTER JOIN R2 : Remplit R1.*
WHERE Produit_reference.marque
Produit reference marque = ‘BMW‘
BMW AND R1 RIGHT OUTER JOIN R2 : Remplit R2.*
Produit.prix_ht > Produit_reference.prix_ht ;
avec NULL si nécessaire.
Philippe LAHIRE – Cours Base de Données L2I Cours 4 Janvier 2012 107 Philippe LAHIRE – Cours Base de Données L2I Cours 4 Janvier 2012 108

13
Exercice (1) Exercice (2)
SELECT *
Relations :
FROM LIVRAISON RIGHT JOIN (DEPOT, JOURNAL)
ON (LIVRAISON.no-depot = DEPOT.no-depot AND
• Journal (code-j, titre, prix, type, périodicité)
LIVRAISON.code-j = JOURNAL.code-j)
• Dépôt (no-dépôt, nom-dépôt, adresse)
• Livraison (no-dépôt, code-j, date-liv, quantité-livrée) Toutes les lignes de DEPOT et JOURNAL seront présentes
Avec éventuellement rien pour la partie livraison
Requêtes : donner… SELECT *
FROM LIVRAISON, DEPOT, JOURNAL
• le prix des journaux livrés le 15/01/07 ? WHERE LIVRAISON.no-depot = DEPOT.no-depot AND
• tous le nom des hebdomadaires reçus par le dépôt de Paris..
LIVRAISON code j = JOURNAL.code-j)
LIVRAISON.code-j JOURNAL code j)
• les titre des journaux livrés à Nice.
• le nom des dépôts qui reçoivent des hebdomadaires dont la Seulement les lignes de DEPOT et JOURNAL qui
quantité livrée excède 100. correspondent à une livraison
Philippe LAHIRE – Cours Base de Données L2I Cours 4 Janvier 2012 109 Philippe LAHIRE – Cours Base de Données L2I Cours 4 Janvier 2012 110

14
Opérateur Union Opérateurs Intersection, Différence
Afficher la liste des numéros d'employé des responsables de Afficher les numéros d'employé des responsables de département
département et des directeurs
qui sont aussi des directeurs
Département Employé
numéro-département … responsable numéro-employé … fonction
SELECT responsable SELECT responsable
FROM Département FROM Département
INTERSECT EXCEPT
SELECT responsable SELECT numéro-employé SELECT numéro-employé
FROM Département FROM Employé FROM Employé
UNION WHERE fonction = 'Directeur'; WHERE fonction = 'Directeur';
SELECT numéro-employé
FROM Employé
WHERE fonction = 'Directeur';
Afficher les numéros d'employé des responsables de département
Sauf ceux qui sont aussi des directeurs
Philippe LAHIRE – Cours Base de Données L2I Cours 4 Janvier 2012 111 Philippe LAHIRE – Cours Base de Données L2I Cours 4 Janvier 2012 112

15
Requêtes (Fonctions statistiques) Clause Group by
• SUM (nom d’attribut) SELECT attributs recherchés
• CO
COUNT(*)
(*) FROM liste des relations
• COUNT(DISTINCT nom d’attribut) WHERE condition
• MAX (nom d’attribut) GROUP BY attributs de regroupement
• MIN (nom d’attribut)
d attribut) [HAVING condition sur le groupe ];
• AVG (nom d’attribut)
SELECT COUNT (*) SELECT COUNT (*)
• AVG (DISTINCT nom d’attribut) FROM Produit FROM Produit
Dans les clauses : GROUP BY marque WHERE marque <> ‘BMW’
• SELECT SELECT AVG (prix_ht), nom GROUP BY marque
• HAVING TO FROM Produit HAVING AVG (prix_ht) > 10.5
GROUP BY marque
Philippe LAHIRE – Cours Base de Données L2I Cours 4 Janvier 2012 113 Philippe LAHIRE – Cours Base de Données L2I Cours 4 Janvier 2012 114

16
Utilisation des fonctions statistiques Requêtes imbriquées (1)
• Donner la moyenne des prix HT et les prix min. et max. SELECT liste d’attributs recherchés
SELECT AVG (p (prix_ht),
), MIN (p
(prix_ht),
), MAX (p
(prix_ht)) FROM liste_des_relations
liste des relations
FROM Produit WHERE bloc SFW dans la condition
• Même chose mais par marque
SELECT AVG (prix_ht), MIN (prix_ht), MAX (prix_ht) Intérêt: indiquer qu'un attribut doit prendre
FROM Produit
P d i ses valeurs dans une liste de valeurs définies
par un autre bloc SWF
GROUP BY marque
• Même chose mais par marque si la moyenne > 10,5 • Itérations imbriquées
SELECT AVG (prix_ht),
(prix ht) MIN (prix_ht),
(prix ht) MAX (prix_ht)
(prix ht) • autre façon
ç de faire certaines formes de jointure
j
• Sous-requêtes indépendantes ou pas
FROM Produit
GROUP BY marque HAVING AVG (prix_ht) > 10.5
Philippe LAHIRE – Cours Base de Données L2I Cours 4 Janvier 2012 115 Philippe LAHIRE – Cours Base de Données L2I Cours 5 Janvier 2012 116

17
Requêtes imbriquées (2) Sous-requêtes indépendantes
Principaux connecteurs: = != > < IN EXISTS ANY ALL Quelles sont les références produit dont le prix HT est
supérieur
p au p
prix HT moyen
y des p produits ?
EXISTS R : retourne TRUE si R n’est pas vide, FALSE sinon
SELECT référence
t IN R : retourne TRUE si t appartient à R, FALSE sinon FROM Produit
WHERE Produit.prix_ht
Produit prix ht > (SELECT AVG(P.prix_ht)
AVG(P prix ht)
valeur comp ANY R : retourne TRUE si la comparaison avec au FROM Produit P);
moins un des tuples de R renvoie TRUE

valeur compp ALL R : retourne TRUE si la comparaison


p avec
tous les tuples de R renvoie TRUE L bl
Le bloc SFW iimbriqué
b i é peutt êt
être é
évalué
l é
séparément du bloc principal

Philippe LAHIRE – Cours Base de Données L2I Cours 5 Janvier 2012 117 Philippe LAHIRE – Cours Base de Données L2I Cours 5 Janvier 2012 118

18
Sous-requêtes indépendantes (1) Sous-requêtes indépendantes (2)
Quels sont les marques de produits vendus le 1/1/2007 ? Quelles sont les marques de produits qui n’ont pas le prix HT le plus élevé ?
SELECT marque
SELECT marque FROM Produit < SELECT max (P.prix_ht) …
FROM Produit, Vente WHERE Produit.prix-ht < ANY
WHERE Vente.ref-produit = Produit.reférence (SELECT P.prix-ht
AND date = 1/1/2007; FROM Produit P;)
ou
SELECT Produit.marque Jointure ou requête imbriquée Quelles sont les marques de produits qui ont le prix HT le plus
FROM Produit élevé ?
WHERE Produit.référence IN SELECT marque > SELECT max (P.prix_ht) …
(SELECT Vente.ref
Vente.ref-produit
produit FROM Produit
FROM Vente WHERE Produit.prix_ht >= ALL
WHERE date = 1/1/2007); (SELECT P.prix_ht FROM Produit P;)
Philippe LAHIRE – Cours Base de Données L2I Cours 5 Janvier 2012 119 Philippe LAHIRE – Cours Base de Données L2I Cours 5 Janvier 2012 120

19
Sous-requêtes corrélées (1) Sous-requêtes corrélées (2)

Quels produits dont le prix HT est supérieur au prix HT moyen des Quels sont les marques dont aucun produit n’a été vendu le
produits de la même marque ?
1/01/2007 ?
SELECT Produit.référence
FROM Produit SELECT Produit.marque
WHERE Produit.prix-ht > (SELECT AVG(P.prix-ht)
FROM Produit
FROM Produit P
WHERE NOT EXISTS
WHERE Produit.marque = P.marque);)
(SELECT Vente.ref-produit
FROM Vente, Produit P
Le bloc SFW principal et le bloc SFW imbriqué
WHERE Vente.ref-produit = P.référence and
doivent être évalués simultanément
P.marque = Produit.marque and
date = 1/01/2007;)

Philippe LAHIRE – Cours Base de Données L2I Cours 5 Janvier 2012 121 Philippe LAHIRE – Cours Base de Données L2I Cours 5 Janvier 2012 122

20
Opérateur Division (1) Opérateur Division
R1(a,b) ÷ R2(b) R1(a,b) ÷ R2(b) : Afficher les valeurs de R1.a pour lesquelles : il
n'existe pas de valeur de R2.b telle que (R1.a,R2.b) n'appartienne pas à R1
Afficher les valeurs de R1.a
R1 a pour lesquelles :
il n'existe pas de valeur de R2.b telle que : Département--Employé
Département Employé
(R1.a,R2.b) n'appartienne pas à R1 num-département … num- num-employé … … fonction
employé

Département Employé Donner le numéro du département, s'il existe, qui emploie tous les
numéro-département
p … responsable
p numéro-employé
p y département
p … fonction ingénieurs système.
SELECT distinct DE1.num-département
Donner le numéro du département, s'il existe, qui emploie tous les FROM Département-Employé DE1
ingénieurs système. (cas particulier: un employé ∈ un seul dept
dept.)
.) WHERE not exists
SELECT D.numéro-département (SELECT * FROM Employe E
FROM Département D WHERE E.fonction = 'Ingénieur
g Système'
y AND NOT EXISTS
WHERE not exists (SELECT * FROM Employe E (SELECT * FROM Département-Employé DE2
WHERE E.fonction = 'Ingénieur Système' WHERE DE1.num-département = DE2.num-département
AND E.département != D.numéro-département); AND DE2.num-employé = E.num-employé));
Philippe LAHIRE – Cours Base de Données L2I Cours 5 Janvier 2012 123 Philippe LAHIRE – Cours Base de Données L2I Cours 5 Janvier 2012 124

21
Opérateur Division Exercices
SELECT distinct département Donner le nom des employés qui ont le même salaire que Dupont
FROM EMPLOYE Employé
p y
WHERE fonction = 'Ingénieur Système‘; numéro-employé nom … salaire

GROUP BY département
HAVING count(numéro-employé) = SELECT Y.nom
((SELECT count(numéro-employé)
( p y ) FROM EMPLOYE E)) FROM Employé X , Employé Y
WHERE E.fonction = 'Ingénieur Système‘); WHERE
X.nom='Dupont'
SELECT * and Y.salaire = X.salaire
FROM EtudiantUE and X.nom != Y.nom;
GROUP BY etudiant
HAVING count(uniteValeur) = Remplacer la jointure par une requête imbriquée
(SELECT count(code) FROM UE);
Philippe LAHIRE – Cours Base de Données L2I Janvier 2012 125 Philippe LAHIRE – Cours Base de Données L2I Cours 5 Janvier 2012 126

22
Manipulation des structures de données Création/Suppression d’un schéma
• Schéma logique / Base de données CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
→ CREATE/DROP SCHEMA/DATABASE ... DROP DATABASE [IF EXISTS] db_name
db name
Pas de message
• Schéma de tables (relations) et de leur contenu • Dans la norme SQL: création de schéma d’erreur si la BD
→ CREATE/ALTER/DROP TABLE ... • MySQL: schema = database existe!
• Il faut avoir les droits de le faire (administrateur?)
• Création d’un compte s’il n’existe pas
• Définition des contraintes qui assurent des contrôles sur • Association des droits
l’intégrité des données
CREATE DATABASE lahire06-07
GRANT ALL PRIVILEGES DROP DATABASE lahire06-07
• Mais encore :
ON lahire06-07.* Attention !
– les index TO ' lahire06-07 '@localhost
– les utilsateurs et les privilèges IDENTIFIED BY ' lahire06-07 ';
Philippe LAHIRE – Cours Base de Données L2I Cours 5 Janvier 2012 127 Philippe LAHIRE – Cours Base de Données L2I Cours 5 Janvier 2012 128

23
Types de la norme ANSI Création et gestion des relations
INTEGER Entiers relatifs 4 octets
• Structures de données (relations, attributs, tuples)
SMALLINT Entiers relatifs 2 octets
relation table
BIGINT Entiers relatifs 8 octets
attribut column
FLOAT Flottants 4 octets
tuple row
DOUBLE Flottants 8 octets
REAL Flottants 4 ou 8 octets
• Instructions sur les relations
NUMERIC(N,D)/ DECIMAL(N,D) Décimaux à précision fixe N octets
CREATE TABLE créer
é une relation
l ti
CHAR(M) Chaînes de longueur fixe M octets
DROP TABLE supprimer une relation
VARCHAR(M) Chaînes de longueur variable au plus M octets
ALTER TABLE modifier la structure d'une relation
BIT VARYING Chaînes d'octets longueur de la chaîne
DATE date(hour, mois, an) 4 octets
TIME heure(h, mn, sh) 4 octets
DATETIME date et heure 8 octets
YEAR année 2 octets
Philippe LAHIRE – Cours Base de Données L2I Cours 5 Janvier 2012 129 Philippe LAHIRE – Cours Base de Données L2I Cours 5 Janvier 2012 130

24
Création de table/relation (1) Création de table (valeurs nulles, défaut)

CREATE TABLE Produit ( • NOT NULL : l’attribut correspondant doit toujours avoir une valeur
référence CHAR(4),
CHAR(4) nom VARCHAR(20) NOT NULL
nom VARCHAR(20), • DEFAULT : définir la valeur d' un attribut par défaut
marque VARCHAR(15), CREATE TABLE Vente ( adresse VARCHAR (30) DEFAULT ’Inconnue’
constructeur CHAR(20) numéro INT(10),
); ref-produit INT(10), CREATE TABLE Produit (
ref-client INT(10), référence CHAR(4) NOT NULL,
CREATE TABLE Client ( date DATE nom VARCHAR(20) NOT NULL,
numéro INT(10), ); marque VARCHAR(15),
nom VARCHAR(20),
constructeur CHAR(20) DEFAULT ‘Renault’
adresse VARCHAR(30),
);
téléphone CHAR(10)
); • Compléter la description
• Voir avec les types MySQL

Philippe LAHIRE – Cours Base de Données L2I Cours 5 Janvier 2012 131 Philippe LAHIRE – Cours Base de Données L2I Cours 5 Janvier 2012 132

25
Création de table (clé primaire) Création de table (unicité)
Identification des tuples Unicité des valeurs dans une colonne
PRIMARY KEY ((att)) UNIQUE ((nom, p
prenom))
PRIMARY KEY (att1, ..., attn) → Principalement pour les clés secondaires
→ mono attribut ou multi attributs CREATE TABLE Produit (
→ Attributs figurant dans une clé : déclaration NOT NULL référence CHAR(4) NOT NULL,
nom VARCHAR(20) NOT NULL,
marque VARCHAR(15),
CREATE TABLE Produit (
constructeur CHAR(20),
référence CHAR(4) NOT NULL,
PRIMARY KEY (référence),
nom VARCHAR(20) NOT NULL,
UNIQUE (nom)
marque VARCHAR(15),
);
constructeur CHAR(20) DEFAULT ‘Renault’
Renault ,
PRIMARY KEY (référence) NOT NULL non spécifié
); UNIQUE ne s’applique pas aux valeurs nulles

Philippe LAHIRE – Cours Base de Données L2I Cours 5 Janvier 2012 133 Philippe LAHIRE – Cours Base de Données L2I Cours 5 Janvier 2012 134

26
Création de table (clé étrangère) Gestion de l’intégrité référentielle
FOREIGN KEY (att) REFERENCES ... Vérification, si insertion, suppression, mise à jour …
FOREIGN KEY (att1, ..., attn) REFERENCES ...
Les valeurs prises par la clé étrangère correspondent-elles
correspondent elles à la clé?
FOREIGN KEY(ref-produit) REFERENCES Produit Action par défaut : rejet de l'opération
→ ref
ref--produit référence la clé primaire de la table Produit
Autres actions si celle par défaut ne convient pas
• ON UPDATE (en cas de mise à jour)
CREATE TABLE Vente ( • ON DELETE ((en cas de suppression)
pp )
numéro INT(10) NOT NULL,
ref-produit INT(10) NOT NULL,
ref-client INT(10) NOT NULL,
Objectif: faire respecter la contrainte
date DATE, – SET NULL clé étrangère mise à NULL
PRIMARY KEY ((numéro), ) – CASCADE application
pp de la même opération
p
FOREIGN KEY (ref-produit) REFERENCES Produit,
– SET DEFAULT valeur par défaut pour la clé
FOREIGN KEY (ref-client) REFERENCES Client
);
étrangère
Philippe LAHIRE – Cours Base de Données L2I Cours 5 Janvier 2012 135 Philippe LAHIRE – Cours Base de Données L2I Cours 5 Janvier 2012 136

27
Intégrité référentielle (exemple) Mise à jour d’un schéma de BD
CREATE TABLE Vente ( • Suppression d'une relation
numéro INT(10) NOT NULL,
NULL DROP TABLE nom de relation ;
ref-produit INT(10) NOT NULL,
ref-client INT(10) NOT NULL,
date DATE, • Modification d'une table
PRIMARY KEY (numéro), ALTER TABLE nom de_relation ACTION description
FOREIGN KEY (ref-produit) REFERENCES Produit
ON DELETE SET NULL ON UPDATE CASCADE,
FOREIGN KEY (ref-client) REFERENCES Client ADD, MODIFY, ALTER, DROP, RENAME
ON DELETE SET NULL ON UPDATE CASCADE
description commande
);
• Si suppression dans Produit : ref-
ref-produit = NULL Mais aussi :
ALTER TABLE Vente TYPE = innodb
• Si mise à jour dans Produit : ref-
ref-produit = mise à jour

Philippe LAHIRE – Cours Base de Données L2I Cours 5 Janvier 2012 137 Philippe LAHIRE – Cours Base de Données L2I Cours 5 Janvier 2012 138

28
Modification d’une table (structure) Mises à jour des données
ALTER TABLE Produit MODIFY nom VARCHAR(25);
• INSERT INTO
ALTER TABLE Produit
P d it ADD quantité-stock
tité t k VARCHAR(20);
VARCHAR(20) pour insérer
i é d
des tuple
t l

ALTER TABLE Client ALTER adresse SET DEFAULT ’NICE’;


• DELETE FROM
ALTER TABLE Client DROP adresse; pour supprimer des tuples
ALTER TABLE Client
ADD CONSTRAINT CT_UN UNIQUE (nom) ;
• UPDATE
ALTER TABLE Client pour mettre à jour des tuples
ADD CONSTRAINT CT_PR
CT PR PRIMARY KEY (numéro) ;

ALTER TABLE Vente ADD CONSTRAINT CT_ET


FOREIGN KEY (ref-client) REFERENCES Client ;
Philippe LAHIRE – Cours Base de Données L2I Cours 5 Janvier 2012 139 Philippe LAHIRE – Cours Base de Données L2I Cours 5 Janvier 2012 140

29
Insertion de tuples (1) Insertion de tuples (2)
Insertion avec désignation explicite des colonnes Insertion à partir d’une autre table

INSERT INTO Produit (nom, marque, constructeur) INSERT INTO Produit (nom, marque, constructeur)
VALUES ('mercedes 300 SL', 'mercedes benz', SELECT P.nom, P.marque, p.constructeur
'daimler'); FROM OldProduit P
WHERE P.marque = ‘Peugeot’
Insertion dans l’ordre des colonnes

INSERT INTO Produit Evolution du schéma relationnel


VALUES (DEFAULT, 'mercedes 300 SL', 'mercedes
benz', 'daimler');
Philippe LAHIRE – Cours Base de Données L2I Cours 5 Janvier 2012 141 Philippe LAHIRE – Cours Base de Données L2I Cours 5 Janvier 2012 142

30
Suppression de tuples Modification des tuples
Suppression de tous les tuples
DELETE FROM Produit UPDATE Produit
Modification d’un
d un tuple
SET nom = 'mercedes 300 SLK'
ou
WHERE numero =3;
DELETE FROM Produit WHERE 1 > 0 (retourne le nombre)

Suppression
Supp ess o conditionnelle
co d t o e e
UPDATE Produit
P d it
DELETE FROM Produit SET prix-ht = prix-ht * 0,9
WHERE marque = ‘peugeot’ WHERE référence NOT IN Modification d’une
(SELECT ref-produit collection de tuple
FROM VENTE
DELETE FROM VENTE WHERE ref ref-produit
produit IN
WHERE quantité > 10);
(SELECT référence
FROM Produit
WHERE Produit.marque = ‘peugeot') ;
Philippe LAHIRE – Cours Base de Données L2I Cours 5 Janvier 2012 143 Philippe LAHIRE – Cours Base de Données L2I Cours 5 Janvier 2012 144

31
Compléments: Définition de vues Compléments: Création de contraintes
Une vue est une table virtuelle dérivée de tables
de base : CREATE ASSERTION
• On stocke seulement la définition de vue CHECK pour dé
décrire
i des
d contraintes
i générales
é é l
• Son contenu est généré dynamiquement
CREATE ASSERTION QuantiteVendue
CREATE VIEW ProduitPhare CREATE VIEW VenteInfo CHECK NOT EXISTS (
AS (référence, date, marque)
SELECT V.quantité
V quantité
SELECT * AS
FROM Vente V, Produit P SELECT P.référence, V.date, FROM Vente V, Produit P
WHERE P.marque WHERE
V.ref-produit = P.référence FROM Vente V, Produit P V.ref-produit = P.référence AND
AND V.quantité
q > 100 ; WHERE P.référence =V.ref-produit;
p P.quantité-vendue
P.quantité vendue < V.quantité);
Evolution du schéma relationnel On suppose que la table Produit
Requêtes fréquentes DROP VIEW VenteInfo contient la colonne quantité-vendue
Philippe LAHIRE – Cours Base de Données L2I Cours 5 Janvier 2012 145 Philippe LAHIRE – Cours Base de Données L2I Cours 5 Janvier 2012 146

32
Compléments: Création d’index Compléments: Transactions

Enlever la validation implicite:


CREATE INDEX
SET AUTOCOMMIT=0 ;
Un index offre un chemin d’accès aux lignes d’une table
Déclencher une transaction et terminer par valider/annuler
CREATE INDEX index1 ON Client(nom,prenom);
START TRANSACTION;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
un index est systématiquement défini sur la clé primaire de
UPDATE ttable2
bl 2 SET summary=@A@A WHERE ttype=1; 1
chaque table
COMMIT; ou ROLLBACK;
pour chaque clause UNIQUE utilisée dans la création de la
table, un index permet de vérifier rapidement, au moment
d’une
d une insertion
insertion, que la clé n’existe
n existe pas déjà Un mécanisme complexe
p et sophistiqué
p q

Philippe LAHIRE – Cours Base de Données L2I Cours 5 Janvier 2012 147 Philippe LAHIRE – Cours Base de Données L2I Cours 5 Janvier 2012 148

33
Compléments: Gestion des privilèges
SHOW DATABASES ;
SHOW PRIVILEGES ;
GRANT privilèges ON … TO …
REVOKE privilèges ON … FROM …

ALL [PRIVILEGES] Tous les droits sauf WITH GRANT OPTION


ALTER Autorise l'utilisation de ALTER TABLE
CREATE Autorise l'utilisation de CREATE TABLE
DELETE Autorise l'utilisation de DELETE
DROP Autorise l'utilisation de DROP TABLE
… …

Philippe LAHIRE – Cours Base de Données L2I Cours 5 Janvier 2012 149

34