Umfangreiche Datenmengen werden üblicherweise in relationalen Datenbank-Systemen (RDBMS) gespeichert Logische Struktur der Datenbank wird mittels Entity/Realtionship-Diagrammen dargestellt structured query language Manipulation und Abfrage der Daten erfolgt mittels (Structured Michael Query Language) Kamleitner, 7.3.2003 Entwickelt anfang der 70er von E.F. Codd (IBM) Aktueller Standard: ANSI--92 (bzw. 99) Am Markt etablierte Datenbanken Oracle, Microsoft -Server, IBM DB2......implementieren mehr oder weniger ANSI--92
E/R Diagramm Umfangreiche Datenmengen werden üblicherweise in relationalen Datenbank-Systemen (RDBMS) gespeichert Logische Struktur der Datenbank wird mittels Entity/Realtionship-Diagrammen dargestellt Manipulation und Abfrage der Daten erfolgt mittels (Structured Query Language) Entwickelt anfang der 70er von E.F. Codd (IBM) Aktueller Standard: ANSI--92 (bzw. 99) Am Markt etablierte Datenbanken Oracle, Microsoft -Server, IBM DB2......implementieren mehr oder weniger ANSI--92
E/R Diagramm Datenbanken bestehen aus Tabellen Spalten Attribute, Felder Zeilen Datensätze Primärschlüssel: ermöglicht eindeutige Identifikation eines Datensatzes, darf also in einer Tabelle niemals doppelt vorkommen ID (Primärschlüssel) 2 3 4 Hersteller VW VW Opel Audi Modell Käfer Golf 2 Manta A4 Preis 9.00,-.200,- 2.300,- 2.400,- Kritik am : entspricht nicht der Normalform! Feld Hersteller ist nicht funktional abhängig vom Primärschlüssel Folge: Ineffiziente Speicherung, Redundanz Lösung: Aufteilen in zwei separate Tabellen
E/R Diagramm Verknüpfung von Tabellen mittels Fremdschlüssel Hersteller-ID (Primärschlüssel) Name VW 2 Opel 3 Audi Hersteller-ID (Fremdschl.) 2 3 Automobil-ID 2 Name Käfer Golf 2 Manta A4 Preis 9.00,-.200,- 2.300,- 2.400,- { Primärschlüssel
Darstellung mittels Entity/Relationship Diagramm Hersteller Hersteller-ID Name : n Automobil Automobil-ID Hersteller-ID (FK) Modellname Preis
- einfach in Betrieb zu nehmende -Datenbank frei verfügbare Demo -Version kommt im Orionserver zum Einsatz Nachteil: Daten werden in der Demo-Version nicht dauerhaft gespeichert und sind nach Beenden des Programms verloren! Freie (bzw. günstige) Alternativen: My, postgre, Microsoft Access
Installation: Download der Datei hsql_42.zip von http://javaboutique.internet.com/ Enpacken der Datei bspw. in C:\H Aufruf von C:\H\hypersonicsql\index.html Klick auf In-Memory Database Manager
Anlegen von Tabellen Vor der ersten Verwendung muss die Struktur (Felder, Datentypen) und die Beziehungen der Tabellen definiert werden Syntax: CREATE TABLE Tabellenname ( Feldname Feldtyp2 [Not Null], Feldname Feldtyp [Not Null],... ); CONSTRAINT Schlüsselname PRIMARY KEY (Feldname,...) CONSTRAINT Schlüsselname2 FOREIGN KEY (Feldname d. aktuellen Tab.) REFERENCES Fremdtabelle (Feldname d. Fremdtab.) Einfache Feldtypen: INTEGER DOUBLE VARCHAR (n) DATE... Ganze Zahlen... Dezimalzahlen... Zeichenkette der Länge n... Datum
: Tabelle Hersteller Hersteller-ID (Primärschlüssel) 2 3 Name VW Opel Audi CREATE TABLE Hersteller ( HerstellerID INTEGER NOT NULL, Name VARCHAR(00) NOT NULL, ); CONSTRAINT HerstellerPK PRIMARY KEY (HerstellerID)
: Tabelle Automobil Hersteller-ID (Fremdschl.) 2 3 Automobil-ID 2 Name Käfer Golf 2 Manta A4 CREATE TABLE Automobil ( HerstellerID INTEGER NOT NULL, AutomobilID INTEGER NOT NULL, Name VARCHAR(00) NOT NULL, Preis DOUBLE, Preis 9.00,-.200,- 2.300,- 2.400,- ); CONSTRAINT AutomobilPK PRIMARY KEY (HerstellerID, AutomobilID), CONSTRAINT HerstellerFK FOREIGN KEY (HerstellerID) REFERENCES Hersteller (HerstellerID)
Einfügen von Datensätzen Beim Einfügen werden die Datentypen sowie evt. vorhandene Constraints von der Datenbank überprüft Syntax: INSERT INTO Tabellenname VALUES (Feld, Feld2,...); e: INSERT INTO Hersteller VALUES (,'VW'); INSERT INTO Hersteller VALUES (2,'Opel'); INSERT INTO Hersteller VALUES (3,'Audi'); INSERT INTO Automobil VALUES (,,'Käfer', 900); INSERT INTO Automobil VALUES (,2,'Golf 2', 200); INSERT INTO Automobil VALUES (2,,'Manta', 2300); INSERT INTO Automobil VALUES (3,,'A4', 2400); INSERT INTO Hersteller VALUES (2,'Mercedes'); INSERT INTO Automobil VALUES (5,,'Civic', 3400);
Einfache Abfragen Dienen der Selektion eines Ausschnitts aus der Datenbank nach bestimmten Kriterien Syntax: SELECT Feldname, Feldname2,... FROM Tabellenname WHERE Bedingung... AND OR Bedingung2...; e: SELECT Name, Preis FROM Automobil; SELECT * FROM Automobil; SELECT Name, Preis FROM Automobil WHERE HerstellerID = AND Preis > 0000;
Ändern von Datensätzen Manipuliert den Inhalt von beliebig vielen Felder in einem definierten Ausschnitt einer Tabelle Syntax: UPDATE Tabellenname SET Feldname = Wert, Feldname2 = Wert,... WHERE Bedingung...; e: UPDATE Automobil SET Preis = Preis * 2; UPDATE Automobil SET Name = 'Golf' WHERE HerstellerID = AND AutomobilID = ;
Löschen von Datensätzen Löscht beliebige Zeilen aus der Tabelle Syntax: DELETE FROM Tabellenname WHERE Bedingung,...; e: DELETE FROM Automobil WHERE HerstellerID = ; DELETE FROM Automobil;
Abfragen mit Verknüpfung (Join) Bildet das Kreuzprodukt von 2 oder mehreren Tabellen ( kombiniert jede Zeile aus Tab. mit jeder Zeile aus Tab. 2 ) Das Kreuzprodukt wird mittels WHERE auf übereinstimmende Schlüsselpaare eingeschränkt Syntax: SELECT Feldname, Feldname2,... FROM Tabellenname, Tabellenname2,... WHERE Verknüpfungsbedingung,...; e: SELECT * FROM Hersteller, Automobil; SELECT * FROM Hersteller, Automobil WHERE Hersteller.HerstellerID = Automobil.HerstellerID;
Abfragen mit Sortierung (order by) Das Abfrageergebnis kann beliebig aufsteigend (ASC[ending]) oder absteigend (DESC[ending]) sortiert werden Syntax: SELECT... ORDER BY Feldname ASC DESC, Feldname2 ASC DESC,...; e: SELECT * FROM Automobil ORDER BY Preis ASC;
Abfragen mit Gruppierung (group by) Anwendung mathematischer Funktionen auf Felder Syntax: SELECT SUM(Feldname) AVG(Feldname) MAX(Feldname) MIN(Feldname) COUNT(Feldname) FROM Tabellenname; Ohne group by-anweisung: Anwendung auf die ganze Tabelle Mit der group by-anweisung: Gruppierung nach einem Feld SELECT Gruppierungsspalte, Math. Funktion FROM Tabellenname GROUP BY Gruppierungsspalte; : Gesucht ist das teuerstes Modell jedes Herstellers SELECT HerstellerID,MAX(Preis) FROM Automobil GROUP BY HerstellerID;
Weitere -Befehle DROP TABLE Tabellenname; ALTER TABLE Tabellenname ADD COLUMN Feldname Feldtyp;
Datenbank zur Personalverwaltung Zu jedem Mitarbeiter sollen Name, Anschrift, PLZ und Gehalt in geeigneten Datentypen gespeichert werden Die Mitarbeiter sind in Abteilungen organisiert, die jeweils durch einen Namen und eine Kostenstellennummer beschrieben werden Jeder Mitarbeiter ist genau einer Abteilung zugeteilt Mitarbeiter MitarbeiterID Name Anschrift PLZ Gehalt AbteilungsID (FK) Abteilungen AbteilungID Bezeichnung Kostenstelle
Anlegen der Tabellen CREATE TABLE Abteilungen ( AbteilungID INTEGER NOT NULL, Name VARCHAR(50) NOT NULL, Kostenstelle INTEGER, ); CONSTRAINT AbteilungenPK PRIMARY KEY (AbteilungID) CREATE TABLE Mitarbeiter ( MitarbeiterID INTEGER NOT NULL, Name VARCHAR(50), Anschrift VARCHAR(50), PLZ INTEGER NOT NULL, Gehalt DOUBLE NOT NULL, AbteilungID INTEGER NOT NULL, ); CONSTRAINT MitarbeiterPK PRIMARY KEY (MitarbeiterID), CONSTRAINT AbteilungFK FOREIGN KEY (AbteilungID) REFERENCES Abteilungen (AbteilungID)
Anlegen einiger Testdatensätze: 4 Abteilungen (Geschäftsführung, Rechnungswesen, Verkauf, Service) Mehrere Mitarbeiter pro Abteilung
Anlegen einiger Testdatensätze: INSERT INTO Abteilungen VALUES (,'Geschäftsführung',000); INSERT INTO Abteilungen VALUES (2,'Rechnungswesen',2200); INSERT INTO Abteilungen VALUES (3,'Verkauf',3400); INSERT INTO Abteilungen VALUES (4,'Service',4000); INSERT INTO Mitarbeiter VALUES (,'Müller','Heuberggasse 42-50',70,20000.0,); INSERT INTO Mitarbeiter VALUES (2,'Meyer','Margarethengürtel 5',050,400.50,2); INSERT INTO Mitarbeiter VALUES (3,'Huber','Bergsteiggasse ',70,200.50,2); INSERT INTO Mitarbeiter VALUES (4,'Berger','Litfaßstrasse 2',030,300,3); INSERT INTO Mitarbeiter VALUES (5,'Naerr','Mengergasse 2',20,000.3,3); INSERT INTO Mitarbeiter VALUES (6,'Stocker','Hernalser Hauptstr. 2',70,500.0,4); INSERT INTO Mitarbeiter VALUES (7,'Niedermesser','Geblergasse 0',70,200.30,4); INSERT INTO Mitarbeiter VALUES (8,'Rat','Arndtstrasse 48',20,400,4);
Einige Abfragen Anzahl der Mitarbeiter SELECT COUNT(*) FROM Mitarbeiter; Liste aller Mitarbeiter-Namen inkl. der jeweiligen Abteilungsbezeichnung SELECT Mitarbeiter.Name,Abteilungen.Name FROM Mitarbeiter,Abteilungen WHERE Mitarbeiter.AbteilungID = Abteilungen.AbteilungID; Liste aller Abteilungs-Bezeichnugnen mit den jeweiligen Gesamt- Gehaltskosten SELECT Abteilungen.Name, SUM(Gehalt) FROM Abteilungen,Mitarbeiter WHERE Mitarbeiter.AbteilungID = Abteilungen.AbteilungID GROUP BY Abteilungen.AbteilungID; Löschen der Abteilung 4 DELETE FROM Mitarbeiter WHERE AbteilungID = 4; DELETE FROM Abteilungen WHERE AbteilungID = 4;