Einführung - Till Hänisch

Werbung
SQL
Structured Query Language
IS: Datenbanken, © Till Hänisch 2000
SELECT
Holt Datensätze (Tupel) aus DB, genauer
Erzeugt neue (temporäre) Relation aus bestehenden
SELECT [ALL|DISTINCT] Attributliste
FROM R1,...,Rn
[WHERE Prädikat]
[ORDER BY A1 [ASC|DESC][{,Ai [ASC|DESC]}]]
Funktion:
 Attributliste  Prädikat ( R1  ...  Rn 
ALL (default) liefert auch Duplikate (Gegensatz zur Relationenalgebra)
DISTINCT liefert nur unterschiedliche Tupel
Attributliste:
Rj.Aji,... oder falls eindeutig auch nur Aji,...
oder Rj.Aji [AS] Aliasname
oder Rj.* (alle Attribute von Rj)
IS: Datenbanken, © Till Hänisch 2000
SELECT contd.

Prädikat



Attribute
Konstanten
Operatoren




=, <>, >, <, <=, >=,…, AND, OR, NOT
Funktionen
SELECT ist Projektion, WHERE clause ist
Selektion
Vollständige Definition des SELECT
Statements ist zu unübersichtlich

Darstellung an Beispielen
IS: Datenbanken, © Till Hänisch 2000
Beispieltabellen
SQL> select * from emp;
EMPNO
--------7369
7499
7521
7566
7654
7698
7782
7788
7839
7844
7876
7900
7902
7934
ENAME
---------SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
JOB
MGR HIREDATE
SAL
COMM
DEPTNO
--------- --------- -------- --------- --------- --------CLERK
7902 17.12.80
800
20
SALESMAN
7698 20.02.81
1600
300
30
SALESMAN
7698 22.02.81
1250
500
30
MANAGER
7839 02.04.81
2975
20
SALESMAN
7698 28.09.81
1250
1400
30
MANAGER
7839 01.05.81
2850
30
MANAGER
7839 09.06.81
2450
10
ANALYST
7566 09.12.82
3000
20
PRESIDENT
17.11.81
5000
10
SALESMAN
7698 08.09.81
1500
0
30
CLERK
7788 12.01.83
1100
20
CLERK
7698 03.12.81
950
30
ANALYST
7566 03.12.81
3000
20
CLERK
7782 23.01.82
1300
10
SQL> select * from dept;
DEPTNO
--------10
20
30
40
DNAME
-------------ACCOUNTING
RESEARCH
SALES
OPERATIONS
SQL> select * from salgrade;
LOC
------------NEW YORK
DALLAS
CHICAGO
BOSTON
IS: Datenbanken, © Till Hänisch 2000
GRADE
LOSAL
HISAL
--------- --------- --------1
700
1200
2
1201
1400
3
1401
2000
4
2001
3000
5
3001
9999
SELECT auf eine Tabelle
SELECT * FROM EMP
gibt Tabelle EMP vollständig aus
Projektion
 A1 ... An
= SELECT A1,...,An FROM R
mit Selektion:
Alle Mitarbeiter in Dept 20
SELECT ename FROM emp WHERE deptno=20;
Alle Mitarbeiter mit Gehalt größer gleich 2000
SELECT ename FROM emp WHERE sal >= 2000;
Alle Mitarbeiter mit Gehalt zwischen 2000 und 3000
SELECT ename FROM emp WHERE sal >= 2000 AND sal <= 3000;
oder
SELECT ename FROM emp where sal BETWEEN 2000 AND 3000;
Alle Mitarbeiter, die nicht in dept 20 oder 30 arbeiten
SELECT ename FROM emp WHERE deptno <> 20 AND deptno <> 30;
oder
SELECT ename FROM emp WHERE NOT (deptno = 20 OR deptno = 30);
oder
SELECT ename FROM emp WHERE NOT(deptno = 20 OR deptno = 30);
oder
SELECT ename FROM emp WHERE deptno NOT IN (20,30);
IS: Datenbanken, © Till Hänisch 2000
Strings
werden durch ' terminiert
manche DB (z.B. mysql) erlauben auch "
Maximallänge beschränkt (je nach DB, mysql 255, ORACLE 4000,...)
Schreibweise (Groß- Kleinschreibung) bei Suche je nach System relevant
Datentyp VARCHAR für variable Länge,
CHAR für feste Länge
Exakter Vergleich mit "=", LIKE bei Wildcards
SELECT ename FROM emp WHERE ename = "SMITH";
Alle Mitarbeiter, deren Name mit "S" anfängt
SELECT ename FROM emp WHERE ename LIKE 'S%';
"%" steht für beliebige Zeichenfolge
"_" für ein einzelnes Zeichen
IS: Datenbanken, © Till Hänisch 2000
Datumswerte
Datentyp DATE oder DATETIME
Schwierig, da kein allgemein akzeptiertes Datumsformat !!!
implizite Konvertierung möglich, aber unsicher, z.B.
SELECT ename FROM emp WHERE hiredate > '1982-01-05';
1. Mai oder 5. Januar ?
Sybase: ... WHERE hiredate > CONVERT(DATETIME,'01-05-1980',110)
Format 110: USA MM-DD-YYYY
Format 112: ISO YYYYMMDD
Oracle: ... WHERE hiredate > TO_DATE(01-05-1980','mm-dd-yyyy')
mysql:
... WHERE hiredate > '1980-01-05'
IS: Datenbanken, © Till Hänisch 2000
numerische Werte

verschiedene Datentypen

ganze Zahlen


INTEGER[(Länge)]
NUMERIC, DECIMAL[(Länge[,Nachkomma])]



festgelegte Präzision
Festkommazahlen, z.B. Währung
Fließkommazahlen


FLOAT,...
eher ungebräuchlich bei DB

meist ist definierte Genauigkeit gefordert
IS: Datenbanken, © Till Hänisch 2000
Sortierung
Standard garantiert keine Reihenfolge der Ergebnistupel
(Meistens werden Tupel in der Reihenfolge der Erstellung geliefert, aber
nicht immer).
Wenn bestimmte Reihenfolge gewünscht:
ORDER BY
SELECT ename,sal FROM emp ORDER BY sal;
sortiert die Tupel nach sal (Wie ?)
Reihenfolge durch modifier ASC (ascending, aufsteigend)
oder DESC (descending, absteigend). Default ist ASC
Mitarbeiter mit Gehalt, höchstes zuerst:
SELECT ename,sal FROM emp ORDER BY sal DESC;
Mehrere Kriterien möglich, z.B. abteilungsweise nach Gehalt sortiert:
SELECT ename,deptno,sal FROM emp ORDER BY deptno ASC, sal DESC;
Zunächst wird nach dem ersten Kriterium sortiert, innerhalb gleicher
Werte nach dem zweiten usw.
IS: Datenbanken, © Till Hänisch 2000
Arithmetische Ausdrücke
in Attributliste, WHERE-clause, ORDER BY
z.B. SELECT ename,sal+comm FROM emp;
Spaltennamen sind hier komplex (oder leer, je nach DB), deshalb
üblicherweise Aliasnamen
z.B. SELECT ename,sal+comm AS total FROM emp;
Arithmetische Operatoren +,-,*,/
zusätzlich (nur teilweise standardisiert) viele Funktionen
SELECT sin(sal) FROM emp;
wichtig sind hauptssächlich String-Funktionen
SELECT
SELECT
SELECT
SELECT
SELECT
SELECT
SELECT
usw.
SUBSTRING(ename,1,2) FROM emp; (bei ORACLE SUBSTR)
LENGTH(ename) FROM emp; (bei SYBASE DATA_LENGTH)
LEFT(ename,1) FROM emp; (erster Buchstabe)
RIGHT(ename,1) FROM emp; (letzter Buchstabe)
LOWER(ename) FROM emp; (Kleinbuchstaben)
UPPER(ename) FROM emp; (Großbuchstaben)
SOUNDEX(ename) FROM emp; (Soundex-Algorithmus)
IS: Datenbanken, © Till Hänisch 2000
JOINS
Verknüpfung mehrerer Relationen über (spezielle) Attribute
SELECT Attributliste FROM R1,...,Rn
WHERE Ri.Aij=Rk.Akl AND Rm.Amn=Ro.Aop ...
"="-Operator : Equi-Join, sonst Non-Equi-Join
z.B. Mitarbeiter mit Abteilung und Gehaltsstufe
SELECT ename,sal,grade,dname
FROM emp, salgrade, dept
WHERE emp.deptno=dept.deptno AND emp.sal BETWEEN salgrade.losal AND salgrade.hisal;
Korrelationsvariablen
SELECT e.ename,d.dname
FROM emp e, dept d
WHERE e.deptno=d.deptno;
nötig, falls eine Relation mehrfach in Join vorkommt,
z.B. alle Mitarbeiter, die mehr verdienen, als ihr Manager
SELECT e.ename, e.sal, m.ename, m.sal
FROM emp e, emp m
WHERE e.mgr=m.empno AND e.sal > m.sal;
IS: Datenbanken, © Till Hänisch 2000
OUTER JOIN
Liste aller Angestellten mit dem jeweiligen Manager
SELECT e.ename, m.ename FROM emp e, emp m
WHERE e.mgr = m.empno;
 ‘King’ fehlt, weil dort mgr = NULL ist.
 emps, die keinen mgr haben, fehlen.
Was tun? --> OUTER JOIN
SELECT e.ename,m.ename
FROM emp e LEFT OUTER JOIN emp m ON e.mgr=m.empno;
WHERE e.mgr * = m.empno;
Andere Notation:
WHERE e.mgr (+)= m.empno (ORACLE)
WHERE e.mgr *= m.empno (Sybase)
Varianten:
LEFT OUTER JOIN
RIGHT JOIN
INNER JOIN ist der normale Join
Verallgemeinerte JOIN-Syntax nach SQL 92
SELECT e.ename, d.dname
FROM emp e JOIN dept d ON deptno = d.deptno
IS: Datenbanken, © Till Hänisch 2000
Subqueries
Die WHERE-clause kann sich auf eine andere (Sub-) Query beziehen.
Formen:
SELECT Attributliste FROM R1,...,Rn
WHERE [NOT] EXISTS (SELECT…)
SELECT Attributliste FROM R1,...,Rn
WHERE Aji (=|<>|<=|>=|<|>) ANY|ALL (SELECT…)
SELECT Attributliste FROM R1,...,Rn
WHERE Aji [NOT] IN (SELECT…)
Alle Mitarbeiter mit demselben Job wie ‘Jones’
SELECT ename, job FROM emp
WHERE job = ANY (SELECT job FROM emp WHERE ename = ‘JONES’);
Alle Mitarbeiter, die mehr verdienen als irgendein Mitarbeiter von dept 30
SELECT ename, sal FROM emp
WHERE sal > ANY (SELECT sal FROM emp WHERE deptno = 30);
Alle Mitarbeiter, die mehr verdienen, als jeder in dept 30
SELECT ename, sal FROM emp
WHERE sal > ALL (SELECT sal FROM emp WHERE deptno = 30);
IS: Datenbanken, © Till Hänisch 2000
Subqueries contd.
IN == “= ANY”, NOT IN == „<> ALL“
z.B. alle Mitarbeiter mit einen Job, den es in dept 30 nicht gibt
SELECT ename, job FROM emp
WHERE job NOT IN (SELECT job FROM emp WHERE deptno = ‘30’);
Alle Mitarebiter, die mindestens einen anderen managen
SELECT ename, job FROM emp e
WHERE EXISTS (SELECT * FROM emp WHERE mgr = e.empno);
Anmerkung:
Diese Subquery muss für jeden Tupel der Hauptquery ausgeführt werden
(da in der FROM-Clause der Subquery auf ein Attribut der Hauptquery Bezug genommen wird).
 Correlated Subquery  Achtung: Performance geht bei großen Datenmengen in den Keller
Deshalb: Correlated Subqueries durch Joins ersetzen.
SELECT m.ename, m.job FROM emp m, emp e WHERE e.mgr = m.empno;
Doppelte werden ausgegeben, daher mit DISTINCT:
SELECT DISTINCT m.ename, m.job FROM emp m, emp e WHERE e.mgr = m.empno;
Mitarbeiter mit dem höchsten Gehalt:
SELECT ename, sal FROM emp e WHERE NOT EXISTS (SELECT * FROM emp WHERE sal > e.sal);
IS: Datenbanken, © Till Hänisch 2000
Aggregatfunktionen
Oft sind nicht die einzelnen Tupel, sondern nur eine Zusammenfassung
des Inhalts von Interesse -> Aggregate Functions
Wichtige Aggregate Functions:
COUNT (*) Zahl der Tupel
COUNT ([DISTINCT] Attribut) Zahl der verschiedenen Attributwerte (<> NULL)
MAX ()
MIN ()
AVG () Durchschnitt
SUM ()
z.B. Zahl der Mitarbeiter:
SELECT COUNT(*) FROM emp;
Zahl der unterschiedlichen Jobs:
SELECT COUNT(DISTINCT job) FROM emp;
Angestellter mit höchstem Gehalt:
SELECT ename, sal FROM emp WHERE sal >= (SELECT MAX (sal) FROM emp);
IS: Datenbanken, © Till Hänisch 2000
Aggregatfunktionen contd.
Durchschnittliches Gehalt / Abteilung?  Gruppierung von Aggregatfunktion
SELECT deptno, AVG (sal) FROM emp GROUP BY deptno;
Struktur:
SELECT … FROM … WHERE …
GROUP BY Gruppierungsausdruck
HAVING Gruppierungsbedingung
ORDER BY …
GROUP BY bewirkt interne Teilmengenbildung,
Aggregatfunktionen wirken jeweils auf diese Teilmengen.
Unterschied WHERE vs. HAVING
Mit WHERE werden Zeilen eliminiert.
Mit HAVING können ganz Teilmengen (Gruppen) eliminiert werden.
Durchschnittliches Gehalt je Abteilung mit mindestens 5 Mitarbeitern:
SELECT deptno, AVG (sal) FROM emp GROUP BY deptno HAVING COUNT(*) >= 5;
Jobs mit Durchschnittsgehalt, das größer ist, als das Durchschnittsgehalt der Manager
SELECT job, AVG (sal) FROM emp
GROUP BY job HAVING AVG (sal) > (SELECT AVG (sal) FROM emp WHERE job = ‘MANAGER’);
IS: Datenbanken, © Till Hänisch 2000
Mengenoperationen
SELECT-Statements liefern Relationen (= Mengen) zurück, diese können
mit den üblichen Mengenoperationen verknüpft werden
SELECT statement
UNION | INTERCEPT | MINUS/EXCEPT
SELECT statement
Name
Person
Verwendung z.B. bei Spezialisierung:
Namensliste aller Personen
SELECT Name,email FROM Dozent
UNION
SELECT Name,email FROM Student
ORDER BY Name;
Student
Dozent
Seme
ster
Gehal
t
Alle jobs, die es sowohl in Dept 20 als auch in Dept 30 gibt:
SELECT DISTINCT job FROM emp WHERE deptno=20
INTERSECT
SELECT DISTINCT job FROM emp WHERE deptno=30;
Anm:mysql unterstützt dies nicht, Sybase nur UNION
IS: Datenbanken, © Till Hänisch 2000
DML, INSERT
Wie kömmen die Daten in die Tabellen rein ?
,werden gelöscht, geändert,...
DML (Data Manipulation Language)
INSERT fügt Datensätze zu einer Tabelle hinzu
INSER INTO table [(col-list)] VALUES (Werteliste)
oder INSER INTO table [(col-list)] SELECT stmt.
Falls nur für einen Teil der Spalten Werte angegeben werden,
werden diese in col-list definiert.
Z.B. Tabelle Person (Name, Vornane, Alter)
INSERT INTO Person (Name, Vorname)
VALUES (’Hänisch’, ’Till’)
INSERT INTO Person (Name)
SELECT ename FROM emp
INSERT INTO Person
VALUES (‘Hänisch’, ‘Till’, ‘33’)
IS: Datenbanken, © Till Hänisch 2000
DELETE
Löscht Datensätze aus einerTabelle
DELETE FROM table [WHERE clause]
z.B lösche alle Datensätze in der Tabelle emp
DELETE FROM emp
WHERE clause wie bei SELECT Statement
Lösche alle Angestellten, die mehr verdienen als ihr Chef
DELETE FROM emp WHERE empno IN
(SELECT e.empno FROM emp e, emp m WHERE e.mgr = m.empno AND e.sal > m.sal)
Duplikate aus Tabelle Person (id, Name) löschen:
DELETE FROM Person WHERE id =
(SELECT MAX (id) FROM Person GROUP BY Name HAVING COUNT(*) > 1)
IS: Datenbanken, © Till Hänisch 2000
UPDATE
Ändert existierende Tupel
UPDATE table SET col = expression {, col = expression}
[WHERE clause]
z.B. erhöhen des Gehalts der Angestelten um 10%,
die weniger als der Durchschnitt verdienen:
UPDATE emp SET sal = 1.1 * sal
WHERE sal < (SELECT AVG (sal) FROM emp)
Anmerkung: Während des Updates ändert sich der Durchschnitt!!!
Daher: Die Subquery wird vor dem UPDATE durchgeführt.
IS: Datenbanken, © Till Hänisch 2000
DDL
Data Definition Language
Anlegen von Tabellen
Befehle: CREATE, DROP, ALTER
Hier nur auszugsweise, im wesentlichen CREATE TABLE
(Rest in Datenbanken II)
Anmerkung: Es existieren grafische Tools für DDL,
nur eingeschränkt sinnvoll (insbesondere bei Wiederverwendung,...)
DROP TABLE name  Tabelle löschen
Tabelle anlegen:
Welche Information sind nötig ?
Name, Attribute + Datentypen, Constraints
IS: Datenbanken, © Till Hänisch 2000
CREATE TABLE
Syntax:
CREATE TABLE name (
coldef [, coldef]
[, tableconstraints]
)
coldef := name type [länge], [[NOT]NULL], [colconstraint]
tableconsraint := CONSTRAINT name constraint-definition
colconstraint := constraint-definition (später mehr)
CREATE TABLE Person (
name VARCHAR (30),
id INT
);
mysql> describe person;
+-------+-------------+------+-----+---------+-------+
| Field | Type
| Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| name | varchar(30) | YES |
| NULL
|
|
| id
| int(11)
| YES |
| NULL
|
|
+-------+-------------+------+-----+---------+-------+
IS: Datenbanken, © Till Hänisch 2000
Datentypen
Hier nur auszugsweise für Sybase, Oracle, Details siehe Dokumentation
CHAR(n)
VARCHAR (n)
DATETIME
DECIMAL (p,s)
FLOAT (l)
INT
String fester Länge (n), CHAR (1) für Boolean
String variabler Länge, max. n Zeichen
übliche Zeichenketten, Maximallänge typ. beschränkt
Aussprache: „vare-care“, „var car“ „var char“
Datum + Uhrzeit, bei Oracle: DATE
Anmerkung: Format unterschiedlich, einstellbar
Festkommazahl (exakt), z.B. bei Geld, Währung
DECIMAL (10,2), Oracle: NUMBER
Fließkommazahl, eher selten bei Datenbanken
ganze Zahl, typ. 32 Bit, Oracle: INTEGER
Zusätzlich je nach System Datentypen für größere Objekte (Texte, Bilder,...)
TEXT,IMAGE (Sybase), MEMO (Access), BLOB/CLOB (Oracle, mysql) mit
spezifischen Einschränkungen (z.B. kein Index,...)
IS: Datenbanken, © Till Hänisch 2000
Constraints
PRIMARY KEY
CREATE TABLE Person (
name VARCHAR (100) NOT NULL,
vorname VARCHAR (40) NOT NULL,
PersonAlter INTEGER NULL,
PRIMARY KEY (name, vorname)
);
Besserer Stil (constraints sollten benannt werden):
CREATE TABLE Person (
name VARCHAR (100) NOT NULL,
vorname VARCHAR (40) NOT NULL,
PersonAlter INTEGER NULL,
CONSTRAINT pk_person PRIMARY KEY (name, vorname)
);
Da Entities und Relationships auf Relationen abgebildet werden,
Um diese zu definieren (und insb. nur gültige Beziehungen z
können FOREIGN KEY Constraints verwendet werden.
FKs verweisen auf den PK einer anderen R
IS: Datenbanken, © Till Hänisch 2000
FOREIGN Key constraints
CREATE TABLE telefon (
nummer VARCHAR (20) NOT NULL,
art CHAR (1) NOT NULL,
name VARCHAR (100) NOT NULL,
vorname VARCHAR (40) NOT NULL,
CONSTRAINT fk_telefon_person FOREIGN KEY (name, vorname)
REFERENCES person (name, vorname)
);
^
Bei nicht zusammengesetzten PKs ist einfachere Sc
CREATE TABLE Telefon (
Nummer VARCHAR(30) NOT NULL,
Art CHAR(1) NOT NULL,
Person INTEGER CONSTRAINT fk_telefon_person REFERENCES Person(ID)
);
IS: Datenbanken, © Till Hänisch 2000
andere Constraints
UNIQUE Werte der entsprechenden Columns müssen eindeutig sein
(PRIMARY KEY impliziert UNIQUE)
Eindeutigkeit von Candidate Keys, z.B. Person (ID)
U_Person UNIQUE (name, vorname)
DEFAULT
Standardwert, häufig durch systemspezifische Funktio
wie User,..., z.B. Protokollierung
CREATE TABLE Log(
action INTEGER NOT NULL,
who VARCHAR(100) DEFAULT USER);
INSERT INTO Log(action) VALUES(42);
CHECK Bedingung für ein Attribut
z.B. bei Person (
PersonAlter INT NOT NULL CHECK (alter > 18)
etwa bei CHAR(1) als Boolean-Ersatz
flag CHAR (1) NOT NULL CHECK (flag IN (’Y’, ’N’))
Bei „modernen“ SQL Dialekten auch Subqueries zulässig, z.B.
Preis DECIMAL (10,2) CHECK (preis >= (SELECT stmt.))
IS: Datenbanken, © Till Hänisch 2000
Zugriffskontrolle
Jeder Benutzer hat volle Verfügungsgewalt (Lesen, Schreiben, Ändern,...)
über die von ihm erzeugten Objekte, andere Benutzer haben keinen Zugriff
Benutzer kann Rechte an seinen Objekten für andere freigeben
(und wieder sperren)
GRANT/REVOKE Privileg {,Privileg} ON objekt TO user {,user}
spezieller "Benutzer" PUBLIC steht für alle Benutzer
Privileg = SELECT,INSERT,UPDATE,DELETE
z.B.
GRANT SELECT ON emp TO PUBLIC;
Zugriff auf Objekte anderer Benutzer erfolgt durch Qualifizierung mit
dem Benutzernamen, z.B. Tabelle "geheim" des Benutzers "max"
SELECT * FROM max.geheim;
IS: Datenbanken, © Till Hänisch 2000
Views
View = „virtuelle“, d.h. abgeleitete Relation
Aus einer oder mehreren Relationen wird durch Query eine neue „virtuelle“ erzeugt:
CREATE TABLE name SELECT ...
physikalische Relation
CREATE VIEW name AS SELECT ...
virtuelle Relation
Wenn sich Tupel der Basisrelation(en) ändern, dann ändert sich automatisch
auch der Inhalt des Views.
Anmerkung:
View-Relationen existieren physikalisch nur als Definition,
die Tupel werden bei jedem Zugriff berechnet.  Performance
View -> Abkürzung (ähnlich Makro)
Wozu?
Vorformulierung von (häufig benötigten, komplexen) Anfragen
z.B. Gehalt der Angestellten
CREATE VIEW Gehalt AS SELECT sal+ISNULL(comm,0) AS Total FROM emp; (Sybase)
CREATE VIEW Gehalt AS SELECT sal+NVL(comm,0) AS Total FROM emp; (Oracle)
Abstraktion von Details (NULL,…), Definition von Business Rules
(Gehalt = sal+comm) an einer Stelle
IS: Datenbanken, © Till Hänisch 2000
Views contd.
Denormalisierung, z.B. emp,dept
CREATE VIEW Angest AS
SELECT e.empno,e.ename, d.deptno,d.dname
FROM emp e, dept d WHERE e.deptno=d.deptno;
Verschiedene Sichten auf Daten (Datenschutz, Vertraulichkeit, Übersicht,...)
z.B. Tabelle emp enthält Gehalt, dies darf jedoch nur für Personalabteilung sichtbar
sein. Sekretariate benötigen aber Liste der Mitarbeiter. Lösung ?
Entweder zusätzliche (redundante) Tabelle, die nur die zugänglichen Informationen
enthält, oder
CREATE VIEW emp_base AS
SELECT ename,empno,deptno,job FROM emp;
(vertikaler Ausschnitt)
oder: Sekretariat soll vollst. emp-Tabelle, aber nur für die eigene Abteilung sehen
(Die Funktion USER liefert unter Sybase den Namen des aktuellen Users zurück)
CREATE TABLE userdept (name varchar(20), deptno INTEGER);
INSERT INTO userdept VALUES('ba',30);
CREATE VIEW myemp AS
SELECT * FROM emp WHERE deptno = ANY (SELECT deptno FROM userdept WHERE name=USER)
(horizontaler Ausschnitt)
IS: Datenbanken, © Till Hänisch 2000
Views Zusammenfassung


Views sind sehr mächtiges Konzept
teilweise Probleme bei Implementierung


INSERT,UPDATE,DELETE



mit Einschränkungen auch auf Views
(typ. eine Basisrelation, Query enthält keine Expressions,
Aggregate,...)
WITH CHECK Option
ORACLE


Performance, Einschränkungen
Instead of Trigger erlauben weitergehenden Einsatz von
Views
mysql

unterstützt keine Views
IS: Datenbanken, © Till Hänisch 2000
Open ends

Indices


Schneller Zugriff auf ausgewählte Datensätze (insb. bei
Joins)
Wie "findet" das DBMS einen Datensatz ? (z.B. deptno=40)



sequentielles Durchlaufen aller Datensätze (full table scan)
einfach, "alle" Bedingungen, Funktionen möglich, bei großen
Tabellen langsam, Dauer steigt linear mit der Zahl der Zeilen
Verwendung eines Index (analog Buch)
geeignete, üblicherweise sortierte Speicherung der
verschiedenen Einträge (typ. B* Baum, Hash)
Schnell (Zugriffsdauer etwa unabhängig von der Zahl der
Datensätze, etwa linear mit der Zahl der Treffer)
Nur bestimmte Funktionen möglich, nicht etwa LIKE '%xx',...
Overhead bei DML (INSERT,UPDATE,...)
CREATE [UNIQUE] INDEX name ON table(Feld1,Feld2,...);
DROP INDEX name;
IS: Datenbanken, © Till Hänisch 2000
Open ends contd.

Trigger



Für best. Ereignisse (INSERT,UPDATE,...) kann zu einer Tabelle
Code hinterlegt werden, der beim Eintreffen ausgeführt wird
Darstellung von Business Rules, Konsistenzbedingungen,
Protokollierung,...
Physikalisches Datenmodell


Bisher: logisches Datenmodell: Relationen
jetzt: Relationale Datenbank: SQL







Auswahl der Datentypen 
Abbildung von Relationships 
ggf. Denormalisierung, Einführung von Views,... 
Abbildung von Business Rules (Constraints, Views, Trigger, stored
procedures,...) ()
Indices 
physikalische Speicherung (Verteilung, Blockgrößen,...)
...
IS: Datenbanken, © Till Hänisch 2000
Herunterladen