Upload
others
View
16
Download
0
Embed Size (px)
Citation preview
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite
Grundlagen relationaler Datenbanken
SOFTLANG Team, Universität Koblenz-Landau http://softlang.wikidot.com/startseite
Prof. Dr. R. Lämmel
1
http://softlang.wikidot.com/course:dbintro
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite
Gliederung1. Einführung!
2. Das Relationale Modell
3. Datendefinition (SQL DDL)
4. Datenmanipulation (SQL DML)
5. Eingebettete Programmierung
6. Objektrelationale Abbildung
7. … ?
2
softlang.wikidot.com/course:dbintro
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite
Einführung
• SQLware als ein Technologischer Raum
• Das 101companies-Projekt als didaktische Hilfe
• Befragung der Seminarteilnehmer
3 © 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite
Technologische Räume!!
SQLware ist ein technologischer Raum. Es ist einer von vielen.
4
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite
Technologischer Raum = Technologie mit gemeinschaftlichen IT-Kontext
5
• SQLware — Etablierter Raum für Datenverwaltung • COBOLware — Klassischer Raum für geschäftl. Progr. • Javaware — Etablierter Raum für OO-Programmierung • XMLware — Interoperabilität für Datenaustausch • JSONware — Weiterer Raum für Interoperabilität • UMLware — Raum für Softwaremodellierung • MDEware — Model Driven Engineering • RDFware — Semantic Web und Linked Data
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite
Bestandteile eines technologischen Raumes
6
• Anwendungsszenarien
• Programmiersprachen
• Datenrepräsentationsformate
• Entwicklungswerkzeuge wie Compiler oder IDEs
• Laufzeitwerkzeuge wie Bibliotheken
• Anfrage- und Transformationssprachen
• Lehrbücher und andere Wissensquellen der Gemeinschaft
• …
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 7
Unterteilung der technologischen Räume nach dem „Daten“paradigma• Tabellen!
• Relationale Tabelle (SQL) • Schlüsselindizierte Dateien (Cobol)
• Bäume!• XML-Bäume • JSON-Bäume • Algebraische Terme (etwa in Haskell und F# und Skala)
• Graphen!• Objektgraphen (etwa in Java) • Modelle (etwa Objektdiagramme in UML)
Es gibt auch „Tricks“, um in XML und JSON mit Graphen zu arbeiten.
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 8
Bäume versus Tabellen versus Graphen
http://en.wikipedia.org/wiki/File:PSM_V18_D630_Restoration
_of_a_lepidodendron.jpg
XML für eine Firma
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 9
Bäume versus Tabellen versus Graphen
Id Name Address Salary Manager Department
1 Craig Redmond 123456 TRUE 42
2 Erik Utrecht 12345 FALSE 42
3 Ralf Koblenz 1234 FALSE 42
… … … … … …
Id Name Department Company
42 Research NULL 88
43 Development NULL 88
44 Dev1 43 88
… … … …
Employee
DepartmentId Name
88 ACME Corporation
… …
Company
Tabellen für eine Firma
Fremdschlüssel
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 10
Name ACME CorporationDepartments [o,…]
Name CraigAddress RedmondSalary 123456
Manager TRUE
:EmployeeName Erik
Address UtrechtSalary 12345
Manager FALSE
:EmployeeName Ralf
Address KoblenzSalary 1234
Manager FALSE
:Employee
:Company
Name ResearchDepartments […]Employees [o, o, o]
:Department
Bäume versus Tabellen versus Graphen
Objektgraph für eine Firma
Zeiger
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 11
• Prozedural (z.B. Cobol) • OO (z.B. Java) • Deklarativ
• Funktional (z.B. F#) • Logisch (z.B. Prolog) • Algebraisch (z.B. SQL)
• Modell-basiert (z.B. UML) • Multi-Paradigma
Ein Programmierparadigma ist ein fundamentaler Programmierstil. […] „Der Programmierung liegen je nach Design der einzelnen Programmiersprache verschiedene Prinzipien zugrunde. […] Programmierparadigmen unterscheiden sich durch ihre Konzepte für die Repräsenta t ion von s ta t i schen (wie beispielsweise Objekte, Methoden, Variablen, Konstanten) und dynamischen (wie beispielsweise Zuweisungen, Kontrollfluss, Datenfluss) Programmelementen.
http://de.wikipedia.org/wiki/Programmierparadigma
3.Juni 2014
Unterteilung der technologischen Räume nach dem „Programmier“paradigma
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 12
Das OO-Paradigma
• Objekte kapseln Zustand (Daten) und Verhalten (Methoden).
• Objekte haben eine Schnittstelle = aufrufbare Methoden.
• Allein die Methoden greifen auf die Daten zu.
• Neue Objekte können instanziiert werden mittels Klasse bzw. Prototyp.
Message
Daten
Methode1
Methoden- auswahl
Methode2
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 13
Objekte als Abstraktion von physischen oder virtuellen Entitäten
Abstraction
Attribute
Methods
: Person
Birthday: 15.12.68Name: Lämmel
programeat
ValuesType of object
First: Ralf
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite
Jedes Ding ist ein Objekt!• Physische Entitäten:
z.B. ein Student oder ein Haus
• Beobachtbare Entitäten: z.B. eine Wettersituation
• Virtuelle Entitäten: z.B. ein Konto in einer Online-Bank
• Programmierte Entitäten: z.B. ein Fenster oder ein Druckauftrag
14
Unterscheidung von Objekten in Analyse, Entwurf und Implementation.
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 15
Einführendes Beispiel: Wir wollen die Struktur für eine Anwendung
im Personalwesen modellieren.
MSFT
VB C#
DevHR
AndersErikPaul
Unternehmen
Abteilungen
Unter-abteilungen
Angestellte
Wir sehen auch Methoden vor: „total“
zum Gehaltssummieren und „cut“ zum Halbieren.
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 16
http://101companies.org/wiki/Contribution:argoUML
Teil-Ganzes-Beziehung
UML-Klassendiagramm für die Unternehmensstruktur
Ausgewählte Methoden
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 17
Eine Java-Klasse I/II
public class Department {
private String name; private Employee manager; private List<Department> subdepts = new LinkedList<Department>(); private List<Employee> employees = new LinkedList<Employee>(); public String getName() { return name; } public void setName(String name) { this.name = name; } public Employee getManager() { return manager; } public void setManager(Employee manager) { this.manager = manager; } public List<Department> getSubdepts() { return subdepts; } public List<Employee> getEmployees() { return employees; }
// Methods omitted}
Privater Zustand
Getter und Setter für DatenzugriffNächste Folie
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 18
Eine Java-Klasse II/II
public class Department {
// State omitted
public double total() { double total = 0; total += getManager().getSalary(); for (Department s : getSubdepts()) total += s.total(); for (Employee e : getEmployees()) total += e.getSalary(); return total; }
public void cut() { getManager().cut(); for (Department s : getSubdepts()) s.cut(); for (Employee e : getEmployees()) e.cut(); } }
Steige in Objekt und aggregiere Gehälter
Steige auch ab, aber modifiziere Gehälter
Vorige Folie
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite
Anforderungen an SQLware
• Programmiersprachenunabhängige Datenmodellierung
• Persistenz für Programmdaten
• Effizienz für schlüsselbasierten Zugriff und große Datenmengen
• Trennung von Daten und Funktionalität
• Deklarative Anfragesprache
• Datenintegrität
19
Im Gegensatz zu Cobol und Java
Im Gegensatz zu (Basis-) OOP
Im Gegensatz zu XML
Im Gegensatz zu OOP
Im Gegensatz zu OOP und Cobol. Dies ist die Basis von Optimierungen.
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite
101companies!!
Didaktische Verwendung eines Projektes der AG Softwaresprachen in diesem Seminar.
20
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite
Verwendung des 101companies-Projektes (Ein Projekt der Arbeitsgruppe SOFTLANG)
• Relevante Ziele des Seminars
• Beschauen von relationalen Schemabeispielen
• Beschauen von SQL-Anfragebeispielen
• Beispielhafte Verbindung zur OO-Programmierung
• Bereitstellung von Ressourcen zu Konzepten
21 © 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 22
Company X: Cobol
!!!!
Company Y: Java + Swing + Hibernate
!!!!
Company Z: Python + Django + HTML5
!!!!
... !!!!
Eine Wissensbasis zu Programmier- bzw.
Softwaretechnologien, -techniken, und -
sprachen — auf der Basis der
beispielhaften Implementation bzw.
Modellierung eines Informationssystems
für das Personalwesen.
Was ist das 101companies Projekt?
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 23
Company X: Cobol
!!!!
Company Y: Java + Swing + Hibernate
!!!!
Company Z: Python + Django + HTML5
!!!!
... !!!!
Aus dem Englischen:
„101 ways of doing something“
Warum der Name „101companies“?
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 24
Ein Informationssystem für das Personalwesen
Features!• „total“: Gehälter summieren • „cut“: Gehälter halbieren • Nutzerinterface • Persistenz in der Datenbank • …
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 25
Demo http://101companies.org/wiki/Contribution:cobol
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 26
Ein paar Zahlen zum Projekt „101“
8
442
#Files per implementation Technologies
Languages LOC per implementation
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite
Fragebogen• Wer ist im technologischen Raum Cobolware unterwegs?
• Wer hat schon nennenswert SQL-Anfragen benutzt?
• Wen interessiert die Verbindung Datenbank und OOP?
• … die Verbindung Datenbank und WebApp?
• … NoSQL anstatt allein SQL?
• … fortgeschrittene SQL-Themen wie Trigger und Gespeicherte Prozeduren?
• …
27
Eine Vorstellungsrunde der Seminarteilnehmer?
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite
Gliederung1. Einführung
2. Das Relationale Modell!
3. Datendefinition (SQL DDL)
4. Datenmanipulation (SQL DML)
5. Eingebettete Programmierung
6. Objektrelationale Abbildung
7. … ?
28
softlang.wikidot.com/course:dbintro
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite
Das Relationale Modell!!
Grundlage der relationalen Datenbanken. Grundlage des technologischen Raumes SQLware.
29 © 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 30
Relationen (Tabellen)
Relation (Tabelle)!Vertikal: Menge von Tupeln (“Zeilen”)!Horizontal: Menge von Spalten!
Jede Zelle ist von einem primitiven Typ: !Zeichenkette (String)!Zahlen (INTEGER, DOUBLE, …)
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 31
Relationale Schemata zur Definition der Tabellenstruktur
company (id INT, name STR)!
department (id INT, name STR, cid INT, did INT)!
employee (id INT,!! ! ! ! ! ! ! ! ! ! ! !! name STR, address STR, salary NUM, manager BOOL,!! cid INT, did INT)
Schlüsselbedingungen („Key constraints“): Ein primärer Schlüssel (unterstrichen) dient der eindeutigen Identifikation einer Zeile. Ein sekundärer Schlüssel (kursiv) ist ein Verweis
auf eine Zeile einer anderen Tabelle.
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 32
Relationale Schemata zur Definition der Tabellenstruktur
company (id INT, name STR)!
department (id INT, name STR, cid INT, did INT)!
employee (id INT,!! ! ! ! ! ! ! ! ! ! ! !! name STR, address STR, salary NUM, manager BOOL,!! cid INT, did INT)
VarianteDie Firma eines Angestellten ist
auch über die Zuordnung zu einer Abteilung repräsentiert.
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 33
Relationale Schemata zur Definition der Tabellenstruktur
company (id INT, name STR)!
department (id INT, name STR, cid INT, did INT, mid INT)!
employee (id INT,!! ! ! ! ! ! ! ! ! ! ! !! name STR, address STR, salary NUM, manager BOOL,!! cid INT, did INT)
VarianteDer Manager einer Abteilung kann
auch über die Abteilung direkt beschrieben werden.
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 34
Relationale Algebra zur „Berechnung“ neuer Tabellen
Projektion (Wähle Spalten aus.)!
Selektion (Wähle Zeilen aus.)!
Join (Füge zwei Tabellen horizontal zusammen.)
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 35
Projektion (Wähle Spalten aus.)
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 36
Selektion (Wähle Zeilen aus.)
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 37
Join (Füge zwei Tabellen horizontal zusammen.)
Company NameACME CorporationACME CorporationACME CorporationACME CorporationACME CorporationACME CorporationACME Corporation
Ergänze die Tabelle „Employee“ um die Spalte mit dem Firmennamen aus der Tabelle „Company“
vermöge „Join“ über den Schlüssel für die Firma.
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite
Normalformen!!
Vermeidung von Redundanzen. Vermeidung von Problemen bei CRUD.
Unterstützung der Datenintegrität.
38
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite
Probleme bei fehlender Normalisierung
39
• Änderungsanomalie: Um die Adresse eines Studenten zu ändern, müssen eventuell mehrere Zeilen geändert werden — sonst werden die Daten inkonsistent.
• Einfügungsanomalie: Das Einfügen eines neuen Studenten ohne die gleichzeitige Zuordnung zu einem Kurs erfordert einen NULL-Wert für Subject_opted.
• Entfernungsanomalie: Das Entfernen einer Belegung eines Kurses führt u.U. zum totalen Entfernen des Studierenden aus der Datenbank, wenn keine weiteren Kursbelegungen vorliegen.
Quelle: http://www.studytonight.com/dbms/database-normalization.php
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite
Erste Normalform (1NF)
40
Quelle: http://www.studytonight.com/dbms/database-normalization.php
Alle Zellen enthalten nur atomare Daten. Es gibt keine Wiederholungsgruppen von Spalten.
Nicht in 1NF
In 1NFPrimärschlüssel
sei dies: Student, Subject
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite
Zweite Normalform (2NF)
41
Quelle: http://www.studytonight.com/dbms/database-normalization.php
Es liegt 1NF vor. Es hängt kein Nichtschlüsselattribut funktional ab von einem Teil des Schlüssels.
Nicht In 2NF
„Age“ hängt allein von „Student“ ab. (Es hängt nicht von „Subject“ ab.)
Primärschlüssel ist noch dies:
Student, Subject
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite
Zweite Normalform (2NF)
42
Quelle: http://www.studytonight.com/dbms/database-normalization.php
Es liegt 1NF vor. Es hängt kein Nichtschlüsselattribut funktional ab von einem Teil des Schlüssels.
In 2NF
Extra Tabelle
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite
Dritte Normalform (3NF)
43
Quelle: http://www.studytonight.com/dbms/database-normalization.php
Es liegt 2NF vor. Es gibt keine transitiven funktionalen Abhängigkeiten.
Tabelle Student_Detail (Nicht in 3NF)
Tabelle Student_Detail (In 3NF)
Tabelle Address (Zusätzlich)
„State“ und eventuell auch „Street“ und „city“ hängen von „Zip“ ab.
Eine extra Tabelle mit Zip, … als primärem Schlüssel
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite
Gliederung1. Einführung
2. Das Relationale Modell
3. Datendefinition (SQL DDL)!
4. Datenmanipulation (SQL DML)
5. Eingebettete Programmierung
6. Objektrelationale Abbildung
7. … ?
44
softlang.wikidot.com/course:dbintro
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite
SQL (Structured Query Language)!!
Die Datendefinitions-, Anfrage-, und Transformationssprache des
technologischen Raumes SQLware.
45 © 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 46
SQL (Structured Query Language) http://101companies.org/wiki/Language:SQL
• Teile von SQL • Datendefinition („Definiere relationale Schemata.“) • Datenmanipulation
• Anfragen („Relationale Algebra“) • Der Rest von CRUD:!
• Create: Einfügen von Zeilen (INSERT in SQL) • Read: Anfragen (SELECT in SQL) • Update: Ändern (UPDATE in SQL) • Delete: Löschen (DELETE in SQL)
Der Fokus auf „Query“ (Anfrage) im Namen ist eventuell irreführend.
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 47
Datendefinition!!
(SQL DDL — Data Definition Language)
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 48
Datendefinition für eine Tabelle
CREATE TABLE company (!
! id INTEGER PRIMARY KEY,!
! name VARCHAR(100) UNIQUE NOT NULL!
)
company (id INT, name STR)
Relationales Schema
SQL DDL
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 49
Mehr Details der Datendefinition
CREATE TABLE department (!
! id INTEGER PRIMARY KEY,!
! name VARCHAR(100) NOT NULL,!
! cid INTEGER NOT NULL,!
! did INTEGER,!
! FOREIGN KEY (cid) REFERENCES company(id),!
! FOREIGN KEY (did) REFERENCES department(id)!
)
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 50
Datendefinition für eine weitere Tabelle
CREATE TABLE employee (!! id INTEGER PRIMARY KEY,!! name VARCHAR(50) NOT NULL,!! address VARCHAR(50) NOT NULL,!! salary DOUBLE NOT NULL,! manager BOOL NOT NULL,!! cid INTEGER NOT NULL,!! did INTEGER NOT NULL,!! FOREIGN KEY (cid) REFERENCES company(id),!! FOREIGN KEY (did) REFERENCES department(id)!)
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 51
Zusammenfassung zu SQL DDL
CREATE TABLE!
INTEGER, VARCHAR(…), DOUBLE, BOOL!
NOT NULL, UNIQUE!
PRIMARY / FOREIGN KEY … REFERENCES
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite
Gliederung1. Einführung
2. Das Relationale Modell
3. Datendefinition (SQL DDL)
4. Datenmanipulation (SQL DML)!
5. Eingebettete Programmierung
6. Objektrelationale Abbildung
7. … ?
52
softlang.wikidot.com/course:dbintro
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 53
Datenmanipulation!!
(SQL DML — Data Manipulation Language)
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 54
CRUD
• C: Create (Insert in SQL)
• R: Read (Select in SQL)
• U: Update (Update in SQL)
• D: Delete (Delete in SQL)
CRUD ist älter als SQL. CREATE im Sinne von SQL ist nicht das CREATE im Sinne von CRUD.
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 55
CRUD (CREATE)
INSERT INTO company (name) VALUES ("Acme Corporation")
Füge eine Firma in die Tabelle „Company“ ein.
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 56
CRUD (CREATE)
INSERT INTO department (name,cid) VALUES ("Research",1) INSERT INTO department (name,cid) VALUES ("Development",1) ...
Füge Zeilen für verschiedene Abteilungen in die Tabelle
„Department“ ein.
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 57
CRUD (READ)
SELECT * FROM department
Selektiere alle Zeilen und Spalten von der Tabelle „Department“.
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 58
Demo von SQL DDL und einfachsten Anfragen
http://101companies.org/wiki/Contribution:mySqlMany
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 59
CRUD (READ)
SELECT name, salary FROM employee
Projektion: Liste die Spalten für Namen und Gehalt aus der Tabelle „Employee“
auf.
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 60
CRUD (READ)SELECT name, salary FROM employee WHERE manager = TRUE
Selektion: Auswahl der Zeilen von
Angestellten, welche Manager sind.
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 61
CRUD (READ)SELECT name, salary FROM employee ORDER BY salary
Die Sortierung der Zeilen erfolgt
aufsteigend nach Gehalt.
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 62
CRUD (READ)SELECT name, salary FROM employee ORDER BY salary ASC
Sortierung in aufsteigender
Ordnung
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 63
CRUD (READ)SELECT name, salary FROM employee ORDER BY salary DESC
Sortierung in absteigender
Ordnung
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 64
CRUD (READ)SELECT department.name, company.name FROM department, company WHERE cid = company.id
Führe ein „Join“ aus, um Namen für Abteilungen und Firmen zu kombinieren.
Das ist ein „Equi-Join“.
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 65
CRUD (READ)
SELECT d1.name, d2.name FROM department AS d1, department AS d2
Alle Kombinationen von Abteilungsnamen. Dieses
Beispiel ist vermutlich wenig sinnvoll.
Das ist ein „Cross-Join“.
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 66
CRUD (READ)
SELECT d1.name, d2.name FROM department AS d1, department AS d2 WHERE d1.did = d2.id
Das ist ein „Equi-Join“.
INNER JOIN: Zeige die übergeordnete Abteilung für jede Abteilung. (Wir verwenden auch Aliasing.)
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 67
CRUD (READ)SELECT d1.name, d2.name FROM department AS d1 INNER JOIN department AS d2 WHERE d1.did = d2.id
INNER JOIN: Zeige die übergeordnete Abteilung für jede Abteilung. (Wir verwenden auch Aliasing.)
Explizite Join-Notation
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 68
CRUD (READ)SELECT d1.name, d2.name FROM department AS d1 LEFT OUTER JOIN department AS d2 ON d1.did = d2.id
LEFT OUTER JOIN: Zeilen mit NULL-Schlüssel werden trotzdem gezeigt.
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 69
CRUD (READ)SELECT d1.name, d2.name FROM department AS d1 LEFT JOIN department AS d2 ON d1.did = d2.id
Optionales Schlüsselwort.
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite
INNER versus OUTER JOIN
70
Quelle: http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/
Zwei Beispieltabellen
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite
INNER JOIN
71
Quelle: http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/
Das Ergebnis enthält allein die passenden Zeilen aus beiden Tabellen.
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite
FULL OUTER JOIN
72
Quelle: http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/
Das Ergebnis enthält alle Zeilen aus beiden Tabellen.
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite
LEFT OUTER JOIN
73
Quelle: http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/
Das Ergebnis enthält die Zeilen der erste Tabelle und möglicherweise leere Spalten für die zweite Tabelle.
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite
LEFT OUTER JOIN mit WHERE
74
Quelle: http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/
Wir zeigen hier nur Zeilen mit passenden Zeilen aus der ersten Tabelle.
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite
FULL OUTER JOIN mit WHERE
75
Quelle: http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 76
CRUD (READ)
SELECT SUM(salary) FROM employee
Summiere die Gehälter aller Angestellten auf,
Das ist eine Aggregationsfunktion zur Summierung.
Resultat ist Zahl!
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 77
CRUD (READ)
SELECT SUM(salary) FROM employee WHERE cid = 1
Summiere nur die Gehälter von einer Firma auf.
Das ist eine Bedingung zu den Angestellten von Interesse.
Achtung: Unsere Beispieldaten benutzen ohnehin nur eine Firma. Resultat
ist Zahl!
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 78
CRUD (READ)
SELECT SUM(salary) FROM employee WHERE manager = true;
Summiere nur die Gehälter von Managern auf.
Das ist eine Bedingung zu den Angestellten von Interesse.Resultat
ist Zahl!
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 79
CRUD (READ)
SELECT SUM(salary) FROM employee WHERE cid = 1 AND manager = TRUE
Summiere nur die Gehälter von Managern aus einer Firma auf.
Wir kombinieren zwei Bedingungen.Resultat
ist Zahl!
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 80
CRUD (READ)
SELECT SUM(salary) FROM employee WHERE cid = (SELECT id FROM company WHERE name = "Acme Corporation")
Benutze eine verschachtelte Anfrage um den bekannten Namen einer Firma auf den Schlüsselwert abzubilden.
Resultat ist Zahl!
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 81
CRUD (READ)SELECT manager, SUM(salary) FROM employee GROUP BY manager
Eine Aggregation wird ermitteln für
Gruppen mit gemeinsamen Wert
für eine Spalte.
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 82
CRUD (UPDATE)
UPDATE employee SET salary = salary / 2
Halbiere alle Gehälter.
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 83
CRUD (UPDATE)
UPDATE employee SET salary = salary / 2 WHERE manager = TRUE
Schränke die betroffenen Angestellten ein.
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 84
Demo von SQL DML
http://101companies.org/wiki/Contribution:mySqlMany
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 85
https://github.com/101companies/101repo/tree/master/contributions/mySqlMany/scripts
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite
Gliederung1. Einführung
2. Das Relationale Modell
3. Datendefinition (SQL DDL)
4. Datenmanipulation (SQL DML)
5. Eingebettete Programmierung!
6. Objektrelationale Abbildung
7. … ?
86
softlang.wikidot.com/course:dbintro
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite
Eingebettete Programmierung!!
Die Verbindung zwischen SQL (relationalen Datenbanken) und
Programmierung in Java (und Cobol).
87 © 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite
Eingebettete Anfragen am Beispiel von „Total“
88
String-Repräsentation von SQL-Anfragen
Explizit Deklaration von Anfrageparametern
Vorüberprüfung der AnfrageEintragen des
Parameters
Ausführen der Anfrage
Iteration über die Antwort
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite
Wesentliche Typen im Umgang mit Eingebetteter Programmierung
• Connection: Verbindung zum Datenbanksystem
• (Prepapred)Statement: Repräsentation SQL-Anfragen
• ResultSet: Sequenzen von Resultaten (Zeilen als Felder)
• SQLException: Besondere Ausnahme in diesem Kontext
89 © 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite
Eingebettete Anfragen am Beispiel von „Cut“
90
Beim C, U, D von CRUD gibt es keine Resultatssequenz sondern
nur ein „Return code“.
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite
Server- versus Client-seitige Anfragen
91
Client-seitige Ausführung
Server-seitige Ausführung
Server- versus Client-seitige Anfragen
• Anfragen nach Möglichkeit auf dem Server
Minimierung des Datenvolumens für Übertragung
Möglichkeit der Optimierung auf dem Server
Quelle: http://www.codeproject.com/Articles/22839/SQL-Server-Interview-Questions-Part
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite
SQL-Einschleusung (SQL Injection)
• Modifikation der Intention einer parametrischen SQL-Anfragen durch Ausnutzung von Metazeichen / Maskierung mittels Nutzereingaben.
• Beispiel (Quelle: http://en.wikipedia.org/wiki/SQL_injection):
• Anzeige von Nutzerdetails:
• "SELECT * FROM users WHERE name ='" + userName + „';"
• Möglicher aktueller Parameter userName:
• ' or '1'='1
93
Damit wird Information über ALLE Nutzer preisgegeben anstatt über einen bestimmten Nutzer.
Ähnlich kann man ein „DROP TABLE“ injizieren.
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 94
Demo von SQL DML
http://101companies.org/wiki/Contribution:simplejdbc
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 95
https://github.com/101companies/101simplejava/tree/master/contributions/simplejdbc
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite
Gliederung1. Einführung
2. Das Relationale Modell
3. Datendefinition (SQL DDL)
4. Datenmanipulation (SQL DML)
5. Eingebettete Programmierung
6. Objektrelationale Abbildung!
7. … ?
96
softlang.wikidot.com/course:dbintro
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite
Objektrelationale Abbildung!!
Datenmanagement allein auf der OO-Ebene etwa mit Persistenz vermöge gekoppelter (abgebildeter) Tabellen.
97 © 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 98
Abbildung zwischen O/R/X
Tabellen
Objekte
XML
Das ist nicht wirklich ein Dreieck. Beispiele: Cobol and JSON
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 99
Interplanetarische Reisen zwischen den technologischen Räumen SQLware und Javaware
Quelle: http://www.nasa.gov/images/content/63114main_highway_med.jpg
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 100
Sesame
XMIModelwareXMLware
JavawareJDBC
Dataware
JDOM
Ontoware
JenaHibernate
EMF.genJMITeneo JAXB
JPA
Technologien für die Raumfahrt
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite
Warum ist (technologische) Raumfahrt eine Herausforderung?
• Verschiedene Terminologien und Koventionen
• Verschiedene Berechnungsmodelle und Typsysteme
• Abhängigkeit von konkreten Sprachen und Technologien
• Unnötige Komplexität
• …
101
Stichworte: „Impedance
mismatch“ oder „Vietnam
of Computer Science“
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite
Zur Erinnerung: Ein Objektmodell für Firmen
102
public class Company { private String name; private List<Department> depts = new LinkedList<Department>(); public String getName() { return name; } public void setName(String name) { this.name = name; } public List<Department> getDepts() { return depts; }}!public class Department { ... }!public class Employee { ... }
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite
Zum Vergleich: Ein XML-Schema für Firmen
103
<xs:element name="company"> <xs:complexType> <xs:sequence> <xs:element ref="name"/> <xs:element maxOccurs="unbounded" minOccurs="0"
ref="department"/> </xs:sequence> </xs:complexType> </xs:element>! <xs:element name="department"> ... </xs:element> ! <xs:complexType name="employee"> ... </xs:complexType>
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite
Zum Vergleich: Ein relationales Schema
104
CREATE TABLE company (!
! id INTEGER PRIMARY KEY,!
! name VARCHAR(100) UNIQUE NOT NULL!
)!
CREATE TABLE department ( ... )!
CREATE TABLE employee ( ... )Im Vergleich zum
Objektmodell: Abteilungen referenzieren die Firma und nicht umgekehrt.
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite
Ziel• Persistieren von Objekten in einer Datenbank
• Abbilden von Objektmodellen auf relationale Schemata
• Abbilden von relationalen Schemata auf Objektmodelle
• Vermittlung zwischen Modellen/Schemata beidseitig
105 © 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 106
Persistenz (am Beispiel von Hibernate/JPA)
Fähigkeiten!
Speicherung von Objekten in der DB; eine Zeile pro Objekt.!
Reaktivierung von Objekten in späteren Programmläufen.
http://www.hibernate.org
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 107
Die Architektur von Hibernate
Quelle: http://www.up.ac.za/services/it/intranet/sysops/docs/hibernate/HibernateSingleHTML.htm
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 108
Eine persistierbare Klasse (POJO)
public class Cat { private String id; private String name; private char sex; private float weight; public String getId() { return id; } private void setId(String id) { this.id = id; } // … other getters and setters … }
Verwendung für Primärschlüssel
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 109
Metadaten für Abbildung
<hibernate-mapping> <class name=“Cat" table="CAT“> <id name="id" type="string" unsaved-value="null" > <column name="CAT_ID" sql-type="char(32)" not-null="true"/> <generator class="uuid.hex"/> </id> <property name="name“> <column name="NAME" length="16" not-null="true"/> </property> <property name="sex"/> <property name="weight"/> </class> </hibernate-mapping>
Bilde Java-Strings auf
SQL-Strings ab.
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 110
Die resultierende Tabelle
! Column | Type | Modifiers --------+-----------------------+----------- cat_id | character(32) | not null name | character varying(16) | not null sex | character(1) | weight | real | !Index: cat_pkey primary key btree (cat_id)
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 111
Eine Hibernate-„Sitzung“ in einem Java-Programm
Session session = HibernateUtil.currentSession(); Transaction tx= session.beginTransaction(); !Cat princess = new Cat(); princess.setName("Princess"); princess.setSex('F'); princess.setWeight(7.4f); !session.save(princess); tx.commit(); HibernateUtil.closeSession();
Registrierung eines Objektes für Persistenz
Regulärer OO-Code
Beginn einer Transaktion
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 112
Query query = session.createQuery( "select c from Cat as c where c.sex = :sex"); query.setCharacter("sex", 'F'); for (Iterator it = query.iterate(); it.hasNext();) { Cat cat = (Cat) it.next(); out.println("Female Cat: " + cat.getName() ); }
Verwendung von Anfragen zur Herstellung von Objekten
Es kommt hier HQL (Hibernate Query Language) zum Einsatz. HQL ist sehr ähnlich zu SQL.
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 113
Demo von Hibernate für das 101companies-Projekt
101companies.org/wiki/Contribution:hibernate
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 114
Konfiguration von Hibernate
Aufrufbeispiele
Verzeichnis mit HSQLDB-DB
Objektmodell mit Abbildungsdateien
SQL-Dateien mit relationalem Schema und Beispieldaten
Typische Funktionalität
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 115
Eine POJO-Klassepublic class Employee {! private long id; private String name; private String address; private double salary; private boolean manager;! public long getId() { return id; } @SuppressWarnings("unused") private void setId(long id) { this.id = id; }...
}
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 116
Abbildung für Angestellte
<hibernate-mapping>
<class name="org.softlang.company.Employee" table="EMPLOYEE">
<id name="id" column="ID"> <generator class="native" /> </id>
<property name="name" /> <property name="address" /> <property name="salary" /> <property name="manager" />
</class>
</hibernate-mapping>
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 117
Abbildung für Abteilungen<hibernate-mapping>
<class name="org.softlang.company.Department" table="DEPARTMENT"> <id name="id" column="ID"> <generator class="native" /> </id>
<property name="name" />
<set name="employees" cascade="all"> <key column="DEPT_ID" /> <one-to-many class="org.softlang.company.Employee" /> </set>
<set name="subdepts" cascade="all"> <key column="DEPT_ID" /> <one-to-many class="org.softlang.company.Department" /> </set>
</class>
</hibernate-mapping>
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite 118
Konfiguration von Hibernate
<hibernate-configuration> <session-factory> <!-- Database connection settings. --> <property name="connection.driver_class">org.hsqldb.jdbcDriver</property> <property name="connection.url">jdbc:hsqldb:hsql://localhost</property> <property name="connection.username">sa</property> <property name="connection.password"></property>
<!-- SQL dialect --> <property name="dialect">org.hibernate.dialect.HSQLDialect</property>
<!-- Create the database schema, if needed; update otherwise --> <property name="hbm2ddl.auto">update</property>
<!-- Mapping files in the project --> <mapping resource="org/softlang/company/Company.hbm.xml" /> <mapping resource="org/softlang/company/Department.hbm.xml" /> <mapping resource="org/softlang/company/Employee.hbm.xml" />
... </session-factory></hibernate-configuration>
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite
Auslassungen• ER-Modell
• Trigger
• Gespeicherte Prozeduren
• Transaktionen
• No-SQL
• OO-Datenbanken
• Datenbanken im Kontext von WebApps
119 © 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-LandauSeite
Danke für Ihre Aufmerksamkeit und Teilnahme. Bitte evaluieren
Sie dieses Seminar.
120
Ihr SOFTLANG Team. Prof. Dr. R. Lämmel
http://softlang.wikidot.com/startseite
softlang.wikidot.com/course:dbintro