Académique Documents
Professionnel Documents
Culture Documents
Plan
Introduction I. Historique.
II. III. IV. V.
02 03 04 06 08 27 33 39
Normes SQL.. Structure du langage Commandes SQL Comparaison des fonctions SQL sur quelques systmes de gestion de bases de donnes relationnelles
Conclusion Rfrences
Page 1
Introduction
Devant laccroissement des collectes dinformations lectroniques en vue de diverses exploitations, il devenait urgent de mettre en place un systme capable dorganiser et de stocker un nombre considrable dinformations. En 1970, ce besoin a t vcu dans les laboratoires dIBM et a donn naissance un systme capable dentretenir les fichiers contenant les informations tout en masquant les dtails complexes et fastidieux lis leurs gestions, permettant ainsi lutilisateur daccder simplement aux informations via un langage dinterrogation. Cette premire tape a introduit de nouvelles notions comme les bases de donnes, le modle relationnel et le systme de gestion de base de donnes. Par la suite diverses socits ont propos leur solution de gestion des donnes, leur langage pour lextraction des donnes. Le langage SQL (Structured Query Language) (Langage de requtes Structur) est le fruit dannes de rflexion sur la problmatique de manipulation des donnes. Formalis et normalis, il est n dans les annes 1980 et a t rapidement adopt par la majorit des diteurs. Ses dernires normalisations lont fait sorienter vers ce que lon appelle dsormais le relationnel objet, cest--dire lintroduction de certains principes de la programmation objet au sein des bases de donnes relationnelles. La normalisation laisse la possibilit aux producteurs de systmes de gestion de bases de donnes (SGBD) d'y ajouter des instructions spcifiques et non normalises. En raison de cette possibilit, ainsi que de l'volution de la norme au cours des annes, les diteurs de SGBD ajoutent souvent des possibilits avant que celle-ci fassent objet de normes, ce qui provoque des variations dans la comprhension et l'interprtation qui est faite d'un code source en SQL par les diffrents logiciels de SGBD. Aprs un bref historique du langage SQL, nous donnerons des syntaxes de quelques commandes pour aboutir une comparaison de certaines fonctions dans des SGBD.
Page 2
I. Historique
Comme beaucoup de technologies de linformatique aujourdhui matures, les bases de donnes relationnelles sont nes des travaux dIBM entre les annes 1960 et 1970. De nombreuses recherches ont t menes au cours de cette priode sur des modles de donnes hirarchiques, rseaux et relationnels. Le relationnel a t unanimement adopt par la suite et programm laide du langage SQL. La thorie sur laquelle repose SQL a t nonce par le professeur Edgar Frank Codd (1924-2003), un mathmaticien dOxford, alors quil travaillait comme chercheur pour IBM au laboratoire de San Jose. Larticle A relational model of data for large shared data banks , publi en juin 1970 dans la revue Association for Computing Machinery, fait toujours office de rfrence et a initi tous les travaux qui ont suivi et qui perdurent. Codd voulait crer un systme o linterrogation des donnes utilisait le vocable anglais. Les travaux de la NASA (National Aeronautics and space Adminstration) (Administration Nationale de laronautique et de lespace), sur la base de donnes modlisant les rochers rapports du voyage sur la lune, a aid au dveloppement de ce langage en lui donnant de la crdibilit. Ds 1974, IBM entamait un prototype de bases de donnes relationnelles appel System/R. Ce projet se termina en 1979, prouvant ainsi la viabilit dun tel systme. Le langage de programmation utilis par IBM pour System/R fut appel SEQUEL (Structured English Query Language) rebaptis par la suite SQL (Structured Query Language). Comme tout langage, SQL a eu ses concurrents, le plus connu fut QUEL du SGBD Ingres du dbut des annes 1980.
Page 3
Page 4
Depuis 2006, des modules ont t rviss et publis, mais il ny a pas encore proprement parler de norme. La norme internationale SQL est passe par un certain nombre de rvisions : Anne 1986 Nom ISO/CEI 9075:1986 Appellation Commentaires
SQL-86 ou dit par l'ANSI puis adopt par l'ISO en1987. SQL-87 SQL-89 ou Rvision mineure. SQL-1 SQL-92 ou Rvision majeure. SQL2
1989
ISO/CEI 9075:1989
1992
ISO/CEI 9075:1992
1999
Expressions rgulires, requtes rcursives, dclencheurs, types non-scalaires et quelques SQL-99 ou ISO/CEI 9075:1999 fonctions orientes objet (les deux derniers points SQL3 sont quelque peu controverss et pas encore largement implments). Introduction de fonctions pour la manipulation XML, window functions , ordres standardiss et ISO/CEI 9075:2003 SQL:2003 colonnes avec valeurs auto-produites (y compris colonnes d'identit). Ajout de quelques fonctions de fentrage (ntile, lead, lag, first value, last value, nth value), ISO/CEI 9075:2008 SQL:2008 limitation du nombre de ligne (OFFSET / FETCH), amlioration mineure sur les types distincts, curseurs et mcanismes d'auto incrments.
2003
2008
SQL est un langage compos de deux parties bien distinctes et, dans ces deux parties, de diverses subdivisions. La premire partie de SQL est constitue de la partie dclarative du langage, cest--dire dordres SQL que le SGBDR doit excuter. En dautres termes, on spcifie ce que lon veut obtenir ou faire, et cest la machine qui dcide comment elle doit lexcuter. La seconde partie est constitue dun langage plus classique de type procdural dans lequel on retrouve les notions de fonctions, mthodes, procdures, etc.
Page 6
Le DCL (Data Control Language) ou LCD (Langage de Contrle de Donnes), cest-dire les ordres SQL permettant de dfinir les privilges affrents aux utilisateurs (GRANT, REVOKE). Les mots cls GRANT et REVOKE permettent d'autoriser des oprations certaines personnes, d'ajouter ou de supprimer des autorisations. Enfin, le TCL (Transaction Control Language) ou LCT (Langage de Contrle des Transactions) permet de grer des transactions englobant des ordres des trois premires subdivisions. Les mots cls COMMIT et ROLLBACK permettent de confirmer ou annuler l'excution de transactions.
dclencheurs (triggers) en tant quobjets de la base (donc stocks dans la base et par consquent persistants). CLI (Call Level Interface) : en fait, des API destines piloter des objets encapsulant des donnes dans des langages htes par lintermdiaire, la plupart du temps, dun middleware (BDE, dbExpress de Borland, OBDC, ADO, OleDB de Microsoft, JDBC, etc.). Embedded SQL : le lancement dordres SQL depuis un langage hte et la rcupration des donnes dans un programme via lutilisation de CURSOR.
Page 7
IV.
Les commandes CREATE, ALTER, DROP, RENAME permettent de dfinir et de modifier la structure de la base de donnes. IV.1.1 Cration de base de donnes Une base de donnes dans le SGBD SQL Server contient au minimum : un fichier de donnes principal (dextension .mdf) o sont stockes les donnes ; un journal des transactions (dextension .ldf) o sont rpertories toutes les transactions. Lorsque lon cre une base, il faut donc prciser le nom, lemplacement et la taille de ces deux fichiers. Exemple : crons une base de donnes nomm "test" CREATE DATABASE test ON PRIMARY ( NAME = test_data, FILENAME = C:\Data\test.mdf, SIZE = 60MB, MAXSIZE = 70MB, FILEGROWTH = 1MB ) LOG ON ( NAME = test_log, FILENAME = D:\Log\test.ldf, SIZE = 15MB, MAXSIZE = 20MB, FILEGROWTH = 1MB ) IV.1.2 Cration de table SQL permet de crer des relations sous des tables dune base de donnes existante et de dfinir lors de la cration les contraintes dintgrit sur les attributs. La commande de cration permet de spcifier le nom de la table et de dfinir les lments de table correspondant aux colonnes et aux contraintes.
Page 8
-- le nom de la base -- le fichier de donnes principal -- nom logique -- emplacement et nom du fichier -- taille de dpart -- taille maximale -- increment -- le journal
CREATE TABLE <nom-table> (colonne [, colonne] [, contrainte-de-relation] [, contrainte-de-relation ]) Colonne = nom-colonne type de donnes [dfaut] [contrainte-de-colonne] <nom de table>, nom-colonne : - chane de caractres (donc doit commencer par une lettre) simple, ou compos (un nom de schma suivi dun nom de table) Type de donnes : chane de caractre de longueur fixe ou variable, numrique, date. - chane de caractre de longueur fixe (sensible la casse) CHAR (<longueur>) [BYTE| CHAR] | NCHAR (<longueur>) la valeur par dfaut tant de longueur 1) - chane de caractre de longueur variable (sensible la casse) VARCHAR2 (<longueur>) [BYTE | CHAR | NVARCHAR2 (<longueur>) longueur obligatoire. LONG - Numrique Les numriques exacts (NUMBER et DECIMAL avec prcision, INTEGER et SMALLINT) Les numriques approchs (FLOAT, REAL et DOUBLE PRECISION) - Date DATE : toute date valide Dfaut : DEFAULT val val peut tre : - Littral - Expression - Fonction SQL Contrainte-de-colonne : contrainte dintgrit (CI) et CI-rf portant sur un seul attribut [CONSTRAINT contrainte] { [NOT] NULL |UNIQUE |PRIMARY KEY |REFERENCES [schma.] nom-table [(nom-col)][ON DELETE CASCADE]
|CHECK (condition)
} [DISABLE] Contrainte-de-relation: CI et CI-rf portant sur une ou plusieurs colonnes [CONSTRAINT contrainte]
Page 9
UNIQUE (nom-col [, nom-col] |PRIMARY KEY (nom-col [, nom col]) |FOREIGN KEY (nom-col [, nom col]) REFERENCES [schma.] nom-table [(nom-col [, nom-col)][ON DELETE CASCADE] |CHECK (condition) } [DISABLE] Contraintes NOT NULL : valeur NULL impossible - uniquement en contrainte de colonne PRIMARY KEY : attribut(s) constituant la cl primaire - La valeur NULL nest pas autorise sur les attributs de la cl primaire, il est donc inutile de rajouter la contrainte NOT NULL - Si plusieurs attributs, alors obligatoirement contrainte de relation UNIQUE : attribut(s) dont la valeur est unique pour toute la table - NULL est autoris sauf si on prcise le contraire (contrainte NOT NULL explicitement demande) - Si la valeur NULL est autorise, plusieurs lignes peuvent avoir la valeur NULL sur cet attribut (unicit pour le NULL non vrifie) - Si plusieurs attributs, alors obligatoirement contrainte de relation FOREIGN KEY: attribut(s) constituant une cl trangre - NULL accept - REFERENCES: la prcision dattributs est optionnelle si identique aux attributs rfrencs - Si plusieurs attributs, alors obligatoirement contrainte de relation CHECK (condition) : la condition peut tre vrifie avec - Nom-col val, peut tre {=, <>, <, , >, } - Prdicat dintervalle : BETWEEN AND - Prdicat de comparaison de texte : LIKE - Test de nullit : NULL - Test dappartenance : IN - Interdit : rfrence des pseudo colonnes (CURRVAL, NEXTVAL, ), appel certaines fonctions (SYSDATE, ), requtes des valeurs dautres lignes Activation des contraintes ENABLE : contrainte active (par dfaut), toutes les donnes doivent la vrifier DISABLE : contrainte inactive
Page 10
Exemple COMMANDE (NUM, CNOM, PNOM, QTE) PRIX (PNOM, FNOM, COUT) FOURNISSEUR (ID, FNOM, VILLE, SEXE, EMAIL) CREATE TABLE COMMANDE (NUM INT UNIQUE, CNOM CHAR(20) NOT NULL, PNOM CHAR(20) NOT NULL, QTE DEC (7,2) ); CREATE TABLE PRIX (PNOM CHAR(20) NOT NULL, FNOM CHAR(20) NOT NULL, COUT INT ); CREATE TABLE FOURNISSEUR (ID INT PRIMARY KEY, FNOM VARCHAR(20) NOT NULL, VILLE CHAR(20), SEXE CHAR(20) CONSTRAINT CK_SEXE CHECK (SEXE ='Masculin' OR SEXE = 'Fminin'), EMAIL VARCHAR(50) NOT NULL UNIQUE, CONSTRAINT CK_EMAIL CHECK (EMAIL LIKE ('%@%.%')) ); IV.1.3 Modification de table ALTER TABLE nom-table {clause-add | clause-modify | clause-drop} Clause-add : Ajout dattribut (s) et / ou de contrainte(s) ADD (colonne | contrainte-de-relation [colonne | contrainte-de-relation]) Clause-modify : Permet de modifier le type, la taille et la valeur par dfaut dun attribut MODIFY (nom-col [type] [DEFAULT expr] [NULL | NOT NULL] ) Clause-drop : Suppression de la vrification de la contrainte et de son stockage dans le dictionnaire des donnes. DROP [PRIMARY KEY | UNIQUE (nom-col [, nom-col]) | CONSTRAINT contrainte] [CASCADE]
Page 11
CASCADE : suppressions en cascades des CI qui dpendent de la CI supprime (cls trangres par exemple) IV.1.4 Suppression de table DROP TABLE nom-table [CASCADE CONSTRAINTS] Supprime la table du dictionnaire et toutes les lignes, index, blocs physiques, vues CASCADE CONSTRAINTS : pour demander la suppression de toutes les contraintes dans les autres tables de la base qui font rfrence la cl primaire et aux cls uniques de la table supprime ; si on ne prcise pas CASCADE et sil y a des rfrences, alors message derreur. IV.1.5 Renommage de table RENAME ancien_nom TO nouveau_nom Tous les liens sont mis jour IV.1.6 Dfinition de vues SQL permet de dfinir les vues au niveau des schmas. Une vue est une table virtuelle calcule partir des tables de base par une question. CREATE [OR REPLACE] [FORCE | NOFORCE] VIEW view [(alias [, alias] ] AS subquery [WITH CHECK OPTION [CONSTRAINT contrainte]] [WITH READ ONLY] La vue est supprime par la commande DROP VIEW view
Restriction : arithmtique (=, <, >, <> , , )) textuelle (LIKE) sur intervalle (BETWEEN) sur liste (IN) Possibilit de blocs imbriqus par : IN, EXISTS, NOT EXISTS, ALL, SOME, ANY IV.2.1.1 Clause SELECT Cette clause permet d'indiquer quelles colonnes, ou quelles expressions doivent tre retournes par l'interrogation. SELECT [DISTINCT] {expression [c_alias] |* ...] Expression valide - [[schma.] table.] attribut - texte - Nombre - Fonction [(argument)] - Combinaison de ces expressions Alias pour expressions / attribut - Renomme lentte dune colonne (affichage ou clause ORDER BY) - Utile si expression calcule - Suit immdiatement lexpression (mot-cl AS facultatif entre attribut et alias) - crire entre guillemets (") si les majuscules et minuscules doivent tre diffrencies, ou si la chane comporte des espaces ou caractres spciaux SELECT * FROM PRIX Ou SELECT PNOM, FNOM, COUT FROM PRIX _*_ signifie que toutes les colonnes de la table sont slectionnes. SELECT nlimine pas les duplications. Pour les liminer, on utilise la clause DISTINCT ou UNIQUE: si, dans le rsultat, plusieurs lignes sont identiques, une seule sera conserve. IV.2.1.2 Clause FROM La clause FROM donne la liste des tables participant l'interrogation. Il est possible de lancer des interrogations utilisant plusieurs tables la fois.
Page 13
FROM table [t-alias] [, table [t-alias]] ... t-alias : renommage de la table le temps de la requte IV.2.1.3 Clause WHERE La clause WHERE permet de spcifier quelles sont les lignes slectionner dans une table ou dans le produit cartsien de plusieurs tables. Elle est suivie d'un prdicat (expression logique ayant la valeur vrai ou faux) qui sera valu pour chaque ligne. Les lignes pour lesquelles le prdicat est vrai seront slectionnes. SELECT PNOM, COUT AS PRIX DU PRODUIT FROM PRIX WHERE FNOM =JEAN IV.2.1.3.1 Conditions de slection . Attribut oprateur Valeur . Attribut oprateur Attribut Oprateur : =, <, >, , , <>. Utilisation des clauses BETWEEN, IN, LIKE, IS NULL SELECT PNOM FROM PRIX WHERE COUT BETWEEN 10000 AND 50000 La condition Y BETWEEN X AND Z est quivalente Y<=Z et X <= Y SELECT PNOM FROM PRIX WHERE COUT IN (SELECT 1000, 10000, 30000) SELECT COUT FROM PRIX WHERE PNOM LIKE B% Le littoral qui suit LIKE doit tre une chane de caractre avec ventuellement des caractres jokers. _ ___ remplace 1 caractre exactement _ _%_ remplace une chane de caractres de longueur quelconque, y compris de longueur nulle IV.2.1.3.2 Requtes imbriques simples
Page 14
La jointure sexprime par deux blocs. SELECT FROM. WHERE imbriqus. Requte : Nom, Cot et fournisseurs des produits commands par Jean. SELECT PNOM, COUT, FNOM FROM PRIX WHERE PNOM IN (SELECT PNOM FROM COMMANDE WHERE CNOM = Jean) IV.2.1.3.3 Jointure Quand on utilise deux tables ou plus, on effectue en ralit des jointures entre ces tables. Une jointure permet donc de combiner les colonnes de plusieurs tables. Lorsque la jointure entre tables s'effectue en imposant l'galit des valeurs d'une colonne d'une table une colonne d'une autre table, on parle de jointure naturelle ou qui-jointure. On trouve aussi des jointures d'une table sur elle-mme. On parle alors d'auto-jointure. Il arrive que l'on doive procder des jointures externes, c'est--dire joindre une table une autre, mme si la valeur de liaison est absente dans une table ou l'autre. Dans certains cas, on peut procder des jointures htrognes, c'est--dire que l'on remplace le critre d'galit par un critre d'ingalit ou de diffrence. Exemple : SELECT a.PNOM, COUT, FNOM FROM PRIX AS a JOIN COMMANDE AS b ON a.PNOM = b.PNOM -- condition de jointure WHERE CNOM = Jean -- condition de slection IV.2.1.3.4 Requtes imbriques plus complexes Requte : Fournisseurs de briques un cot infrieur au cot des tuiles. SELECT FNOM FROM PRIX WHERE PNOM = "Briques" AND COUT < ANY (SELECT COUT FROM PRIX WHERE PNOM = "Tuiles") Requte : Fournisseurs qui fournissent au moins un produit. SELECT FNOM FROM FOURNISSEUR WHERE EXISTS (SELECT * FROM PRIX
Page 15
WHERE FOURNISSEUR.FNOM = PRIX.FNOM) IV.2.1.3.5 Oprations ensemblistes UNION, INTERSECT, MINUS Requte: Produits commands qui cotent plus que 1000F ou ceux qui sont commands par Jean. SELECT PNOM FROM PRIX WHERE COUT > 1000 UNION SELECT PNOM FROM COMMANDE WHERE CNOM = Jean IV.2.1.4 Fonctions de calcul COUNT : Compte le nombre de n-uplets sans limination des dupliqus ni des valeurs nulles Requte: Nombre de fournisseurs de Porto-Novo SELECT COUNT (*) FROM FOURNISSEUR WHERE VILLE ="Porto-Novo" Requte: Nombre de fournisseurs qui fournissent actuellement des produits SELECT COUNT (DISTINCT ou UNIQUE FNOM) FROM PRIX SUM : Permet de faire la somme. Requte : Quantit totale de briques commandes SELECT SUM (QTE) FROM COMMANDE WHERE PNOM = Briques AVG : Calcul la moyenne Requte: Fournisseurs des briques un prix infrieur au cot moyen des briques SELECT FNOM FROM PRIX WHERE PNOM = BRIQUE AND COUT < (SELECT AVG (COUT) FROM PRIX WHERE PNOM = Brique) IV.2.1.5 Autres fonctions: MIN MAX IV.2.1.6 Claude GROUP BY GROUP BY exp1, exp2,...
Page 16
Cette clause permet de prciser les attributs de partitionnement des relations dclares dans la clause FROM. Elle se place juste aprs la clause WHERE, ou aprs la clause FROM si la clause WHERE n'existe pas. Requte : Requte pour chaque produit fourni, son cot moyen SELECT PNOM AVG (COUT) FROM PRIX GROUP BY PNOM. IV.2.1.7 Clause HAVING HAVING prdicat Cette clause permet dliminer les partitionnements comme la clause WHERE limine des n-uplets. Elle sert prciser quels groupes doivent tre slectionns. Elle se place aprs la clause GROUP BY. Le prdicat suit la mme syntaxe que celui de la clause WHERE. Cependant, il ne peut porter que sur des caractristiques de groupe : fonction de groupe ou expression figurant dans la clause GROUP BY. Requte : Les produits fournis et leur cot moyen pour les fournisseurs dont le sige est Cotonou seulement si le cot minimum du produit est >1000 SELECT PNOM, AVG (COUT) FROM PRIX, FOURNISSEUR WHERE VILLE = COTONOU AND PRIX.FNOM = FOURNISSEUR.FNOM GROUP BY PNOM HAVING MIN (COUT) > 1000 IV.2.1.8 Clause ORDER BY Les lignes constituant le rsultat d'un SELECT sont obtenues dans un ordre indtermin. La clause ORDER BY prcise l'ordre dans lequel la liste des lignes slectionnes sera donne. ORDER BY exp1 [DESC], exp2 [DESC], ... L'option facultative DESC donne un tri par ordre dcroissant. Par dfaut, l'ordre est croissant. IV.2.1.9 Limiter le nombre de lignes renvoyes
Page 17
Aucune mthode standardise ne permet de limiter le nombre de lignes renvoyes par un select mais la plupart des SGBDs offre cette facilit. Voici quelques exemples qui montrent comment quelques SGBDs limitent 10 le nombre de lignes renvoyes : Avec MySQL et Postgresql : SELECT PNOM, COUT FROM PRIX LIMIT 10 Avec Oracle: SELECT PNOM, COUT FROM PRIX WHERE ROWNUM <= 10 Avec SQL Server: SELECT TOP 10 PNOM, COUT FROM PRIX
La commande UPDATE permet de modifier les valeurs d'un ou plusieurs champs, dans une ou plusieurs lignes existantes d'une table. UPDATE nom-table SET {nom-col = {expression | (subquery) } [ (nom-col [, nom-col]) = (subquery) } [WHERE condition] Mises jour des attributs cits des lignes qui vrifient la condition, ou de toutes les lignes si la condition est omise.
- ALL: tous les privilges objets - Col: colonnes dune table ou vue pour lesquelles le privilge est accord - TO : dsigne le bnficiaire du privilge - PUBLIC : privilge accord tous les utilisateurs - WITH GRANT OPTION : le bnficiaire du privilge (user ou PUBLIC) peut son tour transmettre le privilge obtenu dautres utilisateurs ou rles. Les cycles sont interdits dans la propagation des privilges.
Au terme de la tche, il est ncessaire de sauvegarder les changements. Toutefois, aucun enregistrement n'est effectu si la tche a chou pour une raison quelconque. Les principales commandes transactionnelles pour contrler ces squences sont : {SET | BEGIN} TRANSACTION; dtermine le dbut d'une transaction. BEGIN est utilise sous SQL Server. COMMIT [WORK]; enregistre les modifications produites par des transactions. ROLLBACK{ [WORK | TO nom_point] }; annule les modifications qui n'ont pas t enregistres prcdemment. SAVEPOINT nom_point; insre un point de sauvegarde dans la liste de transactions, servant en conjonction avec ROLLBACK pour une annulation jusqu' un point prcis. La commande SAVEPOINT vite une annulation complte des transactions par la commande ROLLBACK. Transactions... SAVEPOINT nom_point Transactions... ROLLBACK TO nom_point; D'ailleurs, une commande spcifique permet de supprimer des points de sauvegardes crs par la commande SAVEPOINT. RELEASE SAVEPOINT nom_point; Exemple BEGIN TRANSACTION MYTRAN INSERT INTO COMMANDE (NUM, PNOM, CNOM, QTE) VALUES (1, 'TOLES', 'JEAN', 30000) INSERT INTO COMMANDE (NUM, PNOM, CNOM, QTE) VALUES (2, 'TUILES', 'JEAN', 5000)
Page 21
INSERT INTO COMMANDE (NUM, PNOM, CNOM, QTE) VALUES (3, 'TOLES', 'PIERRE', 50000) IF @@ERROR<>0 ROLLBACK TRANSACTION MYTRAN ELSE COMMIT TRANSACTION MYTRAN
Page 22
La clause VARYING, applicable aux paramtres de type CURSOR, indique le jeu de rsultats pris en charge. La clause OUTPUT permet de retourner la valeur aux instructions appelantes. L'instruction WITH RECOMPILE spcifie que la procdure est recompile l'excution sans utiliser le cache pour le plan de la procdure. L'option RECOMPILE est gnralement utilise pour des valeurs temporaires ou atypiques sans remplacer le plan d'excution plac en mmoire cache. La clause WITH ENCRYPTION indique un cryptage de l'entre de la table syscomments contenant le texte de l'instruction CREATE PROCEDURE. L'argument ENCRYPTION permet d'viter la publication de la procdure dans le cadre de la rplication SQL Server. La clause FOR REPLICATION indique que la procdure stocke doit tre excute lors de la modification de la table concerne par un processus de rplication. La clause AS indique les actions entreprises par la procdure. L'instruction GO signale la fin d'un jeu d'instructions. Syntaxe pour Oracle CREATE [OR REPLACE] PROCEDURE [schema .] procedure [ ( argument [ IN | OUT | IN OUT ] [ NOCOPY ] type_donnee [, argumentN [ IN | OUT | IN OUT ] [ NOCOPY ] type_donnee] ) ] [ AUTHID { CURRENT_USER | DEFINER }] { IS | AS } { instruction_pl/sql | instruction_langage }; La commande OR REPLACE recre la procdure stocke si elle existe dj. La clause OUT permet de retourner la valeur aux instructions appelantes. La clause IN est utilise pour spcifier une valeur pour l'argument en appelant la procdure. La clause AS (dprcie) ou IS indique les actions entreprises par la procdure.
Page 23
Les procdures stockes peuvent tre appeles au moyen de l'instruction EXECUTE (SQL Server) ou CALL (Oracle) partir d'une autre procdure ou d'un lot d'instructions. SQL Server peut utiliser une abrviation EXEC. -- SQL Server EXECUTE Procedure @Parametre = Valeur, ..., @ParametreN = ValeurN -- Oracle CALL Procedure(Valeur, ..., ValeurN) Exemple -- Instruction pour SQL Server CREATE PROCEDURE ajout_enregistrement @proc_pnom char(20), @proc_fnom char(20), @proc_cout int AS INSERT INTO PRIX (pnom, fnom, cout) VALUES (@proc_pnom, @proc_fnom, @proc_cout) GO -- Instruction pour Oracle CREATE PROCEDURE Ajout_Enregistrement ( proc_pnom char(20), proc_fnom char(20), proc_cout int ) IS BEGIN INSERT INTO PRIX (pnom, fnom, cout) VALUES (proc_pnom, proc_fnom, proc_cout END; -- Utilisation -- Sous SQL Server execute Ajout_Enregistrement 'Fer', 'JACOB', 100000 -- Sous Oracle call Ajout_Enregistrement('Fer', 'JACOB', 100000);
Page 24
{ { { FOR | AFTER | INSTEAD OF } { [ INSERT ] [,] [ UPDATE ] [,] [ DELETE ] } [ WITH APPEND ] [ NOT FOR REPLICATION ] AS } instruction_SQL...
} }
La suppression des dclencheurs s'effectue par l'intermdiaire de l'instruction DROP. DROP TRIGGER nom_dclencheur [ , nom_dclencheurN ] La modification des dclencheurs s'effectue par l'intermdiaire de l'instruction ALTER. La syntaxe complte de la commande ALTER TRIGGER est en fait identique dans le cas d'Oracle ou de SQL Server celle de CREATE TRIGGER. ALTER TRIGGER nom_dclencheur_existant ON nom_table FOR INSERT, UPDATE, DELETE AS instruction_SQL... Tous les dclencheurs (ALL) ou certains peuvent tre activs (ENABLE) ou dsactivs (DISABLE) au moyen de l'instruction ALTER TABLE. ALTER TABLE table { ENABLE | DISABLE } TRIGGER { ALL | nom_dclencheur [ , nom_dclencheurN ] } Exemple CREATE TABLE tbl_produit ( nom VARCHAR(20), identificateur INTEGER ) GO INSERT tbl_produit SELECT 'dentifrice', 1 UNION SELECT 'savon', 2 UNION SELECT 'savon', 0 UNION SELECT 'brosse dent', 3 UNION SELECT 'brosse dent', 0 UNION SELECT 'rasoir', 4 UNION SELECT 'mousse raser', 5 UNION SELECT 'serviette', 6 UNION
Page 26
SELECT 'serviette', 0 UNION SELECT 'peigne', 7 UNION SELECT 'brosse cheveux', 8 GO CREATE TRIGGER declencheur_suppression ON tbl_produit FOR DELETE AS SELECT nom AS "Lignes supprimer" FROM deleted GO CREATE TRIGGER declencheur_insteadof ON tbl_produit INSTEAD OF DELETE AS DELETE tbl_produit FROM tbl_produit INNER JOIN deleted ON tbl_produit.nom = deleted.nom WHERE tbl_produit.identificateur = 0 GO DELETE tbl_produit WHERE nom IN ('brosse dent', 'serviette', 'savon') GO SELECT * FROM tbl_produit Cet exemple met en exergue le processus permettant de faire appel diffrents types de dclencheurs au sein d'une table. Le premier dclencheur FOR DELETE s'excute lors d'une suppression en slectionnant les lignes supprimes partir de la table temporaire deleted. Le second Trigger se dclenche et excute ses propres instructions la place de la commande de dclenchement DELETE afin d'effectuer une comparaison entre les noms de produits sur les deux tables tbl_produit et deleted pour ensuite supprimer les enregistrements possdant un identificateur gal zro.
Syntaxe sous Oracle DECLARE CURSOR nom_curseur [(paramtre [, paramtre]...)] [RETURN return_type] IS instruction_slection; Un curseur s'ouvre par l'intermdiaire de la commande OPEN suivi du nom du curseur et de ses ventuels arguments. OPEN nom_curseur[(liste_arguments...)]; La commande FETCH permet de parcourir un enregistrement du curseur ouvert. L'ensemble des enregistrements d'un curseur peut tre parcouru l'aide d'une structure itrative. @@FETCH_STATUS retourne l'tat de la dernire instruction FETCH applique au curseur en cours d'utilisation. Les valeurs 0, -1 et -2 indiquent respectivement si l'instruction FETCH a russi ou a choue et si la ligne recherche n'a pas t trouve. L'attribut Oracle %NOTFOUND retourne FALSE si la dernire instruction FETCH renvoie un enregistrement ou TRUE en cas d'chec. Suite la fin de son utilisation, le curseur peut tre ferm afin de ne plus consommer de ressources. Il est galement possible de dsallouer le curseur. CLOSE nom_curseur; -- Exemple SQL Server DESALLOCATE nom_curseur; -- Exemple Oracle DESALLOCATE CURSOR nom_curseur; Exemples -- Dclaration du curseur DECLARE mycursor CURSOR LOCAL FOR SELECT NUM, PNOM, QTE FROM COMMANDE WHERE CNOM='Jean' -- Ouverture du curseur OPEN mycursor -- Premiere recuperation FETCH NEXT FROM mycursor
Page 28
-- puis on boucle tant qu'il reste des lignes rcuprer WHILE @@FETCH_STATUS=0 BEGIN -- ceci est excut pour chaque ligne du curseur FETCH NEXT FROM mycursor END -- fermeture et dchargement du curseur CLOSE mycursor DEALLOCATE mycursor
IV.8 PL/SQL
PL/SQL (Procedural Language / Structured Query Language) est un langage procdural propritaire cr par Oracle et utilis dans le cadre de bases de donnes relationnelles. Il permet de combiner des requtes SQL et des instructions procdurales (boucles, conditions...), dans le but de crer des traitements complexes destins tre stocks sur le serveur de base de donnes (objets serveur), comme par exemple des procdures stockes ou des dclencheurs. Les dernires volutions proposes par Oracle reposent sur un moteur permettant de crer et grer des objets contenant des mthodes et des proprits.
Page 30
IV.8.4 Affichage
PL/SQL nest pas un langage avec des fonctionnalits dentres sorties volues (ce nest pas son but). Toutefois, on peut imprimer des messages et des valeurs de variables de plusieurs manires diffrentes. Le plus pratique est de faire appel un package prdfini : DBMS output.
Page 31
En premier lieu, taper au niveau de la ligne de commande : SET SERVEROUTPUT ON Pour afficher, on utilise alors la commande suivante : DBMS_OUTPUT.PUT_LINE (Au revoir || nom || bientt); Si on suppose que nom est une variable dont la valeur est toto, linstruction affichera : Au revoir toto bientt.
Page 32
Comparaison de quelques fonctions SQL dans diffrents systmes de gestion de bases de donnes relationnelles
Dun SGBDR un autre, les fonctions SQL ne sont pas identiques. La diffrence entre ces fonctions se rsume dans les tableaux ci-aprs : Lgende : O : Oui N : Non X : Existe mais syntaxe hors norme ! : Mme nom mais fonction diffrente - : implmentation partielle a. Agrgation statistique
Fonction AVG COUNT MAX MIN SUM EVERY ANY / SOME Description Moyenne Nombre Maximum Minimum Total Tous (boolen) Au moins un (boolen) Norme SQL O O O O O O O Paradox Access MySQL PostGreSQL O O O O O N N O X O O O N N O O O O O N N O O O O O N N SQL Server O O O O O N N Oracle Interbase O O O O O N N O O O O O N N
b. Fonctions "systme"
Fonction Description Norme SQL Paradox Access MySQL PostGre SQL SQL Server Oracle Interbase
Date courante Heure courante Utilisateur courant Utilisateur autoris Utilisateur systme Nom de la bases de donnes courante Date et/ou heure courante Utilisateur courant Version du SGBDR
O O O O O N N N N
N N N N N N N N N
N N N N N N N N N
O O N X X O O O O
O O O O O N N N O
N N O O O O N O N
N N N N N O O O N
O O N N N N N O N
Page 33
c. Fonctions gnrales
Fonction OCTET_LENGTH DATALENGTH DECODE LENGTH NVL TO_CHAR TO_DATE TO_NUMBER Description Longueur en octet Longueur Fonction conditionnelle Longueur Valeur non NULL Conversion de donnes en chane Conversion en date Conversion en nombre Norme SQL Paradox Access MySQL PostGreSQL Oracle Interbase SQL Server O N N O O N O N N N N N N O N N N N N N N N N N N N N N N O N N N N N O N N N N N O N N O N N O N N N N O O O O O O N N N N N N
Page 34
f. Fonctions numriques
Fonction % +-*/() ABS ASCII EXP LN LOG(n,m) LOG10 MOD POWER ROUND SQRT Description Modulo Oprateurs et parenthsage Valeur absolue Conversion de caractre en code ASCII Exponentielle Logarithme nprien Logarithme en base n de m Logarithme dcimal Modulo Elvation la puissance Arrondi Racine carre Norme PostGre SQL Paradox Access MySQL Oracle Interbase SQL SQL Server N N N O O O N N O N N N N N N N N N N O N N N N N N N N N N O O O O N N N O O O O O O O O N N O O O O O O O O O N O N O N O O O O O O N N O O O O O O O O O O O O O O N N O N N N N N N N N N N
g. Fonctions temporelles
Fonction AGE Description Norme SQL Paradox Access MySQL PostGreSQL Oracle Interbase SQL Server N N N N O N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N O O N O O N O O O O O N O O N O O N O O O N N N N N N N N N N N N N N O O O N O O N O O O N N N N N O N O O N O O N N N N N N N N N N N N
Age Ajout d'intervalle DATE_ADD une date DATE_FORMAT Formatage de date DAY Jour d'une date DAYNAME Nom du jour HOUR Extraction de l'heure LAST_DAY Dernier jour du mois MINUTE MONTH Mois d'une date Prochain premier jour NEXT_DAY de la semaine SECOND Extrait les secondes WEEK Numro de la semaine YEAR Anne d'une date
Page 35
Sous totaux des agrgats pour toutes CUBE les combinaisons possibles Sous totaux des agrgats pour toutes ROLLUP les combinaisons visibles Sous totaux des GROUPING agrgats pour toutes SETS les combinaisons spcifies Indicateur de sous GROUPINGS totalisation Spcification de NULL FIRTS / classement pour les NULL LAST marqueurs NULL
O O
N N
N N
N N
N N
O N
O O
N N
ROW_NUMBER NTILE Agrgats (MAX, MIN, COUNT, SUM...) ROWS / RANGE PRECEDING * / FOLLOWING * / BETWEEN Clause WINDOW
Numrotation des lignes N-tile (dcile, centile, ....) Calcul d'agrgat avec fentrage Fentre de calcul par ligne ou valeurs Bornage de la fentre de calcul Dfinition d'une fentre de calcul
O O O O O O
N N N N N N
N N N N N N
N N N N N N
N N N N N N
O O O N N N
O O O O O N
N N N N N N
Page 36
CASE IS [NOT] TRUE INNER JOIN LEFT, RIGHT, FULL OUTER JOIN INTERSECT UNION EXCEPT [NOT] BETWEEN [NOT] EXISTS
O O O O O O O O O O O O
N N O O ? ? ? O ? ? ? N N
N N O O N O N O ? O O N N
O N O O N N N O N N N N N
O N O O O O O O O O O N N
O N O O N O N O O O O N -
X N N N X O X O O O O N -
O N O O N O N O O O O N N
Intersection (ensemble) Union (ensemble) Diffrence (ensemble) Fourchette Existence Comparaison toutes les ALL valeurs d'un ensemble Comparaison au moins ANY / SOME une valeur de l'ensemble UNIQUE Existance sans doublons Row value construteur Construteur de ligne values
k. Fonctions spciales
Fonction Description Norme SQL Paradox Access MySQL PostGreSQL Oracle SQL Server Firebird
TABLE SAMPLE Echantillon de donnes TRUNCATE Vidage de table Limitation des lignes OFFSET / FETCH retournes Nombre de ligne LIMIT/TOP retourne "Row Id" Identifiant de ligne
O O O N N
N N N N N
N N N N N
N N N LIMIT _rowid
N N N LIMIT oid
O O N TOP N
O O N N rowid
N O N ROWS ?
l. Sous requtes
Fonction Norme SQL Paradox Access MySQL PostGreSQL SQL Oracle Firebird Server
Imbriques Dans la clause SELECT Dans la clause FROM Dans la clause WHERE Dans la clause HAVING CTE (Common Table Expression : expression de table) Requtes rcursives via CTE
O O O O O O O
O X N O O N N
O O N O N N N
N N N N N N N
O O O O O N N
O O O O O O O
O O O O O O X Page 37
O O N O O O O
Conclusion
SQL est un langage dclaratif rgi par les normes qui sont diversement respectes par les diteurs des SGBDR. Lvolution de SQL permet aujourdhui de manipuler aussi des donnes relatives au multimdia et dintgrer des donnes XML. Le succs que connaissent les grands diteurs de SGBDR a plusieurs origines et repose notamment sur SQL. SQL peut sinterfacer avec des langages de troisime gnration comme C, Ada ou Cobol, mais aussi avec des langages plus volus comme C ++, Java, Delphi, C#, etc. Les procdures stockes offrent des gros avantages pour les applications client/serveur, surtout au niveau des performances : - le trafic sur le rseau est rduit car les clients SQL ont seulement envoyer l'identification de la procdure et ses paramtres au serveur sur lequel elle est stocke. - les procdures sont prcompiles une seule fois quand elles sont enregistres. L'optimisation a lieu ce moment et leurs excutions ultrieures n'ont plus passer par cette tape et sont donc plus rapides. De plus les erreurs sont repres ds la compilation et pas l'excution. Le principal inconvnient des procdures stockes est qu'elles impliquent une dpendance forte vis--vis du SGBD car chaque SGBD a sa propre syntaxe et son propre langage de programmation. Ces diffrences font qu'un code source crit sans prcaution pour un SGBD donn ne fonctionnera pas forcment avec un autre SGBD.
Page 38
Rfrences
Bibliographie
Bases de donnes - de la modlisation au SQL - Laurent Audibert - Ellipses 2009 SQL Synthse de cours et exercices - 2e dition - Frdric Brouard, Christian Soutou, Rudi Bruchez - Pearson Education 2008 SQL par l'exemple - Antony Molinaro - O'reilly, 2007
Page 39