INSIA – SIGL 3 Bases de données SQL – ORACLE

Transcription

INSIA – SIGL 3 Bases de données SQL – ORACLE
INSIA – SIGL 3
Bases de données
SQL – ORACLE
http://st-curriculum.oracle.com/tutorial/DBXETutorial/index.htm
http://st-curriculum.oracle.com/
Bertrand LIAUDET
SOMMAIRE
SOMMAIRE
1
GENERALITES
Calculette SQL ORACLE : sqlplus
Principales commandes sqlplus
Principales variables d’environnement sqlplus
Connexion / Déconnexion
Variables d’environnement
Format d’affichage
Description d’une table
Exécuter un script
Gestion de l’affichage des résultats d’un script
Variables de substitution : &var et &&var
Saisie, affectation et affichage des variables de substitution
Commentaires
login.sql
Exécuter une commande du système d’exploitation
Gestion des transactions
Gestion de fichier
Premiers usages du dictionnaire des données
Lister tous les utilisateurs :
Lister toutes les tables de l’utilisateur connecté
Lister tous les objets de l’utilisateur connecté
Principales vues du dictionnaires des données :
Gestion des accents
Sous windows
Sous linux
Création d’un utilisateur
Installation de Oracle Database Express Edition 10g
4
4
4
4
4
4
5
5
5
5
5
5
5
5
6
6
6
7
7
7
7
7
7
7
7
8
8
INSIA - BASES DE DONNÉES – SIGL 3 – SQL - ORACLE - 2007-2008 - page 1/30 - Bertrand LIAUDET
Création d’un utilisateur
Attribution de quelques autorisations à l'utilisateur
8
8
DDL
CREATE TABLE
DESC nomTable
DROP TABLE
RENAME
ALTER TABLE
CREATE TABLE… AS SELECT
CREATE SEQUENCE : auto-incrément
Création de la séquence
Utilisation de la séquence
Modification de la séquence
Suppresion de la séquence
Contraintes d’intégrité référentielles
Clé primaire
Clé étrangère
ON DELETE CASCADE, ON DELETE SET NULL
CHECK
Gestion des contraintes
Désactivation – Réactivation des contraintes nommées
Lister les contraintes
Différer l’application des contraintes
Commentaires de table et de colonne
Index
Table organisées en Index
ROWID et ROWNUM
ROWID
ROWNUM
INSERT ALL et INSERT FIRST : insertion multi-tables
INSERT ALL
INSERT FIRST
MERGE INTO
9
9
9
9
9
9
9
10
10
10
10
10
10
10
11
11
11
11
11
11
11
12
12
13
13
13
13
14
14
14
14
TYPES
Affichage d’expressions : pseudo-table DUAL
Caractères
Les types
Caractères standards :
Fonctions utiles
Valeurs numériques
Les types
15
15
15
15
15
15
17
17
INSIA - BASES DE DONNÉES – SIGL 3 – SQL - ORACLE - 2007-2008 - page 2/30 - Bertrand LIAUDET
Fonctions utiles
Date et heure
Les types
Fonctions utiles
Données binaires
Les types
Fonctions utiles
17
17
17
17
18
18
18
CONVENTION D’ECRITURE
18
SQL ORACLE AVANCE
Requêtes hiérarchique : table-arbre : CONNECT BY PRIOR
Présentation
Afficher tous les arbres
Afficher toutes les branches
Sélectionner un arbre
Sélectionner une branche
Elaguer des branches
Elaguer des arbres
Where classique
Cas des cycles
ORDER BY FIRST et LAST
Opérations ensemblistes
Les fonctions de groupe
Alias pour ORDER BY
WIDTH_BUCKET
Les fonctions utilisant les expressions régulières
Les éléments d’une expression régulière
Exemples
WITH
GREATEST, LEAST
DECODE
CASE
MAX(SUM(SALAIRE)
GROUP BY ROLLUP : afficher la somme d’une colonne
GROUP BY CUBE
GROUP BY GROUPING SETS
19
19
19
19
20
21
21
22
22
24
24
26
26
26
26
26
27
27
27
28
28
28
28
28
29
29
30
INSIA - BASES DE DONNÉES – SIGL 3 – SQL - ORACLE - 2007-2008 - page 3/30 - Bertrand LIAUDET
GENERALITES
Calculette SQL ORACLE : sqlplus
Principales commandes sqlplus
•
connect, disconnect
•
start, @
•
show, set
•
host
•
spool
•
accept, define, undefined
•
desc (describe)
•
rem (remark), --, /* */
•
save, get
Principales variables d’environnement sqlplus
•
user
•
linesize, pagesize
•
echo, termout, feedback, heading, trimspool
•
autocommit
Connexion / Déconnexion
C:>
C:>
C:>
C:>
C:>
sqlplus
sqlplus
sqlplus
sqlplus
sqlplus
/nolog
/nolog @initEnv.sql
nomUser
nomUser/password
SQL> connect nomUser
SQL> connect nomUser/password
C:> sqlplus @nomFic
// le fichier doit commencer par
// une connexion
SQL> disconnect
SQL> exit
// disconnect et exit valident
// la transaction : commit
Variables d’environnement
SQL> show user
SQL> select user from dual; //dual est une pseudo-table
SQL> show all
// Lister toutes les variables
SQL> show nomVariable // Affiche la valeur de la var.
INSIA - BASES DE DONNÉES – SIGL 3 – SQL - ORACLE - 2007-2008 - page 4/30 - Bertrand LIAUDET
Format d’affichage
SQL>
SQL>
SQL>
SQL>
SQL>
set linesize X
// Taille d’une ligne de résultats
set pagesize X
// Taille d’une page de résultats
column mgr format 999 // nombre sur 3 chiffres
column job trunc format a4 // 4 char max tronqué
column ename format a5 // 5 char max non tronqué
Description d’une table
SQL> desc nomTable
// description d’une table
SQL> select nom_table from user_tables ;
// lister les tables
Exécuter un script
SQL> @nomFichier //exécute le fichier, .sql par défaut
SQL> start nomFichier //équivalent à @
PAUSE : pour arrêter l’exécution d’un script
Gestion de l’affichage des résultats d’un script
SQL> spool fic.txt
SQL> spool off
SQL> set echo on
// Copie l'affichage à l'ecran
// dans 'fic.lst'
// Stoppe la copie dans 'fic.lst'
// affiche la commande en cours
SQL> set feedback on // affiche le nb lignes résultat
SQL> set heading on // affiche l’entête des colonnes
SQL> set trimspool on // supprime les blancs de fin
de ligne
SQL> set termout OFF
// supprime tout affichage
Variables de substitution : &var et &&var
SQL> select * from emp where job = &var_job;
Entrez une valeur pour var_job :
SQL> select * from emp where job = &&var_job;
Entrez une valeur pour var_job :
Les variables && garde leur valeur pour toute la session.
Saisie, affectation et affichage des variables de substitution
SQL> accept var_job num prompt ‘entrez job’
Entrez job :
SQL> define var_job
// affiche la valeur de var_job
SQL> define var_job=’CLERK’ //donne 1 valeur à var_job
SQL> undefine var_job // rend la variable indéfinie
Commentaires
REM
-/*
*/
ligne de commentaire
ligne de commentaire
texte de commentaire
login.sql
INSIA - BASES DE DONNÉES – SIGL 3 – SQL - ORACLE - 2007-2008 - page 5/30 - Bertrand LIAUDET
Le fichier login.sql s’exécute automatiquement au démarrage de slqplus.
Le fichier doit se trouver dans le répertoire de lancement de sqlplus.
Exécuter une commande du système d’exploitation
SQL> host pwd
//exécute un pwd
SQL> host ls –l //exécute un ls
Gestion des transactions
SQL> show autocommit
// OFF par défaut
SQL> autocommit {ON | OFF | IMMEDIATE} //ON
IMMEDIATE
Gestion de fichier
SQL> save nomFich [create, replace, append]
//enregistre le buffer dans un fichier
SQL> get fichier
// met le contenu du ficher dans un buffer
INSIA - BASES DE DONNÉES – SIGL 3 – SQL - ORACLE - 2007-2008 - page 6/30 - Bertrand LIAUDET
Premiers usages du dictionnaire des données
Lister tous les utilisateurs :
desc all_users ;
select * from all_users
Lister toutes les tables de l’utilisateur connecté
desc user_tables
select table_name from user_tables;
select * from user_catalog;
Lister tous les objets de l’utilisateur connecté
select object_name, object_type from user_objects;
Principales vues du dictionnaires des données :
all_catalog
all_tables
user_tables
user_objects
user_constraints
user_indexes
En général, les vues sont préfixées soit par « all » soit par « user ».
Gestion des accents
Sous windows
Ouvrir une fenêtre de commandes windows.
Aller dans le répertoire voulu.
Dans ce répertoire, passer la commande :
Dans ce répertoire, lancer SQLPLUS : les accents sont pris en compte.
C:/monRepertoire> set NLS_LANG=FRENCH_FRANCE.WE8PC850
C:/monRepertoire> sqlplus
Ce répertoire est le répertoire de base pour SQLPLUS
Sous linux
SQL> alter session set nls_language=French;
SQL> alter session set nls_territory=France;
Ces commandes peuvent être placées dans le fichier login.sql
INSIA - BASES DE DONNÉES – SIGL 3 – SQL - ORACLE - 2007-2008 - page 7/30 - Bertrand LIAUDET
Création d’un utilisateur
Installation de Oracle Database Express Edition 10g
On se retrouve avec deux utilisateurs : « system » et « sys ».
Création d’un utilisateur
CREATE USER
IDENTIFIED BY
Bertrand
"MDP123";
Attribution de quelques autorisations à l'utilisateur
GRANT CONNECT, RESOURCE TO Bertrand ;
CONNECT est un rôle prédéfini qui permet la création de tables et donc leur modification,
suppression, consultation.
RESOURCE est un rôle prédéfini qui permet de faire du PL-SQL : création de triggers et de
procédures stockées.
ALL_PRIVILEGES donne tous les privilèges.
INSIA - BASES DE DONNÉES – SIGL 3 – SQL - ORACLE - 2007-2008 - page 8/30 - Bertrand LIAUDET
DDL
CREATE TABLE
CREATE TABLE nomTable (…) ;
CREATE TABLE user.nomTable (…) ;
Les principaux types sont : CHAR, VARCHAR2, NUMBER, DATE.
DESC nomTable
DROP TABLE
DROP TABLE nomTable ;
DROP TABLE user.nomTable;
DROP TABLE nomTable CASCADE CONSTRAINTS;
RENAME
RENAME ancienNom TO nouveauNom ;
ALTER TABLE
ALTER
ALTER
ALTER
ALTER
ALTER
ALTER
TABLE
TABLE
TABLE
TABLE
TABLE
TABLE
nomTable
nomTable
nomTable
nomTable
nomTable
nomTable
ADD…
MODIFY…
RENAME COLUMN…
DROP COLUMN…
SET UNUSED COLUMN nomCol ; -- effet immédiat
DROP UNUSED COLUMNS;
ALTER TABLE nomTable ADD CONSTRAINT…
ALTER TABLE nomTable DROP CONSTRAINT nomContrainte
[CASCADE [DROP INDEX]] ;
-- le cascade si on supprime une clé primaire
ALTER TABLE nomTable DISABLE CONSTRAINT
nomContrainte [CASCADE [DROP INDEX]] ;
ALTER TABLE nomTable ENABKE CONSTRAINT nom Contrainte ;
CREATE TABLE… AS SELECT
CREATE TABLE nomTable AS SELECT ...;
INSIA - BASES DE DONNÉES – SIGL 3 – SQL - ORACLE - 2007-2008 - page 9/30 - Bertrand LIAUDET
CREATE SEQUENCE : auto-incrément
Création de la séquence
CREATE SEQUENCE empNo
INCREMENT BY 1
START WITH 7934
NOCACHE;
Le cache permet une préallocation de la mémoire pour les valeurs de la séquence.
Utilisation de la séquence
Valeur courante de la séquence : nomSeq.currval
Valeur suivante de la séquence : nomSeq.nextval
Affichage des currval et nextval en cours : pseudo-table DUAL:
SELECT empNo.currvall FROM DUAL;
SELECT empNo.nextval FROM DUAL;
Modification de la séquence
ALTER SEQUENCE empNo
Etc.
Suppresion de la séquence
DROP SEQUENCE empNo ;
Contraintes d’intégrité référentielles
Clé primaire
CREATE TABLE Dept (
deptNo
NUMBER(2) NOT NULL,
dName
CHAR(14),
CONSTRAINT pk_dept PRIMARY KEY (deptNo)
);
ou
CREATE TABLE Dept (
deptNo
NUMBER(2) NOT NULL,
dName
CHAR(14),
);
ALTER TABLE DEPT ADD CONSTRAINT pk_dept PRIMARY KEY (deptNo)
ou
CREATE TABLE Dept (
deptNo
dName
NUMBER(2) PRIMARY KEY NOT NULL,
CHAR(14),
INSIA - BASES DE DONNÉES – SIGL 3 – SQL - ORACLE - 2007-2008 - page 10/30 - Bertrand LIAUDET
);
Dans ce cas, la contrainte n’est pas nommée.
Clé étrangère
CREATE TABLE Emp (
empNo
NUMBER(4) NOT NULL,
eName
CHAR(10),
mgr
NUMBER(4),
deptNo
NUMBER(2) NOT NULL,
CONSTRAINT fk_Emp_mgr_Emp FoREIGN KEY (mgr) REFERENCES Emp
(empNo),
CONSTRAINT fk_Emp_deptNo_Dept FOREIGN KEY (deptNo) REFERENCES Dept
(deptNo),
CONSTRAINT pk_Emp PRIMARY KEY (empNo)
);
ON DELETE CASCADE, ON DELETE SET NULL
CONSTRAINT fk_Emp_deptNo_Dept FOREIGN KEY (deptNo) REFERENCES Dept
ON DELETE CASCADE
A noter qu’il n’y a pas de ON UPDATE CASCADE ou SET NULL
CHECK
sal
NUMBER(7,2) CHECK(sal BETWEEN 0 AND 100000),
sal
NUMBER(7,2) CHECK(sal > 0),
CONSTRAINT ck_Emp_comm CHECK(comm >=0),
CONSTRAINT nn_Emp_hireDate CHECK(hireDate IS NOT NULL),
Gestion des contraintes
Désactivation – Réactivation des contraintes nommées
ALTER TABLE Emp DISABLE CONSTRAINT ck_Emp_comm ;
ALTER TABLE Emp ENABLE CONSTRAINT ck_Emp_comm ;
Une fois la contrainte d’intégrité désactivée, on peut violer les contraintes d’intégrité.
On ne pourra réactiver une contrainte que si les contraintes d’intégrité sont bien vérifiées.
Lister les contraintes
DESC all_constraints
DESC user_constraints
SELECT constraint_name, table_name, search_condition, status
FROM user_constraints
WHERE constraint_name LIKE ‘CK%’;
SELECT constraint_name, table_name, search_condition, status FROM
user_constraints WHERE constraint_name LIKE ‘PK%’;
Différer l’application des contraintes
Par défaut les contraintes sont :NOT DEFFERRABLE et INITIALY IMMEDIATE
INSIA - BASES DE DONNÉES – SIGL 3 – SQL - ORACLE - 2007-2008 - page 11/30 - Bertrand LIAUDET
L’application est IMMEDIATE et ne peut pas être différée.
IMMEDIATE signifie que la vérification de la contrainte est effectuée à chaque instruction du
DML.
On peut aussi choisir DEFERRED à la place de IMMEDIATE. L’application de la contrainte
est différé et ne peut pas être rendue immédiate.
DEFFERED signifie que la vérification sera fait au moment de la validation de la transaction
(COMMIT).
Pour pouvoir modifier le moment de l’application des contraintes, il faut définir la contrainte en
DEFFERABLE.
On peut alors modifier le moment d’application par contrainte :
SET CONSTRAINT nomContrainte IMMEDIATE (ou DEFFERED) ;
Ou pour toutes les contraintes à la fois :
SET CONSTRAINTS ALL DEFFERED ;
Commentaires de table et de colonne
COMMENT ON TABLE Dept IS ‘Table des départements de l’entreprise’ ;
DESC User_Tab_Comment ;
SELECT comments FROM User_Tab_Comments WHERE table_name = ‘DEPT’ ;
SELECT view_name FROM All_Views WHERE view_name like ‘%COMMENT%’;
Index
4 types d’index, ascendant ou descendant :
•
standard
•
unique : UNIQUE
•
bitmap : BITMAP
•
basé sur des fonctions : index sur un attribut calculé
Rappelons que
•
Les index ralentissent les mises à jour de la BD (DML) mais accélère les recherches
(SELECT)
•
Les clés étrangères ne sont pas indexées automatiquement. Il est conseillé de les indexer.
•
Les index bitmap sont conseillés quand il y a peu de valeurs distinctes dans la colonne à
indexer et qu’on aura des recherches d’égalité et pas d’inégalité.
•
Les index sont pénalisants quand il concernent des colonnes souvent modifiées.
•
Les index sont pénalisants quand il concernent des colonnes qui contiennent peu de lignes.
CREATE INDEX idx_Emp_job ON Emp(job ASC);
INSIA - BASES DE DONNÉES – SIGL 3 – SQL - ORACLE - 2007-2008 - page 12/30 - Bertrand LIAUDET
SELECT index_Name FROM all_indexes WHERE table_name = ‘EMP’;
SELECT index_Name FROM all_indexes WHERE index_Name like 'PK%' or index_Name like
'FK%' or index_Name like 'IDX%' order by index_Name;
Table organisées en Index
Les tables organisées en index sont des tables organisées en B-tree, la clé primaire étant
l’attribut de classement.
CREATE TABLE NomTable( )
ORGANIZATION INDEX ;
ROWID et ROWNUM
ROWID
Le ROWID identifie l’emplacement de chaque enregistrement (adresse).
ORACLE utilise ce ROWID pour accélérer les accès.
On peut utiliser cette colonne comme un char.
SELECT rowid, empno, ename FROM emp WHERE rowid ='AAADhqAABAAAKaKAAA';
ROWNUM
Le ROWNUM indique le numéro des tuples dans l’ordre de leur création.
INSIA - BASES DE DONNÉES – SIGL 3 – SQL - ORACLE - 2007-2008 - page 13/30 - Bertrand LIAUDET
INSERT ALL et INSERT FIRST : insertion multi-tables
INSERT ALL
INSERT ALL permet d’insérer des tuples dans plusieurs tables et avec des conditions.
INSERT ALL
WHEN ap? = valeur
INTO Table1
VALUES (ap?, ap?, etc.)
WHEN ap? = valeur
INTO Table2
VALUES (ap?, ap?, etc.)
WHEN etc.
SELECT apx, apy, etc.
FROM etc. ;
Le SELECT fourni une liste de tuples. Ces tuples sont insérés dans les Tables si le WHEN est
vérifié en faisant correspondre les attributs du VALUES avec ceux du SELECT (la liste des
attributs du VALUES est donc incluse dans celle des attributs du SELECT).
On peut aussi ne pas avoir de WHEN.
INSERT FIRST
La commande INSERT FIRST a la même syntaxe que INSERT ALL. La différence est que le
INSERT FIRST n’insère que dans une seule table : le INSERT FIRST s’arrête après la première
condition valide.
MERGE INTO
La commande MERGE permet de faire des insert et des delete dans une table à partir des
données d’une autre table ou d’une requête en une seule commande.
MERGE INTO tableCible USING (requêteOuTable) ON (condition)
WHEN MATCHED THEN UPDATE SET affectations
WHEN NOT MATCHED THEN INSERT (attributes) VALUES (valeurs);
INSIA - BASES DE DONNÉES – SIGL 3 – SQL - ORACLE - 2007-2008 - page 14/30 - Bertrand LIAUDET
TYPES
Affichage d’expressions : pseudo-table DUAL
SELECT sysdate, 4*3, log(2, 1024) FROM DUAL;
SELECT sysdate, systimestamp FROM DUAL;
Caractères
Les types
CHAR( ), NCHAR( ) : chaîne fixe, 2000 caractères max.
VARCHAR2( ), NVARCHAR2 (), chaîne variable, 4000 caractères max.
CLOB, NCLOB. : jusqu’à 4 GO.
Le N correspond à des chaînes Unicode : code unique de caractère plus standard.
Caractères standards :
Lettres, chiffres, symboles courants : espace tabulation % ‘ ( ) * - , . / \ : ; < > = ! _ & ~4 + | ^ ?
$#@"[]
Jeu de caractères d’une installation française : WE8ISO8859P1 (Western Europe 8-bit ISO
8859 Part 1)
Fonctions utiles
SELECT ASCII(‘A’) FROM DUAL ; -- code ASCII d’un caractère
SELECT CHR(97) FROM DUAL; -- caractère correspondant au code ASCII
DUMP
SELECT DUMP(‘Bonjour’) FROM DUAL;
SELECT DUMP(‘Bonjour’, 10) FROM DUAL; -- notation décimale
CONCAT(ch1, ch2) equivalent à l’opérateur ||
SUBSTR(ch, debut, longueur)
LENGTH(ch) : longueur de la chaîne.
INITCAP(ch) : met l’initial en capital
UPPER(ch) : tout en majuscule
LOWER(ch) : tout en minuscule
INSIA - BASES DE DONNÉES – SIGL 3 – SQL - ORACLE - 2007-2008 - page 15/30 - Bertrand LIAUDET
RTRIM(ch) : supprime les espaces à la fin (à droite).
LTRIM(ch) : supprime les espaces au début (à gauche)
INSIA - BASES DE DONNÉES – SIGL 3 – SQL - ORACLE - 2007-2008 - page 16/30 - Bertrand LIAUDET
Valeurs numériques
Les types
NUMBER (n, d)
De +ou – 10 –130 à +ou- 10+125. n chiffres dont d décimales. n+d <=38. 21 octets max.
BINARY_FLOAT. Sur 5 octets.
BINARY_DOUBLE. Sur 9 octets.
FLOAT
INTEGER
Fonctions utiles
NVL (attribut, valeur) : substitue une valeur NULL par une autre
REMAINDER, MOD : reste de la division entière
DUMP(valeur, 10) : explique le codage d’une valeur
Date et heure
Les types
DATE : jusqu’à la seconde;
TIMESTAMP: jusqu’à la fraction de seconde.
INTERVAL YEAR TO MONTH : intervale en années et mois.
INTERVAL DAY TO SECOND : intervale en secondes
Fonctions utiles
TO_DATE(date, format)
Formats:
‘MONTH DD, YYYY’,
‘DD MONTH YYYY’,
‘DD MM YYYY’
‘DD-MM-YYYY HH:MM:SS’
‘DD-MM-YYYY HH24:MI’
TO_CHAR(date, format)
SELECT TO_CHAR(sysdate, ‘J’) FROM DUAL; -- nb jours depuis le temps 0
SELECT TO_CHAR(sysdate, ‘DDD’) FROM DUAL; -- nb jours depuis le début de l’année
EXTRACT (partie extraite FROM date)
Partie extraite : YEAR, MONTH, DAY, HOUR, MINUTE, SECOND
SELECT EXTRACT(YEAR FROM SYSDATE) FROM DUAL;
INSIA - BASES DE DONNÉES – SIGL 3 – SQL - ORACLE - 2007-2008 - page 17/30 - Bertrand LIAUDET
SYSDATE : date du serveur, format DATE
CURRENT_DATE : date de la session, format DATE
SYSTIMESTAMP : date du serveur, format TIMESTAMP
LOCALTIMESTAMP : date de la session, format TIMESTAMP
DBTIMEZONE : fuseau horaire du serveur, format VARCHAR2
SESSIONTIMEZONE : fuseau horaire de la session, format VARCHAR2
ADD_MONTHS : ajoute des mois à une date
ROUND(date, format) : arrondi une date selon un format (year, month, etc)
SELECT DBTIMEZONE, SESSIONTIMEZONE FROM DUAL ;
Données binaires
Les types
BLOB : données binaires jusqu’à 4 GO
BFILE : données binaires dans un fichier externe jusqu’à 4 GO.
Fonctions utiles
Fonction BFILENAME(repertoire, fichier) : pour insérer un fichier.
Fonction LOADFROMFILE : pour charger un fichier.
CONVENTION D’ECRITURE
•
Tous les mots-clés du SQL sont en MAJUSCULES ;
•
Les noms tables, des attributs, des contraintes, etc. sont en minuscules.
•
La première lettres des tables est en majuscule.
•
Dans les noms composés, on met une majuscule à la première lettre de tous les composants
à partir du deuixème (dateRet, totalFacture, nbHVol)
•
Contrainte de clé primaire : pk_nomTable
•
Contrainte de clé étrangère : fk_TableSource_attributSource_TableCible
INSIA - BASES DE DONNÉES – SIGL 3 – SQL - ORACLE - 2007-2008 - page 18/30 - Bertrand LIAUDET
SQL ORACLE AVANCE
Requêtes hiérarchique : table-arbre : CONNECT BY PRIOR
Présentation
Les tables avec des auto-jointures peuvent être considérées comme des structures d’arbres.
On part de l’arbre suivant qui décrit l’organigramme d’une entreprise.
7839
7698
7844
7654
7499
7782
7900
7521
7566
7902
7788
7369
7876
Afficher tous les arbres
SQL> select level, empno, mgr from emp connect by prior empno=mgr;
LEVEL
EMPNO
MGR
---------- ---------- ---------1
7902
7566
2
7369
7902
1
7788
7566
2
7876
7788
1
7654
7698
1
7499
7698
1
7900
7698
1
7521
7698
1
7844
7698
1
7876
7788
1
7698
7839
2
7654
7698
2
7499
7698
2
7900
7698
2
7521
7698
2
7844
7698
1
7782
7839
1
7566
7839
2
7902
7566
3
7369
7902
2
7788
7566
3
7876
7788
1
7369
7902
1
7839
2
7698
7839
3
7654
7698
3
7499
7698
3
7900
7698
3
7521
7698
3
7844
7698
2
7782
7839
2
7566
7839
3
7902
7566
4
7369
7902
INSIA - BASES DE DONNÉES – SIGL 3 – SQL - ORACLE - 2007-2008 - page 19/30 - Bertrand LIAUDET
3
7788
7566
4
7876
7788
36 ligne(s) sélectionnée(s).
level est une pseudo-colonne qui donne le niveau dans l’arbre.
CONNECT BY PRIOR feuille = racine
Autre presentation:
SQL> select lpad(' ',4*level-4) || empno arbre from emp connect by
prior empno=mgr;
ARBRE
---------------------------------------------------------------7902
7369
7788
7876
7654
7499
...
7839
7698
7654
7499
7900
7521
7844
7782
7566
7902
7369
7788
7876
36 ligne(s) sélectionnée(s).
La fonction lpad insère une chaîne de caractères à gauche d’une autre.
Afficher toutes les branches
SQL> SELECT level, empno, mgr FROM Emp CONNECT BY PRIOR mgr=empno;
LEVEL
EMPNO
MGR
---------- ---------- ---------1
7369
7902
2
7902
7566
3
7566
7839
4
7839
1
7499
7698
2
7698
7839
3
7839
1
7521
7698
2
7698
7839
3
7839
1
7566
7839
2
7839
1
7654
7698
2
7698
7839
3
7839
1
7698
7839
2
7839
1
7782
7839
2
7839
1
7788
7566
2
7566
7839
3
7839
1
7839
1
7844
7698
2
7698
7839
INSIA - BASES DE DONNÉES – SIGL 3 – SQL - ORACLE - 2007-2008 - page 20/30 - Bertrand LIAUDET
3
1
2
3
4
1
2
3
1
2
3
7839
7876
7788
7566
7839
7900
7698
7839
7902
7566
7839
7788
7566
7839
7698
7839
7566
7839
level est une pseudo-colonne qui donne le niveau dans l’arbre.
CONNECT BY PRIOR racine=feuille.
Autre presentation:
SQL> select lpad(' ',4*level-4) || empno branches from emp connect
by prior mgr=empno;
BRANCHES
----------------------------------------------------7369
7902
7566
7839
7499
7698
7839
etc.
La fonction lpad insère une chaîne de caractères à gauche d’une autre.
Sélectionner un arbre
SQL> select lpad(' ',4*level-4) || empno arbre from emp start with
empno = 7839 connect by prior empno=mgr;
ARBRE
---------------------------------------------------------------7839
7698
7654
7499
7844
7900
7521
7782
7566
7902
7369
7788
7876
START WITH : l’employé qui sert de racine de l’arbre recherché. Si on filtre avec mgr=7839,
on obtient tous les arbres dont la racine à comme parent le 7839.
Sélectionner une branche
SQL> select lpad(' ',4*level-4) || empno branche from emp start
with empno = 7902 connect by prior mgr=empno;
BRANCHE
-----------------------------------------------------------------7902
7566
INSIA - BASES DE DONNÉES – SIGL 3 – SQL - ORACLE - 2007-2008 - page 21/30 - Bertrand LIAUDET
7839
START WITH : l’employé qui sert de feuille de la branche recherchée. Si on filtre avec
mgr=7902, on obtient toutes les branches dont les feuilles ont comme parent le 7902.
SQL> select level, empno, mgr from emp where mgr is not null start
with mgr=7839 connect by prior mgr=empno;
LEVEL
EMPNO
MGR
---------- ---------- ---------1
7566
7839
1
7698
7839
1
7782
7839
Elaguer des branches
SQL> select lpad(' ',4*level-4) || empno branches from emp connect
by prior mgr=empno and empno !=7566;
BRANCHES
-----------------------------------------------------------------7369
7902
7499
7698
7839
7521
7698
7839
7566
7839
7654
7698
7839
7698
7839
7782
7839
7788
7839
7844
7698
7839
7876
7788
7900
7698
7839
7902
Toutes les branches qui contenaient le 7566 ont été coupées. Le 7566 n’apparaît plus dans les
résultats.
Si on filtre avec mgr=7566, c’est comme si on filtrait avec empno=mgr(7566).
Elaguer des arbres
Couper le lien au parent
SQL> select lpad(' ',4*level-4) || empno arbres from emp connect by
prior empno=mgr and empno !=7566;
ARBRES
-----------------------------------------------------------------INSIA - BASES DE DONNÉES – SIGL 3 – SQL - ORACLE - 2007-2008 - page 22/30 - Bertrand LIAUDET
7902
7369
7788
7876
7654
7499
7900
7521
7844
7876
7698
7654
7499
7900
7521
7844
7782
7566
7902
7369
7788
7876
7369
7839
7698
7654
7499
7900
7521
7844
7782
Le 7566 n’apparaît plus comme nœud non racine. Il apparaît quand même comme nœud racine.
Couper les liens aux enfants
SQL> select lpad(' ',4*level-4) || empno arbres from emp connect by
prior empno=mgr and mgr !=7566;
ARBRES
-----------------------------------------------------------------7902
7369
7788
7876
7654
7499
7900
7521
7844
7876
7698
7654
7499
7900
7521
7844
7782
7566
7369
7839
7698
7654
7499
7900
7521
7844
7782
7566
INSIA - BASES DE DONNÉES – SIGL 3 – SQL - ORACLE - 2007-2008 - page 23/30 - Bertrand LIAUDET
Le 7566 est toujours enfant du 7839 mais il n’est parent de personne.
Where classique
SQL> select lpad(' ',4*level-4) || empno arbres from emp where
deptno!=30 connect by prior empno=mgr and mgr !=7566;
Le WHERE se place juste après le FROM, juste avant le START WITH
Cas des cycles
Dans l’exemple précédent, relions la racine à n’importe quel autre nœud
Update emp set mgr=7521 where empno=7839
Afficher toutes les branches
SQL> select lpad(' ',4*level-4) || empno hierarchie from emp
connect by prior mgr=empno;
ERROR:
ORA-01436: boucle CONNECT BY dans les données utilisateur
CONNECT BY NOCYCLE PRIOR
SQL> select lpad(' ',4*level-4) || empno branches from emp connect
by nocycle prior mgr=empno;
BRANCHES
-----------------------------------------------------------------7369
7902
7566
7839
7521
7499
7698
7839
7521
7698
7839
7566
7839
7521
7654
7698
7839
etc.
Le 7521 est à la fois feuille et racine.
CONNECT BY IS CYCLE
SQL> select level, empno, mgr, connect_by_iscycle from emp connect
by nocycle prior mgr=empno;
LEVEL
EMPNO
MGR CONNECT_BY_ISCYCLE
---------- ---------- ---------- -----------------1
7369
7902
0
2
7902
7566
0
3
7566
7839
0
4
7839
7521
0
5
7521
7698
1
1
7499
7698
0
2
7698
7839
0
3
7839
7521
1
1
7521
7698
0
2
7698
7839
0
3
7839
7521
1
INSIA - BASES DE DONNÉES – SIGL 3 – SQL - ORACLE - 2007-2008 - page 24/30 - Bertrand LIAUDET
1
2
3
1
2
3
7566
7839
7521
7654
7698
7839
7839
7521
7698
7698
7839
7521
0
0
1
0
0
1
etc.
INSIA - BASES DE DONNÉES – SIGL 3 – SQL - ORACLE - 2007-2008 - page 25/30 - Bertrand LIAUDET
ORDER BY FIRST et LAST
ORDER BY NULLS FIRST;
ORDER BY NULL LAST;
Opérations ensemblistes
INTERSECT
UNION
UNION ALL : garde les doublons
MINUS
Les fonctions de groupe
AVG, COUNT, MIN, MAX, SUM
STDDEV : écart type
VARIANCE : variance
Alias pour ORDER BY
SELECT empno, ename, sal+NVL(comm, 0) salTot FROM Emp ORDER BY
salTot;
WIDTH_BUCKET
WITDTH_BUCKET (attribut, min, max, nombres d’intervalles) permet de créer un attribut
catégoriel à partir d’un attribut continu.
Exemple
SELECT empno, ename, sal, WIDTH_BUCKET(sal, 0, 10000, 10) tranche
FROM Emp ;
On pourrait écrire
SELECT empno, ename, sal, TRUNC((sal-min)/((max-min)/nbinter))+1
FROM Emp;
INSIA - BASES DE DONNÉES – SIGL 3 – SQL - ORACLE - 2007-2008 - page 26/30 - Bertrand LIAUDET
EXPRESSIONS REGULIERES
Les fonctions utilisant les expressions régulières
REGEXP_LIKE (chaîne source, reg-exp) : pour faire des recherches
REGEXP_REPLACE : pour faire des remplacements
REGEXP_SUBSTR :: permet d’extraire une sous-chaîne
REGEXP_INSTR : pour faire des recherches en renvoyant la position trouvée.
REGEXP_COUNT : complète REGEXP_INSTR en comptant le nombre d’occurrences.
Les éléments d’une expression régulière
Élément
\
Description
Le caractère backslash (barre oblique inverse) permet d’annuler l’effet
d’un caractère significatif suivant (opérateur, par exemple).
*
Désigne aucune ou plusieurs occurrences.
+
Désigne une ou plusieurs occurrences.
?
Désigne au plus une occurrence.
|
Opérateur spécifiant une alternative.
^
Désigne le début d’une ligne de caractères.
$
Désigne la fin d’une ligne de caractères.
.
Désigne tout caractère excepté la valeur NULL.
[]
Désigne une liste devant vérifier une expression continue dans la liste. Une
liste ne devant pas vérifier une expression contenue dans la liste devra
commencer par le caractère “^”.
()
Désigne une expression groupée et traitée comme une simple sousexpression.
{m}
Signifie exactement m fois.
{m,}
Signifie au moins m fois.
{m,n}
Signifie au moins m fois mais pas plus de n fois.
[::]
[= =]
Spécifie la classe de caractères (précisée dans le tableau suivant)
Spécifie la classe d’équivalence (ex : '[=a=]' filtrera ä, â, à…).
Exemples
REGEXP_LIKE (date, ‘../../06’);
REGEXP_REPLACE (attribute, ‘(.)’,’\1-‘);
INSIA - BASES DE DONNÉES – SIGL 3 – SQL - ORACLE - 2007-2008 - page 27/30 - Bertrand LIAUDET
WITH
WITH permet de donner un nom à une requête et de pouvoir ensuite l’utiliser comme une table
dans une autre requête.
WITH nomReq1 AS (SELECT …) , nomReq2 AS (SELECT …) etc
SELECT …;
GREATEST, LEAST
GREATEST et LEAST permettent de trouver la plus grande et la plus petite valeur parmi une
liste de valeur d’un même tuple.
SELECT empno, ename, GREATEST(sal, NVL(comm, 0)) FROM Emp ;
DECODE
DECODE permet de choisir une valeur parmi une liste de valeurs en fonction d’une autre valeur.
SELECT empno, ename, hiredate, DECODE( TRUNC( EXTRACT( YEAR FROM hiredate)/2008),
1, 'NOUVEAU', 0,'ANCIEN') type FROM Emp;
CASE
CASE permet de mettre en place un test dans une requête. C’est un DECODE plus souple.
SELECT empno, ename, hiredate, CASE EXTRACT (YEAR FROM hiredate) WHEN 2008 THEN
'Nouveau' WHEN 2007 THEN ‘Récent’ ELSE ‘Ancien’ END type FROM Emp;
MAX(SUM(SALAIRE)
Moyenne des salaries dans chaque departments :
SQL> SELECT deptno, AVG( sal) FROM EMP GROUP BY deptno;
DEPTNO
AVG(SAL)
---------- ---------10
2387,5
20
2175
30 1566,66667
Moyenne des salaires des département la plus élevée :
SELECT MAX( AVG( sal)) FROM EMP GROUP BY deptno;
Attention on ne peut pas projeté deptno.
Département dont la moyenne des salaires est la plus élevé :
SQL> SELECT deptno FROM EMP GROUP BY deptno HAVING AVG(sal) =
(SELECT MAX( AVG( sal)) FROM EMP GROUP BY deptno);
INSIA - BASES DE DONNÉES – SIGL 3 – SQL - ORACLE - 2007-2008 - page 28/30 - Bertrand LIAUDET
GROUP BY ROLLUP : afficher la somme d’une colonne
SQL> Select deptno, sum(sal) from emp group by rollup(deptno) ;
DEPTNO
SUM(SAL)
---------- ---------10
9550
20
10875
30
9400
29825
Pour avoir la somme des salaires par employés :
Select empno, sum(sal) from emp group by rollup(empno);
Avec deux critères de regroupement:
SQL> Select job, deptno, count(*), sum(sal) from emp group by
rollup(job, deptno);
JOB
DEPTNO
COUNT(*)
SUM(SAL)
--------- ---------- ---------- ---------ANALYST
20
2
6000
ANALYST
2
6000
CLERK
10
2
2100
CLERK
20
2
1900
CLERK
30
1
950
CLERK
5
4950
MANAGER
10
1
2450
MANAGER
20
1
2975
MANAGER
30
1
2850
MANAGER
3
8275
PRESIDENT
10
1
5000
PRESIDENT
1
5000
SALESMAN
30
4
5600
SALESMAN
4
5600
15
29825
15 ligne(s) sélectionnée(s).
GROUP BY CUBE
Le GROUP BY CUBE est utile avec deux critères de regroupement (ou plus). Il donne un bilan
complet : sans critère, par critère simple, par critères couplés.
La différence avec le group by rollup avec deux critères est qu’on a un bilan par critère simple pour les
deux critères et pas pour un seul : dans l’exemple, on a le bilan par DEPTNO en plus (lignes 2, 3 et 4).
SQL> Select job, deptno, count(*), sum(sal) from emp group by
cube(job, deptno);
JOB
DEPTNO
COUNT(*)
SUM(SAL)
--------- ---------- ---------- ---------15
29825
10
4
9550
20
5
10875
30
6
9400
ANALYST
2
6000
ANALYST
20
2
6000
CLERK
5
4950
CLERK
10
2
2100
CLERK
20
2
1900
CLERK
30
1
950
MANAGER
3
8275
//
//
//
//
//
//
//
//
//
//
sal des
sal des
sal des
sal des
sal des
sal des
sal des
sal des
sal des
etc.
15 emp
emp du 10
emp du 20
emp du 30
analyst
analyst du20
clerk
clerk du 10
clerk du 20
INSIA - BASES DE DONNÉES – SIGL 3 – SQL - ORACLE - 2007-2008 - page 29/30 - Bertrand LIAUDET
MANAGER
MANAGER
MANAGER
PRESIDENT
PRESIDENT
SALESMAN
SALESMAN
10
20
30
10
30
1
1
1
1
1
4
4
2450
2975
2850
5000
5000
5600
5600
18 ligne(s) sélectionnée(s).
GROUP BY GROUPING SETS
Le GROUP BY GROUPING SETS est utile avec deux critères de regroupement (ou plus). Il donne
un bilan complet : il donne un bilan complet pour chaque critère simple. C’est un peu comme si on
fusionnait les résultats de deux GROUP BY.
SQL> Select job, deptno, count(*), sum(sal) from emp group by
grouping sets(job, deptno);
JOB
DEPTNO
COUNT(*)
SUM(SAL)
--------- ---------- ---------- ---------CLERK
5
4950
ANALYST
2
6000
PRESIDENT
1
5000
SALESMAN
4
5600
MANAGER
3
8275
30
6
9400
20
5
10875
10
4
9550
8 ligne(s) sélectionnée(s).
A noter le simple GROUP BY :
SQL> Select job, count(*), sum(sal) from emp group by (job);
JOB
COUNT(*)
SUM(SAL)
--------- ---------- ---------CLERK
5
4950
ANALYST
2
6000
PRESIDENT
1
5000
SALESMAN
4
5600
MANAGER
3
8275
INSIA - BASES DE DONNÉES – SIGL 3 – SQL - ORACLE - 2007-2008 - page 30/30 - Bertrand LIAUDET

Documents pareils

INSIA Bases de données ORACLE – 2 – SELECT avancé SQL*Plus

INSIA Bases de données ORACLE – 2 – SELECT avancé SQL*Plus http://st-curriculum.oracle.com/tutorial/DBXETutorial/index.htm http://st-curriculum.oracle.com/ http://www.oracle.com/ Bertrand LIAUDET

Plus en détail