presentation base de donnees

Embed Size (px)

Citation preview

  • 7/25/2019 presentation base de donnees

    1/42

    SIGL460Bases de donnes avances

    Chapitre 5Langage SQL

    1

    Serge Mani, ing. PhD, CISA, CISM

    [email protected]

    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