Oracle SQL im Überblick Editor: Klaus Philipp (Hochschulrechenzentrum Dortmund, E-Mail: [email protected] ) Dies ist ein Überblick über die gängigsten SQL-Kommandos, die dem Leser als Kurzanleitung dienen soll. Als umfassendes Nachschlagewerk sei das Werk von Koch: „Oracle 8: Die umfassende Referenz“ empfohlen. SQL, die Standard-Abfragesprache für Datenbanken • • • • • 1. Allgemeines 2. Datentypen und Operatoren 3. Datendefinition (DDL) 4. Datenmanipulation (DML) 5. Der Select-Befehl 1. Allgemeines Die sogenannte SQL (Structured Query Language) ist eine standardisierte Abfragesprache, die alle Sprachelemente enthält, die erforderlich sind, um sämtliche Arbeiten, die beim Umgang mit einer relationalen Datenbank anfallen, auszuführen. SQL ist relational vollständig und damit gleichmächtig zum Relationenkalkül bzw. zur Relationenalgebra. Die gängigen Datenbankmanagementsysteme, zu denen ORACLE, INFORMIX und andere zählen, bieten den Sprachumfang gemäß dem ANSI-Standard (92), allerdings im allgemeinen nicht den vollen Sprachumfang. Jedes System stellt aber auch eigene Erweiterungen zur Verfügung, die bei anderen Datenbanksystemen nicht vorhanden sind. Diese Erweiterungen sind meistens Architekturbedingt: z. B. CREATE TABLESPACE In SQL unterscheidet man mehrere Befehlsgruppen: • • • die zur Datendefinition dienen Diese Befehlsgruppe wird als Data Definition Language (DDL) bezeichnet. die zur Manipulation der Daten verwendet werden. Diese Gruppe wird Data Manipulation Language (DML) genannt. Eine besondere Bedeutung kommt dem sogenannten SELECT-Kommando zu, mit dem man Auswertungen fast jeder Komplexität durchführen kann. Darüber hinaus gibt es Befehlsgruppen, die • • • die Vergabe von Zugriffsrechten steuern (DCL, Data Control Language), die Struktur und Größe der Datenbank beeinflussen zur Transaktionsverarbeitung notwendig sind • Daten aus dem UNIX-Filesystem laden bzw. in das Filesystem entladen (ORACLE ( eigene Tools, INFORMIX ( SQL) Alle SQL-Befehle können bei ORACLE mit dem Programm sqlplus ausgeführt werden. Bevor wir zu den eigentlichen SQL-Anweisungen kommen, sollen einige wichtige Begriffe geklärt werden. Manipulierte Objekte - Table Eine Tabelle ist eine Datenstruktur, die in einer relationalen Datenbank die Daten enthält. Sie besteht aus Zeilen und Spalten. - Column Jede Spalte repräsentiert ein Attribut des Entity. Z. B. enthält die Employee-Tabelle die Spalten ename und sal, die den Namen und das Gehalt eines Angestellten repräsentieren. - Row Zeilen speichern die Daten einer Tabelle. Jede Zeile repräsentiert ein Exemplar eines Entity. In der Employee-Tabelle entspricht also eine Zeile genau einem Angestellten. - Value Ein Wert ist das Datum, das durch den Schnitt einer gegebenen Zeile und Spalte referenziert wird. Ein Wert nimmt den Datentypen seiner Spalte an. - View Ein View ist die logische Repräsentation einer Tabelle oder einer Kombination von Tabellen. Ein View erhält seine Daten aus den Tabellen, auf denen er basiert. Diese Tabellen heißen daher base tables. Basistabellen können reale Tabellen, aber auch selbst Views sein. - Index Indizes werden in relationalen DBMS für zwei verschiedene Zwecke benötigt: • • Beschleunigung des Zugriffs auf die Zeilen einer Tabelle Erzwingung der Eindeutigkeit von Zeilen einer Tabelle - Cluster Clustering ist ein Mittel zur Strukturierung der Daten in ein oder mehreren Tabellen, so daß deren Zeilen physisch nebeneinander liegen. Clustering ist vorteilhaft, wenn eine Anwendung häufig dieselben Gruppierung der Zeilen einer Tabelle vornimmt. Beispiel Wenn Angestellte aus der Employee-Tabelle jedesmal anhand der Abteilungsnummer verarbeitet werden, ist es von Vorteil ein Clustering dieser Tabelle nach der Spalte depno durchzuführen. Die Verwendung von Indizes und Clustern ist für den Benutzer transparent: ORACLE verwendet diese implizit, wenn es für die auszuführende Operation vorteilhaft ist. Der Benutzer kann nicht durch Modifikation eines SQL-Statements explizit den ORACLE- Query-Optimizer beeinflussen. Optimizer können Regel- oder Statistik-basierend sein. Die oben beschriebene Eigenschaft der Transparenz wird als Physische Datenunabhängigkeit bezeichnet. Durch den Zugriff auf Daten mittels SQL wird ebenfalls die Logische Datenunabhängigkeit gewährleistet, d. h.: keine Manipulation von Pointern, sondern Zugriff durch Namensangabe Schützen der logischen Struktur durch den Einsatz von Views Weitere wichtige Begriffe - Keys Primary Key Der Primärschlüssel einer Tabelle wird benutzt, um jede Zeile eindeutig zu identifizieren. Er kann aus einer oder mehreren Spalten der Tabelle bestehen (bei mehreren Spalten ( composite (compound) primary key Es besteht eine bijektive Beziehung zwischen dem Primärschlüssel und genau einer Zeile der Tabelle. Der Primärschlüssel wird benötigt, da eine Tabelle als ungeordnete Menge angesehen wird (wird in SQL aber nicht zwingend vorgeschrieben). Foreign Key Fremdschlüssel repräsentieren Beziehungen zwischen Tabellen. Fremdschüssel ( Spalte oder Gruppe von Spalten, deren Werte abgeleitet sind von dem Primärschlüssel einer anderen Tabelle. So ist die Spalte deptno der Primärschlüssel der Tabelle dept. Die Spalte deptno der Employee-Tabelle emp ist ein Fremdschlüssel, der die Tabelle dept referenziert. Unique Key Ein Unique Key hat alle Eigenschaften eines Primary Key. Im Gegensatz zum Primary Key, der eine Zeile identifizieren soll, stellt der Unique Key lediglich die Eindeutigkeit sicher. Ein Unique Key sollte keine Null-Werte enthalten. - Constraints Ein Integrity Constraint ist eine Regel, die eine Beziehung innerhalb des Systems erzwingt. Sie werden eingesetzt, um die referentielle Integrität in einem relationalen DBMS zu sichern. (u. a. die Beziehung Primärschlüssel ( Fremdschlüssel). Der Nutzen referentieller Integrität ist die Datenkonsistenz. ( Constraints werden im ORACLE Data-Dictionary gespeichert. ( In Version 6 wird nur die Syntax unterstützt, die Semantik erst ab Version 7 Beispiel Einem Angestellten aus der emp-Tabelle darf keine deptno zugewiesen werden, die in der Tabelle dept nicht existiert. Constraints können folgende Formen annehmen: - NOT NULL-Restriktion - UNIQUE-Restriktion - PRIMARY KEY-Restriktion (---> UNIQUE und NOT NULL) - FOREIGN KEY-Restriktion Die Spalte gehört zu einem Fremdschlüssel und muß den Primärschlüssel der angegebenen Tabelle referenzieren. - CHECK-Restriktion Bevor eine Zeile eingefügt oder geändert wird, muß sie einem vorgegebenen Ausdruck genügen. 2. Datentypen und Operatoren Auch hier gibt es Unterschiede zwischen den einzelnen SQL-Implementierungen. Falls ein Datentyp nur bei einem Konkurrenzsystem verfügbar ist, wird dies notiert. Datentypen: SERIAL[(n)] Eindeutige fortlaufende Zahl, die automatisch vergeben wird. Sie kann zu Beginn mit n initialisiert werden, der Standard-Anfangswert ist 1. Eine Zahl in einer SERIALSpalte kann nicht verändert werden. (nur bei INFORMIX verfügbar) CHAR(n) Eine Zeichenfolge der Länge n, die zulässige Länge hängt vom DBMS ab. INFORMIX: 1 - 32767 ORACLE: 1 - 255 (default = 1) CHARACTER wie oben VARCHAR wie CHAR, jedoch muß eine Länge angegeben werden Zukünftige Versionen von ORACLE definieren CHAR vielleicht als Zeichenketten fester Länge. LONG Daten vom Typ "Character" mit einer variablen Länge von bis zu 65535 Zeichen. Maximal eine Spalte vom Typ LONG je Tabelle zulässig LONG VARCHAR wie oben RAW(n) Binäre Daten in der Länge n. Die Größe muß angegeben werden (max. 255 B.). Die Werte müssen als Zeichenstrings in hexadezimaler Notation eingegeben werden. LONG RAW Binäre Daten, ansonsten wie LONG DATE Ein Datum, das in Form einer Zeichenkette eingegeben wird. ROWID Identifiziert eindeutig eine Zeile in einer Tabelle. Werte vom Typ ROWID werden von der Pseudo-Spalte ROWID geliefert (aber ROWIDTOCHAR ---> CHAR möglich) Keine Definition von Spalten dieses Typs möglich. Numerische Datentypen: SMALLINT Eine ganze Zahl INFORMIX: Wertebereich -32767 bis +32767 ORACLE: NUMBER(38) INTEGER Eine ganze Zahl INFORMIX: -2.147.483.647/+2.147.483.647. ORACLE: NUMBER(38) DECIMAL(m,n) Zahl mit definierbarer Größe und Nachkommastellen. INFORMIX: m<= 32, Default: DECIMAL(16) ORACLE: m<= 38. NUMBER ähnlich dem obigen Datentypen SMALLFLOAT Eine Gleitkommazahl mit bis zu 7 signifikanten Ziffern und einfacher Genauigkeit (nur bei INFORMIX verfügbar). FLOAT Gleitkommazahl REAL Gleitkommazahl DOUBLE PRECISION Gleitkommazahl MONEY(m,n) wie DECIMAL (Format: DBMONEY-Variable) (nur bei INFORMIX verfügbar) Die SQL/DS GRAPHIC-Datentypen haben in ORACLE keine Entsprechung. Abspeicherung der numerischen Datentypen (ORACLE-spezifisch) Angegebener Datentyp Präzision Nachkommastellen NUMBER 38 null NUMBER(*) 38 null NUMBER(*,s) 38 s NUMBER(p) p 0 NUMBER(p,s) p s DECIMAL 38 0 DECIMAL(*) 38 0 DECIMAL(*,s) 38 s DECIMAL(p) p 0 DECIMAL(p,s) p s INTEGER 38 0 SMALLINT 38 0 FLOAT 38 null FLOAT(*) 38 null FLOAT(b) b null REAL 63b,18d null DOUBLE PRECISION 38 null Alle Datentypen werden in einem internen ORACLE Number Format abgespeichert. Wertebereiche: p (decimal precision) 1 - 38 s (scale) -84 - 127 b (binary precision) 1 - 126 Die Angabe null impliziert eine Fließkommazahl. DEC und NUMERIC sind Synonyme für DECIMAL. INT ist ein Synonym für INTEGER. Datentyp-Konvertierungen: nach CHAR NUMBER DATE von CHAR - TO_NUMBER TO_DATE NUMBER TO_CHAR - TO_DATE DATE TO_CHAR nicht zulässig Syntax und Einzelheiten zu den Datentypen - ROWID ( Pseudo-Spalte, die mit jeder Zeile in der Datenbank assoziiert wird. ( ROWID liefert ein Ergebnis in einer Hexadezimal-String Repräsentation für jede selektierte Zeile zurück. Beispiel ROWID ENAME -------------------------------------------------0000000F.0000.0002 SMITH 0000000F.000C.0002 SCOTT Block Zeile Database-File Vorteile ( schnellste Möglichkeit des Zugriffs auf Daten ( Angabe, wo die Zeilen einer Tabelle gespeichert sind - CHAR/VARCHAR Syntax '[char]...' Dabei ist char aus dem verfügbaren Zeichensatz (z. B. ASCII). Beispiel 'Hallo', 'Willi Mueller', '31-DEC-92' - INTEGER Syntax [ + | - ]ziffer[ziffer]...[ K | M ] Beispiele 255, 29K, 6M - NUMBER Syntax [ + | - ]ziffer[ziffer]...[Exponent | Multiplizierer] Exponent: {e|E}[+|]digit[digit]... Multiplizierer: K oder M Beispiele 25, 2.98, 5E3, 5e-3, 512K - DATE Für jedes Datum werden Jahrhundert, Jahr, Monat, Tag, Stunde, Minute, Sekunde abgespeichert. - Die Speicherung erfolgt im 24-Stunden-Format - Der Defaultwert für die Zeit ist 12:00:00 a.m. - Der Defaultwert für das Datum ist der erste Tag des laufenden Monats. - Die aktuellen Werte liefert die Funktion SYSDATE (Maschinendatum). - Das ORACLE DATE-Standardformat ist DD-MON-YY. Beispiel: 24-DEC-92 Zur Eingabe von Daten, die nicht dem Standardformat entsprechen oder einen Zeitanteil enthalten, muß die TO_DATE-Funktion mit einer Formatmaske verwendet werden. Beispiel: insert into geburtstag (gname,gtag) values ('Willi', to_date ('70-DEC-24 16:30 P.M.', 'YY-MON-DD HH:MI P.M.') Arithmetik mit DATE-Feldern: Datum - Datum Datum +/- Konstante (z.B. SYSDATE + 1 / -7) Operatoren: Die im folgenden aufgeführten Operatoren können innerhalb der meisten SQL-Anweisungen (DML) verwendet werden. Arithmetische Operatoren: () überschreibt die normalen Vorrangregeln select (x+y)/(x-y) + - bezeichnet einen positiven oder negativen ...where wert = -1 Ausdruck ...where -gehalt < 0 * / multiplizieren u. dividieren select 2*x+1 + - addieren u. subtrahieren ...where x > y/2 Operatoren für Zeichenketten || Konkatenation von Characterwerten select 'Name: '||ename Vergleichsoperatoren: () überschreibt die normalen Vorrangregeln ...not(a=1 or b=1) = Test auf Gleichheit ...where gehalt = 1000 !=,^=,<> Test auf Ungleichheit ...where gehalt != 1000 >,<,>=,<= Tests auf kleiner/größer als ...where gehalt >= 1000 IN Gleichheit zu einem Mitglied einer ...where job in Menge ('CLERK','ANALYST') äquivalent zu "=ANY" ...where sal in (select sal from emp where deptno = 30) NOT IN äquivalent zu "!=ALL" ...where sal not in (select sal from emp where deptno = 30) ANY vergleicht einen Wert mit jedem Wert aus ...where sal = any einer Liste oder Subquery. Vorausgehen (select sal from emp where muß einer der Operatoren =,!=,<,>,<=,>= deptno = 30) ALL vergleicht einen Wert mit allen Werten aus ...where (sal,comm) >= all einer Liste oder Subquery. Vorausgehen ((1500,300),(3000,0)) muß einer der Operatoren =,!=,<,>,<=,>= [NOT] [nicht] größer als oder gleich x und kleiner ...where a between 0 and 9 BETWEEN als oder gleich y x AND y [NOT] liefert TRUE, wenn eine Subquery mindestens ...where exists EXISTS eine [keine] Zeile zurückliefert (select sal from emp where deptno = 30) [NOT] LIKE stimmt mit dem nachfolgenden Muster ...where nachname überein oder nicht. Das Zeichen "%" ent- like 'M%' spricht irgendeinem String der Länge >= 0, "_" entspricht genau einem Zeichen IS [NOT] NULL Test auf NULL-Wert ...where job is null Logische Operatoren: () überschreibt die Vorrangreihenfolge select ... where x = y and der Operatoren (a = b or p = q) NOT invertiert das Ergebnis eines ...where not (job is null) logischen Ausdrucks ...where not (plz like '4%') AND logisches UND ...where a=1 and b=1 OR logisches ODER ...where a=1 or b=1 Mengenoperatoren: UNION kombiniert Queries, indem alle Zeilen select... union select ...; geliefert werden, die von jeder einzelnen Abfrage erfaßt werden (Vereinigung) INTERSECT Mengen-Durchschnitt der Zeilen ...select ... intersect select ...; MINUS Mengen-Differenz ...select ... minus select ...; sonstige Operatoren: COUNT liefert die Anzahl der Zeilen select count(gehalt) (expr) für die expr nicht NULL ist from emp COUNT(*) liefert alle Zeilen einer Tabelle DISTINCT eliminiert doppelte Zeilen oder select distinct * ... doppelte Werte in einem ...count(distinct deptno) Aggregatausdruck Funktionen: Die nachstehende Liste der Funktionen ist sicherlich nicht vollständig. Ebenso werden nur in einigen Fällen Beispiele angeführt wie diese Funktionen eingesetzt werden. Für weitergehende Informationen wird auf die Originaldokumentation verwiesen. Numerische Funktionen (Single Row) ABS ABS(n) select abs(-15) "Absolute" from dual Ergebnis Absolute ----------15 CEIL CEIL(n) COS COS (n) COSH COSH (n) EXP EXP (n) FLOOR FLOOR(n) LN LN (n) LOG LOG (m,n) MOD MOD(m,n) POWER POWER(m,n) ROUND ROUND(n[,m]) select round(15.193,1) "Round" from dual Ergebnis Round -------15.2 select round(15.193,-11) "Round" from dual Ergebnis Round -------20 SIN SIN (n) SINH SINH (n) SIGN SIGN(n) SQRT SQRT(n) TAN TAN (n) TANH TANH (n) TRUNC TRUNC(n[,m]) Character Funktionen (Single Row) CHR CHR(n) select chr(75) "Character" from dual Ergebnis Character -----------K CONCAT CONCAT (s1, s2) select concat (concat (ename, ´ is a ´), job) "Job" from emp where empno = 7900 Ergebnis Job ---------------------------JAMES is a CLERK INITCAP INITCAP(char) select initcap('HERR WILLI MEIER') "Capitalized" from dual Ergebnis Capitalized --------------------Herr Willi Meier LOWER LOWER(char) select lower('HERR WILLI MEIER') "Lowercase" from dual Ergebnis Lowercase --------------------herr willi meier REPLACE REPLACE select replace('Jack & Jue','J','BL') (s, search_string[,replacement_string]) "Changes" from dual Ergebnis Changes --------------Black & Blue SOUNDEX SOUNDEX(char) select ename from emp where soundex(ename) = soundex('SMYTHE') Ergebnis ename ----------SMITH SUBSTR SUBSTR(char,m[,n]) TRANSLATE (s, from, to) select translate (´2KRW229´, ´0123456789ABC...XYZ´,´9999999999XXX...XXX´) "Translate example" from dual Ergebnis Translate example ---------------------9XXX999 UPPER UPPER (s) Character-Funktionen mit numerischen Rückgabewerten ASCII ASCII(char) select ascii('Q') from dual Ergebnis ASCII('Q') -------------81 INSTR INSTR(char1,char2, select instr [,n[,m]]) ('MISSISSIPPI','S',5,2) "Beispiel" from dual liefert die Position des m-ten Auftretens von char2 in char1 ab Position n Ergebnis Beispiel -----------7 LENGTH LENGTH (char) select length (´Willi´) "Laenge" from dual Ergebnis Laenge --------5 Gruppenfunktionen: Diese Art von Funktionen liefert Resultate, die auf Gruppen von Zeilen basieren; im Gegensatz dazu liefern Single Row Funktionen je Zeile ein Ergebnis. Als Defaultwert wird das gesamte Resultat als eine einzige Gruppe aufgefaßt. Um das Ergebnis in kleinere Gruppen zu zerlegen, muß die GROUP BY-Klausel verwendet werden. AVG AVG select avg(sal) "Average" from emp ([DISTINCT|ALL] n) liefert den Mittelwert von n, ignoriert NULL-Werte Ergebnis Average -----------2073,50 Beispiel: Es liegen die Werte 1,1,1 und 3 vor. Der DISTINCT-Mittelwert ist 2. Der ALLMittelwert ist 1.5. COUNT COUNT select count(jobs) "Count" (expr) ([DISTINCT|ALL] expr) from emp Ergebnis Count ----------4 COUNT(*) COUNT(*) select count(*) from emp MAX MAX ([DISTINCT|ALL] expr) select max(sal) "Maximum" from emp MIN MIN ([DISTINCT|ALL] expr) select min(hiredate) "Mindat" from emp Ergebnis Mindat ------------17-DEC-80 STDDEV STDDEV ([DISTINCT|ALL] n) SUM SUM ([DISTINCT|ALL] n) VARIANCE VARIANCE ([DISTINCT|ALL] n) Konvertierungsfunktionen (Auszug): CHARTOROWID(char) HEXTORAW(char) RAWTOHEX(raw) ROWIDTOCHAR(rowid) select rowid from graphics where rowidtochar(rowid) like '%F38%' TO_CHAR(n,[,fmt]) TO_CHAR(d,[,fmt]) TO_DATE(char[,fmt]) insert into bonus (bonus_date) select to_date ('January 15, 1989','Month dd, YYYY') from dual TO_NUMBER ...sal+to_number(substr('$100 raise,2,3) Date-Funktionen: LAST_DAY LAST_DAY (d) select sysdate, last_day (sysdate) "Last", last_day (sysdate) - sysdate "Days Left" from dual Ergebnis SYSDATE Last Days Left -------------- -------------- -----------18-NOV-93 30-NOV-93 12 MONTHS_BETWEEN MONTHS_BETWEEN (d1,d2) select months_between (to_date (´02-02-93´, ´MM-DD-YYYY´), (to_date (´01-01-93´, ´MM-DD-YYYY´)) "Monate" from dual Ergebnis Monate --------------1.03225806 sonstige Funktionen: LEAST LEAST (expr [,expr] ...) select least (´Harry´, ´Harald´) from dual Ergebnis LEAST --------Harald NVL NVL (expr1, expr2) select ename, nvl (to_char Nullwert-Ersetzung (provision), ´KEINE´) from emp 3. Datendefinition (DDL) Anweisungen zur Datendefinition dienen zur Einrichtung, Änderung oder Löschung von Datenbankobjekten wie z. B. Tabellen, Indizes, Cluster, usw. Hierunter fallen hauptsächlich die CREATE-, ALTER- und DROP-Anweisungen. Die folgende Liste ist alphabetisch geordnet. ALTER CLUSTER • • Änderung von Speichereigenschaften eines Clusters Allokierung eines Extents für einen Cluster ALTER CLUSTER [schema.]cluster [PCTUSED integer] [PCTFREE integer] [SIZE integer] [INITRANS integer] [MAXTRANS integer] [STORAGE storage-clause] [ALLOCATE EXTENT [(SIZE integer DATAFILE ´filename´ INSTANCE integer)]] Beispiel ALTER CLUSTER scott.customer SIZE 512 STORAGE (MAXEXTENTS 25) ALTER DATABASE • • • • • • Öffnen oder Mounten einer Datenbank Konvertieren eines ORACLE Version 6-Data Dictionary bei der Migration auf Version 7 Wählen zwischen archivelog / noarchivelog Ausführen eines Media-Recovery Hinzufügen / Löschen von Redo-Logfile(-Gruppen) Umbenennung von Datenfiles / Logfiles-Members • • • • • Backup des aktuellen Controlfiles Erstellen eines neuen Datenfiles Setzen eines Datenfiles auf online / offline Aktivieren und Deaktivieren von Logfile-Gruppen Ändern des globalen Datenbanknamens Voraussetzung: Der Benutzer muß das ALTER DATABASE Systemprivileg haben. ALTER DATABASE [database] [MOUNT --] [CONVERT] [OPEN [RESETLOGS | NORESETLOGS]] [ARCHIVELOG] [NOARCHIVELOG] [RECOVER ---] [ADD LOGFILE ---] --[DROP LOGFILE MEMBER ---] [RENAME FILE ---] [BACKUP CONTROLFILE TO filename REUSE] [CREATE DATAFILE ---] [DATAFILE filename [ONLINE | OFFLINE [DROP]]] --[RENAME GLOBAL_NAME TO database ---] --Beispiele ALTER DATABASE hrz MOUNT EXCLUSIVE ALTER DATABASE hrz ADD LOGFILE GROUP 3 (´diska:log3.log´, ´diskb:log3.log´) SIZE 50K ALTER DATABASE hrz ADD LOGFILE MEMBER ´diskc:log3.log´ TO GROUP 3 ALTER INDEX • Redefinieren der zukünftigen Speicherallokation eines Index ALTER INDEX [schema.]index [INITRANS integer] [MAXTRANS integer] [STORAGE storage_clause] Beispiel ALTER INDEX scott.customer INITRANS 5 STORAGE (NEXT 100K) Der Index wird so geändert, daß zukünftige Datenblocks 5 initiale Transaktionseinträge und ein inkrementelles Extent von 100k verwenden. ALTER PROFILE • Hinzufügen oder Entziehen eines Resource-Limits zu oder von einem Profil ALTER PROFILE profile LIMIT [SESSIONS_PER_USER integer | UNLIMITED | DEFAULT] [CPU_PER_SESSION " ] [IDLE_TIME " ] [LOGICAL_READS_PER_SESSION " ] --Beispiele ALTER PROFILE engineer LIMIT SESSIONS_PER_USER 5 ALTER PROFILE default LIMIT IDLE_TIME 2 ALTER ROLLBACK SEGMENT • • Ändern der Speichercharakteristika eines Rollback-Segments Setzen auf online oder offline ALTER ROLLBACK SEGMENT rollback_segment [ONLINE | OFFLINE | STORAGE storage_clause] ALTER SEQUENCE • Redefinieren der Wertgenerierung für eine Sequenz ALTER SEQUENCE [schema.]sequence [INCREMENT BY integer] [MAXVALUE integer | NOMAXVALUE] --[CYCLE | NOCYCLE] --Beispiele ALTER SEQUENCE folge MAXVALUE 1500 ALTER SEQUENCE folge CYCLE CACHE 5 ALTER SESSION • Ändern der aktuellen Sitzung durch Aufruf spezieller Funktionen ALTER SESSION SET [NLS_LANGUAGE = language] --[NLS_DATE_FORMAT = ´fmt´] --[OPTIMIZER_GOAL = ALL_ROWS|FIRST_ROWS|RULE|CHOOSE] --- ALTER SNAPSHOT • • Ändern der Snapshot-Speichercharakteristika Einstellen der automatischen Refresh-Zeit und des Refresh-Modus ALTER SNAPSHOT [schema.]snapshot [PCTFREE integer] [PCTUSED integer] [INITRANS integer] [MAXTRANS integer] [STORAGE storage_clause] ALTER SNAPSHOT [schema.]snapshot REFRESH FAST | COMPLETE | FORCE --ALTER SYSTEM • Ändern der ORACLE-Instanz durch Aufruf einer speziellen Funktion ALTER SYSTEM [ENABLE | DISABLE RESTRICTED SESSION] --[CHECKPOINT | CHECK DATAFILES GLOBAL | LOCAL] [SET ---] [KILL SESSION integer1, integer2] (* aus V$SESSION *) ALTER TABLE • • • • • • Hinzufügen einer Spalte Hinzufügen eines Integrity-Constraints Redefinieren einer Spalte Redefinieren von Speichereigenschaften einer Tabelle Aktivieren, Deaktivieren oder Löschen eines Integrity-Constraints Allokation eines Extents ALTER TABLE [schema.]table [ADD (column datatype [DEFAULT expr][column_constraint ...] | table_constraint)] [MODIFY (column [datatype][DEFAULT expr][column_constraint ...])] [PCTFREE integer] --[STORAGE storage_clause] [DROP drop_clause] [ALLOCATE EXTENT ---] --Beispiele ALTER TABLE emp MODIFY (gehalt NUMBER (9,2)) ALTER TABLE emp PCTFREE 30 PCTUSED 60 ALTER TABLESPACE • • • • Hinzufügen oder Umbenennen von Datenfiles Ändern von Speichereigenschaften Setzen von Tablespaces auf online / offline Starten / Stoppen eines Backup ALTER TABLESPACE tablespace [ADD DATAFILE ---] [RENAME DATAFILE ---] --[ONLINE] [OFFLINE ---] [BEGIN | END BACKUP] Beispiel ALTER TABLESPACE accounting OFFLINE NORMAL ALTER USER • • • Ändern eines Benutzerpasswortes Ändern des default-Tablespace und des temporären Tablespace Ändern von Tablespace-Quoten, Profilen oder von default-Rollen ALTER USER user [IDENTIFIED BY password | EXTERNALLY] [DEFAULT TABLESPACE tablespace] [TEMPORARY TABLESPACE tablespace] [QUOTA integer[K | M] | UNLIMITED ON tablespace] [PROFILE profile] [DEFAULT ROLE role, ... | ALL [EXCEPT role, ...] | NONE] Beispiel ALTER USER scott IDENTIFIED BY lion DEFAULT TABLESPACE tstest ALTER USER scott PROFILE sachbearbeiter ALTER VIEW • Recompilieren eines Views ALTER VIEW [schema.]view COMPILE Beispiel ALTER VIEW customer_view COMPILE AUDIT • • Wählen eines Auditing für spezifizierte SQL-Anweisungen Wählen eines Auditing für Operationen auf Schema-Objekten für SQL-Statements: AUDIT statement_opt | system_priv, ... [BY USER] [BY SESSION | ACCESS] [WHENEVER [NOT] SUCCESSFUL] Beispiele AUDIT ROLE AUDIT ROLE WHENEVER SUCCESSFUL AUDIT SELECT TABLE, UPDATE TABLE BY scott AUDIT DELETE ANY TABLE für Schema-Objekte: AUDIT object_opt, ... ON [schema.]object | DEFAULT [BY SESSION | ACCESS] [WHENEVER [NOT] SUCCESSFUL] Beispiel AUDIT SELECT ON scott.emp WHENEVER NOT SUCCESSFUL COMMENT • Hinzufügen eines Kommentars über eine Tabelle, einen View, einen Snapshot oder eine Spalte zum Data-Dictionary COMMENT ON TABLE | COLUMN [schema.]table[.column] | [schema.]view[.column] | [schema.]snapshot[.column] IS text Beispiel COMMENT ON COLUMN adressen.name IS ´Nachnamen einschliesslich Titel´ COMMENT ON COLUMN adressen.name IS ´´ (Löschen) CREATE CLUSTER • • Erstellen eines Clusters, der eine oder mehrere Tabellen umfassen kann Sind mehrere Tabellen betroffen, so haben diese eine oder mehrere Spalten gemeinsam CREATE CLUSTER [schema.]cluster (column datatype, ...) [PCTUSED integer] --- [MAXTRANS integer] [SIZE integer [K | M]] [TABLESPACE tablespace] [STORAGE storage_clause] [INDEX | [[HASH IS column] HASHKEYS integer] Beispiele CREATE CLUSTER personnel (department_number NUMBER (2)) SIZE 512 STORAGE (INITIAL 100K NEXT 50K PCTINCREASE 10) Es wird der (Index-)Cluster mit dem Namen personnel erzeugt, der die cluster key-Spalte department_number, eine Größe von 512 B und die angegebenen Parameterwerte hat. Die folgenden Anweisungen fügen die Tabellen emp und dept zum Cluster hinzu: CREATE TABLE emp (empno NUMBER PRIMARY KEY, ename VARCHAR(10) NOT NULL CHECK (ename=UPPER(ename)), --deptno NUMBER(2) NOT NULL) CLUSTER personnel (deptno) CREATE TABLE dept (deptno NUMBER (2), --CLUSTER personnel (deptno) Optional kann noch ein Index über den Cluster gelegt werden: CREATE INDEX idx_personnel ON CLUSTER personnel CREATE CLUSTER personnel (department_number NUMBER) SIZE 512 HASHKEYS 500 (= 503) --CREATE CONTROLFILE Erneutes Erstellen eines Kontrollfiles, falls alle Kopien des Controlfiles durch Plattenfehler verloren gegangen sind die maximale Anzahl von Redo-Log-Files bzw. Gruppen o. ä. geändert werden soll Notfall-Kommando: sollte im allg. wegen Backups überflüssig sein CREATE DATABASE • Erzeugen einer Datenbank Dient zur Erstellung einer leeren Datenbank mit dem angegebenen Namen database und führt zu der in Teil 6 (wird zur Zeit noch bearbeitet) beschriebenen Verzeichnisstruktur. CREATE DATABASE database [CONTROLFILE REUSE] [LOGFILE [GROUP integer] filespec, ...] [MAXLOGFILES integer] --[DATAFILE filespec, ...] [MAXDATFILES integer] --[CHARACTER SET charset] Beispiele CREATE DATABASE Erzeugt eine kleine Datenbank mit Standardwerten für alle Argumente CREATE DATABASE testneu CONTROLFILE REUSE LOGFILE GROUP 1 (´diskb:log1.log´, ...) SIZE 50K LOGFILE GROUP 2 (´diskb:log2.log´, ...) SIZE 50K MAXLOGFILES MAXLOGHISTORY 100 DATAFILE ´diska:dbeins.dat´ SIZE 2M MAXDATAFILES 10 ARCHIVELOG EXCLUSIVE CREATE INDEX • Erzeugen eines Index für eine Tabelle oder einen Cluster ORACLE 6 CREATE [UNIQUE|DISTINCT] [CLUSTER] INDEX index-name ON table-name (columnname [ASC|DESC], ...) Die angegebenen Spalten der genannte Tabellen werden mit einem Index des Namens indexname versehen. Dieser Name muß in der Datenbank eindeutig sein. ORACLE 7 CREATE INDEX [schema.]index ON [[schema.]table (column [ASC | DESC], ...)] | [CLUSTER [schema.]cluster] --[TABLESPACE tablespace] --[NOSORT] Beispiel CREATE INDEX idx_emp_ename ON emp (ename) CREATE PROFILE • Erstellt ein Profil und spezifiziert dessen Resource-Limits CREATE PROFILE profile LIMIT [SESSIONS_PER_USER integer | UNLIMITED | DEFAULT] [CPU_PER_SESSION " ] [IDLE_TIME " ] [LOGICAL_READS_PER_SESSION " ] --[PRIVATE_SGA integer[K | M] | UNLIMITED | DEFAULT] PRIVATE_SGA bestimmt den Umfang für privaten Platz im shared pool. Beispiel CREATE PROFILE system_manager LIMIT --- CPU_PER_SESSION UNLIMITED COMPOSITE_LIMIT 5000000 CREATE ROLLBACK SEGMENT • Erzeugt ein Rollback-Segment CREATE [PUBLIC] ROLLBACK SEGMENT rollback_segment [TABLESPACE tablespace | STORAGE storag_clause], ... Beispiel CREATE PUBLIC ROLLBACK SEGMENT rbs_2 TABLESPACE system STORAGE (INITIAL 50K NEXT 50K OPTIMAL 150K MAXEXTENTS 10) CREATE SEQUENCE • Erzeugt ein Sequenz zur Generierung aufeinander folgender Werte CREATE SEQUENCE [schema.]sequence [INCREMENT BY integer] [MAXVALUE integer | NOMAXVALUE] --[CYCLE | NOCYCLE] --Beispiel CREATE SEQUENCE eseq INCREMENT BY 10 ESEQ.NEXTVAL liefert damit 1, 11, 21 (zusätzlich CURRVAL) CREATE SNAPSHOT • Erzeugen eines Snapshots der Daten einer oder mehrerer Tabellen Ein Snapshot ist eine Tabelle, die die Resultate von Queries auf eine oder mehrere Tabellen oder Views - häufig auf remote-Datenbanken- enthält. Beispiel CREATE SNAPSHOT emp_sf PCTFREE 5 PCTUSED 60 TABLESPACE users --REFRESH FAST NEXT sysdate + 7 AS SELECT * FROM emp@ny CREATE SYNONYM • Kreiert ein Synonym für ein Schema-Objekt CREATE [PUBLIC] SYNONYM [schema.]synonym FOR [schema.]object[@dblink] Beispiel CREATE PUBLIC SYNONYM emp FOR scott.emp@sales CREATE TABLE • • • Erstellen einer Tabelle Definieren von Spalten und Integrity-Constraints Festlegen der Speicherallokation CREATE TABLE [schema.]table [table_constraint] (column datatype [DEFAULT expr][column_constraint] | table_constraint)], ...) [PCTFREE integer] --[TABLESPACE tablespace] [STORAGE storage_clause] [CLUSTER cluster (cluster, ...)] [ENABLE enable_clause | DISABLE disable_clause] [AS subquery] - DEFAULT spezifiziert einen Wert, wenn ein nachfolgendes INSERT-Kommando den Wert für die Spalte wegläßt. - PCTFREE Prozent des freien Platzes im Tabellenblock - PCTUSED minimale Benutzung (in Prozent) - INITRANS initiale Anzahl von Transaktionseinträgen - MAXTRANS maximale Anzahl von Transaktionen, die gleich- zeitig einen Datenblock ändern können - ENABLE/DISABLE aktivieren/deaktivieren Integrity-Constraints STORAGE STORAGE ([INITIAL integer [K | M]] | [NEXT integer [K | M]] | [MINEXTENTS integer] | [MAXEXTENTS integer] | [PCTINCREASE integer] | [OPTIMAL integer[K | M] | NULL] | --INITIAL Größe des ersten Extents NEXT Größe des nächsten Extents PCTINCREASE Prozentuales Wachstum der Extents nach dem zweiten MINEXTENTS Gesamtzahl allokierter Extents beim Erzeugen des Segmentes MAXEXTENTS Maximale Anzahl von reservierbaren Extents OPTIMAL spezifiziert die optimale Größe für ein Rollback-Segment Beispiele CREATE TABLE salgrade (grade NUMBER CONSTRAINT pk_salgrade PRIMARY KEY USING INDEX TABLESPACE users_a, minsalary NUMBER) TABLESPACE statistik CREATE TABLE scott.emp (empno NUMBER CONSTRAINT pk_emp PRIMARY KEY, --sal NUMBER (10,2) CONSTRAINT ck_sal CHECK (sal < 10000), --- ) STORAGE (INITIAL 6144 NEXT 6144 MINEXTENTS 1 MAXEXTENTS 5 PCTINCREASE 5) CREATE TABLESPACE • • Erzeugen eines Platzes in der Datenbank zur Speicherung von Schema-Objekten, Rollback-Segmenten und temporären Segmenten Angabe der Datenfiles, aus denen der Tablespace besteht CREATE TABLESPACE tablespace DATAFILE filespec, ... [DEFAULT STORAGE storage_clause] [ONLINE | OFFLINE] Beispiel CREATE TABLESPACE tabspace_2 DATAFILE ´diska:tabspace_file2.dat´ SIZE 20M DEFAULT STORAGE ( --- ) ONLINE CREATE TRIGGER Diese Anweisung dient zum Erzeugen und Aktivieren eines Datenbank-Triggers. Ein Trigger ist hier ein gespeicherter PL/SQL-Block, der mit der Tabelle assoziiert ist. ORACLE führt den Trigger automatisch aus, wenn ein SQL-Statement gegen die Tabelle gestartet wird. Dies kann z. B. vor oder nach DELETE, INSERT oder UPDATE der Fall sein (s. SQL-ReferenzDokumentation). CREATE USER • Kreieren eines Datenbank-Benutzers CREATE USER user IDENTIFIED BY password | EXTERNALLY [DEFAULT TABLESPACE tablespace] [TEMPORARY TABLESPACE tablespace] [QUOTA integer[K | M] | UNLIMITED ON tablespace] [PROFILE profile] Beispiel CREATE USER werner IDENTIFIED BY beinhart DEFAULT TABLESPACE user_3 TEMPORARY TABLESPACE temp_2 QUOTA 10M ON user_3 QUOTA 5M ON temp_2 QUOTA 5M ON system PROFILE hausmeister CREATE VIEW • • Definieren eines Views über eine oder mehrere Tabellen oder Views erzeugt eine bestimmte Benutzersicht auf die selektierten Daten CREATE [OR REPLACE] [FORCE | NOFORCE] VIEW [schema.]view [(alias, ...)] AS subquery [WITH CHECK OPTION [CONSTRAINT constraint]] FORCE erzeugt den View auch wenn die Basistabellen nicht existieren oder keine Privilegien darauf bestehen alias spezifiziert Namen für die durch die Query selektierten Ausdrücke subquery SELECT ohne ORDER BY und FOR UPDATE WITH CHECK OPTION garantiert, daß die durch den View durchgeführten Einfügungen und Änderungen in Zeilen resultieren, die durch die View-Query selektiert werden können CONSTRAINT ist der Name des CHECK OPTION-Constraints, default ist SYS_Cn (n integer) Ein View kann dort verwendet werden, wo eine Tabelle in einer der folgenden SQLAnweisungen zulässig ist: COMMENT DELETE INSERT LOCK TABLE UPDATE SELECT Beispiel CREATE VIEW dept20 (person, jahresgehalt) AS SELECT ename, sal * 12 annual_salary FROM emp WHERE deptno = 20 DROP CLUSTER • Löscht einen Cluster aus der Datenbank DROP CLUSTER [schema.]cluster [INCLUDING TABLES [CASCADE CONSTRAINTS]] Existieren Tabellen bzw. Constraints ohne daß die Optionen angegeben wurden, wird eine Fehlermeldung geliefert. DROP INDEX • Löschen eines Index aus der Datenbank DROP INDEX [schema.]index DROP PROFILE • Löschen eines Profils aus der Datenbank DROP PROFILE profile [CASCADE] Das DEFAULT-Profil kann nicht gelöscht werden. Ist das Profil noch Benutzern zugewiesen, muß CASCADE verwendet werden. DROP ROLLBACK SEGMENT • Entfernen eines Rollback-Segmentes aus der Datenbank DROP ROLLBACK SEGMENT rollback_segment DROP SEQUENCE • Löschen einer Sequenz aus der Datenbank DROP SEQUENCE [schema.]sequence DROP SNAPSHOT • Entfernt einen Snapshot aus der Datenbank DROP SNAPSHOT [schema.]snapshot DROP SYNONYM • Entfernen eines Synonyms aus der Datenbank DROP [PUBLIC] SYNONYM [schema.]synonym Beispiel DROP PUBLIC SYNONYM Aktienkurse DROP TABLE • Löschen einer Tabelle inklusive ihrer Indizes und Daten DROP TABLE [schema.]table CASCADE CONSTRAINTS DROP TABLESPACE • Entfernt einen Tablespace aus der Datenbank DROP TABLESPACE tablespace [INCLUDING CONTENTS [CASCADE CONSTRAINTS]] CASCADE CONSTRAINTS löscht alle Integritätsbedingungen, die außerhalb des Tablespace liegen und sich auf Primärschlüssel beziehen. Beispiel DROP TABLESPACE user_3 INCLUDING CONTENTS CASCADE CONSTRAINTS DROP USER • • Löscht einen Benutzer Entfernt alle Objekte im Schema des Benutzers DROP USER user [CASCADE] CASCADE muß spezifiziert werden, wenn noch Objekte im Benutzerschema enthalten sind. DROP VIEW • • Löscht einen View aus der Datenbank Gleichzeitig werden alle Views entfernt, die im Rahmen dieses Views definiert wurden. DROP VIEW [schema.]view NOAUDIT • Deaktiviert das Auditing, indem es die Wirkung eines vorhergehenden AUDITKommandos teilweise oder ganz rückgängig macht für SQL-Statements: NOAUDIT statement_opt | system_priv, ... [BY user, ...] [WHENEVER [NOT] SUCCESSFUL] Beispiele NOAUDIT ROLE NOAUDIT SELECT TABLE BY scott für Schema-Objekte: NOAUDIT object_opt, ... ON [schema.]object [WHENEVER [NOT] SUCCESSFUL] Beispiel NOAUDIT SELECT ON scott.emp RENAME • Ändert den Namen eines Schema-Objektes RENAME old TO new kann für Tabellen, Views, Sequenzen oder private Synonyme verwendet werden Beispiel Reorganisieren einer Tabelle ohne vorherigen Export CREATE TABLE temp (newname, col2, col3) AS SELECT oldname, col2, col3 FROM static DROP TABLE static RENAME temp TO static TRUNCATE • • Löschen aller Zeilen einer Tabelle oder eines Clusters Freigabe des von den Zeilen verwendeten Speicherplatzes TRUNCATE TABLE [schema.]table | CLUSTER [schema.]cluster --- 4. Datenmanipulation (DML) Zur Datenmanipulation dienen die DELETE-, INSERT- und UPDATE-Statements. DELETE • Löschen einer oder mehrerer Zeilen einer Tabelle DELETE FROM [schema.]table | view --- [WHERE condition] Es werden alle Zeilen gelöscht, die dem Ausdruck condition genügen. Bei einigen DBMS werden alle erfaßten Zeilen solange gesperrt, bis der DELETE-Befehl vollständig durchgeführt wurde. Dadurch kann eine vom Betriebssystem festgelegte maximale Anzahl von gleichzeitigen Sperren überschritten werden (---> LOCK TABLE) Beispiele DELETE FROM emp WHERE job = ´SALESMAN´ AND comm < 100 DELETE FROM blake.accounts@dallas EXPLAIN PLAN • • Liefert den Ausführungsplan für ein SQL-Statement kann die Kosten für die Ausführung einer Anweisung bestimmen Beispiel EXPLAIN PLAN SET STATEMENT_ID = ´Gehaltserhoehung in Dortmund´ INTO output FOR UPDATE emp SET sal = sal * 1.10 WHERE deptno = (select deptno FROM dept WHERE loc = ´DORTMUND´) Die Tabelle output enthält dann Informationen über den Ausführungsplan und die Kosten. INSERT • Einfügen einer oder mehrerer neuer Zeilen in eine bestehende Tabelle INSERT INTO [schema.]table | view[@dblink] [(column, ...)] {VALUES (expr, ...) | subquery} expr, ... ist die Liste der Werte, die in die angegebenen Spalten column, ... eingefügt werden sollen. subquery = SELECT-Anweisung ORACLE fügt die Daten in der Reihenfolge der angegebenen Spaltennamen in die Tabelle ein, falls keine Spaltennamen angegeben wurden, ist die Reihenfolge wie beim Erzeugen der Tabelle. Alternativ zur VALUES-Klausel, die lediglich die Eingabe einer einzelnen Zeile ermöglicht, ist die Angabe eines SELECT-Statements zulässig, dessen Resultat ebenso wie bei VALUES in die Tabelle eingefügt wird. Beispiele INSERT INTO emp (empno, ename, sal) VALUES (7810, ´MEIER´, 4900) INSERT INTO bonus SELECT ename, job, sal, comm FROM emp WHERE comm > 0.25 * sal OR job IN (´PRESIDENT´, ´MANAGER´) LOCK TABLE • Sperrt eine Tabelle oder einen View und begrenzt den Zugriff darauf durch andere Benutzer LOCK TABLE [schema.]table | view [@dblink] IN lockmode MODE [NOWAIT] Beispiel LOCK TABLE emp IN EXCLUSIVE MODE NOWAIT UPDATE • Ändern der Werte einer oder mehrerer Spalten von einer oder mehreren Zeilen einer Tabelle UPDATE [schema.]table | view --- SET {(column, ...) = (subquery)}, ... | {column = expr | (subquery)}, ... [WHERE condition] Wenn sich das Kommando auf alle Spalten beziehen soll, kann alternativ * eingegeben werden. Die Anzahl der Namen in col-list muß mit der Anzahl der Werte in expr-list übereinstimmen. Beispiele UPDATE emp SET comm = NULL WHERE job = ´TRAINEE´ UPDATE emp SET (sal, comm) = (SELECT 1.1 * AVG (sal), 1.5 * AVG (comm)) WHERE ename = ´MUELLER´ 5. Der Select-Befehl Die Select-Anweisung dient dem Retrieval. Das SELECT-Kommando ist die Anweisung mit der größten Komplexität. Das Ergebnis einer Datenbankabfrage kann durch die Angabe einer Vielzahl von Schlüsselwörtern beeinflußt werden (s. SQL-Referenz-Dokumentation). SELECT [ALL | DISTINCT] select-list | * FROM [schema.]table | view --- [WHERE condition] [[START WITH condition] CONNECT BY condition] [GROUP BY column-list [HAVING condition]] [UNION | UNION ALL | INTERSECT | MINUS SELECT command] [ORDER BY {column-name [ASC | DESC]}, ...] [FOR UPDATE OF {[schema.]table. |view. column}, ... [NOWAIT]] * liefert alle Spalten von allen Tabellen oder Views, die in der FROM-Klausel aufgeführt sind START WITH CONNECT BY liefert die Zeilen in einer hierarchischen Reihenfolge GROUP BY gruppiert die selektierten Zeilen basierend auf dem Wert der Ausdrücke und liefert eine einzelne Zeile an Informationen je Gruppe HAVING analog WHERE FOR UPDATE sperrt die selektierten Reihen NOWAIT Benutzer erhält die Kontrolle, wenn eine Sperre nicht erworben werden konnte WHERE conditions: expr rel-op expr expr [NOT] BETWEEN expr AND expr expr [NOT] IN (items) column-name [NOT] LIKE "string" [ESCAPE escape-character] column-name [NOT] MATCHES "string" [ESCAPE escape-character] expr rel-op {ALL | [ANY | SOME]} (SELECT-statement) expr [NOT] IN (SELECT-statement) [NOT] EXISTS (SELECT-statement) column-name IS [NOT] NULL Nur die Angabe der SELECT-und der FROM-Klausel sind unbedingt erforderlich. Beispiele SELECT ename, job, sal, deptno FROM emp WHERE NOT (job = ´SALESMAN´AND deptno = 30) SELECT LPAD (´ ´, 2* (LEVEL - 1)) || ename org_chart, empno, manager, job FROM emp START WITH job = ´PRESIDENT´ CONNECT BY PRIOR empno = manager Ergebnis: ORG_CHART EMPNO MANAGER JOB ------------------- ------------------------ ---------------- ---------------KOENIG 7839 PRESIDENT MEIER 7566 7839 ABT-LEITER SCHULZ 7788 7566 GRP-LEITER KUNZ 7876 7839 ABT-LEITER HINZ 7990 7876 GRP-LEITER --SELECT deptno, MIN (sal), MAX (sal) FROM emp GROUP BY deptno Ergebnis: DEPTNO MIN(SAL) MAX(SAL) -------------- --------------- ---------------10 1300 5000 20 800 3000 SELECT deptno, MIN (sal), MAX (sal) FROM emp WHERE job = ´VERTRIEBSBEAUFTRAGTER´ GROUP BY deptno HAVING MIN (sal) < 1000 Ergebnis: DEPTNO MIN(SAL) MAX(SAL) -------------- --------------- ---------------20 800 3000 SELECT ename, deptno, sal FROM emp WHERE job = ´SACHBEARBEITER´ ORDER BY deptno ASC, sal DESC SELECT ename, emp.deptno, dname FROM emp, dept WHERE emp.deptno = dept.deptno Ergebnis: ENAME DEPTNO DNAME ------------- -------------- ----------------MEIER 10 BUCHHALTUNG MUELLER 10 BUCHHALTUNG SCHNEIDER 10 BUCHHALTUNG SCHMITT 20 VERKAUF KOWALSKI 20 VERKAUF