folien zur zweiten einheit (sql - ddl) - Universität Wien
folien zur zweiten einheit (sql - ddl) - Universität Wien
folien zur zweiten einheit (sql - ddl) - Universität Wien
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
IT/ISK: Informationssysteme und<br />
künstliche Intelligenz<br />
- Übungs<strong>einheit</strong> 2 -<br />
WS 2006/2007<br />
<strong>Universität</strong> <strong>Wien</strong><br />
Fakultät für Informatik<br />
Institut für Knowledge and Business Engineering<br />
www. .univie.ac.at<br />
http://www.dke.univie.ac.at Hans-Georg Fill, Wolfgang Kaghofer
SQL (DDL)<br />
• Anlegen von Tabellen<br />
• Primärschlüsseldefinition<br />
• Fremdschlüsseldefinition<br />
Inhalt<br />
• Arbeiten mit Sequences und Trigger<br />
• automatisches Löschen von Datensätzen<br />
• Tabellendefinitionen ändern<br />
• Datentyp DATE<br />
http://www.dke.univie.ac.at Hans-Georg Fill, Wolfgang Kaghofer
• ER-Modell<br />
Mitarbeiternummer<br />
Name<br />
Relationenschemata:<br />
Ausgangspunkt<br />
arbeitet in<br />
Mitarbeiter<br />
n 1<br />
Abteilung<br />
Menge<br />
Mitarbeiter (Mitarbeiternummer, Name, Abteilungsnummer)<br />
Abteilung (Abteilungsnummer, Bezeichnung)<br />
Produkte (Produktnummer, Name)<br />
produziert (Abteilungsnummer, Produktnummer, Menge)<br />
Produkt<br />
produziert<br />
http://www.dke.univie.ac.at Hans-Georg Fill, Wolfgang Kaghofer<br />
m<br />
n<br />
Abteilungsnummer<br />
Bezeichnung<br />
Produktnummer<br />
Name
SQL – DDL und DML<br />
SQL: Structured Query Language<br />
Befehle zum Definieren von Tabellen, Trigger, Constraints<br />
=> DDL (Data Definition Language)<br />
Befehle zum Einfügen, Abfragen und Verändern<br />
von Tabelleninhalten<br />
=> DML (Data Manipulation Language)<br />
Befehle durch ; abgeschlossen<br />
http://www.dke.univie.ac.at Hans-Georg Fill, Wolfgang Kaghofer
CREATE TABLE<br />
• “einfacher Fall”: aus Relationenschema<br />
Tabellenname, Spaltennamen, Schlüsselinformation<br />
– CREATE TABLE abteilung<br />
(abtnr NUMBER(10,0) PRIMARY KEY,<br />
bezeichnung VARCHAR2(30));<br />
• Problem: woher weiß ich beim Einfügen neuer<br />
Datensätze, welche Abteilungsnummer noch nicht<br />
vergeben ist?<br />
• Lösung: Verwendung von Sequences und Triggern<br />
http://www.dke.univie.ac.at Hans-Georg Fill, Wolfgang Kaghofer
Sequence<br />
• generiert automatisch eindeutige numerische Schlüssel<br />
– CREATE SEQUENCE s_abtnr<br />
INCREMENT BY 1<br />
START WITH 1;<br />
• Zugriff auf aktuellen Wert der Sequenz:<br />
– s_abntr.CURRVAL<br />
• Inkrementieren der Sequenz um den vordefinierten Wert:<br />
– s_abtnr.NEXTVAL<br />
http://www.dke.univie.ac.at Hans-Georg Fill, Wolfgang Kaghofer
Trigger<br />
• damit nun automatisch beim Einfügen neuer Datensätze<br />
in die Tabelle Abteilung eine bisher unbenutzte<br />
Abteilungsnummer vergeben wird, muss ein Trigger-<br />
Mechanismus implementiert werden<br />
– CREATE OR REPLACE TRIGGER trigger_abteilung<br />
BEFORE INSERT ON abteilung FOR EACH ROW<br />
DECLARE<br />
abteilungseq abteilung.abtnr%type;<br />
BEGIN<br />
SELECT s_abtnr.nextval INTO abteilungseq FROM DUAL;<br />
:new.abtnr := abteilungseq;<br />
END;<br />
/<br />
http://www.dke.univie.ac.at Hans-Georg Fill, Wolfgang Kaghofer
Einfügen von Datensätzen<br />
• Befehl INSERT INTO: konkrete Werte angeben<br />
• wenn Trigger verwendet werden, ist es natürlich ratsam,<br />
die entsprechenden Attribute nicht „händisch“ einzugeben<br />
das insert-Statement sollte nur die notwendigen<br />
Attributwerte beinhalten.<br />
– INSERT INTO abteilung (bezeichnung) VALUES<br />
(`Buchhaltung´);<br />
=> die Abteilungsnummer wird automatisch vergeben<br />
http://www.dke.univie.ac.at Hans-Georg Fill, Wolfgang Kaghofer
Fremdschlüssel<br />
• Fremdschlüssel werden mit Hilfe einer Column-Constraint<br />
definiert<br />
Beispiel: ein Mitarbeiter arbeitet in einer bestimmten<br />
Abteilung<br />
– CREATE TABLE mitarbeiter<br />
(mnr NUMBER(10,0) PRIMARY KEY,<br />
name VARCHAR2(20),<br />
abtnr NUMBER(10,0) REFERENCES abteilung(abtnr));<br />
http://www.dke.univie.ac.at Hans-Georg Fill, Wolfgang Kaghofer
Automatisches Löschen<br />
• manchmal kann es sinnvoll sein, dass Datensätze, die<br />
einen Fremdschlüssel beinhalten, gelöscht werden, wenn<br />
das referenzierte Tupel wird<br />
Beispiel: wenn etwa eine Abteilung aufgelöst wird und die dort<br />
arbeitenden Mitarbeiter gekündigt werden, ist es vorteilhaft, wenn<br />
nach dem Löschen der Abteilung die entsprechenden<br />
Mitarbeitertupel automatisch mitgelöscht werden<br />
• Realisierung mittels Erweiterung der Fremdschlüssel<br />
Column-Constraint um „on delete cascade“<br />
– abtnr NUMBER(10,0) REFERENCES abteilung(abtnr) on<br />
delete cascade<br />
http://www.dke.univie.ac.at Hans-Georg Fill, Wolfgang Kaghofer
Zusammengesetzte Schlüssel<br />
• Realisierung mittels Table-Constraints<br />
– CREATE TABLE produziert<br />
(abtnr NUMBER(10,0) REFERENCES abteilung(abtnr),<br />
prodnr NUMBER(10,0) REFERENCES produkte(prodnr),<br />
menge NUMBER(*,0),<br />
PRIMARY KEY (abtnr, prodnr));<br />
http://www.dke.univie.ac.at Hans-Georg Fill, Wolfgang Kaghofer
ALTER TABLE (1)<br />
• Möglichkeiten den Aufbau einer Tabelle nachträglich zu<br />
ändern:<br />
– Spalten hinzufügen/entfernen<br />
– Attributdatentyp ändern<br />
– Constraints hinzufügen/löschen bzw. (de)aktivieren<br />
http://www.dke.univie.ac.at Hans-Georg Fill, Wolfgang Kaghofer
ALTER TABLE (2)<br />
• Spalten hinzufügen<br />
– ALTER TABLE mitarbeiter<br />
ADD (gehalt number(7,0));<br />
• Spalten löschen<br />
– ALTER TABLE mitarbeiter<br />
DROP (gehalt);<br />
• Attributdatentyp ändern (kann nur durchgeführt werden,<br />
wenn alle Werte der entsprechenden Spalte NULL sind!)<br />
– ALTER TABLE mitarbeiter<br />
MODIFY (gehalt number(10,0));<br />
http://www.dke.univie.ac.at Hans-Georg Fill, Wolfgang Kaghofer
ALTER TABLE (3)<br />
• Constraint hinzufügen<br />
– ALTER TABLE mitarbeiter<br />
ADD (CONSTRAINT obergrenze check (gehalt
Datentyp DATE<br />
• der Datentyp DATE beinhaltet sowohl eine<br />
Datumsangabe als auch eine Zeitangabe<br />
• Standardformat:<br />
– DD-MMM-YY z.B. 24-Oct-03<br />
– HH:MI:SS a.m. (oder p.m.) z.B. 09:57:00 a.m.<br />
• es existiert in Oracle kein vordefinierter Datentyp, der nur<br />
eine Zeitangabe darstellt<br />
http://www.dke.univie.ac.at Hans-Georg Fill, Wolfgang Kaghofer
DATE – andere Formate<br />
• möchte man ein eigenes Datumsformat verwenden, so<br />
muss man die Funktion to_date() verwenden<br />
• Einfügen von Datensätzen<br />
– INSERT INTO table_name (datum) VALUES<br />
(to_date(´24.10.2003 09:57´, ´dd.mm.yyyy<br />
hh24:mi´));<br />
• Auslesen von Datensätzen und Anzeige in<br />
benutzerdefinierten Format<br />
– SELECT to_char (datum, ´dd.mm.yyyy hh24:mi´) FROM<br />
table_name [WHERE …];<br />
http://www.dke.univie.ac.at Hans-Georg Fill, Wolfgang Kaghofer
DATE – Format ändern<br />
• für die Dauer einer Session kann das Format geändert<br />
werden<br />
– ALTER SESSION SET nls_date_format = ´DD.MM.YYYY<br />
HH24:MI´;<br />
• beim nächsten Einloggen ist allerdings wieder das<br />
Standardformat gültig<br />
• um dauerndes händisches Eingeben zu vermeiden könnte<br />
daher ein Skript verwendet werden<br />
http://www.dke.univie.ac.at Hans-Georg Fill, Wolfgang Kaghofer
Oracle Skript-Funktionalität<br />
• eine einfache Möglichkeit, eine Menge von Anweisungen<br />
automatisch ausführen zu lassen:<br />
– man erzeugt ein Textfile mit allen gewünschten (und syntaktisch<br />
richtigen) Statements;<br />
am Ende des Files sollte / alleine in einer Zeile stehen<br />
– dieses File erhält die Endung „.<strong>sql</strong>“<br />
– dieses File legt man dann am Rechner ab, auf dem man mit der<br />
Oracle-Datenbank arbeitet (in unserem Fall auf<br />
almighty.pri.univie.ac.at)<br />
– Aufrufmöglichkeiten:<br />
• in der Oracle Konsole: <strong>sql</strong>> @filename<br />
• beim Starten mit: <strong>sql</strong>plus @filename<br />
http://www.dke.univie.ac.at Hans-Georg Fill, Wolfgang Kaghofer
Nützliches (1)<br />
• alle Tabellen einer Datenbank anzeigen<br />
– SELECT TABLE_NAME FROM USER_TABLES;<br />
• Struktur einer Tabelle ausgeben<br />
– DESC tablename;<br />
• Löschen einer Tabelle inkl. aller Datensätze<br />
– DROP TABLE tablename [CASCADE Constraints];<br />
• Löschen aller Datensätze einer Tabelle<br />
– DELETE FROM tablename;<br />
http://www.dke.univie.ac.at Hans-Georg Fill, Wolfgang Kaghofer
Nützliches (2)<br />
• Constraints einer Tabelle anzeigen<br />
– SELECT constraint_name, constraint_type<br />
FROM user_constraints<br />
WHERE table_name=´MITARBEITER´;<br />
• Abfragen zu welcher Spalte einer Tabelle die Constraint<br />
gehört<br />
– SELECT constraint_name, column_name<br />
FROM user_cons_columns<br />
WHERE table_name=´MITARBEITER`;<br />
Hinweis: der table_name muss in Grossbuchstaben<br />
angegeben werden!<br />
http://www.dke.univie.ac.at Hans-Georg Fill, Wolfgang Kaghofer