Seance2 S3 ENI-ABT-1
Seance2 S3 ENI-ABT-1
Seance2 S3 ENI-ABT-1
bases de données
SQL
seance2
Chargé de cours
Dr Yacouba Goita
23.12.2016 1
Objectifs d’apprentissage
23.12.2016 2
Plan
Introduction
DDL: Data Definition Language
DML: Data Manipulation Language
DCL : Data Control Language
23.12.2016 3
Introduction
L’algèbre relationnelle permettait de
définir théoriquement les requêtes.
Pour exprimer les requêtes théoriques
dans un SGBD, on utilise une forme de
langage de requête structuré appelée
Structured Query Language ou SQL.
SQL est le plus répandu des langages
de requête de bases de données en
usage aujourd’hui.
23.12.2016 4
Introduction
23.12.2016 5
Trois langages
SQL est composé des 3 langages suivants:
23.12.2016 6
Trois langages
DCL (Data Control Language): Composant
fournissant la sécurité interne de la base de
données. Par exemple: usagers, mot de passe,
permissions.
23.12.2016 7
SQL
SQL a été développé par IBM à San Jose, Californie.
La version courante de SQL est appelée SQL-92
(due à l’année de normalisation).
Toutefois, les produits commerciaux qui supportent
SQL utilisent en partie SQL-92 et offrent même des
fonctionnalités de plus.
SQL est un langage non-procédural, ce qui signifie
que les expressions SQL stipulent ce qui doit être fait
et non comment cela doit être fait.
23.12.2016 8
SQL
Notes:
On peut insérer des sauts de lignes dans une instruction SQL à
n’importe quel endroit, ce qui est pratique pour augmenter la
lisibilité.
23.12.2016 9
Plan
Introduction
DDL: Data Definition Language
DML: Data Manipulation Language
23.12.2016 10
DDL
Les instructions pour la définition des données sont:
CREATE TABLE
ALTER TABLE
DROP TABLE
CREATE INDEX
23.12.2016 12
Create Table
Création simple d’une table:
CREATE TABLE nom_table
(nom_col1 TYPE1,
nom_col2 TYPE2,
...)
23.12.2016 13
Contraintes de Create
Table
Plusieurs contraintes peuvent être définies sur les champs de la
table.
Les contraintes sont:
PRIMARY KEY: Désigner une clé primaire
REFERENCES: Désigner une clé étrangère, établissant une
relation entre 2 tables
UNIQUE: Chaque ligne de la table doit avoir une valeur
différente ou NULL pour cette (ou ces) colonne(s).
NOT NULL: Interdire les valeurs NULL
CHECK: Restreindre les valeurs autorisées à une plage
spécifiée.
23.12.2016 14
Contraintes de Create
Table
Il y a 2 types de clauses de contraintes dans
une instruction CREATE TABLE:
23.12.2016 15
Contraintes de colonne
unique
Contrainte de colonne unique
23.12.2016 16
Contraintes de colonne
unique
Nous définirons la clé primaire de EDITEURS et
spécifier que PubNom ne peut avoir une valeur
nulle.
23.12.2016 18
Contraintes multi-colonnes
Contrainte multi-colonne
Les contraintes multi-colonne servent lorsque
plusieurs colonnes sont en jeu dans la contrainte.
Clé primaire double, clé étrangère double, etc.
CONSTRAINT Nom
[CHECK(expressionDeContrainte)| PRIMARY KEY
(NomColonne,...) |
UNIQUE(NomColonne,...) |
FOREIGN KEY (ColonneReference,...)
REFERENCES
TableReference[(ColonneReference,...)]]
23.12.2016 19
Contraintes multi-colonnes
exemple:
Création du schéma de table Personne où chaque
personne est identifiée par son nom et prénom (par
exemple)
Définition de colonne
DefinitionColonne ::= NomColonne
TypeDonnee[(taille)]
[ContrainteColonneSimple]
23.12.2016 21
Contraintes
Note:
23.12.2016 22
Contraintes
Note:
Pour garantir l’intégrité référentielle, il faut spécifier ce qu’il
faudrait faire en modifiant ou supprimant une table parente.
23.12.2016 23
Contraintes
CONSTRAINT NomIndex FOREIGN KEY (PubID)
REFERENCES EDITEURS (PubID) ON UPDATE CASCADE
23.12.2016 24
Alter Table
ALTER TABLE
Avec cette commande on peut:
Ajouter une nouvelle colonne
Par exemple:
ALTER TABLE Livre ADD COLUMN prixCoutant CURRENCY;
23.12.2016 25
Alter Table
ALTER TABLE
La syntaxe
ALTER TABLE
NomTable
ADD COLUMN NomColonne Type[(grandeur)][contrainte]|
DROP COLUMN NomColonne |
ADD CONSTRAINT ContrainteMultiColonne
DROP CONSTRAINT ContrainteMultiColonne
23.12.2016 26
Drop
DROP
Permet d'effacer une table ou un index ou même
une BD
ex: DROP TABLE Livre;
La syntaxe
DROP TABLE NomTable | DROP INDEX NomIndex
ON NomTable
23.12.2016 27
Plan
Introduction
DDL: Data Definition Language
DML: Data Manipulation Language
23.12.2016 28
SQL DML
Langage de manipulation de données (DML)
SELECT
UNION
UPDATE
DELETE
INSERT INTO
SELECT INTO
23.12.2016 29
Select
L'instruction SELECT
Permet de lire les informations contenues dans la
base de données.
Par exemple:
SELECT * FROM livre WHERE prix > 10.
Cette instruction permet de fournir tous les tuples de
la table livre dont le prix est supérieur à 10.
23.12.2016 30
Select
L'instruction SELECT
Sa syntaxe est :
23.12.2016 31
Select
Prédicat
Sera vu un peu plus loin
Colonne
La colonne ou combinaisons de colonnes à retourner.
opérateurs;
On peut répéter Colonne autant de fois que l'on veut.
23.12.2016 32
Select
Lorsque 2 colonnes retournées (de différentes
tables) ont le même nom, il est nécessaire d'ajouter
le nom de la table devant le nom de la colonne
séparé par un point;
Par exemple:
On ne peut écrire:
SELECT titre, pubID, pubID FROM livre, Editeur
Par exemple
23.12.2016 34
Select
La clause FROM ExpressionTable
23.12.2016 35
Select
Par exemple:
23.12.2016 36
Select
23.12.2016 38
SQL jointure
Clause de jointure
Produit cartésien
Le résultat renvoie toutes les lignes possibles des tables
sélectionnées (livre x Editeur)
SELECT titre, pubID, pubID FROM livre, Editeur
23.12.2016 39
SQL jointure
Jointure interne(naturelle et Thêta)
La syntaxe d'une clause de jointure interne est la
suivante:
Select colonne,….
From Table1, Table2
WHERE Table1.Colonne1 = Table2.Colonne1
[{AND|OR condition jointure thêta...]
23.12.2016 40
SQL/alg. jointure
client |x| compte = (Client.nom =Compte.nom( client x compte))
Select *
From client, compte
Where client.nom = compte.nom
23.12.2016 41
SQL jointure
Jointure externe
Pour exprimer la jointure externe, il faut placer un (+) au niveau
du champs où la jointure externe serait appliquée.
23.12.2016 42
SQL jointure
Editeur –oq Livre
Select *
From Editeur, Livre
Where Editeur.NoE = Livre.NoE (+)
23.12.2016 43
SQL
Langage de manipulation de données (DML) (suite)
SELECT (suite)
UNION
INTERSECT
EXCEPT (MINUS)
UPDATE
DELETE
INSERT INTO
SELECT INTO
Les sous-requêtes
VIEW
23.12.2016 44
SELECT
Rappel SELECT
SELECT [prédicat]DescriptionColonne,...
FROM ExpressionTable
[WHERE Condition]
[GROUP BY CritèreGroupe]
[HAVING Condition]
[ORDER BY CritèreOrdre]
23.12.2016 45
SELECT (prédicat)
SELECT
SELECT [prédicat]DescriptionColonne,...
Il nous permet de faire des choix quant aux lignes
identiques qui seraient retournées par la requête.
On peut utiliser les prédicats suivants: ALL,
DISTINCT.
ALL (par défaut) retourne toutes les lignes lues sans
exception.
DISTINCT ne retourne que les lignes lues qui sont
différentes. S'il y a des lignes pareilles, seule la première
apparaîtra.
23.12.2016 46
SELECT (prédicat)
Par exemple:
SELECT EDITEURS.PubNom
FROM EDITEURS, LIVRES WHERE
EDITEURS.PubID = LIVRES.PubID;
ici, puisque qu'un éditeurs a plusieurs livres, son
nom apparaîtra plusieurs fois.
SELECT DISTINCT PubNom
FROM EDITEURS, LIVRES WHERE
EDITEURS.PubID = LIVRES.PubID;
Ici, même si l'éditeurs a plusieurs livres, son nom
n'apparaîtra qu'une fois.
23.12.2016 47
EXEMPLE
Sans distinct
Avec distinct
Table Editeurs
PubNom
Big House
Big House
Big House PubNom
PubID PubNom PubPhone Pays Big House
Small House
Small House
Small House
Small House
23.12.2016 48
SELECT (GROUP BY)
Company Amount
W3Schools 5500
IBM 4500
W3Schools 7100
W3Schools 12600
IBM 4500
23.12.2016 49
SELECT (HAVING)
Clause HAVING CritereGroupe
La clause HAVING est le filtrage des
groupes de l'algèbre.
La clause HAVING a ete introduite car le
WHERE ne peut pas être utilisé avec les
fonctions d’agrégation comme SUM.
Sans HAVING, il ne serait pas possible de
tester les conditions portant sur le résultat
d’une fonction
23.12.2016 50
SELECT (HAVING)
La clause HAVING n'affecte que les valeurs qui
sont affichées
La clause HAVING ne s'applique qu'après le
regroupement.
Le critère du WHERE s'applique sur un champ (et
non sur une agrégation)
Le critère HAVING s'applique sur un champ
regroupé (inclus dans la clause GROUP BY) ou
un champ agrégé (inclus dans une fonction
d'agrégation).
23.12.2016 51
EXEMPLE
Par exemple:
SELECT Editeurs.Pubnom, AVG(Prix) AS PrixMoyen
FROM Editeurs, Livres WHERE Editeurs.PubID =
Livres.PubID
GROUP BY Editeurs.PubNom HAVING AVG(Prix) < 25.00;
Ici, la requête demande le nom des éditeurs et le prix
minimum des livres de ces éditeurs dont le prix moyen
est inférieur à 25.00$.
23.12.2016 52
EXEMPLE
SELECT Editeurs.Pubnom, AVG(Prix) AS PrixMoyen
FROM Editeurs, Livres WHERE Editeurs.PubID =
Livres.PubID AND Prix < 25.00 GROUP BY
Editeurs.PubNom;
Ici, la requête demande le nom des éditeurs et le
prix minimum des livres de ces éditeurs dont le
prix est inférieur à 25.00$.
Notez qu'on ne peut utiliser l'alias PrixMoyen dans
le HAVING
23.12.2016 53
EXEMPLE
La requête sans Pubnom PrixMoyen
critère
Big House 23,3333333
Medium
House 31,6666667
Small House 20
23.12.2016 54
Exemple
Company Amount
W3Schools 5500
IBM 4500
W3Schools 7100
W3Schools 12600
23.12.2016 55
SELECT (ORDER BY)
Company OrderNumber
Sega 3412
ABC Shop 5678
W3Schools 2312
W3Schools 6798
23.12.2016 56
SELECT (ORDER BY)
Company OrderNumber
W3Schools 2312
W3Schools 6798
Sega 3412
ABC Shop 5678
23.12.2016 57
UNION
L'Opération UNION
L'opération UNION est utilisée pour créer l'union de 2 ou
plusieurs tables. La syntaxe est:
Requete {UNION [ALL] Requete},...
Où Requete est soit une instruction SELECT ou le nom
d'une requête stockée (sera vue au prochain cours).
Par défaut, les doublons sont triés entre les deux requêtes et
n'apparaisse qu'une seule fois.
L'option ALL force à inclure tous les enregistrements et
donc de voir les doublons.
ALL améliore les performances car il n'y a pas de tri de
doublon.
23.12.2016 58
UNION
Par exemple
SELECT * FROM Livres
UNION ALL
SELECT * FROM NewLivres WHERE Prix > 25.00
ORDER BY Titre;
Notes
Toutes les requêtes dans une opération UNION doivent
retourner le même nombre de champs.
Les colonnes sont combinées dans l'union selon leur ordre
dans la clause de requêtes et non par leur nom
23.12.2016 59
EXEMPLE Résultats de l'union
ISBN Titre PubID Prix ISBN Titre PubID Prix
0-103-45678-9 Iliad 1 25,00 1-56592-297-2 Access Database 3 30
0-11-345678-9 Moby Dick 3 49,00 0-321-32132-1 Balloon 3 34
Table Livres 0-12-333433-3 On Liberty 1 25,00 1-1111-1111-1 C++ 1 30
0-123-45678-0 Ulysses 2 34,00 0-99-999999-9 Emma 1 20
0-12-345678-9 Jane Eyre 3 49,00 0-91-335678-7 Fairie Queene 1 15
0-321-32132-1 Balloon 3 34,00
0-91-045678-5 Hamlet 3 20
0-55-123456-9 Main Street 3 25,00
0-103-45678-9 Iliad 1 25
0-555-55555-9 MacBeth 2 12,00
0-12-345678-9 Jane Eyre 3 49
0-91-045678-5 Hamlet 3 20,00
0-91-335678-7 Fairie Queene 1 15,00
0-12-335671-9 John Bull 3 39
0-99-777777-7 King Lear 2 49,00 0-99-777777-7 King Lear 2 49
0-99-999999-9 Emma 1 20,00 0-555-55555-9 MacBeth 2 12
1-1111-1111-1 C++ 1 30,00 0-55-123456-9 Main Street 3 25
1-22-233700-0 Visual Basic 1 25,00 0-11-345678-9 Moby Dick 3 49
1-56592-297-2 Access Database 3 30,00 0-12-333433-3 On Liberty 1 25
0-11-354678-9 Paris 3 29
ISBN Titre PubID Prix 0-123-45678-0 Ulysses 2 34
0-103-45258-9 Corba 1 25,00 1-22-233700-0 Visual Basic 1 25
0-11-354678-9 Paris 3 29,00
0-12-333883-3 SQL 1 15,00 Table
0-12-335671-9 John Bull 3 39,00 newLivres
23.12.2016 60
UNION
AS peut être utilisé dans la première instruction SELECT pour
modifier les noms de colonnes retournées.
Dans un UNION, on ne peut appliquer un ORDER BY pour chaque
requête. Le ORDER BY doit être appliquer au deux requêtes en
même temps.
La clause ORDER BY est utilisée à la fin de la dernière requête
pour ordonner les données retournées des deux requêtes. Elle
utilise toutefois les noms de colonnes de la première requête.
GROUP BY et HAVING peuvent être utilisés dans chaque partie.
UNION ne fait pas partie de SQL-92 mais est aussi présent dans
Oracle et d'autres SGBD.
23.12.2016 61
Intersect
Syntaxe
SELECT ...
INTERSECT
SELECT ...
Exemple:
23.12.2016 62
EXCEPT (MINUS)
Pour exprimer la difference en SQL standard:
SELECT ...
EXCEPT
SELECT ...
Exemple:
23.12.2016 63
UPDATE
L'instruction UPDATE
L'instruction UPDATE est utilisée pour mettre à
jour les données dans une ou plusieurs tables. La
syntaxe est:
UPDATE NomTable
SET NouvelleValeur,...
WHERE Critères;
Par exemple:
UPDATE Livres
SET Livres.Prix = Livres.Prix + 1.00
WHERE Livres.Prix < 25.00
Cette requête augmente de 1$ le prix des livres dont le
prix est inférieur à 25$.
23.12.2016 64
DELETE
L'instruction DELETE
DELETE est utilisée pour supprimer des lignes d'une table.
La syntaxe est:
DELETE
FROM NomTable
WHERE Critère
L'action de l'instruction DELETE est irréversible! Donc faire
attention.
Un exemple:
DELETE
FROM LIVRES
WHERE PubID="3";
23.12.2016 65
INSERT INTO
L'instruction INSERT INTO
INSERT INTO est conçue pour insérer de nouvelles lignes
dans une table. La syntaxe est:
INSERT INTO Cible[(NomChamp,...)]
VALUES(Valeur1,...)
Où Cible est le nom de la table dans laquelle on veut insérer
des données.
Si on ne spécifie pas de NomChamp alors il faut mettre des
valeurs pour tous les champs de la table.
L'instruction suivante ajoute une ligne à la table LIVRES:
INSERT INTO LIVRES
VALUES("1-000-00000-0","SQL",1,25.00);
23.12.2016 66
INSERT INTO
L'instruction suivante ajoute une ligne à la table LIVRES.
Toutefois, les colonnes Prix et PubID auront des valeurs
NULL:
INSERT INTO LIVRES(ISBN,Titre)
VALUES("1-111-11111-1","Partie pêché");
Pour insérer plusieurs lignes, on utilise cette syntaxe:
INSERT INTO Cible[(NomChamp,...)]
SELECT NomChamp,...
FROM ExpressionTable
Si Cible est le nom de la table où l'on veut insérer,
ExpressionTable est le nom de la table d'où on veut prendre
les données pour les insérer dans Cible.
23.12.2016 67
INSERT INTO
Supposons que NewLivres est une table de 3 champs:
ISBN, PubID, et Prix.
L'instruction suivante insère des lignes de LIVRES dans
NewLivres. Elle insère uniquement les livres dont Prix >
20.00$.
INSERT INTO NewLivres
SELECT ISBN, PubID, Prix
FROM Livres
WHERE Prix > 20;
23.12.2016 68
SELECT INTO
L'instruction SELECT ... INTO
L'instruction SELECT... INTO crée une nouvelle table et
insère des données d'autres tables. La syntaxe est:
SELECT NomChamp,...
INTO NomNouvelleTable
FROM Source
WHERE Condition
ORDER BY ConditionOrdre
NomChamp est le nom du champ à copier dans la nouvelle
table.
Source est le nom de la table d'où provienne les données.
On peut mettre aussi une requête ou une jointure.
23.12.2016 69
SELECT INTO
Par exemple, l'instruction suivante crée une
nouvelle table appelée LivresChers ET INCLUT
LES LIVRES DE LA TABLE livres qui valent plus
de 45.00$:
SELECT Titre, ISBN
INTO LivresChers
FROM Livres
WHERE Prix > 45
ORDER BY Titre;
23.12.2016 70
SOUS-REQUETES
Requêtes secondaires
SQL permet l'utilisation d'instructions SELECT au sein des
instructions suivantes:
Autres instructions SELECT
Instructions INSERT...INTO
Instructions DELETE
Instructions UPDATE
23.12.2016 71
SOUS-REQUETES
Par exemple, voici une requête de sélection simple:
SELECT * FROM Livres
WHERE prix < 25
On peut ici remplacer le table Livres par une sous-requête
SELECT * FROM (SELECT livres.* FROM Livres, Editeurs
WHERE Livres.PubID=Editeurs.PubId AND PubNom="alpha")
WHERE prix < 25
Il s'agit ici d'une projection d'une projection.
La sous-requête est d'abord effectuée et on y trouve les livres
dont le nom de l'éditeur est "alpha"
Ensuite, de cette sous-requête est extrait les livres dont le prix
est inférieur à 25.
23.12.2016 72
SOUS-REQUETES
Dans une clause WHERE, la syntaxe d'une requête
secondaire prend trois formes possibles:
Syntaxe 1
Comparaison (RequeteSQL)
où Comparaison est une expression suivie par une
relation de comparaison qui compare l'expression avec
la valeur retournée par la requête secondaire.
Par exemple, l'instruction suivante retourne tous les titres et
prix de livres de la table LIVRES, dont les prix sont
supérieurs aux prix maximum des livres de la table
LIVRES2:
SELECT Titre, Prix FROM Livres
WHERE Prix > (SELECT Max(Prix) FROM Livres2)
23.12.2016 73
SOUS-REQUETES
Syntaxe 2
Expression [NOT] IN (RequeteSQL)
Cette syntaxe est utilisée pour consulter une valeur de colonne
dans la table résultat d'une autre requête.
Par exemple, la déclaration suivante retourne tous les titres de
la table LIVRES qui n'apparaissent pas dans la table Livres2:
SELECT Titre FROM Livres
WHERE Titre NOT IN (SELECT Titre FROM Livres2);
Syntaxe 3
[NOT] EXISTS (RequeteSQL)
Cette syntaxe est utilisée pour vérifier si un item existe (si
retourné) dans la requête secondaire.
23.12.2016 74
SOUS-REQUETES
Par exemple, l'instruction suivante sélectionne tous les
éditeurs qui n'ont pas de livres dans la table LIVRES:
SELECT PubNom FROM Editeurs WHERE NOT EXISTS
(SELECT * FROM Livres WHERE Livres.PubID =
Editeurs.PubID);
Notes:
Avec les syntaxes 1 ou 3, la requête secondaire doit
retourner une seule colonne sinon il y a erreur.
L'instruction SELECT d'une requête secondaire obéit au
même format et aux mêmes règles que toute instruction
SELECT. Toutefois, elle doit être placée entre
parenthèse.
23.12.2016 75
Differences entre les
SGBDs
Paradox Access Sybase SQL Server Oracle
GROUP BY oui oui oui oui oui
HAVING oui oui oui oui oui
UNION oui oui oui oui oui
INTERSECT non non non non oui
EXCEPT non non non non MINUS
23.12.2016 76
Syntaxe 2: difference et
intersection
Avec la syntaxe 2, on peut définir
l’intersection et la différence (vues en
algèbre)
Intersection Table1 table2 :
SELECT attribut1, attribut2, ... FROM table1
WHERE attribut1 IN (SELECT attribut1 FROM
table2) ;
SELECT n°enseignant, NomEnseignant FROM
E1
WHERE n°enseignant IN (SELECT n°enseignant
FROM E2) ;
23.12.2016 77
Syntaxe 2: difference et
intersection
Difference Table1-Table2:
SELECT attribut1, attribut2, ... FROM
table1
WHERE attribut1 NOT IN (SELECT
attribut1 FROM table2) ;
SELECT n°enseignant, NomEnseignant
FROM E1
WHERE n°enseignant NOT IN
(SELECT n°enseignant FROM E2) ;
23.12.2016 78
Les vues
Les vues permettent d'assurer l'objectif
d'indépendance logique. Grâce à elles,
chaque utilisateur pourra avoir sa vision
propre des données.
Les utilisateurs pourront consulter la base, ou
modifier la base (avec certaines restrictions)
à travers la vue, c'est-à-dire manipuler la
table résultat du SELECT comme si c'était
une table réelle.
23.12.2016 79
Les vues
Syntaxe:
CREATE VIEW nom_vue [(nom_col1,...)]
AS SELECT ... [WITH CHECK OPTION] ;
Une fois créée, une vue s'utilise comme
une table. Il n'y a pas de duplication des
informations mais stockage de la définition
de la vue.
23.12.2016 80
Les vues
Exemple:
CREATE VIEW emp10 AS SELECT * FROM
emp WHERE n_dept = 10 ;
si la vue emp10 a été créée avec CHECK
OPTION on ne pourra à travers cette vue
ni modifier, ni insérer des employés ne
faisant pas partie du département 10
23.12.2016 81
Les vues
Il est possible d'effectuer des INSERT et des
UPDATE à travers des vues, sous deux
conditions :
le SELECT définissant la vue ne doit pas
comporter de jointure,
les colonnes résultats du SELECT doivent être
des colonnes réelles et non pas des expressions.
Exemple : Modification des salaires du
département 10 à travers la vue emp10.
UPDATE emp10 SET sal = sal *1.1;
23.12.2016 82
23.12.2016 83