presentation base de donnees
TRANSCRIPT
-
7/25/2019 presentation base de donnees
1/42
SIGL460Bases de donnes avances
Chapitre 5Langage SQL
1
Serge Mani, ing. PhD, CISA, CISM
Universit de Yaound 1
Facult des Sciences
Dpartement dinformatique
-
7/25/2019 presentation base de donnees
2/42
Plan du cours
Introduction Dfinition des donnes
Accs aux donnes
Manipulation des donnes
SQL intgr
2
-
7/25/2019 presentation base de donnees
3/42
Introduction
SQL permet de retrouver et de manipuler les donnes
sans prciser les dtails
Driv de SEQUEL 2 (76), lui-mme driv de
SQUARE (75)
Propos par IBM (82 puis 87)
Premire version normalise SQL1 (ISO89)
Deuxime version normalise SQL2 (ISO92)
SQL3 en cours de normalisation Sert de couche basse aux L4G (par exemple Access)
3
-
7/25/2019 presentation base de donnees
4/42
Dfinition des donnes
Domaine Dfinition de domaines peu utilise
Dfinition partir des types de bases
4
-
7/25/2019 presentation base de donnees
5/42
Dfinition des donnes
Domaine
Exemple
CREATE DOMAIN COULEUR CHAR(6) DEFAULT vertCONSTRAINT VALIDE_COULEUR
CHECK (VALUE IN rouge, blanc, vert, bleu, noir)
Modification de la dfinition (ALTER DOMAIN) Destruction dun domaine
DROP DOMAIN domaine [RESTRICT | CASCADE]
5
-
7/25/2019 presentation base de donnees
6/42
Dfinition des donnes
Table
Cration d une table (forme simple)
Exemple
CREATE TABLE VIN (
NV NUMBER,
CRU CHAR(10),
MIL NUMBER)
Contraintes d intgrit NOT NULL
UNIQUE ou PRIMARY KEY
FOREIGN KEY
REFERENCES CHECK
6
-
7/25/2019 presentation base de donnees
7/42
Dfinition des donnes
Table Avec contraintes dintgrit
Exemple (SQL 86)
CREATE TABLE COMMANDE (
NC NUMBER UNIQUE NOT NULL,
NV NUMBER NOT NULL
QUANTITE NUMBER(6))
Exemple (SQL 89)
CREATE TABLE COMMANDE (
NC NUMBER PRIMARY KEY,
NV NUMBER NOT NULL REFERENCES VIN,
QUANTITE NUMBER(6) CHECK(QUANTITE > 0))
-------------------------------------------------------------------------------
NC NUMBER,
PRIMARY KEY (NC),
NV NUMBER NOT NULL,FOREIGN KEY (NV) REFERENCES VIN,
7
SQL92
-
7/25/2019 presentation base de donnees
8/42
Dfinition des donnes
Table Modification du schma dune table
ALTER TABLE
ADD COLUMN , , Exemple
ALTER TABLE COMMANDE
ADD COLUMN DATE_COM DATE
Suppression d une table
DROP TABLE
Exemple
DROP TABLE COMMANDE
8
-
7/25/2019 presentation base de donnees
9/42
Accs aux donnes
Clause SELECT
Forme
SELECT [ ALL | DISTINCT ] { | *}
Clause FROM
Forme
FROM
ExempleEmploye (mat#, nom, adresse, dept, sup)
Projet (num#, designation, budget)
Departement (dept#, dir, appellation)
Role (nume#, nump#, role_emp) 9
-
7/25/2019 presentation base de donnees
10/42
Accs aux donnes
Exemple
Donner les noms et adresses des employs
SELECT nom, adresse
FROM Employe
Donner la liste des projets
SELECT *
FROM Projet
Donner les noms et les dpartements des
employs
SELECT nom, appellation
FROM Employe, Departement 10
-
7/25/2019 presentation base de donnees
11/42
Accs aux donnes
Clause WHERE Forme
WHERE
Exemple Donner les noms et adresses des employs qui travaillent au DI
SELECT nom, adresse
FROM Employe, Departement
WHERE appellation = DI Donner les noms des employs responsables de projets
SELECT nom
FROM Employe e, Role r
WHERE e.mat = r.nume
AND role_emp = responsable 11
-
7/25/2019 presentation base de donnees
12/42
Accs aux donnes
Fonctions de calcul COUNT, SUM, AVG, MAX, MIN
Exemple Donner le nombre d employs qui travaillent au DI
SELECT COUNT (*)
FROM Employe, Departement
WHERE appellation = DI
Donner le budget total des projets sous la responsabilit de
lemploy numro 35677
SELECT SUM (budget)
FROM Role r, Projet p
WHERE p.num = r.nump
AND role_emp = responsable
AND nume = 3567712
-
7/25/2019 presentation base de donnees
13/42
Accs aux donnes
Forme de conditions IN (NOT IN), Donner la liste des directeurs de
dpartements
SELECT *
FROM Employe
WHERE mat IN
(SELECT dir
FROM Departement)
13
-
7/25/2019 presentation base de donnees
14/42
Accs aux donnes
Forme de conditions ANY ou ALL, Donner la liste des projets qui ont un
budget suprieur au budget d'au moins un des projets
impliquant l'employ numro 34888
SELECT *
FROM Projet
WHERE budget > ANY
(SELECT budget FROM Role r, Projet p
WHERE r.nump = p.numAND nume = 34888)
14
-
7/25/2019 presentation base de donnees
15/42
Accs aux donnes
Forme de conditions IS (NOT) NULL : Donner la liste des employs sans
superviseurs
SELECT *
FROM EmployeWHERE sup IS NULL
EXISTS : Donner les noms des employs qui ne sont impliqus
dans aucun projet
SELECT nom
FROM Employe eWHERE NOT EXISTS
(SELECT *
FROM Role r
WHERE e.mat = r.nume)
15
-
7/25/2019 presentation base de donnees
16/42
Accs aux donnes
Clause GROUP BY Forme
GROUP BY
Exemple Donner les noms des employs et dsignations des projets
regroups par projet
SELECT nom, designation
FROM Employe e, Role r, Projet pWHERE e.mat = r.nume
AND r.nump = p.num
GROUP BY designation
16
-
7/25/2019 presentation base de donnees
17/42
Accs aux donnes
Clause HAVING Forme
HAVING
Exemple Donner les numros de projets dans lesquels interviennent au
moins dix employs autres que le responsable
SELECT nump
FROM Role
WHERE role_emp != responsableGROUP BY nump
HAVING COUNT(nume) > 9
17
-
7/25/2019 presentation base de donnees
18/42
Accs aux donnes
Clause ORDER BY Forme
ORDER BY { [ASC | DESC]}+
Exemple : Donner la liste des projets dans lesquels
participe l'employ 33549 par ordre dcroissant de
budget
SELECT *
FROM Projet
WHERE nume = 33549
ORDER BY budget DESC
18
-
7/25/2019 presentation base de donnees
19/42
Accs aux donnes
Unions Forme
UNION
Exemple, liste des cadresSELECT *
FROM Employe
WHERE mat IN ( SELECT dir
FROM Departement)
UNION
SELECT *
FROM Employe
WHERE mat = ANY ( SELECT nume
FROM Role
WHERE role_emp = responsable)19
-
7/25/2019 presentation base de donnees
20/42
Manipulation des donnes
Insertion Forme
INSERT INTO [ ()]
{VALUES () | }
Exemple 1
INSERT INTO Employe (mat, nom, adresse, dept, sup)
VALUES (34098, Gilles, BP 233 Yde, 456, 68735)
Exemple 2 : Supposons quune nouvelle table
Directeur a t creINSERT INTO Directeur
SELECT *
FROM Employe
WHERE mat IN ( SELECT dirFROM De artement
20
-
7/25/2019 presentation base de donnees
21/42
Manipulation des donnes
Mise jour FormeUPDATE
SET { = } +
WHERE { | CURRENT OF }
Exemple 1UPDATE Employe
SET adresse = BP 3456 Yde
WHERE mat = 34098
Exemple 2
UPDATE Projet
SET budget = budget + 1000
WHERE num IN (SELECT nump
FROM Role
WHERE nume = 34098
AND role_emp = responsable )21
-
7/25/2019 presentation base de donnees
22/42
Manipulation des donnes
Suppression Forme
DELETE FROM
[WHERE ]
Exemple 1
DELETE FROM Employe
WHERE mat = 34098
Exemple 2
DELETE FROM Projet
WHERE num IN (SELECT nump
FROM Role
WHERE nume = 68754)
22
-
7/25/2019 presentation base de donnees
23/42
SQL intgr
Introduction
SQL peut tre intgr dans un langage hte
(C, COBOL, PL/1, PASCAL, JAVA, etc.)
Conflit (opration ensembliste vs. opration
squentielle)
Traitement de plusieurs n-uplets
Cas du langage C
23
-
7/25/2019 presentation base de donnees
24/42
SQL intgr
Principes
Tout instruction SQL commence par
lexpression EXEC SQL pour la distinguer
des autres instructions du langage hte
Diffrents types dinstructions
dclarations
connexion traitement
24
-
7/25/2019 presentation base de donnees
25/42
SQL intgr
Dclarations (variables de communication) Elle se fait dans la section DECLARE SECTION.
Celle-ci commence par l'ordre
EXEC SQL BEGIN DECLARE SECTION; et se termine parEXEC SQL END DECLARE SECTION;
Exemple
EXEC SQL BEGIN DECLARE SECTION;
int pempno ;char pname[11];
int pdeptno;
EXEC SQL END DECLARE SECTION;
25
-
7/25/2019 presentation base de donnees
26/42
SQL intgr
Dclarations (variables de communication)
Utilisation dans SQL
EXEC SQL SELECT DEPTNO, ENAME
INTO :pdeptno, :pname FROM EMP
WHERE EMPNO = :pempno;
Variables prcdes de ":" pour les distinguer des noms des
attributs
Utilisation dans C
strcpy(pname,"Martin");
Les types possibles pour ces variables sont ceux
compatibles avec ORACLE (entiers, rels, chanes de
caractres)26
-
7/25/2019 presentation base de donnees
27/42
SQL intgr
Connexion La connexion une base ORACLE se fait par l'ordre
SQL :
EXEC SQL CONNECT :username IDENTIFIED BY :password; username et password sont des variables dclares dans la
section dclaration
Exemple
EXEC SQL BEGIN DECLARE SECTION;VARCHAR username[20];
VARCHAR password[20];
EXEC SQL END DECLARE SECTION;
EXEC SQL INCLUDE sqlca.h;27
-
7/25/2019 presentation base de donnees
28/42
SQL intgr
Connexion Exemple (suite)
main()
{strcpy(username.arr,"login_oracle"); /* Copie du username*/
username.len = strlen(username.arr);
strcpy(password.arr,"motdepasse_oracle");
password.len = strlen(password.arr);EXEC SQL CONNECT :username IDENTIFIED BY :password;
}
28
-
7/25/2019 presentation base de donnees
29/42
SQL intgr
Traitements Mise jour
mettre jour le salaire dans la relation Employ
EXEC SQL UPDATE EMPSET SAL = :salaire
WHERE EMPNO=301;
Suppression
EXEC SQL DELETE FROM EMP WHERE EMPNO = :empno;
Cration d une table
EXEC SQL CREATE TABLE EMP_TEST
(EMPNO NUMBER, ENAME CHAR(15), JOB CHAR(10));
29
-
7/25/2019 presentation base de donnees
30/42
SQL intgr
Traitements Slection, cas du INTO
S applique quand le SELECT retourne un seul n-uplet
EXEC SQL SELECT job, salINTO :fonction, :salaire
FROM EMP
WHERE empno=301;
Slection, utilisation d un curseur
Sapplique quand le SELECT retourne un ensemble de n-
uplets
Un curseur est une structure de donnes contenant tous les
n-uplets retourns par la commande SELECT
Cette structure se manipule comme un fichier squentiel 30
-
7/25/2019 presentation base de donnees
31/42
SQL intgr
Traitements Association du curseur un SELECT
EXEC SQL DECLARE C CURSOR FOR
SELECT job, salaire
FROM EMP;
Ouverture du curseur
EXEC SQL OPEN C;
A l ouverture, le premier n-uplet est point
Fermeture du curseurEXEC SQL CLOSE C;
31
-
7/25/2019 presentation base de donnees
32/42
SQL intgr
Traitements Accs aux autres n-uplets de manire squentielle
Se fait par l instruction FETCH
EXEC SQL FETCH C INTO: fonction, :salaire;
On ne peut pas reculer dans le curseur
Pour accder de nouveau aux n-uplets, il faut fermer etrouvrir le curseur
32
-
7/25/2019 presentation base de donnees
33/42
SQL intgr
Commandes dynamiques Il est possible dexcuter des commandes SQL
inconnues au moment de lcriture du programme
Il existe pour cela quatre mthodes Commandes sauf SELECT sans variables (EXECUTE
IMMEDIATE)
Commandes sauf SELECT avec un nombre de
variables fixe (PREPARE, EXECUTE)
Commandes avec un nombre de variables variable
(PREPARE, DECLARE, OPEN, FETCH)
SELECT compltement dynamique
33
-
7/25/2019 presentation base de donnees
34/42
SQL intgr
Commandes dynamiques
Commandes sans variables
EXEC SQL EXECUTE IMMEDIATE :modif;
Commandes avec un nombre de variables fixe
EXEC SQL PREPARE S1 FROM :chane;
EXEC SQL EXECUTE S1 USING : variable1, :variable2,
...;
34
-
7/25/2019 presentation base de donnees
35/42
SQL intgr
Directives de traitement d'erreurEXEC SQL WHENEVER [SQLERROR /
SQLWARNING / NOT FOUND] [STOP /
CONTINUE / GO TO tiquette];
Ces directives correspondent donc 3 vnements
ORACLE :
SQLERROR : erreur ORACLE
SQLWARNING : avertissement ORACLE
NOT FOUND : curseur vide ou fini
35
-
7/25/2019 presentation base de donnees
36/42
SQL intgr
Directives de traitement d'erreur EXEC SQL WHENEVER [SQLERROR /
SQLWARNING / NOT FOUND] [STOP /
CONTINUE / GO TO tiquette];
Les actions possibles sont :
STOP : le programme se termine et la transaction est
avorte , CONTINUE : le programme continue en squence,
GO TO : le programme se branche l'adresse
indique.
36
-
7/25/2019 presentation base de donnees
37/42
SQL intgr
Directives de traitement derreur
La porte d'une directive WHENEVER va
jusqu' la directive WHENEVER suivante (ou
la fin de programme) dans l'ordre du textesource PRO*C (et non pas dans l'ordre
d'excution).
L'erreur classique dans la manipulation des
SQL WHENEVER est la suivante :
37
-
7/25/2019 presentation base de donnees
38/42
SQL intgr
routine A
{ ...
EXEC SQL WHENEVER SQLERROR GOTO toto;
...
toto : ...
}
routine B
{ ...
EXEC SQL INSERT ...
} /* donc rien est dit dans B pour SQL WHENEVER */
Par consquent, au sein de la routine B, on garde les
dernires directives rencontres, donc celles de la routine A.
Or l'tiquette toto est locale A et donc inconnue dans B. 38
-
7/25/2019 presentation base de donnees
39/42
SQL intgr
Solutions
par exemple avoir systmatiquement des
tiquettes globales
dfinir localement dans chaque routine les
directives d'erreurs.
39
-
7/25/2019 presentation base de donnees
40/42
SQL intgr
Gestion des transactions
Une transaction est assimile une excution d'un
programme.
Le dbut de transaction est implicite (c'est le dbut deprogramme), et la fin est soit implicite (erreur non
rcupre par un WHENEVER : annulation, ou fin de
programme : validation), soit explicite.
40
-
7/25/2019 presentation base de donnees
41/42
SQL intgr
Gestion des transactions Les ordres de fin de transaction explicites sont :
EXEC SQL COMMIT WORK [RELEASE]; Valide les mises jour.
L'option RELEASE dsalloue toutes les ressources
ORACLE et ralise la dconnexion de la base
EXEC SQL ROLLBACK WORK [RELEASE];
Annule les mises jour
41
-
7/25/2019 presentation base de donnees
42/42
SQL intgr
Gestion des transactions
Pour viter les problmes de conflit entre le
ROLLBACK et les directives WHENEVER, il
est prudent d'utiliser le ROLLBACK commesuit :
EXEC SQL WHENEVER SQLERROR CONTINUE;
EXEC SQL WHENEVER SQLWARNING
CONTINUE;
EXEC SQL ROLLBACK WORK;
42