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
http://st-curriculum.oracle.com/tutorial/DBXETutorial/index.htm
http://st-curriculum.oracle.com/
http://www.oracle.com/
Bertrand LIAUDET