You are on page 1of 41

Structured Query Language

Par Th. COSNUAU

Introduction
Un modle de donnes est un ensemble de concepts et de rgles de composition de ces concepts permettant de dcrire des donnes. Il existe principalement trois types de modles : Le modle hirarchique Le modle rseau Le modle relationnel Le modle relationnel a t initi par CODD IBM en 1970 mais fut surtout utilis partir des annes 1980. Le langage de manipulation de donnes relationnelles se compose d'un ensemble de commandes permettant d'interroger et de modifier une base de donnes. Ce " langage de requte structur " (SQL = Structured Query Language) est une volution (1981) du langage SEQUEL d'IBM. Il permet notamment d'exprimer de faon simple, des slections, des projections et des jointures. On distingue trois sous-ensembles : Le langage de description des donnes (LDD) Le langage de manipulation des donnes (LMD) La langage de spcification des contraintes d'intgrit (LSCI) Le SQL est un langage dclaratif dont la syntaxe est trs simple (comme beaucoup de langages de ce type) ce qui permet de se concentrer sur le problme rsoudre.

Tables utilises dans les exemples

Les exemples cits dans ce document ont tous t tests sous ORACLE, un des systmes de gestion de bases de donnes relationnels les plus rpandus sur le march.

Document1

Page 1 of 41

Ces exemples sont btis sur une base de donnes compose des deux relations suivantes : EMP (NOM, NUM, FONCTION, N_SUP, EMBAUCHE, SALAIRE, COMM, N_DEPT) NOM MARTIN DUPONT DUPOND LAMBERT JOUBERT LEBRETON MARTIN PAQUEL LEFEBVRE GARDARIN SIMON DELOBEL ADIBA CODD LAMERE BALIN BARA NUM 16712 17574 26691 25012 25717 16034 17147 27546 25935 15155 26834 16278 25067 24533 27047 17232 24831 FONCTION directeur administratif commercial administratif prsident commercial commercial commercial commercial ingnieur ingnieur ingnieur ingnieur directeur directeur administratif administratif 27047 27047 27047 27047 24533 24533 24533 24533 25717 25717 24533 16712 N_SUP 25717 16712 27047 27047 EMBAUCHE 23-MAY-90 03-MAY-95 04-APR-88 14-APR-91 10-OCT-82 01-JUN-91 10-DEC-93 03-SEP-83 11-JAN-84 22-MAR-85 04-OCT-88 16-NOV-94 05-PCT-87 12-SEP-75 07-SEP-89 03-OCT-87 10-SEP-88 SALAIRE COMM 40000 9000 25000 12000 50000 15000 20000 22000 23500 24000 20000 21000 30000 55000 45000 13500 15000 0 500 2000 1500 2500 N_DEPT 30 30 20 20 30 20 20 20 20 10 10 10 10 10 20 10 30

DEPT (N_DEPT, NOM, LIEU) NOM recherche vente direction fabrication LIEU Rennes Metz Gif Toulon

N_DEPT 10 20 30 40

Document1

Page 2 of 41

La clause SELECT
La commande SELECT constitue, elle seule, le langage permettant d'interroger une base de donnes. Elle permet : de slectionner certaines colonnes d'une table : c'est l'opration de projection ; de slectionner certaines lignes d'une table en fonction de leur contenu : c'est l'opration de restriction ; de combiner des informations venant de plusieurs tables : ce sont les oprations de jointure, union, intersection, diffrence relationnelle ; de combiner entre elles ces diffrentes oprations. Une interrogation, on parle plutt de requte, est une combinaison d'oprations portant sur des tables (relations) et dont le rsultat est lui-mme une table dont l'existence est phmre (le temps de la requte). Note : On peut introduire un commentaire l'intrieur d'une commande SQL en l'encadrant par /* */ .

Slection de colonnes ou projection

La commande SELECT la plus simple a la syntaxe suivante : SELECT * FROM nom_table ; dans laquelle : nom_table : est le nom de la table sur laquelle porte la slection. * : signifie que toutes les colonnes de la table sont slectionnes. Par dfaut toutes les lignes sont slectionnes. On peut limiter la slection certaines colonnes, en indiquant une liste de noms de colonnes la place de l'astrisque. SELECT nom_col1, nom_col2... FROM nom_table; Exemple : Donner le nom et la fonction de chaque employ. SELECT nom, fonction FROM emp; La clause DISTINCT ajoute derrire la commande SELECT permet d'liminer les duplications. Exemple : Quelles sont toutes les fonctions diffrentes. SELECT DISTINCT fonction FROM emp;

Slection de lignes ou restriction

La clause WHERE permet de spcifier quelles sont les lignes slectionner. Elle est suivie d'un prdicat qui sera valu pour chaque ligne de la table. Les lignes pour lesquelles le prdicat est vrai seront slectionnes. La syntaxe est la suivante : SELECT * FROM nom_table WHERE predicat ;

Document1

Page 3 of 41

Un prdicat n'est ni plus ni moins que la faon dont on exprime une proprit. Les prdicats, qu'ils soient simples ou composs, sont constitus partir d'expressions que l'on compare entre elles. Expression simple Une expression simple peut tre : une variable dsigne par un nom de colonne, une constante. Les expressions peuvent tre de trois types : numrique, chane de caractres ou date. A chacun de ces types correspond un format de constante : Constante numrique nombre contenant ventuellement un signe, un point dcimal et une puissance de dix. Ex : -10, 2.5, 1.2 E-10 Constante chane de caractres une chane de caractres entre apostrophes. Ex :'MARTIN' (Attention, une lettre en majuscules n'est pas considre comme gale la mme lettre en minuscule). Constante date Une chane de caractres entre apostrophes au format suivant : jour-mois-anne o le jour est sur deux chiffres, le mois est dsign par les trois premires lettres de son nom en anglais, l'anne est sur deux chiffres. Ex : '01-FEB-85'

On peut, en SQL, exprimer des expressions plus complexes en utilisant des oprateurs et des fonctions tudis dans le chapitre Expressions et fonctions.

Prdicat simple

Un prdicat simple est le rsultat de la comparaison de deux expressions au moyen d'un oprateur de comparaison qui peut tre : = gal != diffrent < infrieur <= infrieur ou gal > suprieur >= suprieur ou gal Les trois types d'expressions peuvent tre compars au moyen de ces oprateurs : Pour les types date, la relation d'ordre est l'ordre chronologique. Pour les types caractre, la relation d'ordre est l'ordre alphabtique. Il faut ajouter ces oprateurs arithmtiques classiques les oprateurs suivants : expr1 BETWEEN expr2 AND expr3 vrai si expr1 est compris entre expr2 et expr3, bornes incluses expr1 IN (expr2, expr3, ...) vrai si expr1 est gale l'une des expressions de la liste entre parenthses expr LIKE chaine o chaine est une chane de caractres pouvant contenir l'un des caractres jokers : _ remplace exactement 1 caractre % remplace une chane de caractres de longueur quelconque, y compris de longueur nulle. Exemple : Quels sont les employs dont la commission est suprieure au salaire ? SELECT nom, salaire, comm FROM emp WHERE comm > salaire;

Document1

Page 4 of 41

Exemple : Quels sont les employs gagnant entre 20000 et 25000? SELECT nom, salaire FROM emp WHERE salaire BETWEEN 20000 AND 25000; Exemple : Quels sont les employs commerciaux ou ingnieurs? SELECT num, nom, fonction, salaire FROM emp WHERE fonction IN ('commercial', 'ingenieur'); Exemple : Quels sont les employs dont le nom commence par M? SELECT nom FROM emp WHERE nom LIKE 'M%';

Prdicats composs

Les oprateurs logiques AND (et) et OR (ou inclusif) peuvent tre utiliss pour combiner entre eux plusieurs prdicats. L'oprateur NOT plac devant un prdicat en inverse le sens. L'oprateur AND est prioritaire par rapport l'oprateur OR. Des parenthses peuvent tre utilises pour imposer une priorit dans l'valuation du prdicat, ou simplement pour rendre plus claire l'expression logique. Exemple : Quels sont les employs du dpartement 30 ayant un salaire suprieur 25000? SELECT nom FROM emp WHERE n_dept = 30 AND salaire > 25000; Exemple : Quels sont les employs directeurs, ou commerciaux et travaillant dans le dpartement 10? SELECT nom, fonction, salaire, n_dept FROM emp WHERE fonction = 'directeur' OR (fonction = 'commercial' AND n_dept = 10); La requte prcdente donnerait le mme rsultat sans les parenthses, rsultat diffrent de celui du SELECT suivant. Exemple : Quels sont les employs directeurs ou commerciaux, et travaillant dans le dpartement 10? SELECT num, nom, fonction, n_dept FROM emp WHERE (fonction='directeur' OR fonction = 'commercial') AND n_dept = 10;

Valeurs NULL

Pour SQL, une valeur NULL est une valeur non dfinie. Il est possible d'ajouter une ligne une table sans spcifier de valeur pour les colonnes non obligatoires : ces colonnes absentes auront la valeur NULL. Par exemple les employs dont la rmunration ne prend pas en compte de commission auront une valeur NULL, c'est--dire indfinie, comme commission. L'oprateur IS NULL permet de tester la valeur NULL : le prdicat expr IS NULL est vrai si l'expression a la valeur NULL (c'est--dire si elle est indfinie). Exemple : Quels sont les employs dont la commission a la valeur NULL? SELECT nom FROM emp WHERE comm IS NULL;

Document1

Page 5 of 41

L'oprateur IS NOT NULL permet de construire un prdicat vrai si la valeur n'est pas NULL (et donc le prdicat expr IS NOT NULL est vrai si expr est dfinie) Remarques La valeur NULL est diffrente de la valeur zro qui, elle, qui est une valeur bien dfinie. Le prdicat expr = NULL est toujours faux, et ne permet donc pas de tester si l'expression a la valeur NULL. Une expression de la forme NULL + val donne NULL comme rsultat quelle que puisse tre la valeur de val.

Nom de colonne

Les colonnes constituant le rsultat d'un SELECT peuvent tre renommes dans le SELECT, ceci est utile en particulier lorsque la colonne rsultat est une expression. Pour cela, il suffit de faire suivre l'expression dfinissant la colonne d'un nom, selon les rgles suivantes : le nom (30 caractres maximum) est insr derrire l'expression dfinissant la colonne, spar de cette dernire par un espace. si le nom contient des sparateurs (espace, caractre spcial), ou s'il est identique un mot cl de SQL (ex : DATE), il doit tre mis entre guillemets "". Ce nom est celui sous lequel la colonne sera connue des interfaces externes. Sous SQLPLUS, par exemple, il constituera le titre par dfaut de la colonne, et servira de rfrence pour dfinir un format pour la colonne. Exemple : Salaire de chaque employ. SELECT nom, salaire "SALAIRE MENSUEL" FROM emp; Remarque : Attention, ce nom n'est pas connu l'intrieur du SELECT.

Classer le rsultat d'une interrogation

Les lignes constituant le rsultat d'un SELECT sont obtenues dans un ordre indtermin. On peut, dans un SELECT, demand que le rsultat soit class dans un ordre ascendant ou descendant, en fonction du contenu d'une ou plusieurs colonnes (jusqu' 16 critres de classement possibles). Les critres de classement sont spcifis dans une clause ORDER BY dont la syntaxe est la suivante : ORDER BY {nom_col1 | num_col1 [DESC] [, nom_col2 | num_col2 [DESC],...]} Le classement se fait d'abord selon la premire colonne spcifie dans l'ORDER BY puis les lignes ayant la mme valeur dans la premire colonne sont classes selon la deuxime colonne de l'ORDER BY, etc... Pour chaque colonne, le classement peut tre ascendant (par dfaut) ou descendant (DESC). L'ORDER BY peut faire rfrence une colonne par son nom ou par sa position dans la liste des colonnes prsentes derrire le SELECT (la premire colonne slectionne a le numro 1, la deuxime a le numro 2, ...). Exemple : Donner tous les employs classs par fonction, et pour chaque fonction classs par salaire dcroissant SELECT nom, fonction, salaire FROM emp ORDER BY fonction, salaire DESC; Remarque : Dans un classement les valeurs NULL sont toujours en tte quel que soit l'ordre du classement (ascendant ou descendant).

Document1

Page 6 of 41

Syntaxe du Select

SELECT [DISTINCT | ALL] {* | { [schema.]{table | view | snapshot}.* | expr [c_alias] [, { [schema.]{table | view | snapshot}.* | expr [c_alias] } ] ... } FROM [schema.]{table | view | snapshot} [t_alias] [, [schema.]{table | view | snapshot} [t_alias] ] ... [WHERE condition ] [ [START WITH condition] CONNECT BY condition] [GROUP BY expr [, expr] ... [HAVING condition] ] [{UNION | UNION ALL | INTERSECT | MINUS} SELECT command ] [ORDER BY {expr|position} [ASC | DESC] [, {expr | position} [ASC | DESC]] ...] [FOR UPDATE [OF [[schema.]{table | view}.]column [, [[schema.]{table | view}.]column] ...] [NOWAIT] ] DISTINCT renvoie toutes les lignes slectionnes en enlevant les doublons. ALL renvoie toutes les lignes slectionnes sans enlever les doublons. C'est la valeur par dfaut. * renvoie toutes les colonnes de toutes les tables, les vues et les clichs prciss dans le FROM. table.*, view.*, snapshot.* slectionne toutes les colonnes de la table, de la vue ou du clich prcis. expr slectionne une expression habituellement calcule sur les valeurs des colonnes appartenant l'une des tables, vues, ou clichs de la clause FROM. c_alias la chane de caractres qui sert d'en-tte la colonne (par dfaut expr) schema est le nom du schma contenant les tables, vues ou clichs slectionns. Le schma par dfaut est celui de l'utilisateur qui excute la requte. table, view, snapshot est le nom de la table, de la vue ou du clich contenant les donnes slectionnes. t_alias synonyme pour la table dont le nom prcde, utiliser dans le reste de la requte. WHERE restreint les lignes slectionnes celles pour lesquelles la condition est vraie. Si cette clause est omise, toutes les lignes des tables, vues ou clichs prciss derrire le FROM sont renvoyes. START WITH, CONNECT BY renvoie les lignes en parcourant une arborescence. GROUP BY groupe les lignes slectionnes en se basant sur la valeur de expr pour chaque ligne et renvoie une seule ligne par groupe.

Document1

Page 7 of 41

HAVING restreint les groupes de lignes renvoys ceux pour lesquels la condition spcifie est vraie. Sans cette clause, tous les groupes sont renvoys. UNION, UNION ALL, INTERSECT, MINUS Combine les lignes retournes par deux SELECT en utilisant une opration ensembliste. ORDER BY ordonne les lignes slectionnes : expr en utilisant la valeur de expr. Cette expression est base sur des colonnes prcises derrire le SELECT ou sur des colonnes appartenant des tables, vues ou clichs prsents derrire le FROM. position donne le numro de la colonne dans l'ordre du SELECT. ASC, DESC mode ascendant ou descendant. La valeur par dfaut ASC. FOR UPDATE "locke" les lignes slectionnes. NO WAIT retourne le contrle l'utilisateur si la commande SELECT essaye de bloquer une table utilise par un autre utilisateur.

Prrequis Pour pouvoir slectionner des lignes d'un objet (table, vue, clich) il faut soit tre propritaire de cet objet, soit avoir le privilge SELECT sur cet objet. Le privilge SELECT ANY TABLE permet de slectionner des lignes de n'importe quel objet appartenant n'importe quel utilisateur.

Document1

Page 8 of 41

Les jointures
La jointure est une opration permettant de combiner des informations venant de plusieurs tables. Les exemples suivants se limiteront deux tables, mais on peut joindre jusqu' 256 tables. Une jointure se formule simplement en spcifiant plusieurs tables derrire le FROM de la faon suivante : SELECT ... FROM nom_table1, nom_table2... WHERE predicat; Si on ne prcise pas de condition de slection, le rsultat obtenu sera le produit cartsien des tables prsentes derrire le FROM (rsultat non souhait en gnral). Il n'existe pas d'associations implicites ou explicites entre les tables dans SQL. Les associations entre les tables sont dfinies dynamiquement lors des interrogations, ce qui contribue la grande souplesse du langage sql et rend possible toute association mme si elle n'a pas t prvue lors de la dfinition et du chargement de la base.

Equi-jointure

Le rapprochement de chaque ligne de la table emp avec la ligne de la table dept ayant mme numro de dpartement permet d'obtenir la liste des employs avec la localit dans laquelle ils travaillent. Ce rapprochement entre deux colonnes appartenant deux tables diffrentes mais ayant le mme sens (ici le numro de dpartement) et venant vraisemblablement d'une relation 1-n lors de la conception (ici 1 entit dpartement pour n entits employs) est assez naturel. C'est pourquoi ce type de jointure porte le nom de jointure naturelle ou d'qui-jointure. Exemple : Donner pour chaque employ son nom et son lieu de travail. SELECT emp.nom, lieu FROM emp, dept WHERE emp.n_dept = dept.n_dept; Le fait que la colonne contenant le numro de dpartement ait le mme nom dans les deux tables a rendu ncessaire le pr-fixage par le nom de table dans le critre de jointure (clause WHERE). Le nom de colonne nom a lui aussi besoin d'tre prfix car il appartient aux deux tables (nom de la personne dans l'une et nom du dpartement dans l'autre). Par contre le nom de colonne lieu n'a pas besoin d'tre prfix car il n'y a pas d'ambigut sur la table laquelle cette colonne appartient.

Jointure d'une table elle-mme

Il peut tre utile de rassembler des informations venant d'une ligne d'une table avec des informations venant d'une autre ligne de la mme table. Exemple : Donner pour chaque employ le nom de son suprieur hirarchique. SELECT emp.nom, mgr.nom FROM emp, emp mgr WHERE emp.n_sup = mgr.num; Remarque : Dans ce cas, il faut imprativement renommer au moins l'une des deux occurrences de la table (ici emp) en lui donnant un synonyme, afin de pouvoir prfixer sans ambigut chaque nom de colonne.

Autres jointures

Le critre d'galit est le critre de jointure le plus naturel. Mais on peut utiliser d'autres types de comparaisons comme critres de jointures.

Document1

Page 9 of 41

Exemple : Quels sont les employs gagnant plus que SIMON? SELECT emp.nom, emp.salaire, emp.fonction FROM emp, emp j WHERE emp.salaire > j.salaire AND J.nom = 'SIMON';

Jointure externe

Lorsqu'une ligne d'une table figurant dans une jointure n'a pas de correspondant dans les autres tables, elle ne satisfait pas au critre d'qui-jointure et donc ne figure pas dans le rsultat de la jointure. Une option permet de faire figurer dans le rsultat les lignes satisfaisant la condition d'qui-jointure plus celles n'ayant pas de correspondant. Cette option s'obtient en accolant (+) au nom de colonne de la table dans laquelle manquent des lments, dans la condition d'qui-jointure. Exemple : Le dpartement 40 ne figurait pas dans le rsultat du SELECT prcdent. Par contre, il figurera dans le rsultat du SELECT suivant. SELECT emp.nom, lieu FROM emp, dept WHERE emp.n_dept(+) = dept.n_dept; Le (+) peut s'interprter comme l'ajout d'une ligne fictive dont toutes les colonnes ont la valeur NULL, et qui ralise la correspondance avec les lignes de l'autre table qui n'ont pas de correspondant rel. Dans l'exemple cidessus, la valeur de nom associe au dpartement 40 est la valeur NULL. Exemple : Retrouver les dpartements n'ayant aucun employ. SELECT dept.n_dept, emp.nom FROM emp,dept WHERE dept.n_dept = emp.n_dept (+) AND emp.nom IS NULL;

Document1

Page 10 of 41

Les oprateurs ensemblistes


Les oprateurs ensemblistes permettent de "joindre" des tables verticalement c'est--dire de combiner dans un rsultat unique des lignes provenant de deux interrogations. Les lignes peuvent venir de tables diffrentes mais aprs projection on doit obtenir des tables ayant mme schma de relation. Les oprateurs ensemblistes sont les suivants : l'union : UNION l'intersection : INTERSECT la diffrence relationnelle : MINUS La syntaxe d'utilisation est la mme pour ces trois oprateurs : SELECT ... { UNION | INTERSECT | MINUS } SELECT ... Dans une requte utilisant des oprateurs ensemblistes : Tous les SELECT doivent avoir le mme nombre de colonnes slectionnes, et leur types doivent tre un un identiques. Les conversions ventuelles doivent tre faites l'intrieur du SELECT l'aide des fonctions de conversion. Les doubles sont limins (DISTINCT implicite). Les noms de colonnes (titres) sont ceux du premier SELECT. La largeur des colonnes est la plus grande parmi tous les SELECT. Dans une requte on ne peut trouver qu'un seul ORDER BY. S'il est prsent, il doit tre mis dans le dernier SELECT et il ne peut faire rfrence qu'aux numros des colonnes et non pas leurs noms (car les noms peuvent tre diffrents dans chacune des interrogations). On peut combiner le rsultat de plus de deux SELECT au moyen des oprateurs UNION, INTERSECT, MINUS. SELECT ... UNION SELECT ... MINUS SELECT ... Dans ce cas l'expression est value de gauche droite, mais on peut modifier l'ordre d'valuation en utilisant des parenthses. SELECT ... UNION (SELECT ... MINUS SELECT ...)

Document1

Page 11 of 41

Les sous-interrogations (Imbrications & Corrlations)


Une caractristique puissante de SQL est la possibilit qu'un critre de recherche employ dans une clause WHERE (expression droite d'un oprateur de comparaison) soit lui-mme le rsultat d'un SELECT ; c'est ce qu'on appelle une sous-interrogation.

Sous-interrogation ramenant une seule valeur

Exemple : Quels sont les employs ayant la mme fonction que CODD ? SELECT nom FROM emp WHERE fonction = (SELECT fonction FROM emp WHERE nom = 'CODD'); Remarques une sous-interrogation qui ne ramne aucune ligne se termine avec un code d'erreur. une sous-interrogation ramenant plusieurs lignes provoquera aussi, dans ce cas, une erreur (pour traiter correctement ce cas, voir paragraphe ci-dessous)

Sous-interrogation ramenant plusieurs lignes

Une sous-interrogation peut ramener plusieurs lignes condition que l'oprateur de comparaison admette sa droite un ensemble de valeurs. Les oprateurs permettant de comparer une valeur un ensemble de valeurs sont : l'oprateur IN les oprateurs obtenus en ajoutant ANY ou ALL la suite d'un oprateur de comparaison classique (=, !=, >, >=, <, <=) o ANY: la comparaison est vraie si elle est vraie pour au moins un des lments de l'ensemble. o ALL: la comparaison sera vraie si elle est vraie pour tous les lments de l'ensemble. Exemple : Quels sont les employs gagnant plus que tous les employs du dpartement 30. SELECT nom, salaire FROM emp WHERE salaire > ALL (SELECT salaire FROM emp WHERE n_dept = 20);

Sous-interrogation ramenant plusieurs colonnes

Il est possible de comparer le rsultat d'un SELECT ramenant plusieurs colonnes une liste de colonnes. La liste de colonnes figurera entre parenthses gauche de l'oprateur de comparaison. Exemple : Quels sont les employs ayant mme fonction et mme suprieur que CODD? SELECT nom, fonction, n_sup FROM emp WHERE (fonction, n_sup) = (SELECT fonction, n_sup FROM emp WHERE nom = 'CODD');

Sous-interrogation synchronise avec l'interrogation principale

Dans les exemples prcdents, la sous-interrogation tait value d'abord, puis le rsultat pouvait tre utilis pour excuter l'interrogation principale. SQL sait galement traiter une sous-interrogation faisant rfrence une colonne de la table de l'interrogation principale. Le traitement dans ce cas est plus complexe car il faut valuer la sous-interrogation pour chaque ligne de l'interrogation principale.

Document1

Page 12 of 41

Exemple : Quels sont les employs ne travaillant pas dans le mme dpartement que leur suprieur hirarchique. SELECT nom FROM emp e WHERE n_dept != (SELECT n_dept FROM emp WHERE e.n_sup = num) AND n_sup IS NOT NULL; Il a fallu ici renommer la table emp de l'interrogation principale pour pouvoir la rfrencer dans la sousinterrogation. n_sup IS NOT NULL est ncessaire car dans le cas de JOUBERT la colonne n_sup est NULL et la sous-requte ne ramne alors aucune valeur.

Sous-interrogation ramenant au moins une ligne

L'oprateur EXISTS permet de construire un prdicat vrai si la sous-interrogation qui suit ramne au moins une ligne. Exemple : Quels sont les employs travaillant dans un dpartement qui a procd des embauches depuis le dbut de l'anne 94. SELECT * FROM emp e WHERE EXISTS (SELECT * FROM emp WHERE embauche >= '01-jan-94' AND n_dept = e.n_dept); Remarque : On peut inverser le sens de l'oprateur EXISTS en le faisant prcder de NOT.

Sous-interrogations multiples

Un SELECT peut comporter plusieurs sous-interrogations, soit imbriques, soit au mme niveau dans diffrents prdicats combins par des AND ou des OR. Exemple : Liste des employs du dpartement 10 ayant mme fonction que quelqu'un du dpartement de DUPONT. SELECT nom, fonction FROM emp WHERE n_dept = 10 AND fonction IN (SELECT fonction FROM emp WHERE n_dept = (SELECT n_dept FROM emp WHERE nom = 'DUPONT'));

Document1

Page 13 of 41

Expressions et Fonctions simples


Une expression est un ensemble de variables (contenu d'une colonne), de constantes et de fonctions combines au moyen d'oprateurs. Les fonctions prennent une valeur dpendant de leurs arguments qui peuvent tre euxmmes des expressions. Les expressions peuvent figurer : en tant que colonne rsultat d'un SELECT, dans une clause WHERE, dans une clause ORDER BY. Il existe trois types d'expressions correspondant chacun un type de donnes de SQL : arithmtique, chane de caractre, date. A chaque type correspondent des oprateurs et des fonctions spcifiques. SQL autorise les mlanges de types dans les expressions et effectuera les conversions ncessaires : dans une expression mlangeant dates et chanes de caractres, les chanes de caractres seront converties en dates, dans une expression mlangeant nombres et chanes de caractres, les chanes de caractres seront converties en nombre.

Expressions et fonctions arithmtiques

Une expression arithmtique peut contenir : des noms de colonnes des constantes des fonctions arithmtiques combins au moyen des oprateurs arithmtiques.

Oprateurs arithmtiques

Les oprateurs arithmtiques prsents dans sql sont les suivants : + addition ou + unaire - soustraction ou - unaire * multiplication / division Remarque : la division par 0 provoque une fin avec code d'erreur.

Priorit des oprateurs

Une expression arithmtique peut comporter plusieurs oprateurs. Dans ce cas, le rsultat de l'expression peut varier selon l'ordre dans lequel sont effectues les oprations. Les oprateurs de multiplication et de division sont prioritaires par rapport aux oprateurs d'addition et de soustraction. Des parenthses peuvent tre utilises pour forcer l'valuation de l'expression dans un ordre diffrent de celui dcoulant de la priorit des oprateurs. Exemple : Donner pour chaque commercial son revenu (salaire + commission). SELECT nom, salaire+comm FROM emp WHERE fonction = 'commercial';

Document1

Page 14 of 41

Exemple : Donner la liste des commerciaux classe par commission sur salaire dcroissant. SELECT nom, comm/salaire, comm, salaire FROM emp WHERE fonction = 'commercial' ORDER BY comm/salaire DESC; Exemple : Donner la liste des employs dont la commission est infrieure 5% du salaire. SELECT nom, salaire, comm FROM emp WHERE comm <= salaire *.05;

Fonctions arithmtiques

Dans ce paragraphe, ont t regroupes les fonctions ayant un ou plusieurs nombres comme arguments, et renvoyant une valeur numrique. [ROUND(n ,m )] ABS(nb) Renvoie la valeur absolue de nb. CEIL(nb) Renvoie le plus petit entier suprieur ou gal nb. COS(n) Renvoie le cosinus de n, n tant un angle exprim en radians. COSH(n) Renvoie le cosinus hyperbolique de n. EXP(n) Renvoie e puissance n. FLOOR(nb) Renvoie le plus grand entier infrieur ou gal nb. LN(n) Renvoie le logarithme nprien de n qui doit tre un entier strictement positif. LOG(m,n) Renvoie le logarithme en base m de n. m doit tre un entier strictement suprieur 1, et n un entier strictement positif. MOD(m,n) Renvoie le reste de la division entire de m par n, si n vaut 0 alors renvoie m. Attention, utilise avec au moins un de ses arguments ngatifs, cette fonction donne des rsultats qui peuvent tre diffrents d'un modulo classique. Cette fonction ne donne pas toujours un rsultat dont le signe du diviseur. POWER(m,n) Renvoie m puissance n, m et n peuvent tre des nombres quelconques entiers ou rels mais si m est ngatif n doit tre un entier. ROUND(n[,m]) Si m est positif, renvoie n arrondi (et non pas tronqu) m chiffres aprs la virgule. Si m est ngatif, renvoie n arrondi m chiffres avant la virgule. m doit tre un entier et il vaut 0 par dfaut. SIGN(nb) Renvoie -1 si nb est ngatif, 0 si nb est nul, 1 si nb est positif.

Document1

Page 15 of 41

SIN(n) Renvoie le sinus de n, n tant un angle exprim en radians. SINH(n) Renvoie le sinus hyperbolique de n. SQRT(nb) Renvoie la racine carre de nb qui doit tre un entier positif ou nul. TAN(n) Renvoie la tangente de n, n tant un angle exprim en radians. TANH(n) Renvoie la tangente hyperbolique de n. TRUNC(n[,m]) Si m est positif, renvoie n arrondi tronqu m chiffres aprs la virgule. Si m est ngatif, renvoie n tronqu m chiffres avant la virgule. m doit tre un entier et il vaut 0 par dfaut.

Exemple : Donner pour chaque employ son salaire journalier. SELECT nom, ROUND(salaire/22,2) FROM emp;

Expressions et fonctions sur les chanes de caractres Oprateur sur les chanes de caractres

Il existe un seul oprateur sur les chanes de caractres : la concatnation. Cet oprateur se note au moyen de deux caractres |(barre verticale) accols. Le rsultat d'une concatnation est une chane de caractres obtenue en crivant d'abord la chane gauche de || puis celle droite de ||. SELECT nom || '/' || fonction FROM emp;

Fonctions sur les chanes de caractres

Le paragraphe suivant contient les fonctions travaillant sur les chanes de caractres et renvoyant des chanes de caractres. CONCAT(chane1,chane2) Renvoie la chane obtenue en concatnant chane1 chane2. Cette fonction est quivalente l'oprateur de concatnation | |. INITCAP(chane) Renvoie chane en ayant mis la premire lettre de chaque mot en majuscule et toutes les autres en minuscule. Les sparateurs de mots sont les espaces et les caractres non alphanumriques. LOWER(chane) Renvoie chane en ayant mis toutes ses lettres en minuscules. LPAD(chane, long, [char]) Renvoie la chane obtenue en compltant, ou en tronquant, chane pour qu'elle ait comme longueur long en ajoutant ventuellement gauche le caractre (ou la chane de caractres) char. La valeur par dfaut de char est un espace. LTRIM(chane[,ens]) Renvoie la chane obtenue en parcourant partir de la gauche chane et en supprimant tous les caractres qui sont dans ens. On s'arrte quand on trouve un caractre qui n'est pas dans ens. La valeur de dfaut de ens est un espace.

Document1

Page 16 of 41

REPLACE(chaine, avant, aprs) Renvoie chaine dans laquelle toutes les occurrences de la chane de caractres avant ont t remplacs par la chane de caractres aprs. RPAD(chane, n, [char]) Renvoie la chane obtenue en compltant, ou en tronquant, chane pour qu'elle ait comme longueur long en ajoutant ventuellement droite le caractre (ou la chane de caractres) char. La valeur par dfaut de char est un espace. RTRIM(chane [, ens]) Renvoie la chane obtenue en parcourant partir de la droite chane et en supprimant tous les caractres qui sont dans ens. On s'arrte quand on trouve un caractre qui n'est pas dans ens. La valeur de dfaut de ens est un espace. SOUNDEX(chane) Renvoie la chane de caratres constitue de la reprsentation phontique des mots de chane. SUBSTR(chane, m [, n]) Renvoie la partie de chane commenant au caractre m et ayant une longueur de n. TRANSLATE(chane, avant, aprs) Renvoie une chane de caractres en remplaant chaque caractre de chane prsent dans avant par le caractre situ la mme position dans aprs. Les caractres de chane non prsents dans avant ne sont pas modifis. avant peut contenir plus de caractres que aprs, dans ce cas les caractres de avant sans correspondants dans aprs seront supprims de chane. UPPER(chane) Renvoie chane en ayant mis toutes ses lettres en majuscules.

Le paragraphe suivant contient les fonctions travaillant sur les chanes de caractres et renvoyant des entiers. INSTR(chane, sous-chane, debut, occ) Renvoie la position du premier caractre de chane correspondant l'occurrence occ de sous-chane en commenant la recherche la position dbut. LENGTH(chane) Renvoie la longueur de chane, exprime en nombre de caractres.

Expressions et fonctions sur les dates Oprateurs sur les dates

Au moyen des oprateurs arithmtiques + et - il est possible de construire les expressions suivantes : date +/- nombre : le rsultat est une date obtenue en ajoutant le nombre de jours nombre la date date. date2 - date1 : le rsultat est le nombre de jours entre les deux dates.

Fonctions sur les dates


ADD_MONTHS(date,n) Renvoie la date obtenue en ajoutant n mois date. n peut tre un entier quelconque. Si le mois obtenu a moins de jours que le jour de date, le jour obtenu est le dernier du mois. LAST_DAY(date) Renvoie la date du dernier jour du mois de date.

Document1

Page 17 of 41

MONTHS_BETWEEN(date2, date1) Renvoie le nombre de mois entre date2 et date1, si date2 est aprs date1 le rsultat est positif, sinon le rsultat est ngatif. Si les jours date2 et date1 sont les mmes, ou si ce sont les derniers jours du mois, le rsultat est un entier. La partie fractionnaire est calcule en considrant chaque jour comme 1/31me de mois NEXT_DAY(date,nom_du_jour) Renvoie la date du prochain jour de la semaine dont le nom est nom_de_jour. ROUND(date[,prcision]) Renvoie date arrondie l'unit spcifie dans prcision. L'unit de prcision est indique en utilisant un des masques de mise en forme de la date. On peut ainsi arrondir une date l'anne, au mois, la minute,... Par dfaut la prcision est le jour. SYSDATE Renvoie la date et l'heure courantes du systme d'exploitation hote. TRUNC(date[,prcision]) Renvoie date tronque l'unit spcifie dans prcision. Les paramtres sont analogues ceux de la fonction ROUND.

Exemple : Donner la date du lundi suivant l'embauche de chaque employ. SELECT NEXT_DAY (embauche,'MONDAY') FROM emp; Exemple : Donner la date d'embauche de chaque employ arrondie l'anne SELECT ROUND(embauche, 'Y') FROM emp; Exemple : Donner pour chaque employ le nombre de jours depuis son embauche. SELECT ROUND(SYSDATE-embauche) FROM emp;

Fonctions de conversion
ASCII(chane) Renvoie le nombre correspondant au code ascii du premier caractre de chaine. CHR(nombre) Renvoie le caractre dont nombre est le code ascii. TO_CHAR(nombre, format) Renvoie la chane de caractres en obtenue en convertissant nombre en fonction de format. Format est une chane de caractres pouvant contenir les caractres suivants : 9 reprsente un chiffre (non reprsent si non significatif) 0 reprsente un chiffre (reprsent mme si non significatif) . point dcimal apparent V dfinit la position du point dcimal non apparent , une virgule apparatra cet endroit $ un $ prcdera le premier chiffre significatif B le nombre sera reprsent par des blancs s'il vaut 0

Document1

Page 18 of 41

EEEE le nombre sera reprsent avec un exposant (le spcifier avant MI ou PR) MI le signe ngatif sera droite PR un nombre ngatif sera entre <> TO_CHAR(date, format) Renvoie conversion d'une date en chane de caractres. Le format indique quelle partie de la date doit apparatre, c'est une combinaison des codes suivants : scc sicle avec signe cc sicle sy,yyy anne (avec signe et virgule) y,yyy anne( avec virgule) yyyy anne yyy 3 derniers chiffres de l'anne yy 2 derniers chiffres de l'anne y dernier chiffre de l'anne q numro du trimestre dans l'anne ww numro de la semaine dans l'anne w numro de la semaine dans le mois mm numro du mois ddd numro du jour dans l'anne dd numro du jour dans le mois d numro du jour dans la semaine hh ou hh12 heure (sur 12 heures) hh24 heure sur 24 heures mi minutes ss secondes sssss secondes aprs minuit j jour du calendrier julien Les formats suivants permettent d'obtenir des dates en lettres (en anglais) : syear ou year anne en toutes lettres month nom du mois mon nom du mois abrg sur 3 lettres

Document1

Page 19 of 41

day nom du jour dy nom du jour abrg sur 3 lettres am ou pm indication am ou pm bc ou ad indication avant ou aprs Jsus Christ Les suffixes suivants modifient la prsentation du nombre auquel ils sont accols : th ajout du suffixe ordinat st, nd, rd, th sp nombre en toutes lettres Tout caractre spcial insr dans le format sera reproduit tel quel dans la chane de caractres rsultat. TO_DATE(chane, format) Permet de convertir une chane de caractres en donne de type date. Le format est identique celui de la fonction TO_CHAR. TO_NUMBER(chane) Convertit chane en sa valeur numrique.

Remarque : On peut galement insrer dans le format une chane de caractres quelconque, condition de la placer entre guillemets"". Exemple : SELECT TO_CHAR (embauche, 'DD/MM/YY HH24:MI:SS') FROM emp; Exemple : Donner la liste de tous les employs dont le nom ressemble DUPONT. SELECT nom FROM emp WHERE SOUNDEX(nom) = SOUNDEX('DUPONT');

Exemple : Donner la liste de tous les noms des employs en ayant supprim tous les 'L' et les 'E' en tte des noms. SELECT LTRIM(nom, 'LE') FROM emp; Exemple : Donner la liste de tous les noms des employs en ayant remplac les A et les M par des * dans les noms. SELECT TRANSLATE (nom, 'AM','**') FROM emp; Exemple : Afficher tous les salaires avec un $ en tte et au moins trois chiffres (dont deux dcimales). SELECT TO_CHAR (salaire,'<MATH>99900.00') FROM emp;

Autres fonctions
GREATEST(expr1, expr2,...) Renvoie la plus grande des valeurs expr1, expr2,.... Toutes les expressions sont converties au format de expr1 avant comparaison.

Document1

Page 20 of 41

LEAST Renvoie la plus petite des valeurs expr1, expr2,.... Toutes les expressions sont converties au format de expr1 avant comparaison. NVL(expr_1, expr_2) Prend la valeur expr_1, sauf si expr_1 est NULL auquel cas NVL prend la valeur expr_2. Une valeur NULL en SQL est une valeur non dfinie. Lorsque l'un des termes d'une expression a la valeur NULL, l'expression entire prend la valeur NULL. D'autre part, un prdicat comportant une comparaison avec une expression ayant la valeur NULL prendra toujours la valeur faux. La fonction NVL permet de remplacer une valeur NULL par une valeur significative. DECODE(crit, val_1, res_1 [, val_2, res_2 ...], def) Cette fonction permet de choisir une valeur parmi une liste d'expressions, en fonction de la valeur prise par une expression servant de critre de slection. Le rsultat rcupr est : o res_1 si l'expression crit a la valeur val_1 o res_2 si l'expression crit a la valeur val_2 o def (la valeur par dfaut) si l'expression crit n'est gale aucune des expressions val_1, val_2,...,. Les expressions rsultats res_1, res_2, ..., def peuvent tre de types diffrents : caractre et numrique, ou caractre et date (le rsultat est du type de la premire expression rencontr dans le DECODE). La fonction DECODE permet galement de mlanger dans une colonne rsultat des informations venant de plusieurs colonnes d'une mme table.

Exemple : Donner pour chaque employ ses revenus (salaire + commission). SELECT nom, salaire, comm, salaire+NVL(comm, 0) FROM emp; Exemple : Donner la liste des employs avec pour chacun d'eux sa catgorie (prsident = 1, directeur = 2, autre = 3) SELECT nom, DECODE(fonction, 'president', 1, 'directeur', 2, 3) FROM emp; Exemple : Donner la liste des employs en les identifiant par leur fonction dans le dpartement 10 et par leur nom dans les autres dpartements. SELECT DECODE (n_dept, 10, fonction, nom) FROM emp;

Document1

Page 21 of 41

Les fonctions de groupe


Dans les exemples prcdents, chaque ligne rsultat d'un SELECT tait le rsultat de calculs sur les valeurs d'une seule ligne de la table consulte. Il existe un autre type de SELECT qui permet d'effectuer des calculs sur l'ensemble des valeurs d'une colonne. Ces calculs sur l'ensemble des valeurs d'une colonne se font au moyen de l'une des fonctions suivantes : AVG([DISTINCT | ALL] expression) Renvoie la moyenne des valeurs d'expression. COUNT(* | [DISTINCT | ALL] expression) Renvoie le nombre de lignes du rsultat de la requte. Si expression est prsent, on ne compte que les lignes pour lesquelles cette expression n'est pas NULL. MAX([DISTINCT | ALL] expression) Renvoie la plus petite des valeurs d'expression. MIN([DISTINCT | ALL] expression) Renvoie la plus grande des valeurs d'expression. STDDEV([DISTINCT | ALL] expression) Renvoie l'cart-type des valeurs d'expression. SUM([DISTINCT | ALL] expression) Renvoie la somme des valeurs VARIANCE([DISTINCT | ALL] expression) Renvoie la variance des valeurs d'expression. DISTINCT Indique la fonction de groupe de ne prendre en compte que des valeurs distinctes. ALL Indique la fonction de groupe de prendre en compte toutes les valeurs, c'est la valeur par dfaut.

Exemple : Donner le total des salaires du dpartement 10. SELECT SUM(salaire) FROM emp WHERE n_dept = 10; Exemple : Donner le nom, la fonction et le salaire de l'employ (ou des employs) ayant le salaire le plus lev. SELECT nom, fonction, salaire FROM emp WHERE salaire = (SELECT MAX(salaire) FROM emp); Remarques Ces SELECT sont diffrents de ceux vus prcdemment. Il est, par exemple, impossible de demander en rsultat la fois une colonne et une fonction de groupe. un SELECT comportant une fonction de groupe peut tre utilis dans une sous-interrogation.

Valeurs NULL

Aucune des fonctions de groupe ne tient compte des valeurs NULL l'exception de count(*). Ainsi, SUM(col) est la somme des valeurs non NULL de la colonne col. De mme AVG est la somme des valeurs non NULL divise par le nombre de valeurs non NULL.

Document1

Page 22 of 41

Calcul sur plusieurs groupes

Il est possible de subdiviser la table en groupes, chaque groupe tant l'ensemble des lignes ayant une valeur commune. C'est la clause GROUP BY qui permet de dcouper la table en plusieurs groupes : GROUP BY expr_1, expr_2, ... Si on a une seule expression, ceci dfinit les groupes comme les ensembles de lignes pour lesquelles cette expression prend la mme valeur. Si plusieurs expressions sont prsentes les groupes sont dfinis de la faon suivante : parmi toutes les lignes pour lesquelles expr_1 prend la mme valeur, on regroupe celles ayant expr_2 identique, ... Un SELECT de groupe avec une clause GROUP BY donnera une ligne rsultat pour chaque groupe. Exemple : Total des salaires pour chaque dpartement SELECT SUM(salaire), n_dept FROM emp GROUP BY n_dept; Remarque : Dans la liste des colonnes rsultat d'un SELECT comportant une fonction de groupe, ne peuvent figurer que des caractristiques de groupe, c'est--dire : soit des fonctions de groupe ; soit des expressions figurant dans le GROUP BY.

Slection des groupes

De la mme faon qu'il est possible de slectionner certaines lignes au moyen de la clause WHERE, il est possible dans un SELECT comportant une fonction de groupe de slectionner par la clause HAVING, qui se place aprs la clause GROUP BY. Le prdicat dans la clause HAVING suit les mmes rgles de syntaxe qu'un prdicat figurant dans une clause WHERE. Cependant, il ne peut porter que sur des caractristiques du groupe : fonction de groupe ou expression figurant dans la clause GROUP BY, dans ce cas la clause HAVING doit tre place aprs la clause GROUP BY. Exemple : Donner la liste des salaires moyens par fonction pour les groupes ayant plus de deux employs. SELECT fonction, COUNT(*), AVG(salaire) FROM emp GROUP BY fonction HAVING COUNT(*) > 2; Remarque : Un SELECT de groupe peut contenir la fois une clause WHERE et une clause HAVING. La clause WHERE sera d'abord applique pour slectionner les lignes, puis les groupes seront constitus partir des lignes slectionnes, et les fonctions de groupe seront values. Exemple : Donner le nombre d'ingnieurs ou de commerciaux des dpartements ayant au moins deux employs de ces catgories. SELECT n_dept, COUNT(*) FROM emp WHERE fonction in ('ingenieur', 'commercial') GROUP BY n_dept HAVING COUNT(*) >= 2; Une clause HAVING peut comporter une sous-interrogation.

Document1

Page 23 of 41

Exemple : Quel est le dpartement ayant le plus d'employs? SELECT n_dept, COUNT(*) FROM emp GROUP BY n_dept HAVING COUNT(*) = (SELECT MAX(COUNT(*)) FROM emp GROUP BY n_dept) ;

Fonction de groupe deux niveaux

Il est possible d'appliquer au rsultat d'un SELECT avec GROUP BY un deuxime niveau de fonction de groupe. Exemple : la fonction MAX peut tre applique aux nombres d'employs de chaque dpartement pour obtenir le nombre d'employs du dpartement ayant le plus d'employs. SELECT MAX(COUNT(*)) FROM emp GROUP BY n_dept ;

Document1

Page 24 of 41

Modification une base

Dfinition

Le langage de manipulation de donnes est le langage permettant de modifier les informations contenues dans une base de donnes. L'unit manipule est la ligne. Il existe trois commandes SQL permettant d'effectuer les trois types de modifications des donnes : ajout, modification et suppression.

Ajout de lignes Dfinition

La commande INSERT permet d'insrer une ligne dans une table en spcifiant les valeurs insrer. La syntaxe est la suivante : INSERT INTO nom_table(nom_col1, nom_col2, ...) VALUES (val1, val2...) La liste des noms de colonne est optionnelle. Si elle est omise, la liste des colonnes sera par dfaut la liste de l'ensemble des colonnes de la table dans l'ordre de la cration de la table. Si une liste de colonnes est spcifie, les colonnes ne figurant pas dans la liste auront la valeur NULL. Il est possible d'insrer dans une table des lignes provenant d'une autre table. La syntaxe est la suivante : INSERT INTO nom_table(nom_col1, nom_col2, ...) SELECT ... Le SELECT peut contenir n'importe quelle clause sauf un ORDER BY qui impliquerait un classement des lignes contraire l'esprit du relationnel. Exemple : Insrer dans la table bonus les noms et salaires des directeurs. INSERT INTO bonus SELECT nom, salaire FROM emp WHERE fonction = 'directeur';

Syntaxe

INSERT INTO [schema.]table | view [ (column [, column] ...) ] VALUES (expr [, expr] ...) | subquery schema est le nom du schma contenant la table ou la vue. Le schma par dfaut est celui de l'utilisateur qui excute la requte. table / view est le nom de la table dans laquelle les lignes seront insrs. Si c'est un nom de vue qui est prcis, les donnes seront insres dans la table base sur la vue. column nom des colonnes

Document1

Page 25 of 41

VALUES Expr / subquery

Valeurs des colonnes Prrequis Pour pouvoir insrer des lignes dans une table il faut soit tre propritaire de cet objet, soit avoir le privilge INSERT sur cette table. Le privilge INSERT ANY TABLE permet d'insrer des lignes dans n'importe quelle table appartenant n'importe quel utilisateur.

Modification de lignes Dfinition

La commande UPDATE permet de modifier les valeurs d'une ou plusieurs colonnes, dans une ou plusieurs lignes existantes d'une table. La syntaxe est la suivante : UPDATE nom_table SET nom_col1 = {expression1 | ( SELECT ...) }, nom_col2 = {expression2 | ( SELECT ...) } WHERE prdicat; Les valeurs des colonnes nom_col1, nom_col2, ... sont modifies dans toutes les lignes satisfaisant au prdicat. En l'absence d'une clause WHERE, toutes les lignes sont mises jour. Les expressions expression1, expression2,... peuvent faire rfrence aux anciennes valeurs de la ligne. Exemple : Augmenter de 10% les ingnieurs. UPDATE emp SET salaire = salaire * 1.1 WHERE fonction = 'ingenieur' ;

Syntaxe
UPDATE [schema.]table | view [alias] SET (column [, column] ...) = (subquery) | column = expr | (subquery) [, (column [, column] ...) = (subquery) | column = expr | (subquery) ] ... [WHERE condition] schema est le nom du schma contenant la table ou la vue modifier. Le schma par dfaut est celui de l'utilisateur qui excute la requte. table, view est le nom de la table mettre jour. Si c'est un nom de vue, la table mise jour est celle sur laquelle la vue est dfinie. alias est un alias assign la table. les alias sont gnralement utiliss dans des UPDATE contenant des requtes. column est le nom de la colonne qui sera modifie.

Document1

Page 26 of 41

expr est la nouvelle valeur de la colonne. subquery est un SELECT qui renvoie les nouvelles valeurs affectes aux colonnes correspondantes. WHERE restreint les lignes modifies celles pour lesquelles la condition est vraie. Si on omet cette clause toutes les lignes sont modifies.

Prrequis Pour pouvoir modifier des lignes appartenant une table, il faut soit tre propritaire de cet objet, soit avoir le privilge UPDATE sur cette table. le privilge UPDATE ANY TABLE permet de slectionner des lignes de n'importe quel objet appartenant n'importe quel utilisateur.

Suppression de lignes Dfinition

La commande DELETE permet de supprimer des lignes d'une table. La syntaxe est la suivante : DELETE FROM nom_table WHERE prdicat ; Toutes les lignes pour lesquelles prdicat est valu vrai sont supprimes. En l'absence de clause WHERE, toutes les lignes de la table sont supprimes.

Syntaxe
DELETE [FROM] [schema.]table | view [alias] [WHERE condition]

schema est le nom du schma contenant la table ou la vue dtruire. Le schma par dfaut est celui de l'utilisateur qui excute la requte. table, view est le nom de la table ou de la vue contenant les lignes qui seront dtruites. Si c'est un nom de vue, les lignes dtruites appartiennent la table sur laquelle la vue est base. alias Est un alias assign la table. les alias sont gnralement utiliss dans des DELETE contenant des requtes. WHERE Dtruit seulement les lignes satisfaisant la condition. Cette condition peut rfrencer la table et peut contenir des sous-requtes. Si cette clause est omise dtruit toutes les lignes.

Prrequis Pour dtruire des lignes appartenant une table, il faut soit tre propritaire de la table, soit avoir le privilge DELETE sur cette table.

Document1

Page 27 of 41

Le privilge DELETE ANY TABLE permet un utilisateur de dtruire des lignes se trouvant dans n'importe quelle table, ou n'importe quelle vue base sur une table.

Suppression d'une table Dfinition

La commande DROP permet de dtruire une table et toutes ses donnes.

Syntaxe

DROP TABLE [schema.]table [CASCADE CONSTRAINTS] schma est le nom du schma contenant la table ou la vue dtruire Le schma par dfaut est celui de l'utilisateur qui excute la requte. table est le nom de la table dtruire. CASCADE CONSTRAINTS Supprime toutes les contraintes qui se rfrent la table supprime. Prrequis Pour pouvoir dtruire une table il faut soit tre propritaire de cette table, soit avoir le privilge DROP ANY TABLE.

Gestion des transactions

Une transaction est un ensemble de modifications de la base qui forme un tout indivisible. Il faut effectuer ces modifications entirement ou pas du tout, sous peine de laisser la base dans un tat incohrent. Les Systmes de Gestion de Bases de Donnes permettent aux utilisateurs de grer leurs transactions. Ils peuvent tout moment : Valider la transaction en cours par la commande COMMIT. Les modifications deviennent dfinitives et visibles tous les utilisateurs. Annuler la transaction en cours par la commande ROLLBACK. Toutes les modifications depuis le dbut de la transaction sont alors dfaites.

En cours de transaction, seul l'utilisateur ayant effectu les modifications les voit. Ce mcanisme est utilis par les systmes de gestion de bases de donnes pour assurer l'intgrit de la base en cas de fin anormale d'une tche utilisateur : il y a automatiquement ROLLBACK des transactions non termines. ORACLE est un systme transactionnel qui assure la cohrence des donnes en cas de mise jour de la base, mme si plusieurs utilisateurs lisent ou modifient les mmes donnes simultanment. ORACLE utilise un mcanisme de verrouillage pour empcher deux utilisateurs d'effectuer des transactions incompatibles et rgler les problmes pouvant survenir. ORACLE permet le verrouillage de certaines units (table ou ligne) automatiquement ou sur demande de l'utilisateur. Les verrous sont librs en fin de transaction.

Document1

Page 28 of 41

Les tables
Le langage de dfinition des donnes est le langage permettant de crer ou de modifier le schma d'une relation et donc d'une table. Il permet de crer, de modifier et de supprimer non seulement les tables, mais aussi les vues, les index et les clusters.

Crer une table

La table est la structure de base contenant les donnes des utilisateurs. Quand on cre une table, on peut spcifier les informations suivantes : la dfinition des colonnes, les contraintes d'intgrit, La TableSpace contenant la table, les caractristiques de stockage, le cluster contenant la table, les donnes rsultant d'une ventuelle requte.

Cration simple

La commande de cration de table la plus simple ne comportera que le nom et le type de chaque colonne de la table. L'on peut crer une table par la commande CREATE TABLE en spcifiant le nom et le type de chaque colonne. A la cration, la table sera vide mais un certain espace lui sera allou. La syntaxe est la suivante : CREATE TABLE nom_table (nom_col1 TYPE1, nom_col2 TYPE2, ...) L'option NOT NULL assure qu'ORACLE interdit lors d'un INSERT ou d'un UPDATE que cette colonne contienne la valeur NULL, par dfaut elle est autorise.

Cration avec Insertion de donnes

On peut insrer des donnes dans une table lors de sa cration par la commande suivante : CREATE TABLE nom_table [(nom_col1, nom_col2, ...)] AS SELECT... On peut ainsi, en un seul ordre SQL crer une table et la remplir avec des donnes provenant du rsultat d'un SELECT. On n'a pas besoin alors de spcifier de type pour les colonnes : les types des donnes sont ceux provenant du SELECT. Si des conversions de type sont faire, on peut dans le SELECT utiliser les fonctions TO_CHAR, TO_DATE, TO_NUMBER. Par dfaut les noms des colonnes de la nouvelle table sont les noms des colonnes du SELECT. Si des expressions apparaissent dans le SELECT, les colonnes correspondantes doivent imprativement tre renommes.

Document1

Page 29 of 41

Le SELECT peut contenir des fonctions de groupes mais pas d'ORDER BY car les lignes d'une table ne peuvent pas tre classes. On peut, et mme on doit, quand on cre une table dfinir les contraintes d'intgrit que devront respecter les donnes que l'on mettra dans la table (voir un peu plus bas).

Les types de donnes


NUMBER[(longueur,[prcision]) Ce type de donnes permet de stocker des donnes numriques la fois entires et relles dont la valeur est comprise entre 10^-130 et 10^125 avec une prcision de 38 chiffres. longueur prcise le nombre maximum de chiffres significatifs stocks (par dfaut 38), prcision donne le nombre maximum de chiffres aprs la virgule (par dfaut 38), sa valeur peut tre comprise entre -84 et 127. Une valeur ngative signifie que le nombre est arrondi gauche de la virgule.

CHAR(longueur) Ce type de donnes permet de stocker des chanes de caractres de longueur fixe. Longueur doit tre infrieur 255, sa valeur par dfaut est 1. VARCHAR(longueur) Ce type de donnes permet de stocker des chanes de caractres de longueur variable. Longueur doit tre infrieur 2000, il n'y a pas de valeur par dfaut. DATE Ce type de donnes permet de stocker des donnes constitues d'une date et d'une heure.

RAW(longueur) Ce type de donnes permet de stocker des caractres non imprimables. LONG Ce type de donnes permet des stocker des chanes de caractres de longueur variable et infrieure 2^31 -1. Les colonnes de ce type sont soumises certaines restrictions ; o une table ne peut pas contenir plus d'une colonne de ce type ; o les colonnes de ce type ne peuvent pas apparatre dans des contraintes d'intgrit ; o les colonnes de ce type ne peuvent pas tre indexes ; o les colonnes de ce type ne peuvent pas apparatre dans des clauses : WHERE, GROUP BY, ORDER BY ou CONNECT BY ainsi que dans un DISTINCT.

Contraintes d'intgrit

A la cration d'une table, les contraintes d'intgrit se dclarent de la faon suivante : CREATE TABLE nom_table ( nom_col_1 type_1, nom_col_2 type_2, ... nom_col_n type_n CONSTRAINT [nom_contrainte_1] contrainte_1, CONSTRAINT [nom_contrainte_2] contrainte_2, ... CONSTRAINT [nom_contrainte_m] contrainte_m );

Document1

Page 30 of 41

Ou bien de la faon suivante : CREATE TABLE nom_table ( nom_col_1 type_1 CONSTRAINT [nom_contrainte_1_1] contrainte_1_1 CONSTRAINT [nom_contrainte_1_2] contrainte_1_2 ... CONSTRAINT [nom_contrainte_1_m] contrainte_1_m, nom_col_2 type_2 CONSTRAINT [nom_contrainte_2_1] contrainte_2_1 CONSTRAINT [nom_contrainte_2_2] contrainte_2_2 ... CONSTRAINT [nom_contrainte_2_p] contrainte_2_p, ... nom_col_n type_n CONSTRAINT [nom_contrainte_n_1] contrainte_n_1 CONSTRAINT [nom_contrainte_n_2] contrainte_n_2 ... CONSTRAINT [nom_contrainte_n_q] contrainte_n_q ); Les contraintes diffrentes que l'on peut dclarer sont les suivantes : NOT NULL La colonne ne peut pas contenir de valeurs NULL. UNIQUE Chaque ligne de la table doit avoir une valeur diffrente ou NULL pour cette (ou ces) colonne. PRIMARY KEY Chaque ligne de la table doit avoir une valeur diffrente pour cette (ou ces) colonne. les valeurs NULL sont rejetes. FOREIGN KEY Cette colonne fait rfrence une colonne cl d'une autre table. CHECK Permet de spcifier les valeurs acceptables pour une colonne.

Modifier une table

On peut modifier dynamiquement la dfinition d'une table grce a la commande ALTER TABLE. Deux types de modifications sont possibles : ajout d'une colonne et modification d'une colonne existante. Il n'est pas possible de supprimer une colonne. Par contre une colonne qui n'est plus utilise peut tre mise la valeur NULL, auquel cas elle n'occupe plus d'espace disque. Si on dsire vraiment supprimer une colonne, il faut : se crer une nouvelle table sans la colonne en question dtruire l'ancienne table, donner la nouvelle table le nom de l'ancienne.

Ajouter une colonne

La commande suivante permet d'ajouter une ou plusieurs colonnes une table existante : ALTER TABLE nom_table ADD (nom_col1 TYPE1, nom_col2 TYPE2, ...)

Document1

Page 31 of 41

Les types possibles sont les mmes que ceux dcrits avec la commande CREATE TABLE. Si la table contient dj des lignes, la nouvelle colonne aura des valeurs NULL pour les lignes existantes.

Modifier une colonne

Il est possible de modifier la dfinition d'une colonne, condition que la nouvelle dfinition soit compatible avec le contenu de la colonne et en respectant les contraintes suivantes : dans tous les cas il est possible d'augmenter la taille d'une colonne ; il est possible de diminuer la taille, ou mme de changer le type d'une colonne vide ; on peut spcifier NOT NULL si la colonne ne contient aucune valeur NULL ; on peut dans tous les cas spcifier NULL pour autoriser les valeurs NULL.

Supprimer une table

La commande DROP TABLE permet de supprimer une table, sa syntaxe est la suivante : DROP TABLE nom_table ; La table nom_table est alors supprime. La dfinition de la table ainsi que son contenu sont dtruits, et l'espace occup par la table est libr.

Renommer une table

On a la possibilit de changer le nom d'une table par la commande RENAME, la syntaxe est la suivante : RENAME ancien_nom TO nouveau_nom ;

Document1

Page 32 of 41

Les vues
Les vues permettent d'assurer l'objectif d'indpendance logique. Grce elles, chaque utilisateur pourra avoir sa vision propre des donnes. On a vu que le rsultat d'un SELECT est lui-mme une table. Une telle table, qui n'existe pas dans la base mais est cre dynamiquement lors de l'excution du SELECT, peut tre vue comme une table relle par les utilisateurs. Pour cela, il suffit de cataloguer le SELECT en tant que vue. Les utilisateurs pourront consulter la base, ou modifier la base (avec certaines restrictions) travers la vue, c'est-dire manipuler la table rsultat du SELECT comme si c'tait une table relle.

Crer une vue

La commande CREATE VIEW permet de crer une vue en spcifiant le SELECT constituant la dfinition de la vue : CREATE VIEW nom_vue [(nom_col1,...)] AS SELECT ... WITH CHECK OPTION ; La spcification des noms de colonnes de la vue est facultative. Par dfaut, les noms des colonnes de la vue sont les mmes que les noms des colonnes rsultat du SELECT (si certaines colonnes rsultat du SELECT sont des expressions, il faut renommer ces colonnes dans le SELECT, ou spcifier les noms de colonne de la vue). Une fois cre, une vue s'utilise comme une table. Il n'y a pas de duplication des informations mais stockage de la dfinition de la vue. Exemple : Cration d'une vue constituant une restriction de la table emp aux employs du dpartement 10. CREATE VIEW emp10 AS SELECT * FROM emp WHERE n_dept = 10 ; Le CHECK OPTION permet de vrifier que la mise jour ou l'insertion faite travers la vue ne produisent que des lignes qui font partie de la slection de la vue. Ainsi donc, si la vue emp10 a t cre avec CHECK OPTION on ne pourra travers cette vue ni modifier, ni insrer des employs ne faisant pas partie du dpartement 10. Il est possible d'effectuer des INSERT et des UPDATE travers des vues, sous deux conditions : le SELECT dfinissant la vue ne doit pas comporter de jointure, les colonnes rsultat du SELECT doivent tre des colonnes relles et non pas des expressions. Exemple : Modification des salaires du dpartement 10 travers la vue emp10. UPDATE emp10 SET sal = sal *1.1; Toutes les lignes de la table emp, telles que le contenu de la colonne n_dept est gal 10 seront modifies.

Supprimer une vue

Une vue peut tre dtruite par la commande : DROP VIEW nom_vue;

Document1

Page 33 of 41

Renommer une vue

On peut renommer une vue par la commande : RENAME ancien_nom TO nouveau_nom;

Document1

Page 34 of 41

Les index

Introduction - Gnralits

Selon le modle relationnel les slections peuvent tre faites en utilisant le contenu de n'importe quelle colonne et les lignes sont stockes dans n'importe quel ordre. Considrons le SELECT suivant : SELECT * FROM emp WHERE nom = 'MARTIN' Un moyen de retrouver la ou les lignes pour lesquelles ,font color=red>nom est gal MARTIN est de balayer toute la table. Un tel moyen d'accs conduit des temps de rponse prohibitifs pour des tables dpassant quelques centaines de lignes. Une solution offerte par tous les systmes de gestion de bases de donnes est la cration d'index, qui permettra de satisfaire aux requtes les plus frquentes avec des temps de rponse acceptables. Un index sera matrialis par la cration de blocs disque contenant des couples (valeurs d'index, numro de bloc) donnant le numro de bloc disque dans lequel se trouvent les lignes correspondant chaque valeur d'index.

Structure d'un index

Les index sont des structures permettant de retrouver une ligne dans une table partir de la valeur d'une colonne ou d'un ensemble de colonnes. Un index contient la liste trie des valeurs des colonnes indexes avec les adresses des lignes (numro de bloc dans la partition et numro de ligne dans le bloc) correspondantes. Tous les index oracle sont stocks sous forme d'arbres quilibrs (btree) : une structure arborescente permet de retrouver rapidement dans l'index la valeur de cl cherche, et donc l'adresse de la ligne correspondante dans la table. Dans un tel arbre, toutes les feuilles sont la mme profondeur, et donc la recherche prend approximativement le mme temps quelle que soit la valeur de la cl. Lorsqu'un bloc d'index est plein, il est clat en deux blocs. en consquence, tous les blocs d'index ont un taux de remplissage variant de 50% 100%. Sans index on balaie squentiellement toute la table quelle que soit la position de llment recherch.

Utilisation des index

L'adjonction d'un index une table ralentit les mises jour (insertion, suppression, modification de la cl) mais acclre beaucoup la recherche d'une ligne dans la table. L'index acclre la recherche d'une ligne partir d'une valeur donne de cl, mais aussi la recherche des lignes ayant une valeur d'index suprieure ou infrieure une valeur donne, car les valeurs de cls sont tries dans l'index.

Document1

Page 35 of 41

Exemple : Les requtes suivantes bnficieront d'un index sur le champ n_dept. SELECT * FROM emp WHERE num = 16034 ; SELECT * FROM emp WHERE num >= 27234 ; SELECT * FROM emp WHERE num BETWEEN 16034 AND 27234 ; Un index est utilisable mme si le critre de recherche est constitu seulement du dbut de la cl. Exemple : La requte suivante bnficiera d'un index sur la colonne nom. SELECT * FROM emp WHERE nom LIKE 'M%' ; Par contre si le dbut de la cl n'est pas connu, l'index est inutilisable. Exemple : La requte suivante ne bnficiera pas d'un index sur le champ nom. SELECT * FROM emp WHERE ename LIKE '?????????' ;

Valeurs NULL

Elles ne sont pas reprsentes dans l'index, ceci afin de minimiser le volume ncessaire pour stocker l'index. En contrepartie, l'index ne sera d'aucune utilit pour retrouver les valeurs NULL lorsque le critre de recherche est du type IS NULL.

Conversions

L'index n'est utilisable que si le critre de slection est le contenu de la colonne indexe, sans aucune transformation. Par exemple un index sur salaire ne sera pas utilis pour la requte suivante : SELECT * FROM emp WHERE salaire * 12 > 300000 ; Attention en particulier aux conversions de type qui peuvent empcher l'utilisation de l'index. SQL est un langage typ, chaque type de donnes (numrique, caractre, date) ayant ses propres oprateurs, ses propres fonctions et sa propre relation d'ordre. En consquence, si dans une expression, figurent la fois un nombre et une chane de caractres, SQL convertira la chane de caractres en nombre. De mme si dans une expression, figurent la fois une chane de caractres et une date, SQL convertira la chane de caractres en date. Or, dans un prdicat du type : WHERE fonction(col_indexe) = constante SQL ne peut pas utiliser l'index. Ceci peut se produire, de faon insidieuse, lorsque SQL est oblig d'ajouter un appel une fonction de conversion cause d'une discordance de type. Exemple : Le prdicat suivant ne bnficiera pas d'un index sur le champ embauche. SELECT * FROM emp WHERE embauche LIKE '????' ; En effet, SQL est oblig d'effectuer une conversion, et le prdicat qui sera valu est : WHERE TO_CHAR(embauche) LIKE '????'

Document1

Page 36 of 41

Le critre de recherche est une fonction de embauche, et non le champ embauche lui-mme, dans ce cas l'index est inutilisable.

Choix des index

Indexer en priorit : 1. les cls primaires 2. les colonnes servant de critre de jointure 3. les colonnes servant souvent de critre de recherche Ne pas indexer : 1. les colonnes contenant peu de valeurs distinctes (index alors peu efficace) 2. les colonnes frquemment modifies

Crer un index

Un index peut tre cr par la commande suivante : CREATE [UNIQUE] INDEX nom_index ON nom_table (nom_col1 , nom_col2, ...) [PCTFREE nombre] [COMPRESS | NOCOMPRESS] [ROWS = nombre_lignes] ; dans laquelle : L'option UNIQUE indique que l'on interdit que deux lignes aient la mme valeur dans la colonne indexe. PCTFREE prcise le pourcentage de place laisse libre dans les blocs d'index la cration de l'index. Cette place libre vitera une rorganisation de l'index des les premires insertions de nouvelles cls. La valeur par dfaut est 20%. NOCOMPRESS indique que l'on ne veut pas comprimer les cls. nombre_lignes est une estimation du nombre de lignes, permettant d'optimiser l'algorithme de classement.. Un index peut tre cr dynamiquement sur une table contenant dj des lignes. Il sera ensuite tenu jour automatiquement lors des modifications de la table. Un index peut porter sur plusieurs colonnes, la cl d'accs sera alors la concatnation des diffrentes colonnes. On peut crer plusieurs index indpendants sur une mme table. Les requtes SQL sont transparentes au fait qu'il existe un index ou non. C'est l'optimiseur du systme de gestion de bases de donnes qui, au moment de l'excution de chaque requte, recherche s'il peut s'aider ou non d'un index.

Index comprim et non comprim

Les cls dans les index peuvent tre comprimes ou non. La compression est une technique permettant de rduire dans des proportions trs importantes (d'autant plus que la cl est longue) le volume de l'index. En contrepartie, il faut parfois un traitement supplmentaire pour recomposer la cl lors des mises jour de l'index. Par dfaut, les index sont comprims, les avantages de rduction de taille l'emportant sur les inconvnients dans la plupart des cas. sql sait excuter certaines requtes directement au niveau de l'index sans passer par le segment de donnes, si l'index est non comprim et si tous les champs rsultats de la requte sont dans l'index.

Document1

Page 37 of 41

Exemple : L'index cre par : CREATE INDEX x ON emp (num, nom) nocompress ; permettra de rpondre la question : SELECT nom FROM emp WHERE num < 17217 ; sans lire la table puisque toutes les informations se trouvent dans l'index et que l'index est non concatn.

Index concatn

Un index concatn est un index portant sur plusieurs colonnes. Exemple : CREATE INDEX xemp ON (n_dept,num) ; Les index concatns peuvent tre utiliss pour matrialiser une cl compose de plusieurs colonnes. SQL sait utiliser un index concatn mme si le critre de recherche ne porte pas sur toutes les colonnes prsentes dans l'index. Exemple : L'index ci-dessus est utilisable si l'on ne connait que le numro de dpartement. SELECT nom FROM emp WHERE n_dept = 20 ;

Supprimer un index

Un index peut tre supprim dynamiquement par la commande : DROP INDEX nom_index; L'espace libr reste attach au segment d'index de la table : il pourra tre utilis pour un autre index sur la mme table. L'espace ne sera rendu la partition que lors de la suppression de la table.

Document1

Page 38 of 41

Les clusters

Introduction - Gnralits Dfinition

Le cluster est une organisation physique des donnes qui consiste regrouper physiquement (dans un mme bloc disque) les lignes d'une ou plusieurs tables ayant une caractristique commune (une mme valeur dans une ou plusieurs colonnes) constituant la cl du cluster. La mise en cluster a trois objectifs : acclrer la jointure selon la cl de cluster des tables mises en cluster, acclrer la slection des lignes d'une table ayant mme valeur de cl, par le fait que ces lignes sont regroupes physiquement, conomiser de la place, du fait que chaque valeur de la cl du cluster ne sera stocke qu'une seule fois. Le regroupement en cluster est totalement transparent l'utilisateur : des tables mises en cluster sont toujours vues comme des tables indpendantes. Par exemple on pourrait mettre en cluster les tables emp et dept selon n_dept. Ces tables seraient rorganises de la faon suivante : un bloc de cluster serait cr pour chaque numro de dpartement, ce bloc contenant la fois les lignes de la table emp et de la table dept correspondant ce numro de dpartement. La jointure entre les tables emp et dept selon n_dept deviendrait alors beaucoup plus rapide, puisqu'elle serait dj ralise dans l'organisation physique des tables. Pour que l'on puisse mettre une table en cluster il faut que l'une au moins des colonnes faisant partie du cluster soit dfinie comme obligatoire (NOT NULL). On peut indexer les colonnes d'une table en cluster, y compris les colonnes correspondant la cl ou une partie de la cl du cluster. La cl elle-mme est automatiquement indexe, on peut ventuellement la rindexer pour crer un index unique servant contrler son unicit.

Crer un cluster

Avant de pouvoir mettre en cluster une ou plusieurs tables il faut crer le cluster au moyen de la commande CREATE CLUSTER dont la syntaxe est la suivante : CREATE CLUSTER nom_cluster (cle1 type1, cle2 type2, ...) o l'on donne un nom au cluster, et o l'on dfinit le nom et le type des colonnes constituant la cl du cluster. CREATE CLUSTER nom_cluster (cle1 type1, cle2 type2, ...) [SIZE taille_du_bloc] [COMPRESS | NOCOMPRESS] [SPACE nom_de_space_definition]

Document1

Page 39 of 41

dans laquelle : SIZE est la taille d'un bloc de cluster. Cette taille peut varier de 1/6 de bloc oracle 1 bloc oracle (2k octets sur vax/vms), ce paramtre doit tre choisi de faon avoir un bon remplissage des blocs. COMPRESS|NOCOMPRESS est relatif l'index qui sera cr sur la cl du cluster SPACE spcifie le SPACE DEFINITION qui dfinira les paramtres d'allocation d'espace pour le cluster. CREATE CLUSTER DEM (DEPNO NUMBER) SIZE 512;

Mise en cluster d'une table

En principe c'est ds sa cration qu'il faut spcifier si une table sera implante dans un cluster.

Lors de la cration de la table

L'option cluster de l'ordre CREATE TABLE permet de spcifier que la table doit tre mise en cluster. Le cluster doit dj exister.

CREATE TABLE nom_table (nom_col1 TYPE1 NOT NULL , (nom_col2 TYPE2 NOT NULL , ...) CLUSTER NOM_CLUSTER (nom_coli, nom_colj...) nom_coli, nom_colj sont des noms de colonnes de la table, elles seront identifies une une aux colonnes cls du cluster spcifies la cration du cluster.

Table dj existante

En principe cela n'est pas possible, il faut donc procder de la faon suivante : crer une nouvelle table avec l'option cluster et y copier le contenu de la table initiale ; supprimer l'ancienne table ; renommer ventuellement la nouvelle table.

Retrait d'une table d'un cluster

Pour retirer une table d'un cluster il faut : crer une nouvelle table en dehors du cluster et copier la table en cluster dans la nouvelle table ; dtruire l'ancienne table ; la nouvelle table pourra alors tre renomme pour prendre le nom de l'ancienne. ceci ne dtruit pas la table, mais la reconstruit en dehors du cluster.

Supprimer un cluster

Un cluster ne contenant aucune table peut tre supprim par la commande : DROP CLUSTER nom_cluster ;

Document1

Page 40 of 41

Remarque : Les performances du cluster ne sont valables que si on n'a pas de blocs chans (ex de grande table).

Document1

Page 41 of 41

You might also like