TRSQL
TRSQL
Lenvironnement Oracle doit tre install avant le dbut du TP 6 Notice dinstallation la fin du TP 6 Nom de login Oracle : n info ou iup n 7 premires lettres du nom n initiale du prnom Exemple : infogrinr ou iupgrinr Mot de passe Oracle : le nom de login Oracle (pas le mot de passe Unix)
Richard Grin SQL page 2
SQL
Universit de Nice - Sophia Antipolis Richard Grin
Version 2.15 L3 14/10/07
Prsentation de SQL
SQL = Structured Query Language = langage dinterrogation structur Langage de gestion de bases de donnes relationnelles pour n interroger n mettre jour (LMD ; Langage de Manipulation des Donnes) n dfinir les donnes (LDD ; Langage de Dfinition des Donnes gres) n contrler laccs aux donnes (LCD ; Langage de Contrle de laccs aux Donnes)
page 3 Richard Grin SQL page 4
Introduction
Richard Grin
SQL
Oracle
SGBDR (Relationnel) qui utilise le langage SQL Langage procdural PL/SQL (dit L4G) propritaire Nombreux programmes utilitaires n SQL*PLUS : SQL interactif, avec quelques ajouts n SQL*FORMS : saisir/voir des donnes avec des formulaires n SQL*REPORTWRITER : rapports imprims n WebDB pour linterface avec le Web
n
...
SQL page 6
Richard Grin
SQL
page 5
Richard Grin
Connexion/Dconnexion
Connexion par sqlplus : sqlplus [nom[/mot de passe]] Base de travail INFO pour vous Dconnexion : exit (ou EXIT)
Identificateurs
Identificateurs pour les objets manipuls n 30 caractres au plus n lettres, chiffres, _, $ ou # (commence par une lettre) n pas un mot clef Quelques mots clefs : ASSERT, ASSIGN, AUDIT, COMMENT, DATE, DECIMAL, DEFINITION, FILE, FORMAT, INDEX, LIST, MODE, OPTION, PARTITION, PRIVILEGES, PUBLIC, SELECT, SESSION, SET,TABLE.
page 7 Richard Grin SQL page 8
Richard Grin
SQL
Tables
Relations stockes sous forme de tables composes de lignes et de colonnes SQL92 : le nom dune table est prcd du nom dun schma (pour runir tous les objets lis un mme thme) Sous Oracle, le schma est remplac par le nom de lutilisateur qui a cr la table : [Link] Par dfaut, le schma est le nom de lutilisateur connect
Richard Grin SQL page 9 Richard Grin
SQL
page 10
Colonne
Toutes les donnes dune colonne sont dun mme type Identificateur unique pour les colonnes dune table, mais 2 colonnes dans 2 tables diffrentes peuvent avoir le mme nom Le nom complet dune colonne comprend le nom de la table laquelle elle appartient (obligatoire en cas dambigut) : [Link], [Link]
Richard Grin SQL page 12
Richard Grin
SQL
page 11
Types de donnes
Richard Grin
SQL
page 13
Richard Grin
SQL
page 14
Richard Grin
SQL
Types temporels
DATE pour les dates TIME pour les heures, minutes et secondes TIMESTAMP pour un moment prcis : date et
heures, minutes et secondes, avec une prcision jusqu la microseconde (un millionime de seconde)
' doubl
page 17
Richard Grin
SQL
page 18
Type boolen
BIT permet denregistrer un bit
nombre virgule flottante avec jusqu' 38 chiffres significatifs NUMBER(nbChiffres [, nb-dcimales]) nombre dcimal d'au plus nbChiffres chiffres dont nbdcimales aprs la virgule
Richard Grin
SQL
page 19
Richard Grin
SQL
page 20
Richard Grin
SQL
page 21
Richard Grin
SQL
page 22
Select simple
SELECT expression1, expression2, FROM table WHERE prdicat
select nomE, poste from emp; select * from dept; select nomE, sal + comm from emp; select matr, nomE, sal * 1.15 from emp where sal + comm >= 12500;
Interrogations simples
Richard Grin
SQL
page 23
Richard Grin
SQL
page 24
Expressions
Ces expressions se trouvent la suite du select ou du where ; elles peuvent comporter des noms de colonnes constantes n oprateurs arithmtiques n concatnations de chanes de caractres (||) n calculs sur les dates (+ et -) n fonctions
n n
Richard Grin SQL page 25
Valeur NULL
Valeur attribue aux attributs qui n'ont pas reu de valeur Les expressions qui contiennent la valeur NULL ont la valeur NULL : comm + sal est NULL si comm est NULL Sauf la fonction COALESCE
Richard Grin
SQL
page 26
COALESCE
COALESCE(expr1, expr2,) retourne la valeur de la 1re expression non NULL parmi les expressions expr1, expr2, COALESCE(comm, 0) COALESCE(comm, salaire, 0) COALESCE(poste, 'simple soldat') Support par Oracle 10g mais pas par Oracle 9i
NVL
NVL peut tre utilis la place de coalesce dans Oracle 9i NVL(expression, valeur) renvoie la valeur de lexpression si elle nest pas NULL, et valeur sinon Exemple : NVL(comm, 0)
Richard Grin
SQL
page 27
Richard Grin
SQL
page 28
NULLIF
Permet de rcuprer des donnes dune BD qui nutilisait pas la valeur NULL Exemple : select nomE, NULLIF(comm, -1) from emp
Signification de NULL
NULL signifie quune donne est manquante et quon ne connat donc pas sa valeur Cependant, dans la pratique il peut signifier (entre autres) : n pas applicable (seuls les commerciaux touchent une commission) ; viter, mais possible pour simplifier le schma de la base n valeur 0 : on peut considrer que la valeur NULL correspond la valeur 0 ; viter !
Richard Grin SQL page 30
Richard Grin
SQL
page 29
Logique 3 valeurs
La valeur NULL implique une logique 3 valeurs : n vrai n faux n on ne sait pas si cest vrai ou faux Par exemple, la condition salaire > 1000 pour un employ peut tre n vrai, si le salaire est 1200 n faux, si le salaire est 700 n on ne sait pas, si le salaire est NULL
Richard Grin SQL page 31
Pseudo-table DUAL
Particularit d'Oracle Contient une seule ligne et une seule colonne Ne peut tre utilise qu'avec une requte select Pour afficher une expression dont la valeur ne dpend d'aucune table en particulier select user from dual; select sysdate from dual;
Richard Grin
SQL
page 33
Richard Grin
SQL
page 34
page 35
Richard Grin
SQL
page 36
DESCRIBE
Cette commande SQL*PLUS dOracle (pas SQL) affiche une description des colonnes dune table : SQL > describe article; Name Null ? Type REF Not null CHAR(5) NOM VARCHAR(20) PRIX NUMBER(9,2) DATEMAJ DATE
Mme si le type donn la cration est DECIMAL page 37
Contraintes dintgrit
Richard Grin
SQL
Richard Grin
SQL
page 38
Dfinition
Une contrainte dintgrit est une contrainte que doivent vrifier les donnes dune table Une commande est annule par le SGBD si son excution viole une des contraintes
Richard Grin
SQL
page 39
Richard Grin
SQL
page 40
Richard Grin
SQL
page 41
Richard Grin
SQL
page 42
Cl primaire
Si la cl primaire nest forme que dune seule colonne, le plus simple est dajouter une contrainte de colonne :
create table emp ( matr integer constraint pkemp primary key, . . .
Contrainte UNIQUE
2 lignes de la table ne pourront avoir la mme valeur (sauf NULL) Correspond un identificateur (cl candidate si minimal), si on ajoute une contrainte NOT NULL
Richard Grin
SQL
page 45
Richard Grin
SQL
page 46
Cl trangre
Si une seule colonne forme la cl trangre, le plus simple est dutiliser une contrainte de colonne :
create table emp ( Optionnel si colonne . . ., rfrence est cl primaire dept integer constraint r_dept references dept(dept))
Cl trangre
Peut tre une contrainte de table : FOREIGN KEY (colonne1, colonne2,) REFERENCES table-ref [(col1, col2,)] Exemple :
create table emp ( . . ., dept integer, constraint r_dept foreign key(dept) references dept(dept)) Il faut ajouter foreign key
Richard Grin
SQL
page 47
Richard Grin
SQL
page 48
Cls trangres
Les colonnes de lautre table rfrences (col1, col2,) doivent avoir la contrainte PRIMARY KEY ou UNIQUE constraint r_dept references dept(dept)
Richard Grin
SQL
page 49
Richard Grin
SQL
page 50
Richard Grin
SQL
page 52
Richard Grin
SQL
page 55
Richard Grin
SQL
page 56
Contraintes diffrables
Pour pallier ce problme, la vrification dune contrainte peut tre diffre la fin de la transaction Exemple : CONSTRAINT sup_ref_emp references dept DEFERRABLE
Contraintes diffrables
La syntaxe : CONSTRAINT nom-contrainte def-contrainte [NOT] DEFERRABLE [INITIALLY {DEFERRED | IMMEDIATE}] La valeur par dfaut est NOT DEFERRABLE
Richard Grin
SQL
page 57
Richard Grin
SQL
page 58
Richard Grin
SQL
page 59
Richard Grin
SQL
page 60
10
Dfinition
Tables qui stockent les descriptions des objets de la base Tenues jour automatiquement par le SGBD Peuvent tre consultes au moyen du langage SQL
Richard Grin
SQL
page 61
Richard Grin
SQL
page 62
2 types de vues
Vues nommes USER_* dcrivent les objets du schma qui appartiennent lutilisateur ; par exemple, USER_TABLES Vues nommes ALL_* dcrivent les objets du schma qui appartiennent lutilisateur, ou sur lesquels lutilisateur a reu des droits ; ALL_TABLES
Richard Grin
SQL
page 63
Exemple dutilisation
Recherche dinformations sur les contraintes On commence par chercher les noms des vues : select table_name from dict where table_name like '%CONSTRAINTS%'; On fait afficher les noms des colonnes : describe USER_CONSTRAINTS On cherche les informations que lon veut : select constraint_name, constraint_type, table_name from user_constraints
Richard Grin SQL page 65 Richard Grin SQL page 66
11
Insertion
INSERT INTO table [(colonne1, colonne2,)] VALUES (valeur1, valeur2,)
ou
INSERT INTO table [(colonne1, colonne2,)] select
La liste des colonnes est optionnelle ; par dfaut, toutes les colonnes sont dans lordre donn lors de la cration de la table Si la commande comporte une liste, les colonnes qui ne sont pas dans la liste auront la valeur NULL
Richard Grin SQL page 67 Richard Grin SQL page 68
Insertion
Dans les programmes, il faut toujours donner la liste des colonnes dont on donne les valeurs pour faciliter la maintenance de lapplication En interactif, on peut sen passer
Exemples
insert into dept values (10, 'Finance', 'Paris'); insert into dept (lieu, nomD, dept) values ('Grenoble', 'Recherche', 20); insert into emp (matr, nomE, dept, sal) select matr + 100, nomE, 60, sal * 0.15 from emp where dept = 10;
Richard Grin
SQL
page 69
Richard Grin
SQL
page 70
Modification
UPDATE table SET colonne1 = expr1, colonne2 = expr2, [ WHERE prdicat ] Toutes les lignes par dfaut ou UPDATE table [ synonyme ] SET (colonne1, colonne2, ) = (select ) [ WHERE prdicat ] Ne doit renvoyer qu'une seule ligne
Exemples
update emp set dept = 10 where nomE = 'Martin'; update emp set sal = sal * 1.1 where poste = 'Commercial';
Richard Grin
SQL
page 71
Richard Grin
SQL
page 72
12
Exemples (2)
update emp set sal = (select avg(sal) * 1.1 from emp where poste = 'Secrtaire') where nomE = 'Clment'; update emp E Synchronisation set (sal, comm) = (select avg(sal), avg(comm) from emp where dept = [Link]) where poste = 'Secrtaire';
Suppressions
DELETE FROM table [ WHERE prdicat ]
Attention ! s'il n'y a pas de clause WHERE, toutes les lignes sont supprimes Exemple :
delete from emp where dept = 10;
Richard Grin
SQL
page 73
Richard Grin
SQL
page 74
Transactions
Richard Grin
SQL
page 75
Richard Grin
SQL
page 76
Transaction
Ensemble de modifications de la base qui forment un tout indivisible : la fin de la transaction, toutes les modifications effectues pendant la transaction sont sauvegardes ou annules
Richard Grin
SQL
page 77
Richard Grin
SQL
page 78
13
Richard Grin
SQL
page 79
Richard Grin
SQL
page 82
Richard Grin
SQL
page 83
Richard Grin
SQL
page 84
14
Transactions longues
Exemple : organisation par une agence de voyage dun voyage Nice Wuhan (Chine) Ncessite la rservation de plusieurs billets davion : Nice Paris ; Paris Beijing ; Beijing Wuhan On commence par rserver les 2 premiers mais si on ne peut trouver de Beijing Wuhan, il faut tout annuler On met donc toutes ces rservations dans une transaction ; a peut tre long si lagence discute avec le client pendant la transaction
Richard Grin SQL page 85
Transactions embotes
Extension de la notion de transaction plate vite les annulations compltes de transactions Apporte plus de souplesse dans les transactions longues et multi-sites Permet de limiter la dure des blocages des ressources systme
dcider dun traitement substitutif reprendre la transaction annule sannuler ou mme ignorer lannulation (traitement pas indispensable)
Lannulation dune transaction provoque lannulation automatique de toutes ses transactions filles
Richard Grin SQL page 87 Richard Grin SQL page 88
Points de reprise
Sans passer au modle des transactions embotes, on peut assouplir le modle des transactions plates Dsigner des points de reprise dans une transaction : savepoint nomPoint Possible dannuler toutes les modifications effectues depuis un point de reprise : rollback to nomPoint vite dannuler toute la transaction et permet dessayer de pallier le problme
Richard Grin SQL page 89
Exemple
insert into .; savepoint p1; delete from ; update ; savepoint p2; insert into ; -- Problme ! rollback to p2; insert into ; -- on essaie autre chose commit;
Richard Grin SQL page 90
15
Syntaxe gnrale
SELECT FROM WHERE GROUP BY HAVING ORDER BY L'ordre des clauses est impos SELECT et FROM sont obligatoires
Richard Grin SQL page 91 Richard Grin SQL page 92
Interrogation de la base
Clause SELECT
select [distinct] expression1 [ [AS] nom1], expression2 [ [AS] nom2], . . . nom1 :
Exemples
select distinct poste from emp; select nomE, sal + coalesce(comm, 0) as "Salaire Total" from emp;
en-tte de la colonne (entre guillemets si mot-clef ou si contient plusieurs mots) n alias pour dsigner la colonne dans une autre partie du select
n
select *
Richard Grin
SQL
page 93
Richard Grin
SQL
page 94
Richard Grin
SQL
page 96
16
Clause FROM
FROM table1 [synonyme1], table2 [synonyme2], Produit cartsien des tables sil y en a plusieurs Possible de se restreindre un sous-ensemble du produit cartsien (voir jointure)
NOMD -----------VENTES VENTES VENTES RECHERCHE RECHERCHE RECHERCHE FINANCE FINANCE FINANCE
SQL
Richard Grin
SQL
page 97
page 98
Clause FROM
Certains SGBDs (et la norme SQL-2) permettent l'utilisation d'un SELECT la place du nom d'une table :
select nomE, sal, sal / total * 100 Pourcentage from emp, (select sum(sal) as total from emp);
Clause WHERE
La clause WHERE comporte de nombreuses possibilits : n oprateurs de comparaison n oprateurs logiques n jointures n sous-interrogations
Richard Grin
SQL
page 99
Richard Grin
SQL
page 100
Oprateurs de comparaison
=, !=, <, >, <=, >=, BETWEEN, LIKE, NOT LIKE, IN, NOT IN, IS NULL, IS NOT NULL LIKE permet d'utiliser des jokers : n % pour une chane de caractres de longueur quelconque n _ pour un seul caractre Attention, expression = NULL nest jamais vrai, il faut utiliser expression IS NULL
Richard Grin SQL page 101 Richard Grin
Exemples
select * from emp where poste = 'Secrtaire'; select * from emp where sal between 10000 and 15000; select * from emp where dept in (10, 30); select * from emp where comm is not null; select * from emp where nomE like '%A%';
SQL
page 102
17
Oprateurs logiques
AND, OR, NOT Exemples :
select nomE from emp where dept = 30 and (sal > 10000 or comm is null); select * from emp where not (poste = 'Directeur' or poste = 'Secrtaire');
Jointures
Traduction de l'qui-jointure emp J{dept} dept :
select nomE, nomD from emp, dept where [Link] = [Link]
Autre syntaxe :
select nomE, nomD from emp JOIN dept ON [Link] = [Link]
Jointure naturelle
La jointure seffectue sur toutes les colonnes qui ont le mme nom dans les 2 tables ; ces colonnes ne sont pas rptes dans la jointure Les colonnes qui participent la jointure ne doivent tre prfixes par un nom de table
Richard Grin
SQL
page 106
Richard Grin
SQL
page 107
Richard Grin
SQL
page 108
18
Jointure externe
Dans une jointure n'apparaissent que les lignes qui ont une ligne correspondante dans l'autre table Dans l'exemple suivant, un dpartement qui n'a pas d'employ n'apparatra pas : select nomE, nomD from emp join dept on [Link] = [Link] Si on veut qu'il apparaisse, on doit utiliser une jointure externe
Richard Grin
SQL
page 109
Richard Grin
SQL
page 110
Richard Grin
SQL
page 112
Sous-interrogations
Une clause WHERE peut comporter un ordre SELECT embot : select nomE from emp where poste = (select poste from emp where nomE = 'Martin'); Cette sous-interrogation doit ramener une seule ligne et une seule colonne Remplace le select interne par NULL sil ne renvoie aucune ligne (ou erreur, suivant les SGBD)
Richard Grin SQL page 113 Richard Grin SQL page 114
19
o op est un des oprateurs de comparaison =, !=, <, >, <=, >= ANY : vrai si la comparaison est vraie pour au moins une des valeurs ramenes par le SELECT ALL : vrai si la comparaison est vraie pour toutes les valeurs ramenes par le SELECT
Richard Grin SQL page 116
Exemple
Remarque : n = ANY est quivalent IN n != ALL est quivalent NOT IN select nomE, sal from emp where sal > all (select sal where dept select nomE, sal from emp where sal > all (select sal where dept from emp = 30) from emp = 38888)
Richard Grin
SQL
20
Sous-interrogations ; optimisation
Soit un select qui comporte une sous-interrogation : select nom from emp where dept in (select dept from dept where lieu = NICE) Pour chaque employ, le select peut lancer la sousinterrogation pour savoir si lemploy est dans un dpartement qui se trouve Nice En fait, le moteur de recherche du SGBD va optimiser en lanant dabord la sous-interrogation et en conservant en mmoire les dpartements de Nice
Richard Grin SQL page 121
Sous-interrogations synchronises
Cette optimisation nest pas possible quand la sous-interrogation utilise une des valeurs ramenes par linterrogation principale On dit que la sous-interrogation est synchronise avec linterrogation principale Notation pointe utilise pour se rfrer dans la sous-interrogation une colonne de Considr comme une constante par la linterrogation principale : sous-interrogation select nomE from emp E where dept != (select dept from emp where matr = [Link]);
Richard Grin SQL page 122
Relation dordre
Il ny a pas de relation dordre totale naturelle sur les tuples 5 > 3, 12 > 7 On ne peut comparer (5, 7) et (3, 12)
Exemple :
select nomE from emp where (poste, sal) = (select poste, sal from emp where nomE = 'Mercier');
Richard Grin
SQL
page 123
Richard Grin
SQL
page 124
EXISTS
La clause EXISTS(select ) est vraie si le select renvoie au moins une ligne La sous-interrogation est le plus souvent synchronise :
select nomE from emp E where exists (select null from emp where sup = [Link]); synchronisation
Exemple :
select nomE from emp where (poste, sal) in (select poste, sal from emp where dept = 10);
Richard Grin
SQL
page 125
Richard Grin
SQL
page 126
21
Division
R
A x y z x B 1 2 1 3
S
C 1 3
A x
R B S = les A qui sont associs tous les C = {a R[A] / c S, (a, c) R} / = {a R[A] / c S, (a, c) R} /
Richard Grin SQL page 127
Richard Grin
SQL
page 128
Avec le dessin
R
A x y z x B 1 2 1 3
Exemple
Afficher la liste des numros des dpartements qui ont tous les postes La solution est R poste S o R = EMP [ dept, poste ] S = EMP [ poste ]
select distinct dept from emp E where not exists (select poste from emp E2 where not exists (select dept, poste from emp where dept = [Link] and poste = [Link])
page 129 Richard Grin SQL page 130
S
C 1 3
R B S
A x
select A from R R1 where not exists (select C from S where not exists (select A, B from R where A = R1.A and B = S.C)
Richard Grin SQL
Avec le dessin
Dept Poste Poste Dept
Simplification
La traduction mot mot peut souvent tre simplifie :
select dept from dept where not exists (select poste from emp E2 where not exists (select dept, poste from emp where dept = [Link] and poste = [Link])
Richard Grin
SQL
page 132
22
Exemple
Donnez les numros des dpartements qui ont particip tous les projets
Dept CodeP CodeP Dept
Avant simplification
Dept Dept CodeP
Aprs simplification
CodeP Dept
Pas besoin de faire une jointure pour avoir un numro de dpartement select distinct dept from participation natural join emp E where not exists (select codep from projet where not exists (select dept, codep from participation natural join emp where dept = [Link] and codep = [Link]))
Richard Grin SQL page 135
select dept from dept where not exists (select codep from projet where not exists Mais ici la jointure est indispensable (select dept, codep from participation natural join emp where dept = [Link] and codep = [Link]))
Richard Grin SQL page 136
Division en comptant
On peut obtenir le mme rsultat en comptant le nombre de valeurs distinctes (exemple venir)
Fonctions de groupe
Les fonctions de groupe peuvent apparatre dans une expression du select ou du having : AVG moyenne SUM somme MIN plus petite valeur MAX plus grande valeur VARIANCE variance STDDEV cart type COUNT(*) nombre de lignes COUNT(col) nombre de valeurs non NULL dans la colonne COUNT(DISTINCT col) nombre de valeurs distinctes
Richard Grin SQL page 138
Richard Grin
SQL
page 137
23
Exemples
select count(*) from emp; select count(comm) from emp where dept = 10; select sum(sal) from emp where dept = 10; select max(sal) from emp where poste = 'INGENIEUR'; select nome, sal from emp where sal = max(sal);
Niveaux de regroupement
A un niveau de profondeur (relativement aux sousinterrogations) d'un SELECT, les fonctions de groupe et les colonnes doivent tre toutes du mme niveau de regroupement Par exemple, si on veut le nom et le salaire des employs qui gagnent le plus dans l'entreprise, la requte suivante provoquera une erreur :
select nome, sal from emp where sal = max(sal)
Solution :
select nome, sal from emp where sal = (select max(sal) from emp)
Richard Grin SQL page 140
Richard Grin
Clause GROUP BY
Permet de regrouper des lignes qui ont les mmes valeurs pour des expressions :
GROUP BY expression1, expression2,
Exemples
select dept, poste, count(*) from emp group by dept, poste; select dept, count(comm) from emp group by dept; select nome, dept, sal from emp where (dept, sal) in (select dept, max(sal) from emp group by dept); Schma retenir pour obtenir des optima sur des regroupements
Richard Grin
SQL
Exemples (2)
select nomD, avg(sal) from emp natural join dept group by nomD; select dept, count(*) from emp where poste = 'SECRETAIRE' group by dept; select count(*) "Nbre employs", count(comm) "Nbre commissions", count(comm) / count(*) "Ratio" from emp;
Richard Grin
SQL
page 143
Richard Grin
SQL
page 144
24
Exemple
select nomd, sum(sal) from emp natural join dept group by [Link]
Clause HAVING
Cette clause sert slectionner les groupes : HAVING prdicat Le prdicat ne peut porter que sur des caractristiques de groupe
Richard Grin
SQL
page 145
Richard Grin
SQL
page 146
Exemples
select dept, count(*) from emp where poste = 'Secrtaire' group by dept having count(*) > 1; select nomd "Dpartement", count(*) "Nombre de secrtaires" from emp natural join dept where poste = 'Secrtaire' group by nomd having count(*) = (select max(count(*)) from emp where poste = 'Secrtaire' group by dept);
Richard Grin SQL page 147 Richard Grin
Exemples (2)
select dept, count(*) from emp group by dept having count(*) = max(count(*)); Interdit ! car pas le mme niveau de regroupement que le reste du select
SQL
page 148
Exemples (2)
select dept, count(*) from emp group by dept having count(*) = (select max(count(*)) from emp group by dept);
La division en comptant
Lorsque la colonne B de la table dividende ne peut contenir que des valeurs de la colonne C de la table diviseur, on peut obtenir le quotient en comptant le nombre de valeurs distinctes : select dept from emp natural join participation group by dept having count(distinct codeP) = (select count(codeP) from projet)
Richard Grin SQL page 150
Richard Grin
SQL
page 149
25
Exemple
10 P1 P1 10 P2 P2 10 P1 20 P1 10 est associ 2 projets distincts 20 est associ 1 seul projet et il y a 2 projets select dept from emp natural join participation group by dept having count(distinct codeP) = (select count(codeP) from projet)
Richard Grin SQL page 151
Contre-exemple
Pas vrai si la table dividende peut contenir des valeurs qui ne sont pas dans la table diviseur Dans lexemple suivant, le dpartement 20 aurait t faussement slectionn : 10 P1 P1 10 P2 P2 20 P1 20 P3
Richard Grin
SQL
page 152
La division en comptant
On pourrait tout de mme sen sortir par une requte un peu plus complexe : select dept from emp natural join participation where codeP in (select codeP from projet) group by dept having count(distinct codeP) = (select count(codeP) from projet)
Richard Grin SQL page 153
Clause ORDER BY
La clause ORDER BY prcise l'ordre des lignes d'un SELECT :
ORDER BY expr1 [DESC], expr2 [DESC],
Richard Grin
SQL
page 154
Exemples
select nome, poste from emp order by dept, sal desc; select dept, sum(sal) "Total salaires" from emp group by dept order by 2; select dept, sum(sal) "Total salaires" from emp group by dept order by sum(sal);
Fonctions
Fonctions arithmtiques : abs(n), mod(m, n), power(n, e), round(n, p), trunc(n, p), sign(n), sqrt(n), greatest(n1, n2,), least(n1, n2,) Conversions nombre - chane de caractres : to_char(n, format), number(chane) Fonctions date : round(date, prcision), trunc(date, prcision), sysdate Conversions date - chane de caractres : to_char(date, format), to_date(chane, format)
Richard Grin SQL page 156
Richard Grin
SQL
page 155
26
Fonctions (2)
Fonctions sur les chanes de caractres : length(chane), substr(chane, position, longueur), instr(chane, sous-chane, position, n), upper(chane), lower(chane), lpad(chane, long, car), rpad(chane, long, car), ltrim(chane, car), rtrim(chane, car), translate(chane, lesCar1, lesCar2), replace(chane, ancienne, nouvelle)
Exemple
select nomE, to_char(datemb, 'DD/MM/YYYY') from emp where round(sysdate datemb) > 3;
Richard Grin
SQL
page 157
Richard Grin
SQL
page 158
Fonction de choix
2 variantes :
CASE WHEN condition1 THEN resultat1 WHEN condition2 THEN resultat2 ELSE resultat3 END CASE expression WHEN valeur1 THEN resultat1 WHEN valeur2 THEN resultat2 ELSE resultat3 END
Richard Grin SQL page 159
Exemples
SELECT nome, poste FROM emp order by CASE poste WHEN 'Prsident' THEN 1 WHEN 'Directeur' THEN 2 ELSE 3 END; SELECT nome, poste FROM emp order by CASE WHEN poste = 'Prsident' THEN 1 WHEN poste = 'Directeur' THEN 2 ELSE 3 END;
Richard Grin SQL page 160
Oprateurs ensemblistes
On peut effectuer des oprations sur plusieurs select considrs comme des ensembles de lignes : select UNION select select INTERSECT select select MINUS select Ensembles au sens mathmatique : si 2 lignes des 2 select dune union ont les mmes valeurs, lunion naura quune seule ligne avec ces valeurs
Richard Grin
SQL
page 161
Richard Grin
SQL
page 162
27
UNION ALL
Pour conserver les doublons avec UNION
Richard Grin
SQL
page 165
Richard Grin
SQL
page 166
Exemple
MySQL et Postgresql : SELECT matr, nomE FROM emp LIMIT 10 Oracle : SELECT matr, nomE FROM emp WHERE ROWNUM <= 10 SQL Server : SELECT TOP 10 matr, nomE FROM emp
Richard Grin SQL page 167
28
Richard Grin
SQL
page 169
Richard Grin
SQL
page 170
Richard Grin
SQL
page 171
Richard Grin
SQL
page 172
Exemples
alter table emp add (situ_famille char(1), nbEnfants smallint); alter table emp modify (situ_famille char(2));
Richard Grin
SQL
29
Richard Grin
SQL
page 176
Synonymes
Si une table doit tre utilise par plusieurs utilisateurs, il peut tre intressant de lui donner un synonyme public : CREATE PUBLIC SYNONYM employe FOR [Link]
Richard Grin
SQL
page 177
Richard Grin
SQL
page 178
Vues
Une vue est une vision virtuelle partielle ou particulire des donnes dune ou plusieurs tables La dfinition dune vue est donne par un select : les donnes de la vue sont celles retournes par le select Les utilisateurs peuvent consulter ou modifier la base travers la vue comme si c'tait une table relle
page 179 Richard Grin SQL page 180
Vues
Richard Grin
SQL
30
Richard Grin
SQL
page 182
Richard Grin
SQL
page 183
Richard Grin
SQL
page 184
Richard Grin
SQL
page 185
Richard Grin
SQL
page 186
31
Option CHECK
Si la vue a t cre avec "WITH CHECK OPTION", toute modification au travers de la vue ne peut donner des donnes qui ne seraient pas affiches par la vue Par exemple,
update emp10 set dept = 20;
sera interdit
Richard Grin
SQL
page 187
Richard Grin
SQL
page 188
Index
SQL
page 190
Index
Un index utilise des techniques informatiques pour rendre trs rapides les accs aux valeurs d'une colonne
select * from emp where nomE = 'Dupond'
est trs long si la table emp contient des millions de lignes Un index bien construit permet d'obtenir l'emplacement des informations sur Dupond en quelques accs disques (moins de 5, mme s'il y a des millions de lignes dans la table EMP)
Richard Grin SQL page 191
Le nom choisi doit tre unique parmi tous les index de toutes les tables Oracle cre automatiquement un index sur les colonnes qui ont des contraintes Primary key et Unique
Richard Grin
SQL
page 192
32
Richard Grin
SQL
page 194
Utilit
Les identifiants de lignes non significatifs sont prfrables Le plus simple est davoir des cls qui sont des nombres entiers Le problme : gnrer des entiers sans que 2 lignes puissent avoir le mme identifiant, mme en situation de concurrence entre plusieurs transactions
Gnration de cls
Richard Grin
SQL
page 195
Richard Grin
SQL
page 196
Inconvnients de la solution 1
Cette solution nest pas performante : n ncessite un accs la base n il faut trouver le plus grand n ncessite un blocage de la table pour viter que 2 transactions nobtiennent la mme valeur Si on veut garder un historique, on peut se retrouver avec des lignes qui ont le mme identificateur (si la ligne de plus grand identificateur est supprime)
Richard Grin SQL page 198
Richard Grin
SQL
page 197
33
Solution 2
Une table contient la prochaine cl attribuer La valeur est incrmente chaque nouvelle cl
Variantes
Variante 1 : Une seule table contient une seule valeur utilise pour les identifiants de toutes les tables Variante 2 : Une table par cl Variante 3 : Une seule table qui contient une ligne par table qui a besoin dune cl Quelle colonnes dans la table des cls ?
Richard Grin
SQL
page 199
Richard Grin
SQL
page 200
Pseudo-code de la variante 1
lock table_cle; update table_cle set cle = cle + 1; val = select cle from table_cle; commit; insert into table values (val,); commit;
Richard Grin SQL page 201
Richard Grin
SQL
page 202
Les squences
Les versions actuelles des SGBD offrent des solutions qui ne ncessitent pas daccs aux donnes de la base Inconvnient : pas les mmes solutions dans tous les SGBDs Les squences sont disponibles avec Oracle,
DB2 et PostgreSQL
Richard Grin
SQL
page 203
Richard Grin
SQL
page 204
34
CURRVAL et NEXTVAL
On ne peut utiliser CURRVAL quaprs avoir utilis NEXTVAL au moins une fois dans la session de travail NEXTVAL modifie immdiatement la valeur future pour les autres transactions, mme sil est lanc dans une transaction non valide La valeur de CURRVAL ne dpend que des NEXTVAL lancs dans la mme transaction
Richard Grin
SQL
page 205
Richard Grin
SQL
page 206
Richard Grin
SQL
page 207
Richard Grin
SQL
page 208
Autres solutions
DB2 et SQL Server ont une clause IDENTITY pour dire quune colonne est un identifiant, avec une valeur qui est gnre automatiquement par le SGBD La norme SQL 3 a normalis cette possibilit Pas disponible sous Oracle MySQL permet de dclarer une colonne AUTO_INCREMENT
Richard Grin
SQL
page 209
Richard Grin
SQL
page 210
35
Exemple
facture(id, nom_client, date_facture,) ligne_facture(id_facture, nb_ligne, quantite, id_article)
Richard Grin
SQL
page 211
Richard Grin
SQL
page 212
Procdures stockes
Les SGBD modernes fonctionnent en client/serveur Chaque requte issue dun client n transite sur le rseau n est compile lorsquelle arrive au serveur : celuici recherche en particulier la meilleure faon de rpondre la requte La compilation peut tre une tape complexe et longue traiter et coteuse en ressources Les procdures stockes sont des requtes prcompiles et stockes sur le serveur
page 213 Richard Grin SQL page 214
Procdures stockes
Richard Grin
SQL
3 tapes
1. 2. 3.
criture du code de la procdure Compilation et enregistrement sur le serveur ; on donne un nom la procdure stocke Excution de la procdure en passant au serveur le nom de la procdure
Richard Grin
SQL
page 215
36
Richard Grin
SQL
page 217
Richard Grin
SQL
page 219
Richard Grin
SQL
page 220
Richard Grin
SQL
37
Fonctions
Comme les procdures stockes mais elles renvoient une valeur Elles peuvent tre utilises dans les requtes SQL comme les fonctions prdfinies
Richard Grin
SQL
page 223
Richard Grin
SQL
page 224
Exemple en PL/SQL
create or replace function euro_to_fr(somme in number) return number is taux constant number := 6.55957; begin return somme * taux; end;
Richard Grin SQL page 225
Richard Grin
SQL
page 226
Triggers (dclencheurs)
Compils et stocks sur le serveur Souvent crits dans le mme langage que les procdures stockes Leur excution est dclenche par des actions sur la base, par exemple une insertion dans une table Ils compltent les contraintes d'intgrit en permettant des contrles et des traitements plus complexes Pas normaliss en SQL2 (normaliss en SQL3)
page 227 Richard Grin SQL page 228
Triggers
Richard Grin
SQL
38
Exemple de trigger
CREATE OR REPLACE TRIGGER totalSalaire AFTER UPDATE OF salaire ON emp REFERENCING OLD AS ancien, NEW AS nouveau FOR EACH ROW Autre possibilit : for each statement update cumul set augmentation = augmentation + [Link] - [Link] where matricule = [Link]
Richard Grin SQL page 229
Richard Grin
SQL
page 230
Clause WHEN
create or replace trigger modifsalaire before update of sal on emp for each row when ([Link] < [Link]) begin raise_application_error(-20001, 'Interdit de baisser le salaire ! (' || :[Link] || ')'); end;
Afficher les erreurs de compilation : SHOW ERRORS Supprimer un trigger : DROP TRIGGER nomTrigger Tables du dictionnaire des donnes : USER_TRIGGERS, USER_TRIGGER_COLS
Richard Grin
SQL
page 231
Richard Grin
SQL
page 232
Ordres interdits
Les ordres COMMIT et ROLLBACK sont interdits dans un trigger
Scurit
Richard Grin
SQL
page 233
Richard Grin
SQL
page 234
39
Travail en scurit
Plusieurs utilisateurs peuvent travailler en toute scurit sur la mme base Les donnes peuvent tre confidentielles ou partages entre plusieurs utilisateurs
Richard Grin
SQL
page 235
Richard Grin
Rles
Pour faciliter la cration de nouveaux utilisateurs avec certains droits, la plupart des SGBD permettent de crer des rles Un rle dfinit des droits et interdictions Quand on cre un nouvel utilisateur, on lui affecte un ou plusieurs rles
Richard Grin
SQL
page 237
Richard Grin
Richard Grin
SQL
page 240
40
Richard Grin
SQL
page 241
Richard Grin
SQL
page 242
Richard Grin
SQL
page 243
Richard Grin
SQL
page 245
Richard Grin
SQL
page 246
41
Le problme
Un pirate sait quun des utilisateurs autoriss sappelle Dupond Il saisit Dupond' -- pour le nom et a pour le mot de passe La requte devient :
select * from utilisateur where nom = 'Dupond' --' and mdp = 'a'
Les parades
Toujours vrifier la saisie dun utilisateur avant de sen servir pour construire une requte SQL Pour lexemple, il aurait suffit dinterdire le caractre ' ou de le doubler Les API fournies avec les langages pour accder une base de donnes offrent des facilits pour se protger contre linjection de code SQL Avec JDBC par exemple, il suffit dutiliser des paramtres et PreparedStatement ; les caractres spciaux comme ' sont alors traits comme des caractres ordinaires
Richard Grin SQL page 248
Mais -- indique un commentaire avec le SGBD utilis ; donc la requte excute sera :
select * from utilisateur where nom = 'Dupond'
Richard Grin SQL page 247
Richard Grin
SQL
page 249
Richard Grin
SQL
page 250
Quelques questions
A quel moment les modifications sont-elles vues par les autres transactions ? Que se passe-t-il lorsque plusieurs transactions veulent modifier les mmes donnes ? Un ordre SQL (moyenne des salaires, par exemple) tient-il compte des modifications apportes par les autres transactions valides pendant son excution ?
Richard Grin
SQL
page 251
Richard Grin
SQL
page 252
42
Transaction T2
s = Lire S ; attente...
Enregistrer s Enregistrer s
s = Lire S
s = s + 2000 Enregistrer s
Richard Grin SQL page 253 Richard Grin SQL page 254
Lecture inconsistante
Temps
Transaction T2 Bloquer B
Bloquer A Attente...
Richard Grin SQL page 255
Ce cas n'arrive pas si les modifications ne sont visibles par les autres qu'aprs un COMMIT
Richard Grin SQL page 256
Lignes fantmes
Ce problme survient quand une transaction na pas peru la cration dune ligne par une autre transaction Par exemple, une transaction lit dabord le nombre demploys et lance ensuite la lecture dinformations sur chacun de ces employs Si une autre transaction a ajout des employs, le nombre lu auparavant ne correspond plus la ralit
page 257 Richard Grin SQL page 258
Transaction T1 Lire V
Lire V Pour viter cela, T1 devrait bloquer les donnes lues (V)
Richard Grin SQL
43
Lignes fantmes
Temps
Transactions srialisables
On vient de voir que lexcution de transactions entrelaces peut provoquer des pertes de donnes ou de cohrence Pour viter ces problmes, le SGBD doit sarranger pour que lexcution de plusieurs transactions entrelaces fournisse les mmes rsultats que lexcution des mmes transactions les unes la suite des autres (dans un ordre quelconque)
Richard Grin SQL page 260
Transaction T1
Rcupre le nombre demploys du dept 10 (35)
Transaction T2
Ajoute un employ au dept 10 COMMIT Rcupre les informations sur les employs du dept 10 (36 lignes) Pour viter cela, T1 devrait bloquer la table des employs au dbut de la transaction (pas possible de bloquer des lignes qui nexistent pas !)
Richard Grin SQL page 259
Moyens de srialiser
Le moyen le plus courant sappelle le verrouillage 2 phases : n on doit bloquer un objet avant dagir sur lui (lecture ou criture) n on ne peut plus faire de blocage aprs avoir dbloquer un objet On a donc 2 phases : 1. acquisitions des verrous 2. abandons des verrous (en pratique, souvent au COMMIT ou ROLLBACK)
Richard Grin SQL page 261
Richard Grin
SQL
page 262
Estampillage
Lestampillage est une autre stratgie que le verrouillage 2 phases pour assurer la srialisation des transactions Lanciennet des transactions est repre par une estampille donne la cration de la transaction (un nombre incrment chaque attribution) Chaque donne accde par une transaction reoit lestampille de cette transaction
Estampillage
Les algorithmes qui utilisent lestampillage assurent que lexcution concurrente des transactions sera quivalente lexcution squentielle de ces transactions dans lordre de leur estampille
Richard Grin
SQL
page 263
Richard Grin
SQL
page 264
44
Rsultat de lestampillage
Cet algorithme est trop restrictif et ne va autoriser que peu dexcutions parallles des transactions La transaction redmarre va peut-tre entrer en conflit avec une autre transaction plus jeune Dautres algorithmes destampillage moins simplistes permettent damliorer le paralllisme, en particulier en distinguant les accs en lecture et les accs en criture Malgr tout ce type de traitement est souvent trop restrictif et nuit la concurrence
Richard Grin SQL page 266
Autres traitements
Pour amliorer les performances dans des situations de forte concurrence, les SGBD offrent la possibilit dtre plus permissif et de ne pas srialiser les transactions
Richard Grin
SQL
page 267
Richard Grin
SQL
page 268
Richard Grin
SQL
page 269
Richard Grin
SQL
page 270
45
En rsum
Niveaux par isolation dcroissante : n SERIALIZABLE (souhaitable, mais coteux car provoque des blocages de tables) n REPEATABLE READ (sous Oracle, remplac par les blocages explicites des lignes lues) n READ COMMITED (le plus souvent le niveau par dfaut, comme avec Oracle) n READ UNCOMMITED (trs rarement utilis ; pas possible sous Oracle)
Richard Grin SQL page 271
Richard Grin
SQL
page 272
Pratiquement
En fait, linstantan nest que virtuel Oracle sarrange pour que lordre SQL voie les donnes comme elles taient au dbut de lexcution, en gardant plusieurs versions des donnes Sil saperoit quune donne a t modifie depuis le dbut de lordre SQL, il utilise une ancienne version de la donne
Richard Grin
SQL
page 273
Richard Grin
SQL
page 274
Richard Grin
SQL
46
Richard Grin
SQL
page 278
Types de blocages
Un blocage peut tre n exclusif : seul celui qui a bloqu peut modifier ou bloquer les donnes bloques n partag : plusieurs transactions peuvent effectuer en mme temps ce type de blocage C'est un blocage dfensif qui marque les donnes pour interdire qu'une autre transaction ne les bloque dans un mode trop restrictif, ou ne les modifie
Richard Grin
SQL
page 280
Richard Grin
SQL
page 281
47
Richard Grin
SQL
page 284
Blocages implicites
Les commandes INSERT, UPDATE et DELETE effectuent implicitement n un blocage exclusif des lignes modifies n un blocage partag sur la table ; ce blocage empche un blocage de la table par une autre transaction, qui interdirait la modification des donnes
Richard Grin
SQL
page 285
Richard Grin
SQL
page 286
2 types de solutions
Traitement pessimiste Traitement optimiste
valeur
3. affecter D la nouvelle valeur calcule
Risque de modifications perdues si dautres transactions ont modifi D entre ltape 1 et ltape 3
Richard Grin SQL page 287 Richard Grin SQL page 288
48
Traitement pessimiste
Pour viter les problmes lis aux accs concurrents, le comportement le plus simple est pessimiste : 1. D est bloqu pour empcher sa modification par dautres transactions 2. calcul de la nouvelle valeur 3. affectation D de la nouvelle valeur 4. dblocage de D la fin de la transaction
Richard Grin
SQL
page 289
Traitement optimiste
1. Lecture de D sans le bloquer, en esprant que dautres transactions ne le modifieront pas 2. Calcul de la nouvelle valeur 3. Blocage court pendant lequel on vrifie si loptimisme tait justifi : D a t-il t modifi entretemps par dautres transactions ? si a nest pas le cas, on valide la transaction 4. sinon, on agit en consquence ; par exemple en recommenant le traitement, ou en lannulant
Richard Grin SQL page 291
Richard Grin
SQL
page 292
Implmentation
La comparaison peut se faire avec des if du langage hte Souvent, on peut aussi utiliser ce type de update au moment o on effectue la modification ( la fin) : n = update emp set salaire = nouveauSalaire where matr = 8000 and salaire = ancienSalaire Si on rcupre n = 0, loptimisme ntait pas justifi
Richard Grin
SQL
page 293
Richard Grin
SQL
page 294
49
Richard Grin
SQL
page 295
Richard Grin
SQL
page 296
Richard Grin
SQL
page 298
Richard Grin
SQL
page 299
Richard Grin
SQL
page 300
50