Vous êtes sur la page 1sur 25

M.Tondeur H.

SQL-Oracle

SQL ORACLE

Page 1 sur 25

M.Tondeur H.

SQL-Oracle

Oracle en Pratique
Notion de Schma sous Oracle Cest un ensemble comprenant des structures de donnes et des donnes, il appartient un utilisateur et porte le nom de ce dernier. Chaque utilisateur possde ainsi son propre schma.

Utilisateur1 Utilisateur2

Table1 Table2 Table3 Table4 Table5

L'utilisateur 1 est propritaires des tables (table1, table2, table3) et l'utilisateur 2 est propritaire des tables (Table4 et Table5)

Si l'utilisateur 1 est connect, il peut raliser les requtes suivantes : SELECT * FROM Table1 ; SELECT * FROM Table2 ; SELECT * FROM Table3 ; la requte suivante chouera en provoquant une leve d'exception sous Oracle : SELECT * FROM Table4 ; Si l'utilisateur des droits sur la table4, il devra utiliser la requte en qualifiant le nom de la table par le nom du propritaire (schma). SELECT * FROM Utilisateur2.Table4 ; De mme pour l'utilisateur 2 si des droits daccs la Table2, il devra raliser la requte de la manire suivante : SELECT * FROM Utilisateur1.Table2 ; Utiliser SQLPLUS SQLPLUS : Est un outil de requte en ligne de commande, il est prsent depuis les premires versions d'ORACLE, toujours prsent dans la version 11g d'Oracle, on l'utilisera plutt comme un outil permettant de raliser des requtes par BATCHS(Tches automatises) ou pour dpanner en cas de problmes. Cet outil fonctionne dans la philosophie des outils comme VI ou EMACS. Les commandes dans SQLPLUS CONNECT user/password@descripteur QUIT ou EXIT quitter sqlplus SPOOL OUT SPOOL fichier enregistre le buffer au fils de leau dans un fichier. SPOOL OFF met fin cet enregistrement

Page 2 sur 25

M.Tondeur H.
R excute une requte L Liste le contenue du Buffer L* Liste la ligne Courante Ln liste la ligne numro n I insre une ligne aprs la ligne courante A texte Ajoute texte aprs la ligne courante DEL Supprime la ligne courante CLEAR Efface le Buffer

SQL-Oracle

SAVE fichier Ecrit le buffer courant dans le fichier.sql GET fichier Charge dans le buffer le contenu du fichier.sql qui se trouve dans le rpertoire courant. START fichier Ouvre et lance le fichier.sql Un script sql, se prsente comme un fichier texte, et dans ce cas respecte une syntaxe sql spcifique oracle. Poser un commentaire dans un fichier o requte SQL * --commentaire sur une seule ligne * /* commentaires sur plusieurs lignes*/

LDD Langage de Description des Donnes Cration de tables


CREATE TABLE [schma.]nomtable ( colonne1 type1 [DEFAULT valeur1] [NOT NULL] [,colonne2 type2 [DEFAULT valeur2] [NOT NULL]] [CONSTRAINT nomContrainte1 TypeContrainte1] );

- Schma peut tre omis, il sera donc assimil au nom de lutilisateur. - Type des colonnes Caractres (CHAR,NCHAR,VARCHAR2, NVARCHAR2,CLOB,NCLOB)
CHAR(n) & NCHAR(n) sont des chanes de caractres de longueur fixe. VARCHAR2 & NVARCHAR2 sont des chanes de longueur variable. CLOB & NCLOB sont des types acceptants des grands flux de caractres.

Valeur Numrique (NUMBER)


NUMBER permet de stocker des valeurs entires et flottante, on peut prciser le nb de chiffres aprs la virgule comme ceci NUMBER(n,d) ou N+D<=28

Date/heure (DATE,TIMESTAMP)
Le type DATE, permet d'exprimer des dates et heures JJMMYYYY HH:MM:SS Le type TIMESTAMP permet d'exprimer des dates et heures avec une prcision sur les millimes de secondes.

Donnes binaires(BLOB,BFILE)
Le type BLOB permet de stocker des flux d'octets comme les images, la vido, le son. Le type BFILE permet de stocker un pointeur sur un fichiers.

Page 3 sur 25

M.Tondeur H.
Utilisation :

SQL-Oracle

CHAR(n) chane de caractres fixes. VARCHAR2(n) chane de caractre variable. NCHAR(n) NVARCHAR2(n) NUMBER((t,d)) valeur numrique de t chiffres dont d dcimales. DATE Permet de stocker des moments ponctuels, la prcision est compose du sicle, de lanne, du mois, du jour, de lheure, des minutes et des secondes. - Les Contraintes Les contraintes peuvent sappliquer de 2 manires Des contraintes sur les colonnes. Des contraintes sur la table. Les contraintes sur les colonnes sont DEFAULT valeur NOT NULL UNIQUE colonne CHECK (condition) 4 types de contraintes :
CONSTRAINT nomContrainte UNIQUE (colonne1 [,colonne2]) PRIMARY KEY (colonne1 [,colonne2]) FOREIGN KEY (colonne1 [,colonne2]) REFERENCES [schma.]nomtablepere (Colonne1 [,Colonne2]) [ON DELETE {CASCADE|SET NULL}] CHECK (condition)

Exemple : CREATE TABLE clients (Idcli NUMBER NOT NULL, nom VARCHAR2(50), prenom VARCHAR2(50), age NUMBER NOT NULL, idadr as NUMBER, CONSTRAINTS pk_client PRIMARY KEY (IdCli), CONSTRAINTS fk_client_adresse FOREIGN KEY (IdAdr) REFERENCES Adresse (IdAdr), CONSTRAINTS ck_client_age CHECK (age BETWEEN 18 AND 100) ); Attention : Il est fortement recommand de nommer les contraintes. pk_ fk_ ck_ uk_

Page 4 sur 25

M.Tondeur H.
Ajouter une contrainte : ALTER TABLE NomTable ADD (
CONSTRAINT nomContrainte UNIQUE (colonne1 [,colonne2]) PRIMARY KEY (colonne1 [,colonne2]) FOREIGN KEY (colonne1 [,colonne2]) REFERENCES [schma.]nomtablepere (Colonne1 [,Colonne2]) [ON DELETE {CASCADE|SET NULL}] CHECK (condition) );

SQL-Oracle

Supprimer une contrainte :

ALTER TABLE NomTable DROP CONSTRAINT nomContrainte [CASCADE] ;


Dsactiver une contrainte : ALTER TABLE DISABLE nomcontrainte ; Activer une contrainte : ALTER TABLE ENABLE nomcontrainte ; Lister les contraintes poses : SELECT * FROM USER_CONSTRAINTS ; Obtenir les noms et descriptions des tables Obtenir les noms des tables SELECT TABLE_NAME FROM USER_TABLES ; Obtenir la description de la table:
DESC nomtable ;

Permet dobtenir la structure de la table dont le nom est indiqu. Poser un commentaire sur une table ou une colonne dune table en SQL
COMMENT ON TABLE [schma.]NomTable IS MON COMMENTAIRE ; COMMENT ON COLUMN [schma.]NomTable.nomColonne IS MON COMMENTAIRE ;

Voir les commentaires poss : SELECT * FROM USER_TAB_COMMENTS ; Supprimer une table
DROP TABLE [schma.]NomTable [CASCADE CONSTRAINTS] ;

CASCADE CONSTRAINTS permet dindiquer la suppression des contraintes associes cette table. Renommer une table

Page 5 sur 25

M.Tondeur H.
RENAME ancienNom TO nouveauNom ;

SQL-Oracle

Les contraintes dintgrit, index et prrogatives associes lancienne table sont automatiquement transfres sur la nouvelle. Attention : Les vues, synonymes, procdures catalogus sont inchangs, il faut donc les recrer. Autre manire de renommer une table
ALTER TABLE noTable RENAME TO NouveauNom ;

Ajouter une colonne


ALTER TABLE typeContraintes ; NomTable ADD NomColonne TypeCol CONSTRAINTS nomContraintes

Renommer colonne
ALTER TABLE NomTable RENAME COLUMN Nomcolonne TO Nouveau NomColonne ;

Modifier type des colonnes


ALTER TABLE Nomtable MODIFY Nomcolonne TypeColonne Contraintes ;

Exemple ALTER TABLE piste MODIFY nom CHAR(10) NOT NULL ; Supprimer des colonnes
ALTER TABLE nomTable DROP COLUMN nomColonne ;

Attention : Pas toutes les versions, ne supprime pas les colonnes comportant une cl primaire, ne supprime pas les colonnes utilises dans les index, et ne peut pas supprimer toutes les colonnes.

LMD Langage de Manipulation des Donnes


Cration des squences Les squences sont des objets qui permettent de crer des squences de valeur avec incrment ou dcrment automatique. Crer une squence : CREATE SEQUENCE nomSequence MINVALUE valeurMin | NOMINVALUE MAXVALUE valeurMax | NOMAXVALUE START WITH valeurDeDebut INCREMENT BY valeurIncrment CYCLE|NOCYCLE CACHE n | NOCACHE ORDER | NOORDER;
Les valeurs par dfauts sont : NOMINVALUE => 1 NOMAXVALUE => 2 1 START WITH =1 INCREMENT BY = 1 CYCLE CACHE= 20

Page 6 sur 25

M.Tondeur H.
ORDER

SQL-Oracle

Modifier une squence : ALTER SEQUENCE nomSequence MINVALUE valeurMin | NOMINVALUE MAXVALUE valeurMax | NOMAXVALUE START WITH valeurDeDebut INCREMENT BY valeurIncrment CYCLE|NOCYCLE CACHE n | NOCACHE ORDER | NOORDER; Supprimer une squence : DROP SEQUENCE NomSequence ; Pour faire appel a une squence ou donne son nom suivie de la commande NEXTVAL. Il est galement possible dutiliser la commande CURRVAL qui permet dobtenir la valeur courante du compteur sans incrmenter celui ci (lecteur seule). Lutilisation pour la premire fois de NEXTVAL pour un compteur donne la valeur courante de celui ci, les utilisation suivantes donnent les valeurs suivantes (fonction incrmentation activ).
TestSequence.NEXTVAL

Info : La table DUAL, est une table particulire, elle ne possde qu'un champs et une valeur(X) Cette table DUAL peut tre utilis pour tester des formules, des squences ou envoyer vers la sortie rsultats du texte. Exemple : SELECT "bonjour" FROM DUAL ; => bonjour SELECT 3+2 FROM DUAL ; => 5 On peut aussi tester les squences avec la table DUAL SELECT seq.CURRVAL FROM DUAL ; => 1 SELECT seq.NEXTVAL FROM DUAL ; => 2 SELECT seq.NEXTVAL FROM DUAL ; => 3 Insrer des donnes dans vos tables Pour crer une ou plusieurs lignes dans une table, SQL offre linstruction INSERT INTO. INSERT INTO nomtable(colonne1,colonne2,.) VALUES(valeur1,valeur2,.) ; Plusieurs prcautions prendre :

Page 7 sur 25

M.Tondeur H.

SQL-Oracle

- Les valeurs donnes dans le VALUES doivent tre dans le mme ordre et le mme type que ceux de la colonne. - Toutes les colonnes qui ne sont pas prcises, reoivent alors la valeur par dfaut. (Souvent NULL ou celle dfini par la contrainte DEFAULT valeur1) - Si la moindre valeur ne vrifie pas les contraintes de la table, alors linstruction INSERT INTO choue.
Exemple : INSERT INTO clients(numero,nom,prenom,code_postal) VALUES (120,Tondeur,Herv,59300) ;

Exemple dutilisation des squence :


CREATE SEQUENCE AutoInc MINVALUE 1 MAXVALUE 999999 START WITH 1 INCREMENT BY 1 ; INSERT INTO clients(numero,nom,prenom,code_postal) VALUES (AutoInc.NEXTVAL,Tondeur,Herv,59300) ;

Utilisation de sous requte pour linsertion de donnes dans un table Il est possible dutiliser une sous requte qui renvoie un ensemble de tuples, qui pourront tre rintgr dans votre table (souvent utilis pour ma migration de donnes). Dans ce cas particulier on nutilise pas de clause VALUE, elle est implicite.
Exemple : INSERT INTO commandes(numero,jour,client) SELECT numero,jour,client FROM commandes_anciennes WHERE (SYSDATE-jour)>=180 ;

Modifier des donnes dans vos tables SQL vous permet de modifier une ou plusieurs donnes de vos tables grce la commande : UPDATE nomTable SET colonne=valeur [WHERE condition] ;
Exemple : UPDATE articles SET prix=prix/6.55957 ; Exemple : UPDATE articles SET prix=prix/6.55957 WHERE devise=EURO ;

Lorsque la clause conditionnelle est omise, toutes les lignes de la colonne sont mise jour. Il est possible de mettre plusieurs colonne jour en mme temps, il faut se mfier des corrlations entre colonnes. Quelques fonctions de conversions utiles TO_CHAR(colonneDate) convertir une date en chane de caractres.

Page 8 sur 25

M.Tondeur H.
TO_DATE(ChaneCaractres) convertir une chane en type Date. EXTRACT({YEAR|MONTH|DAY|HOUR|MINUTE|SECOND} FROM Expression-Interval}) extrait une parte donnes dune date ou dun intervalle.

SQL-Oracle

{Expression-Date|

NUMTOYMINTERVAL(expressionnumerique,{YEAR|MONTH}) convertir un nombre dans un type INTERVAL YEAR TO MONTH NUMTODSINTERVAL(expressionnumerique,{DAY|HOUR|MINUTE|SECOND}) un nombre dans un type INTERVAL DAY TO SECOND. Supprimer des donnes dans vos tables Pour supprimer une ou plusieurs ligne dans un seule table, SQL prvoit linstruction : DELETE FROM nomTable [WHERE condition] ;
Exemple : DELETE FROM clients ;

convertir

Supprimer tous les clients


DELETE FROM commandes WHERE (SYSDATE jour)>=180 ;

NB : Si une des lignes est rfrenc par une cl trangre alors la requte est refuse. Attention l'utilisation de la clause DELETE sans clause WHERE est dangereuse, il est recommand d'utiliser la clause TRUNCATE dans le cas o on dsire supprimer l'ensemble des lignes d'une table. TRUNCATE TABLE NomTable [{DROP|REUSE} STORAGE] ; L'option DROP STORAGE, permet de supprimer l'espace disque occup par ces donnes qui vont tre supprimes. L'option REUSE STORAGE, permet de conserver l'espace disque occup par ces donnes. Slection de donnes Pour afficher les donnes sous forme dun tableau dont les colonnes porte un intitul, SQL propose linstruction : SELECT colonnes FROM NomTable WHERE Conditions ; (1) (2) 1) les colonnes Les Alias de tables et de colonnes

Les alias de tables, permettent de prfixer les tables, il est fortement recommand par Oracle d'utiliser les alias de tables. Les alias de tables sont obligatoires quand deux tables portent le mme nom, comme par exemple dans l'auto-jointure, ou dans l'appel de base de donnes externe avec un database Link. Exemple : SELECT c.Nom, c.Prenom FROM CLIENTS c ;

Page 9 sur 25

M.Tondeur H.

SQL-Oracle

Les alias de colonnes permettent de renommer des colonnes laffichage. Les alias de colonnes sont utiles pour les calculs. On utilise le mot clef AS Exemple : SELECT compa AS C1, nom AS NomEtPrenom, brevet C3 FROM pilote ; SELECT pl.compa AS C1, pl.nom AS NomEtPrenom, pl.brevet AS C3 FROM pilote AS pl ; NB : Oracle traduit les noms des alias en majuscules. Lutilisation du mot clef AS est facultative Il faut prfixer les colonnes par lalias de la table lorsquil existe. les colonnes et le caractres joker *

Il est possible dans le nom des colonnes dutiliser le caractre spcial * qui permet de nommer toutes les colonnes dune ou plusieurs tables. Les colonnes calcules

Dans la clause SELECT, on peut utiliser les oprateurs Arithmtiques(+ - * /), loprateur de concatnation des chanes de caractres (||) ou des fonctions SQL (comme MOD pour le modulo, FLOOR pour la troncature entire ou SUBSTR pour lextraction de sous chanes de caractres) Ds que lon un doute sur les priorits des oprateurs, il faut utiliser les parenthses afin de lever toute ambigut. A partir du moment ou lon utilise des colonnes calcules, il est conseill de lui donner un nom (un alias) avec le mot clef AS pour en expliquer le contenue. Un alias est donn entre double quotes prixTTC
Exemple : SELECT SUBSTR(prenom,1,1) || . Nom AS identit , FLOOR ((SYSDATE naissance) / 365.25) AS Age , MOD((SYSDATE naissance), 365) AS Nb de jour depuis lanniversaire FROM clients ;

Les fonctions dagrgation SQL Syntaxe COUNT SUM MIN MAX AVG Description Dnombrement des lignes Somme des valeurs numriques Valeur Numrique Minimale Valeur Numrique Maximale Moyenne des valeurs numriques

Ces fonctions ignorent les valeurs NULL dans leur calcul et nliminent pas les doublons.
Exemple :

Page 10 sur 25

M.Tondeur H.

SQL-Oracle

SELECT MAX(prix) AS prix le plus cher , MIN(prix) AS Prix le moins cher , AVG(prix) AS prix moyen FROM articles ; SELECT COUNT(numero) AS Nombre de clients FROM clients ;

quelques fonctions Oracles

ASCII(c) Retourne la valeur du caractre ASCII quivalent. CHR(n) Retourne le caractre ASCII quivalent CONCAT (c1,c2) quivalent || INITCAP (c) Premire lettre de chaque mot mis en majuscule UPPER (c) Met en majuscule la chane LOWER(c) Met en minuscule la chane LENGTH(c) Longueur de la chane REPLACE(c1,c2,c3) recherche c2 dans c1 et le remplace par c3 TRIM(c) supprime les espaces devant et derrire la chane. ABS(n) valeur absolue CEIL(n) plus petit entier FLOOR(n) plus grand entier ROUND(n,d) arrondi a d dcimale la valeur n SIGN(n) signe de n TRUNC(n,d) coupure de n d dcimales SYSDATE Date courante LAST_DAY(d) retourne le dernier jour du mois GREATEST(exp1,exp2,exp3) retourne la plus grande des expressions LEAST(exp1,exp2,exp3) retourne la plus petite des expression NULLIF(exp1,exp2) retour NULL si exp1=exp2 sinon Exp1 NVL(exp1,exp2) converti exp1 en exp2 si exp1=NULL

2) La clause WHERE La clause WHERE peut tre trs riche en conditions de slection Les oprateurs de comparaisons < = > <= >= <> SELECT * FROM articles WHERE prix<100 ; Comparateur de vacuit La Syntaxe =NULL ou <>NULL renvoie toujours faux , on ne peut tester la vacuit dune colonne quavec la syntaxe IS [NOT] NULL
Exemple SELECT * FROM clients WHERE cp IS NOT NULL ;

Les oprateurs Logiques

Page 11 sur 25

M.Tondeur H.

SQL-Oracle

Les mots cls AND et OR sont mis disposition Exemple SELECT * FROM articles WHERE couleur=bleu AND (prix>100 OR prix<10) ; Les bornes dinclusions Loprateur BETWEEN permet de remplacer avantageusement la squence >= . AND . <= Exemple : SELECT * FROM articles WHERE prix BETWEEN 10 AND 100 ; Slection dans une liste L oprateur IN permet vrifier quune valeur est contenue dans une liste de valeurs. Nb : il peut tre associ loprateur NOT pour signifier nest pas dans. Exemple : SELECT * FROM clients WHERE nom NOT IN (Dupont,Durand) ; Comparateur de Motifs Il est possible de balayer une colonne de type chane de caractres la recherche dun motif, grce loprateur de filtre LIKE et du caractre % qui remplace toute srie de caractre(s) (y compris vide). Exemple : SELECT * FROM clients WHERE nom LIKE D% ; SELECT * FROM clients WHERE nom LIKE %e ; Il existe galement le caractre _ qui remplace 1 caractre, on peut lutiliser plusieurs fois de suite. Oprations sur le rsultat Le rsultat dune requte SELECT peut comporter plusieurs fois la mme ligne. Pour liminer les lignes doublons, il existe les mot-cls DISTINCT, UNIQUE, ALL DISTINCT et UNIQUE permettent dliminer les ventuels duplicatas. ALL affiche lensemble des donnes (cest l valeur par dfaut). Exemple : SELECT DISTINCT nom FROM clients ; Oprateur de trie

Il est galement possible de trier les lignes du rsultat, pour cela nous disposons de la clause ORDER BY. Exemple : SELECT * FROM clients ORDER BY nom ASC NULLS FIRST ; On utilise les mots cls : ASC pour classer dans lordre croissant

Page 12 sur 25

M.Tondeur H.
DESC pour classe dans lordre dcroissant NULLS FIRST les valeurs nulles en haut NULLS LAST les valeurs nulles en bas

SQL-Oracle

On peut utiliser dans la clause ORDER BY les alias de la clause SELECT La zone de trie, utilise la SORT AREA de la PGA, cette SORT AREA est parametrable grce l'option SORT_AREA_SIZE du fichier init.ora. Le champ ROWNUM

Enfin pour garder que les x premires lignes du rsultat, Oracle prvu de numroter les lignes du rsultat dans un colonne cache nomme ROWNUM, qui se trouve dans vos tables propritaire. Exemple : SELECT DISTINCT nom FROM clients WHERE ROWNUM<=100 ORDER BY nom ASC NULLS LAST ; Les oprations ensemblistes On peut articuler les rsultats de plusieurs requtes homognes laide des oprations ensemblistes UNION, INTERSECT et MINUS. Les rgles respecter avec ces oprations ensemblistes sont les suivantes : Les colonnes affiches par les deux requtes doivent tre compatibles, en nombre , en ordre et en type de donnes. Les ventuels alias ne sont dfinis que dans la premire clause SELECT. Une ventuelle clause ORDER BY nes possible qu la fin de la dernire requte, car elle agit sur le rsultat final.

Dernires remarques : Par dfaut, lopration UNION limine les doublons ; pour les conserver, il faut utiliser loprateur UNION ALL. Contrairement UNION et INTERSECT, loprateur MINUS nest pas commutatif, donc lordre dans lequel les requtes sont crites, de part et dautre, a de limportance.

Exemple : -- affiche les identit de tous les clients et de tous les employs SELECT prenom || || nom AS identit FROM clients UNION SELECT prenom || || nom AS identit FROM employes ORDER BY identit ASC ;
--Idem-SELECT prenom || || nom AS identit FROM employes UNION SELECT prenom || || nom AS identit FROM clients ORDER BY identit ASC ;

Page 13 sur 25

M.Tondeur H.

SQL-Oracle

-- affiche les identits de tous les clients qui ont un homonyme parmi les employs SELECT prenom || || nom AS identit FROM clients INTERSECT SELECT prenom || || nom AS identit FROM employes ORDER BY identit ASC ;
--Idem-SELECT prenom || || nom AS identit FROM employes INTERSECT SELECT prenom || || nom AS identit FROM clients ORDER BY identit ASC ;

-- affiche les identits de tous les clients qui nont pas dhomonyme parmi les employs SELECT prenom || || nom AS identit FROM clients MINUS SELECT prenom || || nom AS identit FROM employes ORDER BY identit ASC ; -- affiche les identits de tous les employs qui nont pas dhomonyme parmi les clients SELECT prenom || || nom AS identit FROM employes MINUS SELECT prenom || || nom AS identit FROM clients ORDER BY identit ASC ;

Les Jointures Equi-Jointure Une equi-jointure utilise loprateur = et compare en gnralement des cls primaires avec des cls secondaires. Oracle recommande dutiliser des alias de tables pour amliorer les performances. Les alias sont obligatoires pour des colonnes qui portent le mme nom ou pour les auto jointures. On va trouver deux formes dcritures, relationnelle (=) et SQL2 (JOINON condition), lutilisation de INNER devant JOIN est optionnelle et est appliqu par dfaut. Exemple dquijointure :

SELECT NomSalle, NomPoste, TypePoste FROM Poste,Salle WHERE Poste.nSalle=Salle.nSalle AND Salle.NomSalle=07T ; SELECT NomSalle, NomPoste, TypePoste FROM Salle JOIN Poste ON Poste.nSalle=Salle.nSalle WHERE Salle.NomSalle=07T ;

Page 14 sur 25

M.Tondeur H.

SQL-Oracle

Auto Jointure Cas particulier de lquijointure, lauto jointure, relie une table elle mme. Soit la table suivante : Commandes(numero,client, jour) Avec une autojointure il est possible de rpondre la question suivante : Afficher les numros des clients qui ont command en mme temps. SELECT DISTINCT a.client, b.client FROM commandes a, commandes b WHERE a.client < b.client AND a.jour=b.jour ; SELECT DISTINCT a.client, b.client FROM commandes a JOIN commandes b ON a.client<b.client WHERE a.jour=b.jour ; DISTINCT est obligatoire car sinon, deux clients qui ont command en mme temps deux fois, apparatraient deux fois. Jointure externe Les jointures externes permettent dextraire des enregistrements qui ne rpondent pas aux critres de jointure. Lorsque deux tables sont en jointure externe, une tables est dominante par rapport lautre qui est dite subordonne . Ce sont les enregistrements de la table dominante qui sont retourns (mme sil ne satisfont pas aux conditions de jointure).
Ecriture relationnelle

- La directive de jointure externe (+) se place du ct de la table subordonne. - Cette directive peut se placer gauche ou droite dune clause de jointure, pas des deux cts. - Une clause de jointure externe ne peut ni utiliser loprateur IN ni tre associ une autre condition par loprateur OR.
Ecriture SQL2

Le sens de la directive de jointure externe LEFT ou RIGHT de la clause OUTER JOIN dsigne la table dominante.

Page 15 sur 25

M.Tondeur H.

SQL-Oracle

--Affichage de toutes les informations relatives aux clients dont on connat les informations complmentaires. SELECT * FROM clients a, annuaire_client b WHERE a.numero_client=b.num_client ; Cette requte naffiche pas tous les clients car il existe des clients pour lesquels on ne connat aucune information complmentaire. Il faut donc que la condition de jointure ne soit pas obligatoire, afin de ne pas supprimer laffichage les clients dont on na pas dinformation complmentaire. On parle alors de jointure externe. Il suffit pour cela dajouter le signe (+) dans la condition de jointure du cot de la table subordonne :
Ecriture relationnelle

SELECT * FROM clients a, annuaire_client b WHERE a.numero_client=b.num_client (+) ; Une requte quivalente SELECT * FROM clients a, annuaire_client b WHERE b.num_client (+) = a.numero_client ;
Ecriture SQL2

SELECT * FROM clients a LEFT (a.numero_client=b.num_client); Une requte quivalente SELECT * FROM annuaire_client b (a.numero_client=b.num_client);

OUTER

JOIN

annuaire_client

ON

RIGHT

OUTER

JOIN

clients

ON

Les Sous Requtes ou jointures procdurales Il est possible dutiliser dans une requte principale, une sous requte SELECT condition que cette dernire soit dlimite par des parenthses. Sous requte qui renvoient une colonne et une seule valeur Lorsque la ss-requte renvoie de manire sure une seule valeur, il est possible dutiliser les oprateurs de comparaisons classique. Page 16 sur 25

M.Tondeur H.

SQL-Oracle

Exemple :
SELECT * FROM articles WHERE prix >= (SELECT MAX(prix) FROM articles WHERE couleur=bleu) ;

Ces ss-requte peuvent galement semployer avec des oprateurs arithmtiques. Exemple :
SELECT ( SELECT COUNT(*) FROM clients WHERE FLOOR((SYSDATE b.naissance) /365.25) <18 ) / ( SELECT COUNT(*) FROM clients ) * 100 AS proportion de clients mineurs FROM DUAL

Sous requte qui renvoient une colonne et plusieurs valeurs Lorsque la sous requte renvoie une colonne de valeurs, la requte principale peut utiliser un oprateur de comparaison classique, mais accompagn soit de ALL soit de ANY et IN : Exemple :
SELECT * FROM articles WHERE prix >= ANY (SELECT prix FROM articles WHERE couleur=bleu) ;

ALL a tous ANY au moins un IN = ANY NOT IN <>ALL Sous requte qui renvoie plusieurs colonnes et plusieurs lignes Une sous requte peut renvoyer plusieurs colonnes de valeurs, auquel cas elle peut tre utilise dans la clause FROM de la requte principale. Exemple :
SELECT *, FLOOR(SYSDATE b.naissance) / 365.25) AS Age FROM (SELECT *

Page 17 sur 25

M.Tondeur H.
FROM clients WHERE ROWNUM <=10 ORDER BY naissance DESC) a , annuaire_client b WHERE a.client = b.numero (+) ;

SQL-Oracle

Une sous requte multi colonnes est galement utilisable avec un oprateur de comparaison entre couples et tous les autres tuples. Corrlation Une sous requte peut avoir besoin dinformation provenant de la requte principale. On dit alors que la requte est corrle et le passage dinformation se fais par lutilisation dalias. Attention avec la corrlation il risque dy avoir beaucoup de calcul et de pertes de temps, prfrer utiliser une technique diffrente si possible. Autres Utilisations Lemploie dune sous requte peut tre appel galement par une requte INSERT et galement dans une requte DELETE Les clauses de Groupements Il est parfois ncessaire de calculer la mme fonction dagrgation sur plusieurs de lignes. La clause GROUP BY Exemple pour calculer le montant total de chaque commande, il est ncessaire de grouper les lignes de commandes. Exemple :
SELECT a.commande, SUM(a.quantit * b.prix) AS Montant total FROM ligne_commande a , articles b WHERE a.article = b.numro GROUP BY a.commande ;

Pour reconnatre une requte SELECT qui ncessite une clause GROUP BY, il suffit de se demander si le rsultat doit afficher plusieurs valeurs dune mme fonction dagrgat. Attention : il existe deux contraintes impratives sur les colonnes de la clause SELECT ; Toutes les colonnes de la clause GROUP BY doivent figurer sur la clause GROUP BY Toutes les colonnes de la clause SELECT sans fonction dagrgat, doivent figurer dans la clause GROUP BY Il est parfois indispensable de procder par plusieurs vue prliminaires avant de pouvoir calculer. Exemple :
--calcul des revenus

Page 18 sur 25

M.Tondeur H.
CREATE OR REPLACE VIEW revenus (formation, revenu) AS SELECT a.formation, SUM(a.prsence * b.frais) FROM participations a, formations b WHERE a.formation=b.numero GROUP BY a.formation ; --calcul des marges SELECT a.formation, a.revenu b.cot AS profit FROM revenus a, couts b WHERE a.formation=b.formation ; --calcul des cots CREATE OR REPLACE VIEW cots (formation, cot) AS SELECT a.formation, SUM(a.heures * b.bonus * c.tarifs + b.prime + b.fixe) FROM animation a, formations b, animateurs c WHERE a.formation=b.numero AND a.animateur=c.numero GROUP BY a.formation ;

SQL-Oracle

Regroupement sur plusieurs colonnes La clause GROUP BY permet deffectuer des groupements sur plusieurs colonnes (puis des calculs dagrgation sur ces sous-groupes). Exemple :
SELECT a.client, b.article, MAX(a.quantit) AS Quantit MAX FROM commandes a , ligne_commandes b WHERE a.numero=b.commande GROUP BY a.client, b.article ;

Lordre des colonnes dans la clause GROUP BY na pas dimportance et lordre des mmes colonnes dans la clause SELECT na pas besoin dtre le mme. Par contre il est conseill dutiliser la clause ORDER BY pour laquelle lordre de limportance. Exemple :
--Pour afficher le rsultat dabord par N client croissant puis -- ( lintrieur dun mme N client) par N article dcroissant SELECT a.client,b.article, MAX(a.quantite) AS Quantite MAX FROM commandes a, lignes_commandes b WHERE a.numero=b.commande GROUP BY a.client, b.article ORDRE BY a.client ASC, b.article DESC ;

La clause HAVING Il est parfois utilise dexclure certains groupes issus dune requte GROUP BY laide dune ou plusieurs conditions de slection. Ces conditions ne peuvent tre crites dans la clause WHERE qui est rserve lexclusion des lignes avant groupement, mais dans une dernire clause, la clause HAVING.

Page 19 sur 25

M.Tondeur H.

SQL-Oracle

Exemple :
SELECT client, COUNT(numero) AS Nombre de commandes FROM commandes GROUP BY client HAVING COUNT(numero)>=4 ;

Les alias ne peuvent tre utilis dans une clause HAVING, il faut en consquence de quoi rpter la formule. Tous les oprateurs qui sont autoris dans une clause WHERE peuvent tre utiliss dans la clause HAVING, y compris une sous requte. Par contre les conditions de slection avant groupement ( et les conditions de jointure) doivent rester dans la clause WHERE. Exemple :
SELECT a.article, b.client, SUM(a.quantite) AS quantite totale FROM ligne_commandes a, commandes b WHERE a.commande=b.numero GROUP BY a.article, b.client HAVING (a.article, SUM(a.quantite)) IN (SELECT article, MAX(quantite_totale) FROM QuantitesTotales GROUP BY client) ;

La clause WHERE peut porter sur les colonnes de la clause SELECT sans fonction dagrgation ainsi que sur les colonnes non affiches. La clause HAVING ne peut porter que sur les colonnes de la clause SELECT (agrges ou non). Crer des Vues : - On peut donner un nom une requte, puis lutiliser comme une table dans une autre requte. - Une vue est une table virtuelle qui permet de regrouper des champs de plusieurs table en une seule. - De simplifier les requtes SQL. - Dapporter une scurit dans la manipulation des donnes qui se font via les vue et non plus directement partir des tables. - De permettre de montrer aux utilisateurs que les donnes qui les concernent et de cachs les schmas relationnels.

Page 20 sur 25

M.Tondeur H.

SQL-Oracle

- De donner des intituls aux colonnes plus parlant que ceux des tables, et parfois de traduire dans diffrentes langue ou langages mtiers. On utilise pour cela la clause SQL suivante : CREATE OR REPLACE VIEW nomVue (nomcolvue1,nomcolvue2,.) AS SELECT col1,col2, . FROM Nomtables WHERE conditions [WITH READ ONLY] ; L'option WITH READ ONLY, rend la vue non modifiable. Les nouveaux intituls de colonnes donns lors de la dfinition de la vue pourront tre rutiliss comme nimporte quel nom de colonne. Les Vues permettent deffectuer des requtes INSERT, DELETE et UPDATE sur plusieurs tables la fois, conditions dutiliser des dclencheurs ou d'avoir une vue modifiable. Une vue est modifiable si et seulement si, on n'utilise pas les mots clefs suivants dans la conception de la vue : DISTINCT AVG, COUNT, MAX, MIN, VARIANCE, STDDEV ROWNUM, ROWID, LEVEL GROUP BY HAVING ORDER BY CONNECT BY Supprimer une vue : DROP VIEW NomVue [CASCADE CONSTRAINTS] ; L'option CASCADE CONSTRAINTS, permet de supprimer les cls primaire et trangres. Crer des Synonymes : CREATE OR REPLACE [PUBLIC] SYNONYME NomSynonyme FOR NomObjetOracle[@Database Link] ; L'option PUBLIC, permet de crer un synonyme public accessible par tous. NomObjetOracle, reprsente un objet d'un schma Oracle, comme une table par exemple. DROP [PUBLIC] SYNONYME NomSynonyme [FORCE] ; L'option FORCE, force la suppression si le synonyme est dpendant d'un autre objet, comme une vue par exemple. Crer des Databases Link :

Page 21 sur 25

M.Tondeur H.

SQL-Oracle

CREATE [PUBLIC] DATABASE LINK NomDbLink CONNECT TO <utilisateur> IDENTIFIED BY <Password> USING <schma> ; Permet de crer une connexion avec une base de donnes distante, et de linterroger comme si cette base de donnes tait locale. Exemple : CREATE DATABASE LINK ComptaLyon CONNECT TO System IDENTIFIED BY manager USING CPTLYON ; SELECT * FROM Ecritures@ComptaLyon ; DROP DATABASE LINK NomDbLink [FORCE] ; L'option FORCE, permet de forcer la suppression du database link, mme si celui ci est verrouiller par un autre objet Oracle. Lister l'ensemble des DATABASE LINK du schma Oracle : SELECT * FROM DBA_DB_LINKS ; Acclrer les recherche grce aux Index : Un Index Oracle permet dacclrer laccs aux donnes dune table. Le but principal dun index est dviter de parcourir une table squentiellement du premier enregistrement jusqu' celui vis. Plusieurs type dindex sont proposs par Oracle : - Larbre quilibr (B-tree) - Inverse (Reverse Key) qui concerne les tables clustrises . - Chane de bits (Bitmap) qui regroupe chaque valeur de la ou des colonnes indexes sous la forme dune chane de bits. - Bass sur les calculs entre colonnes (function-based indexes) CREATE INDEX {UNIQUE|BITMAP} [schma.]nomIndex ON [schma.]nomTable ( {colonne1 | expressionCol1} [ASC | DESC] .) ; UNIQUE permet de crer un index qui ne supporte pas les doublons. BITMAP fabrique un index chanes de bits ASC et DESC prcisent lordre (croissant ou dcroissant). Exemple :
CREATE UNIQUE INDEX Idx_compte ON CompteEpargne (titulaire DESC) ;

Index B-tree ordre inverse

Page 22 sur 25

M.Tondeur H.
CREATE INDEX idx_debitFF ON CompteEpargne (debit*6.55957) ;

SQL-Oracle

Index B-tree expression dune colonne


CREATE BITMAP INDEX Idx_Bitmap_txInt_CompteEpargne ON CompteEpargne (txInt) ;

Index Bitmap
CREATE INDEX Idx_fct_Solde_CompteEpargne ON CompteEpargne ((credit-Debit)*(1+(txInt/100))-agios, credti,debit,txInt,agios) ;

Index bas sur une fonction Mettre en place les dclencheurs La syntaxe des dclencheurs sous Oracle peut tre plus ou moins complexe.
CREATE [ OR REPLACE ] TRIGGER schma.nom_dclencheur AFTER | BEFORE { [ INSERT [ OR DELETE [ OR UPDATE OF nom_colonne,...,nom_colonneN ] ] ] } ON schma.nom_table FOR EACH ROW nom_procdure (argument...argumentN);

La seconde syntaxe se rvle bien plus absconse, puisqu'elle intgre non seulement les dclencheurs LMD mais galement d'autres types de dclencheurs bass sur des commandes LDD ou DATABASE. En outre, pour les dclencheurs LMD, des clauses spcifiques aux vues apparaissent, ainsi que la clause REFERENCING.
CREATE [ OR REPLACE ] TRIGGER [ schma. ] nom_dclencheur { AFTER | BEFORE | INSTEAD OF } { { [ INSERT [ OR DELETE [ OR UPDATE [ OF nom_colonne [, nom_colonneN ] ] ] ] ] } ON { { [ schma. ] nom_table } | { [ NESTED TABLE colonne_embote OF ] [ schma . ] nom_vue } } { [ REFERENCING ] { [ OLD [ AS ] ancienne_colonne | NEW [ AS ] nouvelle_colonne

Page 23 sur 25

M.Tondeur H.
| PARENT [ AS ] colonne_parente ]

SQL-Oracle

} } {

} [ FOR EACH ROW ] instruction_SQL; | { { Evnement_LDD [ OR EvnementN_LDD ] } | { Evnement_Base_Donnes [ OR EvnementN_Base_Donnes ] } ON { { [ schma. ] SCHEMA } | DATABASE } WHEN ( Condition ) { instruction_PL/SQL | instruction_procdure };

La commande OR REPLACE recre le dclencheur s'il existe dj. La clause BEFORE indique que le dclencheur doit tre lanc avant l'excution de l'vnement. La clause AFTER indique que le dclencheur doit tre lanc aprs l'excution de l'vnement. Les instructions INSERT et DELETE indique au dclencheur de s'excuter lors respectivement d'une insertion ou d'une suppression dans la table. La clause UPDATE OF indique que le dclencheur doit tre lanc lors de chaque mise jour d'une des colonnes spcifies. Si elle est omise, n'importe quelle colonne de la table modifie provoque le dclenchement du Trigger. La clause ON dsigne le nom de la table associ son schma pour lequel le dclencheur a t spcifiquement cr. La clause FOR EACH ROW dsigne le dclencheur pour tre un dclencheur de ligne. Oracle lance un dclencheur de ligne une fois pour chaque ligne qui est affecte par l'instruction de dclenchement. Si la clause est omise, le dclencheur est un dclencheur d'instruction. Oracle lance un dclencheur d'instruction une fois seulement lorsque l'instruction dclenchante est mise si la contrainte du dclencheur optionnelle est rencontre. La clause REFERENCING permet de spcifier des noms de corrlation. Il est possible d'utiliser les noms de corrlation dans des blocs d'instructions PL/SQL et dans la condition WHEN d'un dclencheur de ligne pour se rfrer spcifiquement des valeurs anciennes et nouvelles de la ligne courante. Les noms de corrlation par dfaut sont OLD et NEW. Si le dclencheur de ligne est associ une table nomme OLD ou NEW, l'utilisation de cette clause permet de spcifier des noms de corrlations diffrents afin d'viter une confusion entre les noms de table et les noms de corrlation. Si le dclencheur est dfini sur une table imbrique, OLD et NEW se rfrent la ligne de la table imbrique, et PARENT se rfre la ligne courante de la table parente.

Page 24 sur 25

M.Tondeur H.

SQL-Oracle

Si le dclencheur est dfini sur une table ou une vue, OLD et NEW se rfre aux instances d'objet. La clause REFERENCING n'est pas valide avec les dclencheurs INSTEAD OF sur les vnements LDD de cration. Exemple
-- Premier exemple CREATE OR REPLACE TRIGGER declencheur_suppression AFTER DELETE ON tbl_1 FOR EACH ROW WHEN (1 = 1) DECLARE action_utilisateur VARCHAR2(50); BEGIN SELECT user INTO action_utilisateur FROM DUAL; INSERT INTO delete_log VALUES ('tbl_1',action_utilisateur,TO_CHAR(SYSDATE, 'DD/MON/YYYY'), TO_CHAR(SYSDATE, 'HH24:MI:SS')); END; -- Second exemple CREATE TABLE tbl_1 (col_a INTEGER, col_b CHAR(20)); CREATE TABLE tbl_2 (col_c CHAR(20), col_d INTEGER); CREATE TRIGGER declencheur_insertion AFTER INSERT ON tbl_1 FOR EACH ROW WHEN (NEW.col_a <= 10) BEGIN INSERT INTO tbl_2 VALUES(:NEW.col_b, :NEW.col_a); END;

Le premier exemple cre un dclencheur qui insre un champ log l'intrieur d'une table, pour chaque ligne supprime dans la table spcifie. Le second exemple cre un dclencheur qui insre un enregistrement l'intrieur de la seconde table lorsqu' une opration d'insertion s'est accomplie dans la premire table. Le dclencheur vrifie si le nouvel enregistrement possde un premier composant infrieur ou gal 10 et si c'est le cas, inverse les enregistrements l'intrieur de la seconde table. Les variables spciales NEW et OLD sont disponibles pour se rfrer respectivement des nouveaux ou d'anciens enregistrements. Les deux points (:) prcdent NEW et OLD dans VALUES sont dans ce cas obligatoires, par contre dans la clause conditionnelle WHEN, ils doivent tre omis.

Page 25 sur 25

Vous aimerez peut-être aussi