FROM employees

Werbung
SQL I - Basiswissen
Christine Apfel, DESY, Juni 2011
SQL Schulung Übersicht I
 Relationale Datenbanken Einführung
 Terminologie
 Eigenschaften
 SQL-Anweisungen
 Select Klausel
 From Klausel
 Where Klausel
 Vergleichsoperatoren
 Logische Operatoren
 Single Row- Funktionen (teilweise Oracle spezifisch)
 Aggregatfunktionen
SQL Schulung Übersicht II
 Datengruppen
 GROUP BY-Klausel
 HAVING-Klausel
 Joins
 Natural Joins
 Inner Joins und Outer Joins
 Left Outer Joins
 Right Outer Joins
 Full Outer Joins
 Kartesische Produkte
 Cross Joins
SQL Schulung Übersicht III
 Subselects (Unterabfragen)



Single Row Unterabfragen
Gruppenfunktionen
Multiple Row Unterabfragen
 Mengenoperatoren




UNION / UNION ALL
INTERSECT
MINUS
Richtlinien
SQL Schulung Übersicht IV
 DDL-Anweisungen
 Datenbankobjekte
 Tabellen erstellen (CREATE TABLE-Anweisung)
 Datentypen und Constraints
 Tabellendefinition ändern (ALTER TABLE-Anweisung)
 Tabellen löschen (DROP TABLE-Anweisung)
 DML-Anweisungen
 INSERT-Anweisung
 UPDATE-Anweisung
 DELETE-Anweisung
 TRUNCATE-Anweisung
 COMMIT- u. ROLLBACK-Anweisung
SQL Schulung Übersicht V
 weitere Schemaobjekte





Views
Sequences
Pseudospalten
Indizes
Synonyme
 Data Dictionary
Einführung
SQL Schulung: Kapitel 1
Relationale Datenbanken - Konzept
 Dr. E.F. Codd entwickelte das relationale
Modell für Datenbank-Systeme 1970
 Relation ist Grundlage für das relationale
Datenbank-Management-System (RDBMS)
 Komponenten des relationalen Modells sind:



Relationen (Zusammenstellung von Objekten)
Menge von Operatoren, mit denen die
Relationen bearbeitet werden
Datenintegrität für Korrektheit und Konsistenz
Datenbanksysteme
 DBMS



organisiert intern die strukturierte Speicherung
der Daten gemäß Datenmodell
kontrolliert alle lesenden u. schreibenden
Zugriffe
stellt DB-Anfragesprache (SQL)
 Datenbank


die Daten
die Datenbeschreibung (Data Dictionary)
Relationale Datenbanken - Definition
Eine relationale Datenbank ist eine
Zusammenstellung von Relationen oder
zweidimensionalen Tabellen
Relation / Tabelle
Relationenname
Attribute / Felder / Spalten
Tabelle 1
A1
Wert 1
A2
Wert 2
Wert 2
Wert 3
Wert 3
Wert 3
Wert 4
Wert 4
…
An
Relationenschema
Tupel/
Zeilen
Entity-Relationship-Modell
 beschreibt Ausschnitt der „realen“ Welt
 Daten werden in Entitys unterteilt
 Zwischen verschiedenen Entitys gibt es
Beziehungen (Relationship)
 keine Abbildung von ausgeführten Aktivitäten
(siehe UML)
ER-Grundlagen I
 Entität (Entity)




Objekt der „realen“ Welt
Entitätstyp
Typisierung gleichartiger Entitäten
Beziehung (Relationship)
semantische Beziehung zwischen Entitäten
Beziehungstyp
Typisierung gleichartiger Beziehungen
Kardinalität
mögliche Anzahl der an einer Beziehung beteiligten
Entitäten
ER-Grundlagen II
 Attribut / identifizierende Attribute
Eigenschaft eines Entitätstyps
 identifizierende Attribute
Attribut o. Attributkombination eines
Entitättyps
 Beziehungstyp mit Attributen
(m:n-Beziehungen)
ER-Modelle
Rel. Datenbanken - Terminologie
 Zeile (Tupel; Schlüssel-Wert-Paar) ← Entität
 Spalte ← Attribut



Primärschlüssel
Fremdschlüssel
sonstige
 Feld
Relationale DBMS Eigenschaften
 Kann durch Ausführen von SQL-
Anweisungen gelesen und bearbeitet werden
 Enthält eine Zusammenstellung von Tabellen
ohne physische Zeiger
 Verwendet eine Menge von Operatoren
 Sicherheitsfunktionen (Zugriff auf Daten und
deren Benutzung)
Das DB-Mangement System
 SGA (System Global Area)
 Benutzertabellen und Data Dictionary
SQL
Structured Query Language:
 Datenmanipulationssprache (DML)
SELECT, INSERT, UPDATE, DELETE, MERGE
 Datendefinitionssprache (DDL)
CREATE, ALTER, DROP, RENAME, TRUNCATE, COMMENT
 Transaktionssteuerung
COMMIT, ROLLBACK, SAVEPOINT
 Datenkontrollsprache (DCL)
GRANT, REVOKE
SELECT-Klausel
SQL Schulung: Kapitel 2
SELECT - Anweisung
 Abruf von Informationen aus der Datenbank
 Projektion
SELECT-Klausel
 Join
FROM-Klausel
 Selektion
WHERE-Klausel
SELECT-Basis-Syntax
SELECT * | {
[DISTINCT] column|expression [alias]
}*
FROM table;
SELECT Beispiele
 SELECT *
FROM departments;
DEPARTMENT_ID
---------------------10
20
30
40
50
DEPARTMENT_NAME
-----------------------------Administration
Marketing
Purchasing
Human Resources
Shipping
MANAGER_ID
---------------------200
201
114
203
121
LOCATION_ID
---------------------1700
1800
1700
2400
1500
60
IT
103
1400
SELECT Beispiele II
 SELECT department_id, location_id
FROM departments;
DEPARTMENT_ID
---------------------10
20
30
40
LOCATION_ID
---------------------1700
1800
1700
2400
SELECT Beispiele III
 SELECT department_id “Dep-id“,
location_id “Loc-id“
FROM departments;
Dep-id
---------------------10
20
30
40
Loc-id
---------------------1700
1800
1700
2400
SQL Beispiele IV (Alias)
 select d.department_id "Dep-id", d.location_id "Loc-id"
from departments d;
Dep-id
---------------------10
20
30
40
Loc-id
---------------------1700
1800
1700
2400
Hinweis: Bei Oracle kann in der „SELECT-Klausel“ auch AS verwendet
werden.
SELECT department_is AS Department, location_id AS Location
SQL-Anweisungen erstellen
 in SQL Anweisungen wird nicht zwischen
Gross- und Kleinschreibung unterschieden
 SQL-Anweisungen können aus einer oder
mehrerer Zeilen bestehen
 Schlüsselwörter dürfen nicht abgekürzt oder
auf mehrere Zeilen verteilt werden
 Einrückungen verbessern die Lesbarkeit
 ! Semikolon (;) am Ende der Anweisung !
 Wo ?
Exkurs SQL Developer
Arithmetische Ausdrücke
 Arithmetische Operatoren
+, -, *, /
 Datentypen: NUMBER u. DATE
 in jeder Klausel einer SQL-Anweisung
verwendbar, ausgenommen FROM
 Punkt-Rechnung vor Strichrechnung
 Auswertunsrichtung: von links nach rechts
bei gleicher Priorität
 Klammern für Umgehung der Prioritätsregeln
Arithmetische Operatoren Beispiele
 SELECT last_name, salary, salary + 300
FROM employees;
 SELECT last_name, salary, 12*salary+100
FROM employees;
 SELECT last_name, salary, 12*(salary+100)
FROM employees;
Nullwerte definieren
 ein Nullwert steht für einen nicht verfügbaren,
nicht zugewiesenen, unbekannten oder nicht
anwendbaren Wert.
 nicht zu verwechseln mit der Zahl Null (0)
 nicht zu verwechseln mit einem Leerzeichen
 Nullwert für alle Spalten und Datentypen
möglich
 bestimmte Constraints verbieten Nullwerte
Nullwerte Beispiel
 SELECT last_name, job_id, commission_pct
FROM employees;
LAST_NAME
------------------------OConnell
Grant
Vargas
Russell
Partners
JOB_ID
---------SH_CLERK
SH_CLERK
ST_CLERK
SA_MAN
SA_MAN
SALARY
---------------------2600
2600
2500
14000
13500
COMMISSION_PCT
----------------------
0,4
0,3
Nullwerte in arithm. Ausdrücken
 arithmetische Ausdrücke, die einen Nullwert
benutzen, liefern einen Nullwert
 SELECT last_name, 12*salary*commission_pct
FROM employees;
LAST_NAME
------------------------OConnell
Grant
Vargas
Russell
Partners
Errazuriz
JOB_ID
---------SH_CLERK
SH_CLERK
ST_CLERK
SA_MAN
SA_MAN
SA_MAN
12*SALARY*COMMISSION_PCT
------------------------
67200
48600
43200
Verkettungsoperatoren
 verknüpfen Spalten oder Zeichenfolgen mit
anderen Spalten oder Zeichenfolgen
 wird durch 2 senkrechte Striche (||)
dargestellt
 erstellt eine Ergebnisspalte
 Nullwerte werden ignoriert
z.B.: LAST_NAME || NULL ergibt LAST_NAME
Literale Zeichenfolgen
 Ein Literal ist ein Zeichen, eine Zahl oder ein
Datum in einer SELECT-Klausel
 Literale Datums- und Zeichenwerte müssen
in Hochkommata (' ') gesetzt werden
 Jede Zeichenfolge wird für jede
zurückgegebene Zeile einmal ausgegeben
 keine Spalten !!!
Verkettungsoperatoren u. Literale
Beispiel
SELECT '[' || employee_id || ']' || first_name || ' ' || last_name
"Employee"
FROM employees;
Employee
-------------------------------------------------------------[198] Donald OConnell
[199] Douglas Grant
[200] Jennifer Whalen
…
DISTINCT
 zum Ausblenden von mehrfach vorhandenen
Zeilen
 gültig für alle Spalten der Projektion
SELECT department_id
FROM employees;
vs.
SELECT DISTINCT department_id
FROM employees;
Tabellenstruktur
 Welche Spalten gibt es in der Tabelle?
 Welche Datentypen wurden verwendet?
 Welche NOT-NULL Constraints liegen vor?
 DESC(RIBE) tabellen-name
DESCRIBE Beispiel
 desc employees;
Name
-----------------------------EMPLOYEE_ID
FIRST_NAME
LAST_NAME
EMAIL
PHONE_NUMBER
HIRE_DATE
JOB_ID
SALARY
COMMISSION_PCT
MANAGER_ID
DEPARTMENT_ID
Null
Type
-------- ----------------------------NOT NULL NUMBER(6)
VARCHAR2(20)
NOT NULL VARCHAR2(25)
NOT NULL VARCHAR2(25)
VARCHAR2(20)
NOT NULL DATE
NOT NULL VARCHAR2(10)
NUMBER(8,2)
NUMBER(2,2)
NUMBER(6)
NUMBER(4)
WHERE-Klausel
SQL-Schulung Kapitel: 3
Syntax WHERE-Klausel
SELECT * | {
[DISTINCT] column|expression [alias] } *
FROM table;
[ WHERE condition(s)];
 WHERE schränkt die Abfrage auf die Zeilen
ein, die eine Bedingung erfüllen
 condition besteht aus Spaltennamen,
Ausdrücken, Konstanten und einem
Vergleichsoperator
WHERE-Klausel Beispiel
SELECT employee_id, last_name, job_id, department_id
FROM employees
WHERE department_id = 90;
EMPLOYEE_ID
----------------100
101
102
LAST_NAME
-----------------King
Kochhar
De Haan
JOB_ID
---------AD_PRES
AD_VP
AD_VP
DEPARTMENT_ID
-------------90
90
90
Zeichenfolgen und Datumsangaben
 Zeichenfolgen und Datumswerte werden in Hochkommata
gesetzt
 Bei Zeichenwerten wird die Gross/Kleinschreibung beachtet
 Datumswerte sind formatabhängig
Defaultformat: DD-MON-YY
Beispiel:
SELECT last_name, job_id, department_id
FROM employees
WHERE last_name = 'Whalen';
!= last_name = 'WHALEN'
SELECT last_name, job_id, department_id
FROM employees
WHERE hire_date = '17-SEP-87';
Vergleichsoperatoren
Operator
Bedeutung
=
Gleich
>
Grösser als
>=
Grösser/gleich
<
Kleiner als
<=
Kleiner/gleich
<>
Ungleich
BETWEEN…AND…
IN(set)
LIKE
IS NULL bzw. IS NOT NULL
Zwischen zwei Werten (Werte eingeschlossen)
Entspricht einem Wert aus einer Werteliste
Entspricht einem Zeichenmuster
Ist ein Nullwert bzw. ist kein Nullwert
Syntax Vergleichsoperatoren
… WHERE expr operator value
Beispiele:
… WHERE salary >= 6000
… WHERE last_name LIKE 'Smi%'
… WHERE salary BETWEEN 2000 AND 4000
… WHERE last_name BETWEEN 'King' AND 'Smith'
… WHERE department_id IN (30,50)
… WHERE last_name IN ('Hartstein', 'Vargas')
… WHERE commission_pct IS NULL
Vergleichsoperator LIKE
 Symbole _ und %
 beliebig kombinierbar
 ESCAPE-Identifier, um nach Symbolen zu
suchen
Beispiel:
... WHERE last_name LIKE '_o%'
... WHERE job_id LIKE '%SA\_%' ESCAPE '\'
Logische Operatoren
Operator
AND
OR
NOT
Bedeutung
Gibt TRUE zurück, wenn jede der durch
AND kombinierten Bedingungen wahr ist
Gibt TRUE zurück, wenn eine der durch OR
kombinierten Bedingungen wahr ist
Gibt TRUE zurück, wenn die nachfolgende
Bedingung falsch ist
AND-Operator
 AND fordert, dass beiden Komponenten der
Bedingung wahr sind
 AND-Wahrheitstafel
AND
TRUE
FALSE
NULL
TRUE
TRUE
FALSE
NULL
FALSE
FALSE
FALSE
FALSE
NULL
NULL
FALSE
NULL
OR-Operator
 OR fordert, dass eine Komponente der Bedingung
wahr ist
 OR-Wahrheitstafel
OR
TRUE
FALSE
NULL
TRUE
TRUE
TRUE
TRUE
FALSE
TRUE
FALSE
NULL
NULL
TRUE
NULL
NULL
NOT-Operator
 NOT negiert das Ereignis
 kann mit IN, BETWEEN, LIKE etc. kombiniert werden
 NOT-Wahrheitstafel
NOT
TRUE
FALSE
NULL
FALSE
TRUE
NULL
Prioritätsregeln
Priorität Operator(en)
1
2
3
Arithmetische Operatoren
Verkettungsoperator
Vergleichsoperator
4
5
IS [NOT] NULL, LIKE, [NOT] IN
[NOT] BETWEEN
6
7
8
Ungleich
Logischer Operator NOT
Logischer Operator AND
9
Logischer Operator OR
Prioritätsregeln Beispiele
SELECT last_name, job_id, salary
FROM employees
WHERE
job_id = 'SA_REP'
OR
job_id = 'AD_PRES'
AND
salary > 15000;
oder
SELECT last_name, job_id, salary
FROM employees
WHERE
(job_id = 'SA_REP'
OR
job_id = 'AD_PRES‘)
AND
salary > 15000;
Syntax ORDER BY-Klausel
SELECT
expr
FROM
table
[WHERE
condition(s)]
[ORDER BY {column, expr, num.position} [ASC|DESC]]
 sortieren der abgerufenen Zeilen
 ASC: aufsteigende Reihenfolge, Default
 DESC: absteigende Reihenfolge
 steht am Ende der SELECT-Anweisung
 expr muss Sortierspalte nicht beeinhalten
Sortieren
 In absteigender Reihenfolge sortieren:
… ORDER BY hire_date DESC;
 Nach Spalten Alias sortieren:
… ORDER BY annsal;
 Nach mehreren Spalten sortieren:
… ORDER BY department_id, salary DESC;
 Nach numerischer Position sortieren:
… ORDER BY 2 DESC
Austauschvariablen
 Syntax: &variablenname bzw.
'&variablenname ‘
 Benutzer wird zur Eingabe aufgefordert
 Überall im SELECT-Statement erlaubt




WHERE-Klausel mit variablen Bedingungen
SELECT-Klausel mit variablen Spalten
ORDER BY-Klausel mit variablen
Sortierkriterium
etc.
 &&variablenname für Wiederverwendbarkeit
Austauschvariablen Beispiele
SELECT employee_id, last_name, salary, department_id
FROM employees
WHERE employee_id = &employee_num;
SELECT employee_id, last_name, job_id, &col
FROM employees
WHERE &condition
ORDER BY &order_column;
SELECT employee_id, last_name, job_id, &&col
FROM employees
ORDER BY &col;
DEFINE / UNDEFINE
DEFINE employee_num = 200
SELECT employee_id, last_name, salary,
department_id
FROM employees
WHERE employee_id = &employee_num;
UNDEFINE employee_num
Hinweise
SELECT *
FROM employees
WHERE last_name = &name;
Benutzer muss für name 'irgendwas' eingeben
vs.
SELECT *
FROM employees
WHERE last_name = '&name';
Benutzer muss für name irgendwas eingeben
Single Row Funktionen
SQL Schulung: Kapitel 4
SQL-Funktionen (Oracle)
 Bearbeitung von Datenwerten
 Single Row-Funktionen
 numerische
 datumsbezogene
 Funktionen dienen folgenden Zwecken:
 Berechnungen mit Daten durchführen
 Einzelne Datenelemente ändern
 Ausgabe für Zeilengruppen bearbeiten
 Datumswerte und Zahlen für die Anzeige formatieren
 Spaltendatentypen konvertieren
 Multiple Row-Funktionen (→ Aggregatfunktionen)
Single Row-Funktionen
 bearbeiten Datenelemente
 akzeptieren Argumente und geben einen Wert zurück
 bearbeiten jede zurückgegebene Zeile
 geben ein Ergebnis pro Zeile zurück
 können den Datentyp ändern
 können verschachtelt sein
 akzeptieren Spalten oder Ausdrücke als Argumente
function_name [(arg1, arg2, …)]
SR-Funktionen -Funktionalität
 jede von der Abfrage zurückgegebene Zeile wird




bearbeitet
pro Zeile wird ein Ergebnis zurückgegeben
der zurückgegebene Datenwert kann einen anderen
Datentyp haben als der referenzierte Wert
die Funktionen erwarten möglicherweise ein oder
mehrere Argumente
sie können in SELECT-, WHERE- und ORDER BYKlauseln verwendet, sowie verschachtelt werden
Single Row-Funktionen
 Zeichenfunktionen




akzeptieren Zeichenwerte und liefern Zeichen- oder
numerische- Werte zurück
numerische Funktionen
akzeptieren numerische Werte und geben numerische Werte
zurück
Datumsfunktionen
bearbeiten Werte vom Datentyp DATE. Zurückgegeben wird ein
DATE mit einer Ausnahme ein NUMBER.
Konvertierungsfunktionen
konvertieren Werte von einem Datentyp in einen anderen
Allgemeine Funktionen
NVL, NVL2, NULLIF, COALESCE, CASE und DECODE
Zeichenfunktionen I
 Funktionen zur Umwandlung der
Groß/Kleinschreibung
Funktion
Zweck
LOWER(column|expr)
Konvertiert alphanum. Zeichenwerte in
Kleinbuchstaben
UPPER(column|expr)
Konvertiert alphanum. Werte in
Grossbuchstaben
INITCAP(column|expr)
Konvertiert alphanum. Werte in Großschreibung, wobei der 1.Buchstabe groß,
alles folgende kleingeschrieben wird
Zeichenfunktionen II
 Funktionen zum Bearbeiten von Zeichen
Funktion
Zweck
CONCAT (col1|expr1,
col2|expr2 )
Verkettet den 1. Zeichenwert mit dem 2.
Entspricht ||-Operator
SUBSTR(column|expr,m Gibt bestimmte Zeichen aus einem
[,n])
Zeichenwert zurück. Die zurückgegebene
Teilzeichenfolge beginnt bei der
Zeichenposition m und ist n Zeichen lang.
LENGTH(column|expr)
Liefert die Anzahl der Zeichen i. Ausdruck
INSTR(column|expr,‘stri
ng‘, [,m],[n])
Gibt die numerische Position einer benannten
Zeichenfolge zurück. Optional kann mit m die
Position angegeben werden, wo die Suche
beginnen soll. n Default m,n=1
Zeichenfunktionen II-Fortsetzung
Funktion
Zweck
LPAD(column|expr,n,‘ Füllt den Zeichenwert rechts- bzw.
string‘)
linksbündig bis zur Zeichenposition n mit
RPAD(column|expr,n, Leerzeichen auf.
‘string‘)
TRIM(leading|trailing| Ermöglicht es, Zeichen am Anfang und/oder
both, trim_character
am Ende einer Zeichenfolge
FROM trim_source)
abzuschneiden. Wenn trim_character oder
trim_source ein Zeichenliteral ist, müssen
Sie in Hochkommata gesetzt werden.
REPLACE(text,
search_string,
replacement_string)
Sucht nach einer Zeichenfolge u. ersetzt
diese durch die angegebene
Ersatzzeichenfolge.
Funktionen zur Umwandlung der
Groß/Kleinschreibung Beispiele
-- Konvertiert in Kleinbuchstaben
SELECT LOWER('SQL Kurs')
FROM DUAL;
-- Konvertiert in Grossbuchstaben
SELECT UPPER('SQL Kurs')
FROM DUAL;
-- Konvertiert den 1.Buchstaben in Gross-- folgende Zeichen in Kleinschreibweise
SELECT INITCAP('SQL Kurs')
FROM DUAL;
Hinweis: die DUAL-Tabelle dient als Mittel zur Anzeige von Funktionsergebnissen
-- gibt die Namen in Gross- und die job-id‘s in Kleinbuchstaben aus
SELECT 'The Job-ID for ' || UPPER(last_name) || ' is ' || LOWER(job_id)
AS "Employee Details"
FROM employees;
Funktionen zur Umwandlung der
Groß/Kleinschreibung Beispiele II
SELECT employee_id, last_name, department_id
FROM employees
WHERE last_name = 'higgins';
0 rows selected
SELECT employee_id, last_name, department_id
FROM employees
WHERE LOWER(last_name) = 'higgins';
EMPLOYEE_ID
LAST_NAME
DEPARTMENT_ID
---------------------- ------------------------- ---------------------205
Higgins
110
1 rows selected
… WHERE UPPER(last_name) = 'HIGGINS';
… WHERE INITCAP(last_name) = 'Higgins';
Funkt. zur Bearbeitung von Zeichen
Beispiel
Ausgabe
SELECT CONCAT('Hello', 'World')
FROM DUAL;
HelloWorld
SELECT SUBSTR('HelloWorld',1,5)
FROM DUAL;
Hello
SELECT LENGTH('HelloWorld')
FROM DUAL;
10
SELECT INSTR('HelloWorld','W')
FROM DUAL;
6
SELECT LPAD(salary,10 ,'*')
FROM EMPLOYEES;
… *****24000
SELECT RPAD(salary,10 ,'*')
FROM EMPLOYEES;
… 24000***** …
SELECT REPLACE ('JACK and JUE','J','BL')
FROM DUAL;
BLACK and BLUE
SELECT TRIM ('H' FROM 'HelloWorld')
FROM DUAL;
elloWorld
Funktion z. Bearbeitung von Zeichen
SELECT employee_id,
CONCAT(first_name, last_name) NAME,
LENGTH (last_name),
INSTR(last_name, 'a') "Contains 'a' ?"
FROM employees
WHERE SUBSTR(last_name, -1,1) = 'n';
EMPLOYEE_ID
-----------200
201
102
105
110
112
NAME
------------------JenniferWhalen
MichaelHartstein
LexDe Haan
DavidAustin
JohnChen
Jose ManuelUrman
LENGTH(LAST_NAME)
-----------------6
9
7
6
4
5
Contains 'a' ?
--------------3
2
5
0
0
4
Numerische Funktionen
 akzeptieren numerische Werte und liefern
numerische Werte zurück
Funktion
Zweck
ROUND(column|expr, n)
Rundet eine Spalte, einen Ausdruck oder einen
Wert auf n Dezimalstellen. Ist kein Wert für n
angegeben, wird auf einen ganzzahligen Wert
gerundet.
TRUNC(column|expr, n)
Schneidet eine Spalte, einen Ausdruck oder
einen Wert auf n Dezimalstellen ab. Ist kein
Wert für n angegeben, werden die Ziffern hinter
dem Dezimalkomma abgeschnitten
MOD(m,n)
Gibt den Rest von m geteilt durch n zurück
Hinweis: MOD wird häufig verwendet um zu
ermitteln, ob ein Wert gerade oder ungerade ist.
Numerische Funktionen Beispiele
Beispiel
Ausgabe
SELECT ROUND(45.923,2), ROUND(45.923,0),
ROUND(45.923,-1)
FROM DUAL;
45,92
46
50
SELECT TRUNC(45.923,2), TRUNC(45.923,0),
TRUNC(45.923,-1)
FROM DUAL;
45,92
45
40
SELECT MOD(45,2), MOD(45,0), MOD(45,77),
MOD(46,2)
FROM DUAL;
1
45
45
0
Mit Datumswerten arbeiten
 Oracle speichert Datumswerte im folgenden
Format:
Jahrhundert, Jahr, Monat, Tag, Stunde, Minute, Sekunde
 Default-Anzeigeformat:
DD-MON-RR
 gültige Datumswerte liegen zwischen
1.Januar 4712 v.Chr. und dem 31.Dezember
9999
 SYSDATE liefert Datum und Uhrzeit
Mit Datumswerten rechnen
 eine Zahl addieren oder subtrahieren um einen
neuen Datumswert zu erhalten
Zahl ↔ Anzahl an Tagen
Datum +/- Zahl = Datum
 zwei Datumswerte subtrahieren um die Anzahl
dazwischenliegender Tage zu ermitteln
Datum – Datum = Anzahl Tage
 Stunden zu einem Datum addieren, indem die Anzahl
der Stunden durch 24 dividiert wird.
Datum + Zahl/24 = Datum
 Arithmetische Operatoren mit Datumswerten:
SELECT last_name, (SYSDATE-hire_date)/7 AS WEEKS
FROM employees
WHERE department_id = 90;
Datumsfunktionen
Funktion
Ergebnis
MONTH_BETWEEN(d1, d2)
Berechnet die Anzahl Monate zwischen
zwei Datumswerten (d1 und d2)
ADD_MONTH(date,n)
Addiert n Kalendermonate zu einem
Datum date
NEXT_DAY(date, char)
Sucht nach dem 1.Auftreten des durch
char angegebenen Wochentags
LAST_DAY(date)
Letzter Tag des Monats von date
ROUND(date [, format])
Datumswert runden
TRUNC(date [, format])
Datumswert abschneiden
Datumsfunktionen Beispiele
Beispiel
Ausgabe
SELECT MONTHS_BETWEEN('01-SEP-95','01-JAN-94')
FROM DUAL;
20
SELECT MONTHS_BETWEEN('01-JAN-94','01-SEP-95')
FROM DUAL;
-20
SELECT ADD_MONTHS('11-JAN-94',6)
FROM DUAL;
11-JUL-94
SELECT LAST_DAY('11-FEB-94')
FROM DUAL;
28-FEB-94
SELECT ROUND(SYSDATE,'MONTH'), ROUND(SYSDATE,'YEAR')
FROM DUAL;
wenn sysdate: 25.07.07
01-AUG-07
01-JAN-08
SELECT TRUNC(SYSDATE,'MONTH'), TRUNC(SYSDATE,'YEAR')
FROM DUAL;
wenn sysdate: 25.07.07
01-JUL-07
01-JAN-07
Hinweis: Das Ausgabeformat ist abhängig von den gesetzten
Datenbankparametern!
Datumsfunktionen Beispiele II
SELECT employee_id EMP_ID,
hire_date,
TRUNC (MONTHS_BETWEEN (SYSDATE, hire_date),4) TENSURE,
ADD_MONTHS(hire_date,6) REVIEW,
NEXT_DAY(hire_date, 'FRIDAY') NEXTDAY,
LAST_DAY(hire_date) LASTDAY
FROM employees
WHERE MONTHS_BETWEEN (SYSDATE, hire_date) < 91;
EMP_ID
------167
173
HIRE_DATE
---------21.04.00
21.04.00
TENSURE
--------90,402
90,402
REVIEW
--------21.10.00
21.10.00
NEXTDAY
--------28.04.00
28.04.00
LASTDAY
--------30.04.00
30.04.00
Implizite Datentypkonvertierung
 bei Zuweisungen unter den folgenden Datentypen
kann der Oracle-Server eine automatische
Typkonvertierung vornehmen:
 Hinweis: Es sollte auf eine implizite
Datenkonvertierung verzichtet werden, um die
Zuverlässigkeit einer Anweisung zu garantieren.
Von
VARCHAR2 oder CHAR
In
NUMBER
VARCHAR2 oder CHAR
DATE
NUMBER
DATE
VARCHAR2
VARCHAR2
Explizite Datentypkonvertierung
 SQL stellt 3 Funktionen bereit, um einen Wert von einem
Datentyp in einen anderen zu konvertieren:
 TO_CHAR(number|date, [fmt], [nlsparams])
Konvertiert eine Zahlen- o. Datumswert in eine VARCHAR2Zeichenfolge nach der Formatmaske fmt.
numerische Werte:
nlsparams gibt die folgenden Zeichen an, die von
Zahlenformatelementen zurückgegeben werden:




Dezimalzeichen
Gruppentrennzeichen
lokales Währungszeichen
internationales Währungszeichen
Ohne nlsparams wird der Defaultwert der Session verwendet
Explizite Datentypkonvertierung II

TO_CHAR(number|date, [fmt], [nlsparams])
Datumswerte:
nlsparams legt die Sprache fest, in der die Namen der
Monate und Tage sowie deren Abkürzungen zurückgegeben
werden.

TO_NUMBER (char, [fmt],[nlsparams])
Konvertiert eine Zeichenfolge, die aus Ziffern besteht, in eine Zahl
im Format fmt.
nlsparams hat hier denselben Zweck wie in TO_CHAR
TO_DATE (char, [fmt],[nlsparams])
Konvertiert eine Zeichenfolge, die ein Datum darstellt, gemäß der
Angaben in fmt in einen Datumswert. Wird fmt nicht angegeben, ist
das Format DD-MON-YY
nlsparams hat hier denselben Zweck wie in TO_CHAR

TO_CHAR mit Datumswerten
TO_CHAR(date, 'formatmaske')
Die Formatmaske:
 muss in Hochkommata gesetzt werden
 unterscheidet zwischen Gross- u. Kleinschreibung
 kann alle gültigen Elemente eines Datumsformats
enthalten
 verfügt über ein fm-Element, um aufgefüllte
Leerzeichen zu löschen oder führende Nullen zu
unterdrücken
 wird durch ein Komma vom Datumswert getrennt
Datumsformatmaske - Elemente
Element
Ergebnis
YYYY
Vollständiges Jahr als Zahl
YEAR
Jahr in Worten (Englisch)
MM
Zweistelliger Zahlenwert für den Monat
MONTH
Vollständiger Name des Monats
MON
Abkürzung aus 3 Buchstaben für den Monat
DY
Abkürzung aus 3 Buchstaben f.d.Wochentag
DAY
Vollständiger Name des Wochentages
DD
Tag des Monats als numerischer Wert
HH/HH12/HH24 Sunde des Tages, Stunde (1-12) o. Stunde (0-23)
MI
Minute (0-59)
SS/SSSSS
Sekunde (0-59) / Sek.n. Mitternacht (0-86399)
TO_CHAR mit num. Werten
TO_CHAR(number, 'formatmaske') ddspth
Element
Beschreibung
9
Numerische Position (#9 bestimmt Anzeige)
0
Führende Nullen anzeigen
$
Führendes Dollarzeichen
L
Führendes lokales Wähungssymbol
./,
Dezimalpunkt / Komma an angegebener Position
D
Gibt das Dezimalzeichen a. d. angegebenen Position aus
G
Gibt das Gruppentrennzeichen a. d. angegebenen Position aus
U
Gibt das Eurozeichen mit an
S
Gibt das Vorzeichen mit an +/-
B
Zeigt den Wert Null nicht als 0 sondern als leeres Feld an
Konvertierungsfunktionen Beispiele
Beispiel
Ausgabe
SELECT TO_CHAR(SYSDATE ,'MM/YY')
FROM DUAL;
11/07
SELECT TO_CHAR(SYSDATE ,'MONTH/YEAR')
FROM DUAL;
NOVEMBER/TWO THOUSAND SEVEN
SELECT TO_CHAR(SYSDATE ,'HH:MI:SS')
FROM DUAL;
02:15:33
SELECT TO_CHAR(SYSDATE ,'HH:MI:SSSSS')
FROM DUAL;
02:15:51365
SELECT TO_CHAR(salary, '$99,999.00')
FROM employees
WHERE employee_id = 100;
$24,000.00
Funktionen verschachteln
 Single Row-Funktionen können in einer
beliebigen Zahl von Ebenen verschachtelt
werden
 Verschachtelte Funktionen werden von innen
nach außen ausgewertet
F3 (F2 (F1 (col, arg1) ,arg2) ,arg3)
1.
2.
3.
Funktionen verschachteln Beispiel
SELECT last_name, UPPER(CONCAT(SUBSTR(last_name,1,8)
‚_US‘))
FROM employees
WHERE department_id = 60;
1.
2.
3.
Erg1 = SUBSTR(last_name,1,8)
Erg2 = CONCAT(Erg1, ‚_US‘)
Erg3 = UPPER(Erg2)
SELECT TO_CHAR(NEXT_DAY(ADD_MONTHS(hire_date, 6), ‚FRIDAY‘),
‚fmDay, Month DDth, YYYY‘) „Next 6 Month Review“
FROM employees
ORDER BY hire_date;
Aggregatfunktionen
SQL-Schulung: Kapitel 5
Syntax Aggregatfunktion
SELECT * | {
[DISTINCT] column|expression [alias] } *
FROM table
[WHERE
[GROUP BY
[ORDER BY
condition]
column]
column];
 werden auf Gruppen von Zeilen angewandt
Zeilen werden durch die WHERE-Klausel definiert.
 sind in der WHERE-Klausel selbst nicht erlaubt (später)
 liefern ein Ergebnis pro Gruppe
 Nullwerte werden ignoriert
Aggregatfunktionen-Richtlinien




DISTINCT bewirkt, dass die Funktion keine doppelten Werte berücksichtigt
ALL bewirkt, dass alle Werte, einschl. Doppelter berücksichtigt werden (Default)
expr-Argument kann vom Typ CHAR, VARCHAR2, NUMBER oder DATE sein
n-Argument bezieht sich auf numerische Datentypen
Arten von Gruppenfunktionen und Syntax:
Funktion
Beschreibung
AVG ( [DISTINCT | ALL] n)
Durchschnittwert von n.
COUNT ({*|[DISTINCT | ALL] expr})
Ermittelt die #Zeilen, für die expr ausgewertet wird
MAX ([DISTINCT | ALL] expr)
Höchster Wert von expr
MIN ([DISTINCT | ALL] expr)
Kleinster Wert von expr.
STDDEV ([DISTINCT | ALL] n)
Standardabweichung von n
SUM ([DISTINCT | ALL] n)
Summe der Werte von n
VARIANCE ([DISTINCT | ALL] n)
Varianz von n
Aggregatfunktionen Beispiele
SELECT AVG(salary), MAX(salary), MIN(salary),
SUM(salary)
FROM employees
WHERE hire_date >= '29.01.00'
AND job_id LIKE '%REP%';
SELECT MIN(hire_date), MAX(hire_date)
FROM employees;
COUNT Funktion
 3 Formate:
 COUNT (*)
gibt die Anzahl Zeilen aus der Tabelle zurück, die die
Kriterien der SELECT-Anweisung erfüllen.
 COUNT(expr)
gibt die Anzahl der nicht leeren Werte in der durch expr
angegebenen Spalte zurück
 COUNT(DISTINCT expr)
gibt die Anzahl der eindeutigen, nicht leeren Werte in
der durch expr angegebenen Spalte zurück
COUNT Beispiele
SELECT COUNT(*)
FROM employees;
→ ermittelt Anzahl Angestellter
SELECT COUNT(commission_pct)
FROM employees;
→ ermittelt Anzahl Angestellter, die eine Provision bekommen
SELECT COUNT(*) - COUNT(commission_pct)
FROM employees;
→ ermittelt die Anzahl Angestellter, die keine Provision bekommen
SELECT COUNT(DISTINCT department_id)
FROM employees;
→ ermittelt die Anzahl unterschiedlicher Abteilungen, die Angestellte haben
Aggregatfunktionen u. Nullwerte
 Nullwerte werden ignoriert
 WHERE Klauseln können dies nicht verhindern:
SELECT COUNT(commission_pct)
FROM employees
WHERE commission_pct is null;
→ 0 Zeilen
 NVL zwingt Aggregatfunktionen Nullwerte einzubeziehen
SELECT COUNT(NVL(commission_pct,0))
FROM employees
WHERE commission_pct is null;
→ 72 Zeilen
Exkurs:
NVL konvertiert einen Nullwert in einen konkreten Wert.
Definiert ist NVL für DATE, CHAR, VARCHAR2 und NUMBER
Datengruppen
SQL-Schulung: Kapitel 6
Syntax GROUP-BY Klausel
SELECT * | {
[DISTINCT] column|expression [alias] } *
FROM
[WHERE
[GROUP BY
[ORDER BY
table
condition]
group_by_expression]
column]
 Tabellenzeilen können in kleine Gruppen aufgeteilt werden
 group_by_condition gibt die Spalten an, deren Werte die Basis
für die Gruppierung der Zeilen darstellen.
 Die group_by_condition Spalte muss nicht Bestandteil der
SELECT-Klausel sein.
 In Verbindung mit Aggregatfunktionen, müssen alle Spalten in
der SELECT-Klausel, die nicht in Aggregatfunktionen enthalten
sind, in der GROUP BY-Klausel angegeben werden
GROUP BY-Klausel Beispiele
SELECT department_id, AVG(salary)
FROM employees;
→ Fehler
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id;
→ Ermittelt Durchschnittsgehalt pro Department
DEPARTMENT_ID
---------------------10
20
30
…
AVG(SALARY)
---------------------4400
9500
4150
Gruppen in Gruppen
 GROUP BY-Klausel mit mehreren Spaltenangaben
 Reihenfolge in der GROUP BY-Klausel definiert Haupt- u.
Untergruppen
SELECT department_id, job_id, AVG(salary)
FROM employees
GROUP BY department_id, job_id
ORDER BY department_id, job_id;
DEPARTMENT_ID
---------------------10
20
20
30
30
JOB_ID
---------AD_ASST
MK_MAN
MK_REP
PU_CLERK
PU_MAN
AVG(SALARY)
-----------------4400
13000
6000
2780
11000
Syntax HAVING-Klausel
SELECT * | {
[DISTINCT] column|expression [alias] } *
FROM
[WHERE
[GROUP BY
[HAVING
[ORDER BY
table
condition]
group_by_expression]
group_by_condition]
column]
 Gruppenergebnisse einschränken auf Basis der
Aggregatfunktion
 Aggregatfunktionen sind in der WHERE-Klausel nicht erlaubt →
HAVING-Klausel
 legt fest, welche Gruppen angezeigt werden sollen
 HAVING auch ohne GROUP BY möglich
HAVING-Klausel Beispiel
SELECT department_id, MAX(salary)
FROM employees
GROUP BY department_id
HAVING MAX(salary) > 10000;
Abarbeitungsreihenfolge:
1. Zeilen werden gruppiert
2. die Aggregatfunktion wird auf die Gruppe
angewandt
3. die Gruppe, die die Kriterien in der HAVING-Klausel
erfüllt, werden angezeigt
HAVING-Klausel Beispiele II
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id
HAVING MAX(salary) > 10000;
SELECT job_id, SUM(salary) PAYROLL
FROM employees
WHERE job_id NOT LIKE '%REP%'
GROUP BY job_id
HAVING SUM(salary) > 13000
ORDER BY SUM(salary)
SELECT MAX(AVG(salary)) "Max. Durchschnittsgehalt"
FROM employees
GROUP BY department_id
→ Hinweis: Gruppenfunktionen können in bis zu 2 Ebenen verschachtelt werden
Joins
(Daten aus mehreren Tabellen anzeigen)
SQL-Schulung: Kapitel 7
Arten von Joins nach SQL:1999-Standard
Zu den SQL:1999.Standard konformen Joins
zählen:
 Cross Joins
 Natural Joins
 USING-Klausel
 Full (zweiseitige) Outer Joins
 Beliebige Join-Bedingungen für Outer Joins
Syntax SQL:1999-Standard
SELECT table1.column, table2.column
FROM table1
[NATURAL JOIN table2] |
[JOIN table2 USING (column_name)] |
[JOIN table2
ON (table1.column_name = table2.column_name)]
|
[LEFT|RIGHT|FULL OUTER JOIN table2
ON (table1.column_name = table2.column_name)]
|
[CROSS JOIN table2];
NATURAL JOIN
 basiert auf allen Spalten, die in beiden Tabellen
denselben Namen haben
 ausgewählt werden die Zeilen, die in allen
übereinstimmenden Spalten die gleichen Werte
haben
 gleichnamige Spalten mit unterschiedlichen
Datentypen lösen Fehler aus
 Spalten, die in beiden Tabellen denselben Namen
haben, müssen ohne Kennzeichner auskommen
NATURAL JOIN Beispiel
desc locations;
Name
-----------------------------LOCATION_ID
STREET_ADDRESS
POSTAL_CODE
CITY
STATE_PROVINCE
COUNTRY_ID
desc departments;
Name
-----------------------------DEPARTMENT_ID
DEPARTMENT_NAME
MANAGER_ID
LOCATION_ID
Null
Type
-------- ------------------------------NOT NULL NUMBER(4)
VARCHAR2(40)
VARCHAR2(12)
NOT NULL VARCHAR2(30)
VARCHAR2(25)
CHAR(2)
Null
-------NOT NULL
NOT NULL
Type
------------------------------NUMBER(4)
VARCHAR2(30)
NUMBER(6)
NUMBER(4)
NATURAL JOIN Beispiel Forts.
SELECT department_id, department_name, location_id, city
FROM departments NATURAL JOIN locations
DEPARTMENT_ID
--------------60
50
10
20
30
90
DEPARTMENT_NAME
------------------------IT
Shipping
Administration
Marketing
Purchasing
Executive
LOCATION_ID
--------------1400
1500
1700
1800
1700
1700
CITY
---------------------Southlake
South San Francisco
Seattle
Toronto
Seattle
Seattle
…
SELECT department_id, department_name, location_id, city
FROM departments NATURAL JOIN locations
WHERE department_id IN (20,50)
DEPARTMENT_ID
----------------20
50
DEPARTMENT_NAME
--------------------Marketing
Shipping
LOCATION_ID
----------------1800
1500
CITY
---------------------Toronto
South San Francisco
JOINS mit der USING-Klausel
 wenn mehrere Spalten denselben Namen, aber unterschiedliche
Datentypen haben, können Sie die NATURAL JOIN-Klausel mit
der USING-Klausel ändern und die Spalten angeben, die für
einen Equi Join verwendet werden
 mit der USING-Klausel können Sie angeben, dass nur eine
Spalte verwendet werden soll, wenn mehrere übereinstimmende
Spalten existieren
 NATURAL JOIN- und USING-Klauseln schliessen sich
gegenseitig aus
 für die in der USING-Klausel referenzierten Spalten dürfen in
der gesamten SQL-Anweisung keine Kennzeichner verwendet
werden
USING-Klausel Beispiel
SELECT l.city, d.department_name
FROM locations l JOIN departments d USING
(location_id)
WHERE location_id = 1400;
CITY
DEPARTMENT_NAME
------------------------------ -----------------------------Southlake
IT
SELECT l.city, d.department_name
FROM locations l JOIN departments d USING
(location_id)
WHERE d.location_id = 1400
ORA-25154: column part of USING clause cannot have qualifier
Mehrdeutige Spaltennamen
 mit Tabellenpräfixen können die
Spaltennamen, die in mehreren Tabellen
vorkommen, eindeutig gekennzeichnet
werden
 Tabellenpräfixe verbessern die Performance
 mit Spalten-Aliasnamen können die Spalten
unterschieden werden, die identische Namen
in unterschiedlichen Tabellen aufweisen
Tabellen-Aliasnamen verwenden
 mit Aliasnamen können Abfragen vereinfacht werden
 die Lesbarkeit von Abfragen wird erhöht
 die Performance wird gesteigert
 max. 30 Zeichen
 gilt nur für die aktuelle SELECT-Anweisung
SELECT e.employee_id, e.last_name, d.location_id,
department_id
FROM employees e JOIN departments d
USING (department_id);
ON-Klausel
 die Join-Bedingung für Natural Joins ist im Prinzip ein




Equi-Join aller Spalten mit gleichen Namen.
mit der ON-Klausel können beliebige Bedingungen
oder die zu verknüpfenden Spalten angegeben
werden
die Spalten müssen nicht den gleichen Namen haben
die Join-Bedingung wird von anderen Suchkriterien
getrennt
die ON-Klausel macht den Code lesbarer
ON-Klausel Beispiel
SELECT e.employee_id, e.last_name, e.department_id,
d.department_id, d.location_id
FROM employees e JOIN departments d
ON (e.department_id = d.department_id );
EMPLOYEE_ID
-----------200
201
202
114
119
115
116
…
LAST_NAME
----------Whalen
Hartstein
Fay
Raphaely
Colmenares
Khoo
Baida
DEPARTMENT_ID
--------------10
20
20
30
30
30
30
DEPARTMENT_ID
----------------10
20
20
30
30
30
30
LOCATION_ID
-----------1700
1800
1800
1700
1700
1700
1700
ON-Klausel (Self Join)
 eine Tabelle wird mit sich selbst verknüpft
 es müssen unterschiedliche Aliasnamen verwendet werden
 sinnvoll, wenn Werte einer Spalte mit anderen Werten derselben Spalte
verglichen werden (z.B. hierarchisch strukturierte Daten)
Beispiel:
SELECT e.last_name emp, m.last_name mgr
FROM employees e JOIN employees m
ON (e.manager_id = m.employee_id );
EMP
------------------------Fay
Gietz
Zlotkey
Cambrault
…
MGR
------------------------Hartstein
Higgins
King
King
Zusätzliche Bedingungen
 die Join-Bedingung kann mit beliebigen
Bedingungen kombiniert werden.
SELECT e.employee_id, e.last_name, e.department_id, d.department_id,
d.location_id
FROM employees e JOIN departments d
ON (e.department_id = d.department_id )
AND e.manager_id=149;
ist equivalent zu
SELECT e.employee_id, e.last_name, e.department_id, d.department_id,
d.location_id
FROM employees e JOIN departments d
ON (e.department_id = d.department_id )
WHERE e.manager_id=149;
3-Way Joins mit der ON-Klausel
 Verbindung von 3 Tabellen
 Ausführungsrichtung nach SQL:1999 von links nach
rechts
SELECT employee_id, city, department_name
FROM employees e JOIN departments d
ON (e.department_id = d.department_id )
JOIN locations l
ON (d.location_id = l.location_id);
 1. ausführbarer Join: emloyees JOIN departments
referenzierbar sind Spalten dieser Tabellen
 2. ausführbarer Join: departments JOIN locations
Non Equi Join
 nicht auf den = -Operator bezogen
Beispiel:
SELECT e.last_name, e.salary, j.grade_level
FROM employees e JOIN job_grades j
ON e.salary BETWEEN j.lowest_sal AND j.highest_sal;
Outer Join
 verwenden, wenn Datensätze ohne direkte
Übereinstimmung existieren
 Zeile wird angezeigt, trotzdem Join-Bedingung nicht
erfüllt ist
 es werden alle Zeilen zurückgegeben, die die JoinBedingung erfüllen +
einige oder alle Zeilen aus einer Tabelle, für die keine
Zeilen in der anderen Tabelle die Join-Beziehung
erfüllen
 Arten:



LEFT OUTER
RIGHT OUTER
FULL OUTER
OUTER Join Arten
 LEFT OUTER:
ruft alle Zeile aus der linken Tabelle ab, auch wenn in
der rechten Tabelle keine Übereinstimmungen
existieren
 RIGHT OUTER:
ruft alle Zeilen aus der rechten Tabelle ab, auch wenn
in der linken Tabelle keine Übereinstimmungen
existieren
 FULL OUTER:
Zeigt alle Zeilen an, die Übereinstimmungen
aufweisen, zzgl. Zeilen aus beiden Tabellen, die
keine Übereinstimmungen aufweisen
LEFT OUTER JOIN Beispiel
SELECT e.last_name, e.department_id, d.department_name
FROM employees e LEFT OUTER JOIN departments d
ON e.department_id = d.department_id;
LAST_NAME
----------------Grant
Higgins
Gietz
Sciarra
DEPARTMENT_ID
DEPARTMENT_NAME
------------------ -----------------110
110
100
Accounting
Accounting
Finance
Faviet
100
Finance
→ es werden alle Angestellten mit Ihrer Department-Zuordnung
angezeigt, auch wenn es keine Zuordnung gibt
RIGHT OUTER JOIN Beispiel
SELECT e.last_name, d.department_id, d.department_name
FROM employees e RIGHT OUTER JOIN departments d
ON e.department_id = d.department_id;
LAST_NAME
DEPARTMENT_ID
--------------- ---------------120
270
130
…
260
Zlotkey
80
Whalen
10
Weiss
50
DEPARTMENT_NAME
-------------------Treasury
Payroll
Corporate Tax
Recruiting
Sales
Administration
Shipping
→ es werden alle Departments mit Ihrer Department-Zuordnung
angezeigt, auch wenn ihnen keine Angestellten zugeordnet sind
FULL OUTER JOIN Beispiel
SELECT e.last_name, d.department_id, d.department_name
FROM employees e FULL OUTER JOIN departments d
ON e.department_id = d.department_id;
LAST_NAME
DEPARTMENT_ID DEPARTMENT_NAME
------------- ------------- -----------------------------120
Treasury
270
Payroll
130
Corporate Tax
Vishney
80
Sales
Vargas
50
Shipping
Grant
50
Shipping
Grant
→ es werden alle Departments und alle Angestellten anzeigt, mit
und ohne jeweiliger Zuordung
Kartesische Produkte
 Definition: Alle Zeilen aus der 1.Tabelle werden mit
allen Zeilen aus der 2.Tabelle verknüpft
 Anzahl generierter Zeilen = Anzahl Zeilen d. 1.
Tabelle * Anzahl Zeilen d. 2.Tabelle
 ein kartesisches Produkt wird gebildet, wenn:



eine Join-Bedingung fehlt
eine Join-Bedingung ungültig ist
alle Zeilen aus der ersten Tabelle mit allen Zeilen aus
der zweiten Tabelle verknüpft werden
 → gültige Join Bedingungen sind wichtig!
CROSS JOIN-Klausel
 erstellt Kreuzprodukt aus zwei Tabellen
 ein Kreuzprodukt entspricht dem kartesischen
Produkt
Beispiel:
SELECT e.department_name, d.department_name
FROM departments e CROSS JOIN departments d;
Unterabfragen
SQL-Schulung: Kapitel 8
Zweck von Unterabfragen
 eine Unterabfrage ist eine SELECT-
Anweisung, die in eine Klausel einer anderen
SELECT-Anweisung eingebettet ist z.B.


WHERE-Klausel
HAVING-Klausel
 nützlich, wenn Zeilen aus einer Tabelle mit
einer Bedingung ausgewählt werden, die von
den Daten in einer Tabelle selbst abhängt
Unterabfragen Syntax
SELECT
FROM
WHERE
select_list
table
expr operator
(SELECT
select_list
FROM
table);
 die Unterabfrage (innere Abfrage) wird einmal vor der
Hauptabfrage (äussere Abfrage) ausgeführt.
 das Ergebnis der Unterabfrage wird von der
Hauptabfrage verwendet
operator
eine Vergleichsbedingung
Single Row- u. Multiple Row-Operatoren
Unterabfrage Beispiel
SELECT last_name, salary
FROM employees
11000
WHERE salary >
(SELECT salary
FROM employees
WHERE last_name = 'Abel');
LAST_NAME
------------------------King
Kochhar
De Haan
Greenberg
Russell
Partners
Errazuriz
Ozer
SALARY
---------------------24000
17000
17000
12000
14000
13500
12000
11500
Unterabfragen Richtlinien
 Unterabfragen werden in Klammern ()
eingeschlossen
 bessere Lesbarkeit durch: Unterabfragen werden auf
der rechten Seite der Vergleichsbedingung
angegeben
 Verwendung von Single Row- und Multiple RowOperatoren führen zu 2 Arten von Unterabfragen:


Single Row-Unterabfrage
Multiple Row-Unterabfrage
 Haupt- und Unterabfrage können sich auf
unterschiedliche Tabellen beziehen
Arten von Unterabfragen
 Single Row-Unterabfrage
Abfrage, deren innere SELECT-Anweisung
nur eine Zeile zurückgibt
 Multiple Row-Unterabfrage
Abfrage, deren innere SELECT-Anweisung
mehrere Zeilen zurückgibt
 Multiple Column-Unterabfragen
Abfrage, deren innere SELECT-Anweisung
mehrere Spalten zurückgibt (später)
Singe Row-Unterabfrage
 geben nur eine Zeile zurück
 verwenden Single Row-Operatoren
=, >, >=, <, <=, <>
Beispiel:
SELECT last_name, job_id
FROM employees
WHERE job_id = (SELECT job_id
FROM employees
WHERE employee_id = 141);
LAST_NAME
------------------------Nayer
Mikkilineni
Landry
Markle
Bissot
JOB_ID
---------ST_CLERK
ST_CLERK
ST_CLERK
ST_CLERK
ST_CLERK …
Single Row-Unterabfrage Beispiel
SELECT last_name, job_id
FROM employees
WHERE job_id =
(SELECT job_id
FROM employees
WHERE employee_id = 141)
AND salary >
(SELECT salary
FROM employees
WHERE employee_id = 143);
Aggregatfunktionen in Unterabfragen
 mit einer Aggregatfunktion kann eine
Unterabfrage auf eine Zeile reduziert werden
Beispiel:
SELECT last_name, job_id, salary
FROM employees
WHERE salary = (SELECT MIN(salary)
FROM employees
);
LAST_NAME
JOB_ID
SALARY
------------------------- ---------- ---------------------Olson
ST_CLERK
2100
Unterabfragen in HAVING-Klausel
 das Managementsystem führt Unterabfragen
zuerst aus
 Unterabfragen-Ergebnis wird an die HAVING
Klausel der Hauptabfrage weitergeleitet
Beispiel:
SELECT department_id, MIN(salary)
FROM employees
GROUP BY department_id
HAVING MIN(salary) > (SELECT MIN(salary)
FROM employees
WHERE department_id = 50);
Wieviele Zeilen werden
zurückgegeben?
SELECT last_name, job_id
FROM employees
WHERE job_id =
(SELECT job_id
FROM employees
WHERE last_name = ‘Haas‘ );
no rows selected
Hinweis:
Es gibt keinen Angestellten mit dem Namen Haas, so liefert die
Unterabfrage keine Zeilen zurück. Ergebnis der Unterabfrage ist
null. Ein Vergleich mit null liefert immer null, auch wenn es eine
Jobkennung null geben würde.
Wo liegt der Fehler?
SELECT
FROM
WHERE
employee_id, last_name
employees
salary = ( SELECT MIN(salary)
FROM employees
GROUP BY department_id);
ERROR at line 4: ORA-01427: single-row subquery
returns more than one row
Die Unterabfrage liefert mehrere Zeilen zurück, daher muss
auch ein Multiple Row Operator für die Verarbeitung der
Unterabfrage eingesetzt werden!
Multiple Row-Unterabfrage
 geben mehrere Zeilen zurück
 verwenden Multiple Row-Vergleichsoperatoren
IN, ANY, ALL
SELECT
FROM
WHERE
employee_id, last_name
employees
salary IN ( SELECT MIN(salary)
FROM employees
GROUP BY department_id);
Das Suchkriterium der Hauptabfrage sieht dann wie folgt aus:
SELECT employee_id, last_name
FROM
employees
WHERE
salary IN (2500, 4200, 4400, 6000, 7000, 8300,
8600, 17000);
ANY-Operator
SELECT employee_id, last_name, job_id, salary
FROM employees
WHERE salary < ANY
(SELECT salary
FROM employees
WHERE job_id = 'IT_PROG')
AND job_id <> 'IT_PROG';
Bedeutung und Anwendung von ANY:
< ANY
weniger als das Maximum
> ANY
mehr als das Minimum
= ANY
hat dieselbe Bedeutung wie IN
ALL-Operator
SELECT employee_id, last_name, job_id, salary
FROM employees
WHERE salary < ALL
(SELECT salary
FROM employees
WHERE job_id = 'IT_PROG')
AND job_id <> 'IT_PROG';
Bedeutung und Anwendung von ALL:
< ALL
weniger als das Minimum
> ALL
mehr als das Maximum
Mengenoperatoren
SQL-Schulung: Kapitel 9
Mengenoperatoren
 kombinieren die Ergebnisse von zwei oder mehr
Komponentenabfragen zu einem Ergebnis
 werden auch zusammengesetzte Abfragen genannt
 haben die gleiche Priorität
 Auswertung von links nach rechts, bzw. open nach unten
Operator
Rückgabe
UNION
Alle eindeutigen Zeilen, die von einer der Abfragen
ausgewählt werden
UNION ALL
Alle Zeilen, die von einer der Abfragen ausgewählt werden,
einschliesslich doppelter Zeilen
INTERSECT
Alle eindeutigen Zeilen, die von beiden Abfragen
ausgewählt werden
MINUS
Alle eindeutigen Zeilen, die von der ersten, nicht jedoch
von der zweiten Anweisung ausgewählt werden
UNION Operator
 gibt Ergebnisse aus beiden Abfragen zurück
 doppelte Ergebnisse werden ausgeblendet
 Anzahl und Datentyp der gewählten Spalten müssen




in allen von der Abfrage verwendeten SELECTAnweisungen identisch sein
UNION gilt für alle ausgewählten Spalten
die Spaltennamen müssen nicht identisch sein
der IN-Operator hat eine höhere Priorität als der
UNION-Operator
Standard: Ausgabe in aufsteigender Reihenfolge
sortiert, basierend auf der ersten Spalte
UNION-Operator Beispiel
SELECT employee_id, job_id
FROM employees
UNION
SELECT employee_id, job_id
FROM job_history;
 doppelte Datensätze werden ausgeblendet
 Datensätze gelten als gleich, wenn sie in allen
Projektionsspalten gleich sind
UNION ALL-Operator
 im Gegensatz zu UNION werden doppelte
Zeilen nicht ausgeblendet
 die Ausgabe wird nicht standardmässig
sortiert
 DISTINCT kann nicht verwendet werden
INTERSECT-Operator
 gibt alle die Zeilen zurück, die in allen Abfragen




vorkommen
Anzahl und Datentyp der von den SELECTAnweisungen der Abfragen gewählten Spalten
müssen in allen von der Abfrage verwendeten
SELECT-Anweisungen identisch sein
Spaltennamen müssen nicht identisch sein
eine Änderung der Reihenfolge der Abfragen, welche
die Schnittmenge bilden, wirkt sich nicht auf das
Ergebnis aus
INTERSECT ignoriert NULL-Werte nicht
INTERSECT-Operator Beispiel
SELECT employee_id, job_id
FROM employees
INTERSECT
SELECT employee_id, job_id
FROM job_history;
 liefert die Angestellten, die einmal die Job-
Position gewechselt haben und wieder in die
alte Position zurückgekehrt sind
MINUS-Operator
 gibt die Zeilen aus der ersten Abfrage zurück, die in
der zweiten Abfrage nicht vorkommen
 Anzahl und Datentyp der von den SELECTAnweisungen der Abfragen gewählten Spalten
müssen in allen von der Abfrage verwendeten
SELECT-Anweisungen identisch sein
 Spaltennamen müssen nicht identisch sein
 alle Spalten in der WHERE-Klausel müssen in der
SELECT-Klausel enthalten sein, damit der Operator
MINUS ordnungsgemäss funktioniert
MINUS-Operator Beispiel
SELECT employee_id, job_id
FROM employees
MINUS
SELECT employee_id, job_id
FROM job_history;
 liefert die Angestellten, die noch nie den Job
gewechselt haben
Mengenoperatoren Richtlinien
 die Ausdrücke in den SELECT-Listen müssen in
Anzahl und Datentyp übereinstimmen
 durch Klammern kann die Ausführungsreihenfolge
geändert werden
 die ORDER BY-Klausel


darf nur ganz am Ende der Anweisung stehen
akzeptiert den Spaltennamen, Aliasnamen aus der
ersten SELECT-Anweisung oder die positionale
Notation
 Mengenoperatoren können in Unterabfragen
verwendet werden
Ausdrücke in den SELECT-Listen
SELECT employee_id, department_id
FROM employees
WHERE (employee_id, department_id)
IN (SELECT employee_id, department_id
FROM employees
UNION
SELECT employee_id, department_id
FROM job_history);
Dummy Spalten
 um SELECT-Listen anzugleichen
SELECT department_id,
TO_NUMBER(null) location, hire_date
FROM employees
UNION
SELECT department_id,
location_id, TO_DATE(null)
FROM departments;
DML (Data Manipulation Language)
SQL-Schulung: Kapitel 10
Datenmanipulationssprache (DML)
 eine DML-Anweisung wird ausgeführt, wenn



in einer Tabelle eine neue Zeile hinzugefügt wird
→ INSERT
in einer Tabelle eine vorhandene Zeile geändert wird
→ UPDATE
in einer Tabelle eine vorhandene Zeile gelöscht wird
→ DELETE
 eine Transaktion besteht aus einer Zusammenstellung von
DML-Anweisungen, die eine logische Arbeitseinheit bilden
 eine Transaktion kann bestätigt werden
→ COMMIT
 eine Transaktion kann rückgängig gemacht werden
→ ROLLBACK
INSERT-Anweisung Syntax
INSERT INTO table [(column [, column….])]
VALUES (value [, value…]);
 mit dieser VALUE-Klausel-Syntax wird genau eine
Zeile eingefügt
table
column
value
steht für den Namen der Tabelle
ist der Name der Tabellenspalte
ist der entsprechende Wert der Spalte
INSERT-Anweisung
 die Spaltenangaben können weggelassen werden,
wenn für alle Spalten Werte in Default-Reihenfolge
angegeben werden
 Implizite Methode: weglassen der Spalte aus der
Spaltenliste:
INSERT INTO departments (department_id,
department_name)
VALUES (30, 'Purchasing');
 Explizite Methode: Für alle Spalten werden Werte
angegeben:
INSERT INTO departments
VALUES (30, 'Purchasing',NULL,NULL);
INSERT Anweisung Forts.
 Datumswerte und Zeichenketten werden in
einfachen Anführungszeichen angegeben
 mit DESC tabellenname kann die DefaultReihenfolge ermittelt werden
 DBMS prüft Datentypen, Datenbereiche und
Datenintegritätsbedingungen (Constraints)




NOT NULL Constraint
UNIQUE Constraint
FOREIGN KEY Constraint
CHECK Constraint
Spezielle Werte
 SYSDATE ist eine Funktion, die das aktuelle Datum
und Uhrzeit zurückliefert
INSERT INTO employees
VALUES (113, 'Louis', 'Popp', 'LPOPP', '515.124.4567',
SYSDATE, 'AC_ACCOUNT', 6900, NULL, 205, 100);
 TO_DATE für nicht Default-Formate
INSERT INTO employees
VALUES (113, 'Louis', 'Popp', 'LPOPP', '515.124.4567',
TO_DATE('FEB 3, 1999', 'MON DD, YYYY'), 'AC_ACCOUNT',
6900, NULL, 205, 100);
Default-Format: DD-MON-YY
YY entspricht dem aktuellem Jahrhundert, DefaultUhrzeit ist 00:00:00
Zeilen aus anderen Tabellen kopieren
 INSERT in Verbindung mit einer Unterabfrage
INSERT INTO sales_reps(id, name, salary,
commission_pct)
SELECT employee_id, last_name, salary,
commission_pct
FROM employees
WHERE job_id LIKE '%REP%';
 keine VALUES-Klausel
 die Anzahl der Spalten in der INSERT-Klausel
muss mit der Spaltenanzahl in der
Unterabfrage übereinstimmen
INSERT über Unterabfrage Syntax
INSERT INTO table [(column [, column….])]
subquery;
 Anzahl der Datentypen der Spalten in der
Spaltenliste der INSERT-Klausel müssen mit
der Anzahl und den Datentypen der Werte in
der Unterabfrage übereinstimmen.
 Für eine Kopie aller Zeilen einer Tabelle:
INSERT INTO copy_emp
SELECT * FROM employees;
Achtung: copy_emp muss natürlich existieren!
UPDATE-Anweisung Syntax
UPDATE table
SET
column = value [, column = value, …]
[WHERE condition];
table
column
value
condition
steht für den Namen der Tabelle
ist die Tabellenspalte, deren Wert
geändert werden soll
ist der entsprechende Wert
identifiziert die zu aktualisierenden Zeilen und
besteht aus Spaltennamen, Ausdrücken,
Konstanten, Unterabfragen und Vergleichsoperatoren
UPDATE-Anweisung Beispiele
UPDATE employees
SET department_id = 70
WHERE employee_id = 113;
Updates mit Hilfe von Unterabfragen:
UPDATE employees
SET job_id = (SELECT job_id
FROM employees
WHERE employee_id = 205),
salary = (SELECT salary
FROM employees
WHERE employee_id = 205)
WHERE employee_id = 114;
Hinweis: Die Unterabfragen brauchen sich nicht auf die gleiche
Tabelle beziehen
DELETE-Anweisung Syntax
DELETE [FROM] table
[WHERE condition];
table
condition
ist der Name der Tabelle
identifiziert die zu löschenden Zeilen und besteht
aus Spaltennamen, Ausdrücken, Konstanten,
Unterabfragen und Vergleichsoperatoren
DELETE-Anweisung Beispiele
DELETE FROM departments
WHERE department_name = 'FINANCE';
→ Löscht das Department Finance
DELETE FROM copy_emp;
→ Löscht alle Datensätze der Tabelle copy_emp
DELETE FROM departments
WHERE department_id IN (30,40);
→ Löscht die Departments mit der ID 30 und 40
DELETE-Anweisung Beispiele II
DELETE FROM employees
WHERE department_id =
(SELECT department_id
FROM departments
WHERE department_name LIKE '%Public%');
→ Löscht alle Angestellten aller Abteilungen, welche im
Namen Public verwenden.
TRUNCATE-Anweisung
 Entfernt alle Zeilen aus einer Tabelle, so dass die
Tabelle anschliessend leer und die Tabellenstruktur
weiter intakt ist
 ist eine Anweisung der Datendefinitionssprache
(DDL), keine DML-Anweisung, und kann nicht ohne
Weiteres rückgängig gemacht werden
 Syntax
TRUNCATE TABLE table_name;
 Beispiel:
TRUNCATE TABLE copy_emp;
TRUNCATE
 effiziente Methode um Tabellen zu leeren
 schneller als DELETE, weil:



es eine DDL-Anweisung ist, ohne
ROLLBACK-Informationen
existierende DELETE-Trigger werden
umgangen
unterliegt dennoch CONSTRAINTS
Datenbanktransaktionen
Können bestehen aus:
 DML-Anweisungen, die eine konsistente
Änderung der Daten bewirken
 einer DDL-Anweisung
 einer Anweisung der Datenkontrollsprache
(DCL)
Datenbanktransaktionen II
 eine Transaktion beginnt, wenn die erste DML-SQL-Anweisung
ausgeführt wird
 eine Transaktion endet bei einem der folgenden Ereignisse:
 eine COMMIT- oder ROLLBACK-Anweisung wird abgesetzt
 eine DDL- oder DCL-Anweisung wird ausgeführt
 ein Benutzer beendet die Session
 das System stürzt ab
 Nach der Beendigung einer Transaktion startet die nächste
ausführbare SQL-Anweisung automatisch die nächste
Transaktion
 DDL- und DCL-Anweisungen werden autom. festgeschrieben,
die Transaktion wird implizit beendet.
COMMIT- und ROLLBACK
Anweisungen
 stellen die Datenkonsistenz sicher
 erstellen eine Sicht auf die Datenänderung
bevor sie dauerhaft gespeichert wird
→ Kontrolle über die dauerhafte
Speicherung
 gruppieren logisch zusammenhängende
Operationen
 explizite Steueranweisungen für
Transaktionen
Transaktionen steuern
Anweisung
Beschreibung
COMMIT
Beendet die aktuelle Transaktion, indem alle noch nicht
gespeicherten Datenänderungen dauerhaft
festgeschrieben werden
SAVEPOINT name Markiert einen Savepoint innerhalb einer Transaktion
ROLLBACK
Beendet die aktuelle Transaktion, indem alle noch nicht
gespeicherten Datenänderungen verworfen werden
Rollt die akt. Transaktion zum angegebenen Savepoint
ROLLBACK TO
SAVEPOINT name zurück, wodurch alle Änderungen und/oder Savepoints
verworfen werden, die nach dem Savepoint erstellt
wurden, zu dem das Rollback erfolgt. Wird die TO
SAVEPOINT-Klausel weggelassen, so wird die
gesammte Transaktion zurückgesetzt.
Änderungen zurückrollen
UPDATE ….
SAVEPOINT update_done;
Savepoint created.
INSERT…
ROLLBACK TO update_done;
Rollback complete.
→ das Insert wird rückgängig gemacht
Implizite Transaktionsverarbeitung
 Commit wird automatisch gesetzt bei:


DDL-Anweisungen
DCL-Anweisungen
 autom. Rollback bei Systemausfall
 Vorsicht bei bzw. mit AUTOCOMMIT
Zustand der Daten (vor Commit u. Rollback)
 jede Datenänderung ist im Verlauf einer Transaktion
vorübergehend, bis die Transaktion festgeschrieben wird
 DML-Operationen finden zunächst im Datenbank-Buffer statt
 der aktuelle Benutzer kann die Ergebnisse von DML-
Operationen durch Abfragen der entsprechenden Tabellen
prüfen
 andere Benutzer können die Ergebnisse der DML-Operation
des akt. Benutzers nicht sehen
 DML-Operationen sperren die entsprechenden Zeilen, damit die
Daten nicht von mehreren Seiten gleichzeitig geändert werden
Zustand der Daten (nach Commit)
 Datenänderungen werden dauerhaft in der
Datenbank festgeschrieben
 der vorherige Zustand kann nicht wiederhergestellt
werden (Ausnahme, durch das DBMS-Recovery)
 alle Benutzer können sich die Ergebnisse anzeigen
 Sperren der betroffenen Zeilen werden freigegeben.
Diese Zeilen können von den Benutzern wieder
bearbeitet werden
 alle Savepoints werden gelöscht
Daten festschreiben
DELETE FROM employees
WHERE employee_id = 99999;
1 row deleted.
INSERT INTO departments
VALUES (290, ' Corporate Tax ', NULL, 1700);
1 row created.
COMMIT;
Commit complete.
Zustand der Daten (nach Rollback)
 Datenänderungen werden rückgängig
gemacht
 der vorherige Zustand der Daten wird wieder-
hergestellt
 Sperren der betroffenen Zeilen werden
freigegeben.
 alle Savepoints werden gelöscht
Daten festschreiben
DELETE FROM employees;
107 rows deleted.
ROLLBACK;
Rollback complete.
DELETE FROM employees
WHERE employee_id = 164;
1 row deleted.
SELECT * FROM employees WHERE employee_id = 164;
no rows selected.
SELECT * FROM employees;
106 rows selected.
COMMIT;
Commit complete.
DDL-Anweisungen !!!
DELETE FROM employees;
107 rows deleted.
COMMIT;
CREATE TABLE xyz;
COMMIT;
SELECT * FROM emloyees;
no rows selected.
ROLLBACK;
SELECT * FROM employees;
no rows selected.
implizites Commit vor und nach
jeder DDL-Anweisung!!!
Lesekonsistenz
 die Lesekonsistenz stellt jederzeit eine konsistente Ansicht der





Daten sicher.
Lesevorgängen werden keine Daten angezeigt, die gerade
geändert werden.
die Änderungen eines Benutzers verursachen keine Konflikte
mit den Änderungen eines anderen Benutzers
Schreibvorgänge können sicher sein, dass Änderungen an der
Datenbank konsistent erfolgen.
die Lesekonsistenz stellt für dieselben Daten folgendes sicher:
 Lesevorgänge müssen keine Schreibvorgänge abwarten
 Schreibvorgänge müssen keine Lesevorgänge abwarten
die Lesekonsistenz stellt sicher, dass jedem Benutzer die Daten
mit dem Status zum Zeitpunkt des letzten Commits angezeigt
werden
Lesekonsistenz technisch
 sie wird automatisch implementiert
 es wird eine Teilkopie der Datenbank in
Undo-Segmenten aufbewahrt, sobald eine
DML-Operation ausgeführt wird
 Daten aus den Undo-Segmenten: Snapshot
 Undo-Segmente werden nach dem
Commit/Rollback wieder freigegeben
 im Rollback-Fall werden die Daten aus den
Undo-Segmenten wieder in die Tabellen
geschrieben
DDL (Data Definition Language)
SQL-Schulung: Kapitel 11
Datendefinitionssprache (DDL)
 CREATE datenbankobjekt
Erzeugt ein neues Datenbankobjekt
 ALTER datenbankobjekt
Nimmt Änderungen an der Definition
des Datenbankobjekts vor
 DROP datenbankopjekt
Löscht ein Datenbankobjekt
Hinweis: Es sind unterschiedliche Privilegien notwendig,
um die Methoden der DDL zu verwenden.
Datenbankobjekte
 Tabellen
 Views
 Sequences
 Pseudospalten
 Indizes
 Synonyme
DDL- Tabellen
SQL-Schulung: Kapitel 12
Benennungsregeln
Tabellen und Spaltennamen:
 müssen mit einem Buchstaben beginnen
 dürfen 1-30 Zeichen lang sein
 dürfen nur die folgenden Zeichen enthalten:
A-Z, a-z, 0-9, _,$,#
 dürfen nicht mit dem Namen eines anderen Objekts
desselben Benutzers übereinstimmen
 dürfen nicht mit einem reservierten Wort
übereinstimmen (abhängig vom jeweiligen DBMS)
Ansonsten:
 es sollten aussagekräftige Namen gewählt werden
 Gross- und Kleinschreibung spielt keine Rolle
CREATE TABLE-Anweisung
Syntax
CREATE TABLE [schema].table
(column datatype [DEFAULT expr] [,…]);
 CREATE TABLE Privileg
 Speicherbereich
schema
table
column
datatype
DEFAULT expr
Eigentümer
Tabellenname
Spaltenname
Datentyp u. Länge der Spalte
definiert default, falls der Spalte
kein Wert zugewiesen wird
Tabellen anderer Benutzer
referenzieren
 Tabellen anderer Benutzer befinden sich in einem
anderen Schema.
 Schema muss als Präfix vor den Tabellennamen
gesetzt werden
 User muss berechtigt sein, die Tabellen lesen zu
dürfen
SELECT *
FROM userA.employees;
SELECT *
FROM userB.employees;
OPTION DEFAULT
 Für Einfügeoperationen kann ein Default-Wert definiert werden
… hire_date DATE DEFAULT SYSDATE
 zulässige Werte sind Literalwerte, Ausdrücke und SQLFunktionen
 Unzulässige Werte sind Spaltennamen und Pseudospalten
 der Default-Datentyp muss dem Spaltendatentyp entsprechen
CREATE TABLE hire_dates
(id
NUMBER(8),
hire_date
DATE DEFAULT SYSDATE);
Table created.
DESCRIBE dept
Datentypen
Datentyp
Beschreibung
VARCHAR2(n)
Zeichendaten variabler Länge mit (1 < n > 4000 Bytes)
CHAR(n)
Zeichdaten fester Länge mit (1 < n > 2000 Bytes)
NUMBER(n,p)
Numerische Daten variabler Länge. n ist
Gesamtstellenzahl und p ist Anzahl Nachkommastellen
DATE
Datums- u. Uhrzeit-Wert
LONG
Zeichendaten variabler Länge (→ 2 GB)
CLOB
Zeichendaten (→ 4 GB)
RAW (n) und
LONG RAW
Binärdaten des Typs RAW (1 < n > 2000 Bytes)
LONG RAW (→ 2 GB)
BLOB
Binärdaten (→ 4GB)
BFILE
In einer externen Datei gespeicherte Binärdaten (→ 4 GB)
ROWID
Ein Base-64-Code, der die eindeutige Adresse einer Zeile
in einer Tabelle bestimmt
Datetime-Datentypen
Datentyp
Beschreibung
TIMESTAMP
Datum mit Nachkommastellen f. Sekunden
INTERVAL
YEAR TO
MONTH
Wird als Intervall von Jahren und Monaten
gespeichert
INTERVAL DAY
TO SECOND
Wird als Intervall von Tagen, Stunden, Minuten
und Sekunden gespeichert
 TIMESTAMP ist eine Erweiterung von DATE
 setzt sich zusammen aus Jahr, Monat, Tag sowie Stunden,
Minuten, Sekunden und 1/1000 stel Sekunde
 Angabge von Zeitzonen moeglich)
Constraints
 erzwingen Regeln auf Tabellenebene
 verhindern das Löschen einer Tabelle, wenn
Abhängigkeiten vorhanden sind
 Constraint-Typen:





NOT NULL
UNIQUE
PRIMARY KEY
FOREIGN KEY
CHECK
Constraints und ihre Bedeutung
Constraint
Beschreibung
NOT NULL
Gibt an, dass die Spalte keinen Nullwert
enthalten darf
UNIQUE
Gibt eine Spalte oder Spaltenkombination an,
deren Werte in allen Zeilen der Tabelle
eindeutig sein muss
PRIMARY KEY
Identifiziert jede Zeile einer Tabelle eindeutig
FOREIGN KEY
Richtet eine Fremdschlüsselbeziehung
zwischen der Spalte und einer Spalte in der
referenzierten Tabelle ein und setzt diese
durch
CHECK
Legt eine Bedingung fest, die erfüllt sein
muss
Constraints Richtlinien
 nicht benannte Constraints bekommen einen
generierten Namen (bei Oracle SYS_Cn)
 können mit der Tabelle zusammen erstellt
oder im nachhinein definiert werden
 definiert auf Spalten- oder Tabellenebene
 Constraints, die mehrere Spalten betreffen
muessen auf Tabellenebene definiert werden
 im Data Dictionary gespeichert
Constraints definieren
 Syntax
CREATE TABLE [schema.]table
(column datatype [DEFAULT expr]
[column_constraint],
…
[table_constraint][,…]);
 auf Spaltenebene
column [CONSTRAINT constraint_name] constraint_type
 auf Tabellenebene
column,…
[CONSTRAINT constraint_name] constraint_type
(column, …)
Constraints definieren Beispiel
 Constraint auf Spaltenebene:
CREATE TABLE employees (
employee_id NUMBER(6)
CONSTRAINT emp_emp_id_pk PRIMARY KEY,
first_name
VARCHAR2(20),…
)
 Constraint auf Tabelleneben:
CREATE TABLE employees (
employee_id NUMBER(6),
first_name
VARCHAR2(20),..
job_id
VARCHAR2(10) NOT NULL,
CONSTRAINT emp_emp_id_pk
PRIMARY KEY (EMPLOYEE_ID));
)
NOT NULL Constraint
 stellt sicher, dass für die Spalte keine
Nullwerte akzeptiert werden
 Spalten ohne NOT NULL Constraint dürfen
standardmässig Nullwerte enthalten
ausgenommen Primary Key-Spalten
 NOT NULL Constraints werden auf
Spaltenebene definiert
UNIQUE-Constraint
 definiert, dass ein Wert für eine Spalte o.
Spaltenkombination nur einmal in der Tabelle für die
Spalte vorkommt
 UNIQUE-Schlüssel
 definiert auf Tabellen- o. Spaltenebene
 Erlauben Nullwerte, diese dürfen dann auch
mehrfach vorkommen, da sie keinem anderen Wert
entsprechen
Hinweis: Ein Nullwert in einer Spalte erfüllt stets ein
UNIQUE-Constraint
PRIMARY KEY-Constraint
 erstellt Primärschlüssel für die Tabelle
 es kann nur einen pro Tabelle geben
 ist eine Spalte oder Spaltengrupe, die jede Zeile
einer Tabelle eindeutig identifiziert
 setzt Eindeutigkeit der Spalte oder
Spaltenkombination durch und stellt sicher, dass
keine Spalte, die zu einem Primärschlüssel gehört,
einen Nullwert enthält
Implizit wird auf die Spalte o. Spaltenkombination ein
eindeutiger Index gesetzt.
FOREIGN KEY-Constraint
 FOREIGN KEY (o. referenzielle Integritäts-)




Constraints bestimmen eine Spalte oder
Spaltenkombination als Fremdschlüssel
richten eine Beziehung zwischen einem Primär- oder
UNIQUE-Schlüssel in derselben oder einer anderen
Tabelle ein
ein Fremdschlüsselwert muss einem vorhandenen
Wert in der übergeordneten Tabelle entsprechen oder
NULL sein
basieren auf Datenwerten und sind rein logische
(nicht physische) Zeiger
definiert auf Spalten- o. Tabellen-Ebene
FOREIGN KEY-Constraint II
 ein zusammengesetzter Fremdschlüssel muss mit Hilfe der
Definition auf Tabellenebene erstellt werden.
 ein Einspaltiger-Fremdschlüssel kann auf Spaltenebene
definiert werden.
CREATE TABLE employees (…
department_id
NUMBER(4) CONSTRAINT emp_depid_fk
REFERENCES departments (department_id));
oder
CREATE TABLE employees (…
department_id
NUMBER(4),
CONSTRAINT emp_dept_fk FOREIGN KEY (department_id)
REFERENCES departments (department_id), … );
FOREIGN KEY-Constraint
Schlüsselwörter
 FOREING KEY definiert die Spalte der referenzierten Tabelle
(untergeordnete Tabelle) auf Tabellen Constraint-Ebene
 REFERENCES identifiziert die Tabelle und Spalte in der
übergeordneten Tabelle
 ON DELETE CASCADE löscht die abhängigen Zeilen aus der
untergeordneten Tabelle, wenn eine Zeile in der übergeordneten
Tabelle gelöscht wird
 ON DELETE SET NULL konvertiert abhängige Fremdschlüsselwerte in
Nullwerte
Hinweis, Richtung:
 Der Fremdschlüssel wird in der untergeordneten Tabelle definiert.
 Die Tabelle mit der referenzierten Spalte ist die übergeordnete Tabelle
 Ohne die Option ON DELETE CASCADE oder ON DELETE SET NULL
kann die Zeile in der übergeordneten Tabelle nicht gelöscht werden,
wenn diese in der untergeordneten Tabelle referenziert wird.
CHECK Constraint
 definiert eine Bedinung, die jede Zeile erfüllen muss
 nicht zulässig sind:
 Referenzen auf die Pseudospalten CURRVAL,
NEXTVAL, LEVEL und ROWNUM
 Aufrufe der Funktionen SYSDATE, UID, USER und
USERENV
 Abfragen, die andere Werte in andere Zeilen
referenzieren
…, salary NUMBER(2)
CONSTRAINT emp_salary_min CHECK (salary >
0),…
CREATE TABLE Beispiel
CREATE TABLE employee
(employee_id
NUMBER(6)
CONSTRAINT ep_employee_id PRIMARY KEY,
first_name
VARCHAR2(20),
last_name
VARCHAR2(25) CONSTRAINT ep_last_name_nn
NOT NULL,
email
VARCHAR2(25) CONSTRAINT ep_email_nn
NOT NULL,
CONSTRAINT ep_email_uk UNIQUE,
phone_number VARCHAR2(20),
hire_date
DATE
CONSTRAINT
job_id
VARCHAR2(10) CONSTRAINT
salary
NUMBER(8,2) CONSTRAINT
commission_pct NUMBER(2,2),
manager_id
NUMBER(6),
department_id NUMBER(4)
CONSTRAINT
departments (department_id)
);
ep_hire_date_nn NOT NULL,
ep_job_nn NOT NULL,
ep_sal_ch CHECK (salary > 0),
ep_dept_fk REFERENCES
Constraints verletzen
UPDATE employees
SET department_id = 55
WHERE department_id = 110;
Hinweis: department 55 existiert nicht!
UPDATE employees
*
ERROR at line 1:
ORA-02291: integrity constraint (HR.EP_DEPT_FK)
violated – parent key not found
Constraints verletzen II
DELETE FROM departments
WHERE department_id = 60;
Hinweis: In der Abteilung 60 arbeiten Angestellte (employees)
DELETE FROM departments
*
ERROR at line 1:
ORA-02292: integrity constraint
(HR.ep_dept_fk) violated – child record found
CREATE TABLE incl. Subquery
 Tabellen können auch anhand einer Unterabfrage
erstellt werden
Syntax
CREATE TABLE table
[(column, column…)] AS subquery
 die Anzahl der Spalten in der neuen Tabelle muss mit
der Projektionsklausel der Unteranweisung
übereinstimmen
 definieren von Spalten mit Spaltennamen und
Default-Werten
CREATE TABLE incl. Subquery
Richtlinien
 die Tabelle wird mit den angegebenen Spaltennamen erstellt
 die von der SELECT-Anweisung abgerufenen Zeilen werden in




die neue Tabelle eingefügt
die Spaltendefinition darf nur den Spaltennamen und DefaultWert enthalten
sind Spaltenspezifikationen angegeben, so muss die Anzahl der
Spalten der Anzahl der Spalten in der SELECT-Liste der
Unterabfrage entsprechen
sind keine Spaltenspezifikationen angegeben, so entsprechen
die Spaltennamen der Tabelle den Spaltennamen der
Unterabfrage
im Gegensatz zu den Datentypendefinitionen der Spalten
werden die Integritätsregeln nicht an die neue Tabelle
übergeben
CREATE TABLE incl. Subquery
Beispiel
CREATE TABLE dept80
AS
SELECT
employee_id,
last_name,
salary * 12 ANNSAL,
hire_date
FROM
employees
WHERE
department_id = 80;
Table created.
DESCRIBE dept80
Name
------------------EMPLOYEE_ID
LAST_NAME
ANNSAL
HIRE_DATE
Null
--------NOT NULL
NOT NULL
NOT NULL
Type
-------------------------NUMBER(6)
VARCHAR2(25)
NUMBER
DATE
ALTER TABLE
SQL-Schulung: Kapitel
ALTER TABLE-Anweisung
 neue Spalten zu einer Tabelle hinzufügen
 vorhandene Spalten einer Tabelle ändern
 Spalten aus einer Tabelle entfernen
 neue Constraints für eine Tabelle definieren
 Default-Werte für Spalten setzen o. löschen
Tabellen löschen
 alle Daten und die Struktur der Tabelle werden






gelöscht
alle noch nicht gespeicherten Transaktionen werden
festgeschrieben (committed)
alle Indizes werden gelöscht
alle Constraints werden gelöscht
Views und Synonyme bleiben erhalten, sind jedoch
ungültig
kein ROLLBACK !
nur der Ersteller der Tabelle oder ein Benutzer mit
dem Privileg DROP ANY TABLE kann die Tabelle
entfernen !
Views
SQL-Schulung: Kapitel 13
VIEW
 eine View ist eine logische Tabelle, die auf einer
Tabelle oder einer anderen View basiert
 eine View enthält selber keine Daten!
 Grundlegende Tabellen: Basistabellen
 wird im Data Dictionary als SELECT-Anweisung
gespeichert




Datenzugriff beschränken
verschiedene Ansichten derselben Daten
vereinfachen von komplexen Abfragen
Datenunabhängigkeit
Einfache und komplexe Views
 einfache View:
 leitet Daten aus nur einer Tabelle ab
 enthält keine Funktionen oder Datengruppen
 kann DML-Operationen über die View
ausführen
 komplexe View:
 leitet Daten aus mehreren Tabellen ab
 enhält Funktionen oder Datengrupen
 lässt nicht immer DML-Operationen über die
View zu
CREATE VIEW-Anweisung
Syntax:
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view [(alias[,
alias]…)] AS subquery
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY [CONSTRAINT constraint]]
Schlüsselwort
Bedeutung
OR REPLACE
erstellt die View, auch wenn sie schon vorhanden ist
FORCE
Erstellt die View, auch wenn Basistabellen nicht existieren
NOFORCE
Erstellt die View nur, wenn die Basistabellen existieren
view / constraint
Name der View bzw. Name des jeweiligen Contraints
Alias
Gibt Namen für die Ausdrücke an, die von der Abfrage der View ausgewählt
werden
subquery
Eine vollständige Select-Anweisung
WITH CHECK OPTION
es werden nur Zeilen eingefügt /aktualisiert, für welche die View berechtigt ist
WITH READ ONLY
es können keine DML-Operationen an dieser View ausgeführt werden
Views erstellen Richtlinien
 die Unterabfrage, die eine View definiert, kann
komplexe SELECT-Syntax, einschliesslich Joins,
Gruppen und Unterabfragen, enthalten
 werden keine Constraint-Namen vergeben, so
generiert das DBMS einen Namen
Oracle: SYS_Cn
 die Option OR REPLACE kann verwendet werden,
um die Definition einer View zu verändern, ohne sie
zuvor zu löschen und neu zu erstellen oder die zuvor
erteilten Objektprivilegien neu zu erteilen.
CREATE VIEW Beispiele
CREATE VIEW empvu80
AS SELECT employee_id, last_name, salary
FROM employees
WHERE department_id = 80;
View created.
CREATE VIEW salvu50
AS SELECT employee_id ID_NUMBER, last_name
NAME, salary*12 ANN_SALARY
FROM employees
WHERE department_id = 50;
View created.
Views auslesen
 Daten aus Views werden genauso ausgelesen wie
aus einer Tabelle
 in der FROM-Klausel wird der Viewname angegeben
 können mit Tabellen verjoint werden
 können in beliebig komplexen SELECT-Anweisungen
eingebunden sein
Beispiele:
SELECT *
FROM salvu50;
SELECT last_name
FROM empvu50
WHERE salary > 6000;
komplexe View Beispiel
CREATE VIEW dept_num_vu
(name, minsal, maxsal, avgsal)
AS SELECT d.department_name, MIN(e.salary),
MAX(e.salary), AVG(e.salary)
FROM employees e, departments d
WHERE e.department_id = d.department_id
GROUP BY d.department_name;
DML-Operationen an Views ausführen
 DML-Operationen können i.d. Regel an allen
einfachen Views ausgeführt werden
 es können keine Zeilen entfernt werden,
wenn die View eines der folgenden Elemente
enthält:




Aggregatfunktionen
GROUP BY-Klausel
Schlüsselwort DISTINCT
Pseudospalten-Schlüsselwort ROWNUM
DML-Operationen an Views ausführen
 DML-Operationen können i.d. Regel an allen
einfachen Views ausgeführt werden
 es können keine Zeilen geändert werden,
wenn die View eines der folgenden Elemente
enthält:





Aggregatfunktionen
GROUP BY-Klausel
Schlüsselwort DISTINCT
Pseudospalten-Schlüsselwort ROWNUM
Spalten, die durch Ausdrücke definiert sind
DML-Operationen an Views ausführen
 DML-Operationen können i.d. Regel an allen
einfachen Views ausgeführt werden
 es können keine Zeilen hinzugefügt werden, wenn
die View eines der folgenden Elemente enthält:






Aggregatfunktionen
GROUP BY-Klausel
Schlüsselwort DISTINCT
Pseudospalten-Schlüsselwort ROWNUM
Spalten, die durch Ausdrücke definiert sind
NOT NULL-Spalten in den Basistabellen, die nicht für
die View selektiert wurden
WITH CHECK OPTION
 mit der Klausel wird sichergestellt, dass an einer View
ausgeführte DML-Operationen innerhalb der Domäne der View
bleiben
Beispiel:
CREATE OR REPLACE VIEW empvu20
AS SELECT
FROM employees
WHERE department_id 20
WITH CHECK OPTION CONSTRAINT empvu20_ck;
Der Versuch, die Abteilungsnummer für eine Zeile in der View zu
ändern, scheitert, da er gegen das WITH CHECK OPTIONConstraint verstösst.
DML-Operationen verweigern
 durch WITH READ ONLY werden alle DML-
Operationen verhindert
 Jeder Versuch, eine DML-Operation an der View
abzusetzen führt zu einer Fehlermeldung
CREATE OR REPLACE VIEW empvu10
(employee_number, employee_name, job_title)
AS SELECT employee_id, last_name, job_id
FROM employees
WHERE department_id = 10
WITH READ ONLY;
Views entfernen
DROP VIEW view;
Name der View
DROP VIEW empvu80;
View dropped.
 eine View wird ohne Datenverluste entfernt
 nur der Ersteller oder ein Benutzer mit dem
Privileg DROP ANY VIEW kann eine View
löschen
Sequences
SQL-Schulung: Kapitel 14
Sequences
 eine Sequence ist ein Datenbankobjekt, das






Ganzzahlwerte erstellt
kann automatisch eindeutige Nummern generieren
ist ein gemeinsam verwendbares Objekt
kann verwendet werden um einen Primärschlüssel zu
erstellen
ersetzt Anwendungs-Code
beschleunigt den Zugriff auf Sequence-Werte wenn
sie im Cache gespeichert sind
eine Sequence ist nicht an eine Tabelle gebunden!
CREATE SEQUENCE- Anweisung
CREATE SEQUENCE sequence
[INCREMENT BY n]
[START WITH n]
[{MAXVALUE n | NOMAXVALUE}]
[{MINVALUE n | NOMINVALUE}]
[{CYCLE | NOCYCLE}]
[{CACHE n | NOCACHE}]
CREATE SEQUENCE SYNTAX
Schlüsselwort
Bedeutung
sequence
Steht für den Namen des Sequence-Generators
INCREMENT BY n
Gibt das Intervall zwischen Sequencenummern an,
fehlt die Klausel wird 1 als Intervall verwendet
START WITH n
Gibt die erste zu generierende Sequence-Nummer
an. Fehlt die Klausel wird mit 1 begonnen.
MAXVALUE n
Gibt den höchsten Wert an, den die Sequence
generieren kann
NOMAXVALUE
Legt einen Höchstwert von 1027 für die aufsteigende
Sequence und -1 für die absteigende Sequence fest
MINVALUE n
Gibt den kleinsten Wert der Sequence an
NOMINVALUE
Legt einen kleinsten Wert von 1 für eine
aufsteigende Sequence und -1026 für die absteigene
Sequence fest
SEQUENCES Beispiel
 für eine Primärschlüssel Sequence
CREATE SEQUENCE dept_deptid_seq
INCREMENT BY 10
START WITH 120
MAXVALUE 9999
NOCACHE
NOCYCLE;
Sequence created.
Pseudospalten NEXTVAL und
CURRVAL




NEXTVAL gibt den nächsten verfügbaren Sequence-Wert zurück. Bei jeder
Referenzierung wird ein eindeutiger Wert zurückgegeben, selbst bei
verschiedenen Benutzern
CURRVAL ruft den aktuellen Sequence-Wert ab
NEXTVAL muss für die Sequence ausgegeben werden, bevor CURRVAL einen
Wert enthält
können verwendet werden in:





SELECT-Liste einer SELECT-Anweisung, die nicht Bestandteil einer
Unterabfrage ist
SELECT-Liste einer Unterabfrage in einer INSERT-Anweisung
VALUES-Klausel einer INSERT-Anweisung
SET-Klausel einer UPDATE-Anweisung
können nicht verwendet werden in:





SELECT-Liste einer View
SELECT-Anweisung mit dem Schlüsselwort DISTINCT
SELECT-Anweisung mit den Klausel GROUP BY, HAVING oder ORDER BY
Unterabfrage in einer SELECT-, DELETE- oder UPDATE-Anweisung
DEFAULT Ausdruck in einer CREATE TABLE- oder ALTER TABLE-Anweisung
Sequence verwenden
SELECT dept_deptid_seq.CURRVAL
FROM dual;
SELECT dept_deptid_seq.NEXTVAL
FROM dual;
Sequence-Werte im Cache
 das Caching von Sequence-Werten
ermöglicht einen schnelleren Zugriff auf die
Werte
 Lücken zwischen den Sequence-Werten
können in folgenden Fällen auftreten



Bei einem ROLLBACK
Bei einem Systemausfall
wenn eine Sequence von mehreren Tabellen
verwendet wird
SEQUENCES ändern
ALTER SEQUENCE sequence
[INCREMENT BY n]
[{MAXVALUE n | NOMAXVALUE}]
[{MINVALUE n | NOMINVALUE}]
[{CYCLE | NOCYCLE}]
[{CACHE n | NOCACHE}];
Sequences ändern Richtlinien
 nur der Eigentümer oder ein Benutzer mit dem ALTER-Privileg




darf Änderungen vornehmen
die Änderung wirkt sich nur auf zukünftige Sequence-Nummern
aus
die Sequence muss gelöscht und neu erstellt werden, wenn der
Startwert o. aktuelle Wert neu gesetzt werden soll
bestimmte Validierungsmassnahmen werden durchgeführt, so
kann kein kleiner Max.Value gesetzt werden.
das Entfernen einer Sequence erfolgt mit der DROPAnweisung:
DROP SEQUENCE sequence;
Sequence dropped.
Indizes
SQL-Schulung: Kapitel 15
Indizes
 ein Index ist ein Schemaobjekt
 wird vom Server verwendet, um den Abruf von Zeilen





mit Hilfe eines Zeigers zu beschleunigen
kann I/O-Vorgänge mit Hilfe einer beschleunigten
Pfadzugriffsmethode reduzieren, die Daten schneller
zu finden
ist unabhängig von der indizierten Tabelle
aber…wird eine Tabelle gelöscht, so werden auch die
zugehörigen Indizes gelöscht
wird automatisch verwendet und verwaltet
Ohne Indizes → Full Table scan
Indexerstellung - Verfahren
 automatisch:
ein eindeutiger Index wird automatisch erstellt, wenn
ein PRIMARY KEY- oder UNIQUE-Constraint in einer
Tabellendefinition verwendet wird
 manuell:
vom Benutzer explizit angelegte nicht-eindeutige
Indizes, welche den Zeilenzugriff beschleunigen
z.B. bei Foreign Key Beziehungen.
Hinweis: ein eindeutiger Index kann auch manuell
erstellt werden, es ist jedoch nicht ratsam, da hierfür
ein UNIQUE-Constraint verwendet werden muss,
welches dann implizit einen eindeutigen Index
erstellt.
Indizes erstellen
CREATE INDEX index
ON table (column [, column]…);
index
table
column
Name des Index
Name der Tabelle
Tabellenspalte, die indiziert werden soll
Beispiel für einen Index auf last_name:
CREATE INDEX emp_last_name_idx
ON employees(last_name);
Index created.
Index erstellen - Richtlinien
Ein Index sollte in folgenden Fällen erstellt werden, wenn:
 eine Spalte viele verschiedene Werte hat
 eine Spalte viele Nullwerte enthält
 eine oder mehrere Spalten häufig gemeinsam in einer
WHERE-Klausel oder Join-Bedingung verwendet werden
Es sollte kein Index erstellt werden, wenn:
 die Spalten nur selten als Bedingung in Abfragen verwendet
werden
 die Tabelle nur klein ist und die meisten Abfragen
wahrscheinlich mehr als 2 bis 4 Prozent der Zeilen in der
Tabelle abrufen
 die Tabelle häufig aktualisiert wird
 die indizierten Spalten als Bestandteil eines Ausdrucks
referenziert werden
Index erstellen – Richtlinien II
Achtung:
 es sollten nicht zuviele Indizes für eine
Tabelle angelegt werden
 bei jeder DML-Operation, müssen die Indizes
aktualisiert werden
 je mehr Indizes mit einer Tabelle verknüpft
sind, desto grösser ist der Aufwand für den
DB-Server bei der Aktualisierung aller Indizes
Indizes entfernen
DROP INDEX index;
 entfernt einen Index aus dem Data Dictionary
 dies hat keine Auswirkungen auf die sonstige
Tabellenstruktur oder die Daten
 Indizes können nicht geändert sondern nur gelöscht
und neu angelegt werden
 man muss Eigentümer sein, oder das Privileg DROP
ANY INDEX besitzen, um einen Index zu löschen
 Wird eine Tabelle gelöscht, so werden auch die
zugehörigen Indizes gelöscht
Synonyme
SQL-Schulung: Kapitel 16
Synonyme
 sind Alias-Namen um Datenbankobjekten einen alternativen
Namen zu geben
 vereinfacht Zugriff
 einfache Referenzen auf Tabellen anderer Benutzer
 kürzen von langen Objektnamen
CREATE [PUBLIC] SYNONYM synonym
FOR object;
PUBLIC
erstellt ein Synonym, das allen Benutzern zugänglich ist
synonym steht für den Namen des zu erstellenden Synonyms
object
bezeichnet das Objekt, für welches das Synonym
erstellt wird
 Das Objekt darf nicht in einem Package enthalten sein
 der Name eines privaten (private) Synonyms muss sich von
allen anderen Objekten des Benutzers unterscheiden
Synonyme erstellen u. entfernen
CREATE SYNONYM d_sum
FOR dept_sum_vu;
Synonym created.
DROP SYNONYM d_sum;
Synonym dropped.
CREATE PUBLIC SYNONYM dept
FOR alice.departments;
Synonym created.
DROP PUBLIC SYNONYM dept;
Synonym dropped.
Data Dictionary
SQL-Schulung: Kapitel 17
Data Dictionary
 speichert Informationen zur Datenbank
 ist genau wie andere Datenbankdaten in Tabellen
und Views strukturiert
 ist schreibgeschützt
 Zugriff mit SQL
Views
 Definitionen aller Schemaobjekte in der Datenbank
 Default-Werte für Spalten
 Integritäts-Constraint-Informationen
 Namen von Oracle-Benutzern
 Privilegien und Rollen der einzelnen Benutzer
 andere allgemeine Datenbankinformationen
Data Dictionary-Struktur
View-Präfix
Zweck
USER_
View des Benutzers (Inhalt des Schemas,
Elemente, Eigentümer)
ALL_
Erweiterte View des Benutzers (Objekte, auf die
der Benutzer zugreifen kann)
DBA_
View des Datenbankadministrators
V$
Performance-bezogene Daten
 USER_OBJECTS
z.B.: OBJECT_NAME, OBJECT_TYPE, CREATED, LAST_DDL_TIME, STATUS, GENERATED
 ALL_OBJECTS
USER-Views
View
Bedeutung
USER_OBJECTS
Alle Schemabezogenen Objekte
USER_TABLES
Tabelleninformationen
USER_TAB_COLUMNS
Spalteninformationen
USER_CONSTRAINTS
Constraintinformationen
USER_CONS_COLUMNS Spalten-Constraintzuordnung
USER_VIEWS
View-Informationen incl. SelectStatement
USER_SEQUENCES
Sequence-Information
USER_SYNONYMS
Synonym-Information
COMMENT-Anweisung
 Kommentare setzen in Tabellen, Spalten, Views
 → 2000 Byte max.
 Kommentare anzeigen lassen:
 ALL_COL_COMMENTS
 USER_COL_COMMENTS
 ALL_TAB_COMMENTS
 USER_TAB_COMMENTS
 Kommentare hinzufügen
COMMENT ON [TABLE table | COLUMN
table.column ] IS 'text';
Herunterladen