CRUD - Index of

Werbung
softlang.wikidot.com/course:dbintro
http://softlang.wikidot.com/course:dbintro
Grundlagen
relationaler Datenbanken
SOFTLANG Team, Universität Koblenz-Landau
http://softlang.wikidot.com/startseite
Prof. Dr. R. Lämmel
Gliederung
1. Einführung!
2. Das Relationale Modell
3. Datendefinition (SQL DDL)
4. Datenmanipulation (SQL DML)
5. Eingebettete Programmierung
6. Objektrelationale Abbildung
7. … ?
Seite
1
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Seite
2
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Einführung
Technologische Räume!
•
SQLware als ein Technologischer Raum
•
Das 101companies-Projekt als didaktische Hilfe
•
Befragung der Seminarteilnehmer
Seite
3
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
!
SQLware ist ein technologischer Raum.
Es ist einer von vielen.
Seite
4
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Technologischer Raum = Technologie
mit gemeinschaftlichen IT-Kontext
Bestandteile eines technologischen Raumes
•
Anwendungsszenarien
•
Programmiersprachen
•
Datenrepräsentationsformate
•
Entwicklungswerkzeuge wie Compiler oder IDEs
•
Laufzeitwerkzeuge wie Bibliotheken
•
Anfrage- und Transformationssprachen
•
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
•
Lehrbücher und andere Wissensquellen der Gemeinschaft
•
RDFware
— Semantic Web und Linked Data
•
…
Seite
5
Unterteilung der technologischen
Räume nach dem „Daten“paradigma
•
•
•
Seite
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
6
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Bäume versus Tabellen versus Graphen
XML für
eine Firma
Tabellen!
•
Relationale Tabelle (SQL)
•
Schlüsselindizierte Dateien (Cobol)
Bäume!
Es gibt auch „Tricks“, um
in XML und JSON mit
Graphen zu arbeiten.
•
XML-Bäume
•
JSON-Bäume
•
Algebraische Terme (etwa in Haskell und F# und Skala)
Graphen!
http://en.wikipedia.org/wiki/
File:PSM_V18_D630_Restoration
_of_a_lepidodendron.jpg
•
Objektgraphen (etwa in Java)
•
Modelle (etwa Objektdiagramme in UML)
Seite
7
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Seite
8
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Bäume versus Tabellen versus Graphen
Bäume versus Tabellen versus Graphen
Tabellen für
eine Firma
:Company
Employee
Id
Name
Address
Salary
Manager
Department
1
Craig
Redmond
123456
TRUE
42
2
Erik
Utrecht
12345
FALSE
42
3
Ralf
Koblenz
1234
FALSE
42
…
…
…
…
…
…
ACME Corporation
Departments
[o,…]
Objektgraph
für eine Firma
:Department
Fremdschlüssel
Zeiger
Department
Research
Name
Departments
[…]
Employees
[o, o, o]
Company
:Employee
:Employee
:Employee
Id
Name
Department
Company
Id
Name
42
Research
NULL
88
88
ACME Corporation
Name
Craig
Name
Erik
Name
Ralf
43
Development
NULL
88
…
…
Address
Redmond
Address
Utrecht
Address
Koblenz
44
Dev1
43
88
Salary
123456
Salary
12345
Salary
1234
…
…
…
…
Manager
TRUE
Manager
FALSE
Manager
FALSE
Seite
9
Seite
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Unterteilung der technologischen Räume
nach dem „Programmier“paradigma
•
Prozedural (z.B. Cobol)
•
OO (z.B. Java)
•
Deklarativ
http://de.wikipedia.org/wiki/
Programmierparadigma
3.Juni 2014
•
Funktional (z.B. F#)
•
Logisch (z.B. Prolog)
•
Name
Algebraisch (z.B. SQL)
•
Modell-basiert (z.B. UML)
•
Multi-Paradigma
Seite
11
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äsentation von statischen (wie
beispielsweise Objekte, Methoden, Variablen,
Konstanten) und dynamischen (wie
beispielsweise Zuweisungen, Kontrollfluss,
Datenfluss) Programmelementen.
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
10
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Das OO-Paradigma
•
Objekte kapseln Zustand (Daten)
und Verhalten (Methoden).
•
Objekte haben eine Schnittstelle =
aufrufbare Methoden.
•
•
Methode1
Daten Methode2
Allein die Methoden greifen auf die
Daten zu.
Neue Objekte können instanziiert
werden mittels Klasse bzw. Prototyp.
Seite
12
Me
a
ss
ge
Methodenauswahl
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Objekte als Abstraktion von
physischen oder virtuellen Entitäten
Jedes Ding ist ein Objekt!
•
Type of object
Values
Attribute
: Person
Birthday: 15.12.68
Name: Lämmel
First: Ralf
Abstraction
program
eat
Methods
Seite
13
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
Seite
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Einführendes Beispiel: Wir wollen die Struktur für eine Anwendung
im Personalwesen modellieren.
Unter
sc
Objek heidung v
on
ten in
Entwu Analyse,
r
f und
Imple
menta
tion.
14
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
UML-Klassendiagramm für die
Unternehmensstruktur
Unternehmen
MSFT
HR
Unter-
abteilungen
Angestellte
Abteilungen
Dev
Paul
Teil-GanzesBeziehung
VB
C#
Erik
Anders
Wir sehen auch
Methoden vor: „total“
zum Gehaltssummieren
und „cut“ zum Halbieren.
Seite
15
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Ausgewählte
Methoden
http://101companies.org/wiki/
Contribution:argoUML
Seite
16
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Eine Java-Klasse I/II
Eine Java-Klasse II/II
public class Department {
public class Department {
private
private
private
private
public
public
public
public
public
public
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;
}
String name;
Employee manager;
List<Department> subdepts = new LinkedList<Department>();
List<Employee> employees = new LinkedList<Employee>();
String getName() { return name; }
void setName(String name) { this.name = name; }
Employee getManager() { return manager; }
void setManager(Employee manager) { this.manager = manager; }
List<Department> getSubdepts() { return subdepts; }
List<Employee> getEmployees() { return employees; }
public void cut() {
getManager().cut();
for (Department s : getSubdepts())
s.cut();
for (Employee e : getEmployees())
e.cut();
}
// Methods omitted
}
Getter und Setter für
Datenzugriff
Nächste Folie
Seite
17
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Vorige Folie
// State omitted
Privater Zustand
Steige in Objekt und
aggregiere Gehälter
Steige auch ab, aber
modifiziere Gehälter
}
Seite
18
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Anforderungen an SQLware
Im Gegensatz zu Cobol und Java
•
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
Im Gegensatz zu (Basis-) OOP
101companies!
!
Im Gegensatz zu XML
Didaktische Verwendung eines Projektes der
AG Softwaresprachen in diesem Seminar.
Im Gegensatz zu OOP
Im Gegensatz zu OOP und Cobol.
Dies ist die Basis von Optimierungen.
Seite
19
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Seite
20
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Verwendung des 101companies-Projektes
Was ist das 101companies Projekt?
(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
Seite
21
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Warum der Name „101companies“?
Company X:
Cobol
!
!
Company
Y:
! + Hibernate
Java + Swing
! !
!
Company
Z:
!
Python + Django
+ HTML5
! !
!
!
!
!
!
!
!
Company X:
Cobol
!
!
Company
Y:
! + Hibernate
Java + Swing
! !
Eine Wissensbasis zu Programmier- bzw.
Softwaretechnologien, -techniken, und -
!
Company
Z:
!
Python + Django
+ HTML5
! !
!
!
!
!
!
!
!
...
Seite
22
23
beispielhaften Implementation bzw.
Modellierung eines Informationssystems
für das Personalwesen.
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Ein Informationssystem für das Personalwesen
Aus dem Englischen:
„101 ways of doing something“
Features!
• „total“: Gehälter summieren
• „cut“: Gehälter halbieren
• Nutzerinterface
• Persistenz in der Datenbank
• …
...
Seite
sprachen — auf der Basis der
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Seite
24
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Demo
http://101companies.org/wiki/
Contribution:cobol
Ein paar Zahlen zum Projekt „101“
8
#Files per implementation Technologies
Languages
LOC per implementation
442
Seite
25
Seite
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Fragebogen
26
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
softlang.wikidot.com/course:dbintro
Gliederung
•
Wer ist im technologischen Raum Cobolware unterwegs?
•
Wer hat schon nennenswert SQL-Anfragen benutzt?
•
Wen interessiert die Verbindung Datenbank und OOP?
2. Das Relationale Modell!
•
… die Verbindung Datenbank und WebApp?
3. Datendefinition (SQL DDL)
•
… NoSQL anstatt allein SQL?
4. Datenmanipulation (SQL DML)
•
… fortgeschrittene SQL-Themen wie Trigger und Gespeicherte Prozeduren?
5. Eingebettete Programmierung
•
…
Eine
V
der S orstellung
s
emin
arteil runde
nehm
er?
Seite
27
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
1. Einführung
6. Objektrelationale Abbildung
7. … ?
Seite
28
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Relationen (Tabellen)
Das Relationale Modell!
!
Grundlage der relationalen Datenbanken.
Grundlage des technologischen Raumes SQLware.
Relation (Tabelle)!
Vertikal: Menge von Tupeln (“Zeilen”)!
Horizontal: Menge von Spalten!
Jede Zelle ist von einem primitiven Typ: !
Zeichenkette (String)!
Zahlen (INTEGER, DOUBLE, …)
Seite
29
Seite
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
30
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Relationale Schemata zur
Definition der Tabellenstruktur
Relationale Schemata zur
Definition der Tabellenstruktur
company (id INT, name STR)!
company (id INT, name STR)!
department (id INT, name STR, cid INT, did INT)!
department (id INT, name STR, cid INT, did INT)!
employee (id INT,!! ! ! ! ! ! ! ! ! ! ! !
! name STR, address STR, salary NUM, manager BOOL,!
! 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.
Seite
31
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Vari
ante
Die Firma eines Angestellten ist
auch über die Zuordnung zu einer
Abteilung repräsentiert.
Seite
32
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Relationale Schemata zur
Definition der Tabellenstruktur
Relationale Algebra zur
„Berechnung“ neuer Tabellen
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)
Vari
a
Der Manager einer Abteilung kann
auch über die Abteilung direkt
beschrieben werden.
nte
Seite
33
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Projektion
(Wähle Spalten aus.)
Seite
35
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Projektion (Wähle Spalten aus.)!
Selektion (Wähle Zeilen aus.)!
Join (Füge zwei Tabellen horizontal zusammen.)
Seite
34
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Selektion
(Wähle Zeilen aus.)
Seite
36
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Join
(Füge zwei Tabellen horizontal zusammen.)
Company Name
ACME Corporation
ACME Corporation
ACME Corporation
ACME Corporation
ACME Corporation
ACME Corporation
ACME Corporation
Normalformen!
!
Vermeidung von Redundanzen.
Vermeidung von Problemen bei CRUD.
Unterstützung der Datenintegrität.
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.
Seite
37
Seite
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
38
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Probleme bei fehlender Normalisierung
Erste Normalform (1NF)
Quelle: http://www.studytonight.com/dbms/database-normalization.php
Quelle: http://www.studytonight.com/dbms/database-normalization.php
Alle Zellen enthalten nur atomare Daten.
Es gibt keine Wiederholungsgruppen von Spalten.
Nicht in 1NF
•
•
•
Ä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.
Seite
39
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
In 1NF
Primärschlüssel
sei dies:
Student, Subject
Seite
40
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Zweite Normalform (2NF)
Zweite Normalform (2NF)
Quelle: http://www.studytonight.com/dbms/database-normalization.php
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.
Es liegt 1NF vor.
Es hängt kein Nichtschlüsselattribut funktional ab von einem Teil des Schlüssels.
Nicht In 2NF
In 2NF
„Age“ hängt allein von „Student“ ab.
(Es hängt nicht von „Subject“ ab.)
Seite
41
Primärschlüssel
ist noch dies:
Student, Subject
Extra Tabelle
Seite
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Dritte Normalform (3NF)
42
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
softlang.wikidot.com/course:dbintro
Quelle: http://www.studytonight.com/dbms/database-normalization.php
Gliederung
Es liegt 2NF vor.
Es gibt keine transitiven funktionalen Abhängigkeiten.
1. Einführung
Tabelle Student_Detail (Nicht in 3NF)
2. Das Relationale Modell
„State“ und eventuell auch „Street“
und „city“ hängen von „Zip“ ab.
Tabelle Student_Detail (In 3NF)
3. Datendefinition (SQL DDL)!
4. Datenmanipulation (SQL DML)
5. Eingebettete Programmierung
Eine extra Tabelle mit Zip, … als
primärem Schlüssel
Tabelle Address (Zusätzlich)
6. Objektrelationale Abbildung
7. … ?
Seite
43
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Seite
44
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
SQL (Structured Query Language)
http://101companies.org/wiki/Language:SQL
•
Der Fokus auf „Query“ (Anfrage) im
Namen ist eventuell irreführend.
Teile von SQL
SQL (Structured Query Language)!
•
Datendefinition („Definiere relationale Schemata.“)
!
•
Datenmanipulation
Die Datendefinitions-, Anfrage-, und
Transformationssprache des
technologischen Raumes SQLware.
Seite
45
•
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)
Seite
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
46
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Datendefinition für eine Tabelle
Relationales Schema
company (id INT, name STR)
Datendefinition!
SQL DDL
!
(SQL DDL — Data Definition Language)
CREATE TABLE company (!
!
id INTEGER PRIMARY KEY,!
!
name VARCHAR(100) UNIQUE NOT NULL!
)
Seite
47
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Seite
48
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Mehr Details der Datendefinition
Datendefinition für eine weitere Tabelle
CREATE TABLE employee (!
CREATE TABLE department (!
!
id INTEGER PRIMARY KEY,!
!
id INTEGER PRIMARY KEY,!
!
name VARCHAR(50) NOT NULL,!
!
name VARCHAR(100) NOT NULL,!
!
address VARCHAR(50) NOT NULL,!
!
cid INTEGER NOT NULL,!
!
salary DOUBLE NOT NULL,!
!
did INTEGER,!
manager BOOL NOT NULL,!
!
cid INTEGER NOT NULL,!
!
FOREIGN KEY (cid) REFERENCES company(id),!
!
did INTEGER NOT NULL,!
!
FOREIGN KEY (did) REFERENCES department(id)!
!
FOREIGN KEY (cid) REFERENCES company(id),!
!
FOREIGN KEY (did) REFERENCES department(id)!
)
)
Seite
49
Seite
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
50
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
softlang.wikidot.com/course:dbintro
Zusammenfassung zu SQL DDL
Gliederung
1. Einführung
2. Das Relationale Modell
CREATE TABLE!
3. Datendefinition (SQL DDL)
INTEGER, VARCHAR(…), DOUBLE, BOOL!
NOT NULL, UNIQUE!
PRIMARY / FOREIGN KEY … REFERENCES
4. Datenmanipulation (SQL DML)!
5. Eingebettete Programmierung
6. Objektrelationale Abbildung
7. … ?
Seite
51
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Seite
52
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
CRUD
Datenmanipulation!
•
C: Create (Insert in SQL)
!
•
R: Read (Select in SQL)
•
U: Update (Update in SQL)
•
D: Delete (Delete in SQL)
(SQL DML — Data Manipulation Language)
Seite
53
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
CRUD (CREATE)
INSERT INTO company (name) VALUES ("Acme Corporation")
Füge eine Firma in die
Tabelle „Company“ ein.
Seite
55
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Seite
54
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-Landau
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.
Seite
56
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
CRUD (READ)
SELECT * FROM department
Demo von SQL DDL und
einfachsten Anfragen
http://101companies.org/wiki/
Contribution:mySqlMany
Selektiere alle Zeilen und Spalten
von der Tabelle „Department“.
Seite
57
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
CRUD (READ)
SELECT name, salary FROM employee
Seite
58
CRUD (READ)
SELECT name, salary FROM employee
WHERE manager = TRUE
Projektion: Liste die
Spalten für Namen
und Gehalt aus der
Tabelle „Employee“
auf.
Seite
59
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Selektion: Auswahl
der Zeilen von
Angestellten, welche
Manager sind.
Seite 60
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
CRUD (READ)
CRUD (READ)
SELECT name, salary FROM employee
ORDER BY salary
SELECT name, salary FROM employee
ORDER BY salary ASC
Die Sortierung der
Zeilen erfolgt
aufsteigend nach
Gehalt.
Seite 61
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
CRUD (READ)
SELECT name, salary FROM employee
ORDER BY salary DESC
Sortierung in
aufsteigender
Ordnung
Seite 62
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
CRUD (READ)
SELECT department.name, company.name FROM department, company
WHERE cid = company.id
Das ist ein
„Equi-Join“.
Sortierung in
absteigender
Ordnung
Führe ein „Join“ aus, um Namen für
Abteilungen und Firmen zu kombinieren.
Seite 63
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Seite
64
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
CRUD (READ)
CRUD (READ)
SELECT d1.name, d2.name
SELECT d1.name, d2.name
FROM department AS d1, department AS d2
FROM department AS d1, department AS d2
WHERE d1.did = d2.id
Das ist ein
„Equi-Join“.
Das ist ein
„Cross-Join“.
Alle Kombinationen von
Abteilungsnamen. Dieses
Beispiel ist vermutlich
wenig sinnvoll.
Seite
65
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
CRUD (READ)
INNER JOIN: Zeige die übergeordnete Abteilung
für jede Abteilung. (Wir verwenden auch Aliasing.)
Seite
66
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
CRUD (READ)
SELECT d1.name, d2.name
SELECT d1.name, d2.name
FROM department AS d1
FROM department AS d1
INNER JOIN department AS d2
LEFT OUTER JOIN department AS d2
WHERE d1.did = d2.id
Explizite JoinNotation
ON d1.did = d2.id
LEFT OUTER JOIN:
Zeilen mit NULLSchlüssel werden
trotzdem gezeigt.
INNER JOIN: Zeige die übergeordnete Abteilung
für jede Abteilung. (Wir verwenden auch Aliasing.)
Seite
67
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Seite
68
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
CRUD (READ)
SELECT d1.name, d2.name
FROM department AS d1
LEFT JOIN department AS d2
INNER versus OUTER JOIN
Quelle: http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/
Zwei Beispieltabellen
ON d1.did = d2.id
Optionales
Schlüsselwort.
Seite
69
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Seite
70
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
INNER JOIN
FULL OUTER JOIN
Quelle: http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/
Quelle: http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/
Das Ergebnis enthält allein die
passenden Zeilen aus beiden Tabellen.
Das Ergebnis enthält alle Zeilen aus
beiden Tabellen.
Seite
71
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Seite
72
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
LEFT OUTER JOIN
LEFT OUTER JOIN mit WHERE
Quelle: http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/
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.
Wir zeigen hier nur Zeilen mit passenden Zeilen aus
der ersten Tabelle.
Seite
73
Seite
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
FULL OUTER JOIN mit WHERE
74
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
CRUD (READ)
Quelle: http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/
SELECT SUM(salary) FROM employee
Das ist eine Aggregationsfunktion
zur Summierung.
Resultat
ist Zahl!
Summiere die Gehälter aller
Angestellten auf,
Seite
75
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Seite
76
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
CRUD (READ)
CRUD (READ)
SELECT SUM(salary) FROM employee
SELECT SUM(salary) FROM employee
WHERE cid = 1
WHERE manager = true;
Das ist eine Bedingung zu den
Angestellten von Interesse.
Achtung: Unsere Beispieldaten
benutzen ohnehin nur eine Firma.
Resultat
ist Zahl!
Summiere nur die Gehälter
von Managern auf.
Summiere nur die Gehälter
von einer Firma auf.
Seite
77
Seite
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
CRUD (READ)
SELECT SUM(salary) FROM employee
WHERE cid = 1 AND manager = TRUE
Wir kombinieren zwei
Bedingungen.
Resultat
ist Zahl!
Summiere nur die Gehälter von
Managern aus einer Firma auf.
Seite
79
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Das ist eine Bedingung zu den
Angestellten von Interesse.
Resultat
ist Zahl!
78
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
CRUD (READ)
SELECT SUM(salary) FROM employee
WHERE cid = (SELECT id FROM company
WHERE name = "Acme Corporation")
Resultat
ist Zahl!
Benutze eine verschachtelte
Anfrage um den bekannten
Namen einer Firma auf den
Schlüsselwert abzubilden.
Seite
80
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
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.
Seite 81
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
CRUD (UPDATE)
UPDATE employee
SET salary = salary / 2
Halbiere alle Gehälter.
Seite
82
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
CRUD (UPDATE)
UPDATE employee
SET salary = salary / 2
WHERE manager = TRUE
Schränke die betroffenen
Angestellten ein.
Seite
83
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Demo von SQL DML
http://101companies.org/wiki/
Contribution:mySqlMany
Seite
84
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
softlang.wikidot.com/course:dbintro
Gliederung
1. Einführung
2. Das Relationale Modell
3. Datendefinition (SQL DDL)
4. Datenmanipulation (SQL DML)
5. Eingebettete Programmierung!
6. Objektrelationale Abbildung
https://github.com/101companies/101repo/tree/master/contributions/mySqlMany/scripts
Seite
85
7. … ?
Seite
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
86
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Eingebettete Anfragen
am Beispiel von „Total“
Eingebettete Programmierung!
String-Repräsentation
von SQL-Anfragen
Explizit Deklaration von
Anfrageparametern
!
Die Verbindung zwischen SQL
(relationalen Datenbanken) und
Programmierung in Java (und Cobol).
Eintragen des
Parameters
Iteration über
die Antwort
Seite
87
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Vorüberprüfung
der Anfrage
Ausführen der
Anfrage
Seite
88
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Eingebettete Anfragen
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
Seite
89
am Beispiel von „Cut“
Beim C, U, D von CRUD gibt es
keine Resultatssequenz sondern
nur ein „Return code“.
Seite
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Server- versus Client-seitige Anfragen
90
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
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
Client-seitige Ausführung
Server-seitige Ausführung
Quelle: http://www.codeproject.com/Articles/22839/SQL-Server-Interview-Questions-Part
Seite
91
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
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:
•
•
Demo von SQL DML
"SELECT * FROM users WHERE name ='" + userName + „';"
http://101companies.org/wiki/
Contribution:simplejdbc
Möglicher aktueller Parameter userName:
•
' or '1'='1
Damit wird Information über ALLE Nutzer
preisgegeben anstatt über einen bestimmten Nutzer.
Ähnlich kann man ein „DROP TABLE“ injizieren.
Seite
93
Seite
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
94
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
softlang.wikidot.com/course:dbintro
Gliederung
1. Einführung
2. Das Relationale Modell
3. Datendefinition (SQL DDL)
4. Datenmanipulation (SQL DML)
5. Eingebettete Programmierung
6. Objektrelationale Abbildung!
https://github.com/101companies/101simplejava/tree/master/contributions/simplejdbc
Seite
95
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
7. … ?
Seite
96
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Abbildung zwischen O/R/X
Objekte
Objektrelationale Abbildung!
!
Datenmanagement allein auf der OOEbene etwa mit Persistenz vermöge
gekoppelter (abgebildeter) Tabellen.
Tabellen
XML
Das ist nicht wirklich ein Dreieck.
Beispiele: Cobol and JSON
Seite
97
Seite
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Interplanetarische Reisen zwischen den
technologischen Räumen SQLware und Javaware
98
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Technologien für die Raumfahrt
XMI
Modelware
Teneo
XMLware
JAXB
JMI
EMF.gen
JDOM
Sesame
Dataware
Ontoware
JDBC
Hibernate JPA
Javaware
Jena
Quelle: http://www.nasa.gov/images/content/63114main_highway_med.jpg
Seite
99
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Seite 100
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
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
•
…
Seite 101
Zur Erinnerung: Ein Objektmodell für Firmen
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 { ... }
!
nce
peda am
m
I
„
:
n
worte
„Viet
Stich ch“ oder ence“
t
i
a
c
mism mputer S
of Co
public class Employee { ... }
Seite 102
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Zum Vergleich: Ein relationales Schema
Zum Vergleich: Ein XML-Schema für Firmen
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
<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>
CREATE TABLE company (!
!
CREATE TABLE employee ( ... )
<xs:element name="department"> ... </xs:element> !
id INTEGER PRIMARY KEY,!
!
name VARCHAR(100) UNIQUE NOT NULL!
)!
CREATE TABLE department ( ... )!
!
<xs:complexType name="employee"> ... </xs:complexType>
Seite 103
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Seite 104
Im Vergleich zum
Objektmodell: Abteilungen
referenzieren die Firma
und nicht umgekehrt.
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Ziel
•
Persistieren von Objekten in einer Datenbank
•
Abbilden von Objektmodellen auf relationale Schemata
•
Abbilden von relationalen Schemata auf Objektmodelle
•
Vermittlung zwischen Modellen/Schemata beidseitig
Persistenz
(am Beispiel von Hibernate/JPA)
http://www.hibernate.org
Fähigkeiten!
Speicherung von Objekten in der DB; eine Zeile pro Objekt.!
Reaktivierung von Objekten in späteren Programmläufen.
Seite 105
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Die Architektur von Hibernate
Seite 106
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
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
Quelle: http://www.up.ac.za/services/it/intranet/sysops/docs/hibernate/HibernateSingleHTML.htm
Seite 107
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Seite 108
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
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>
Bilde JavaStrings auf
<property name="name“>
SQL-Strings ab.
<column name="NAME" length="16" not-null="true"/>
</property>
<property name="sex"/>
<property name="weight"/>
</class>
</hibernate-mapping>
Seite 109
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Eine Hibernate-„Sitzung“ in
einem Java-Programm
Session session = HibernateUtil.currentSession();
Transaction tx= session.beginTransaction();
Beginn einer
Transaktion
!
Cat princess = new Cat();
princess.setName("Princess");
princess.setSex('F');
princess.setWeight(7.4f);
Regulärer OOCode
!
session.save(princess);
tx.commit();
HibernateUtil.closeSession();
Seite 111
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)
Seite 110
Verwendung von Anfragen zur Herstellung von Objekten
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() );
}
Registrierung
eines Objektes
für Persistenz
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Es kommt hier HQL (Hibernate
Query Language) zum Einsatz.
HQL ist sehr ähnlich zu SQL.
Seite 112
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Verzeichnis mit HSQLDB-DB
Konfiguration von Hibernate
Demo von Hibernate für
das 101companies-Projekt
Aufrufbeispiele
Objektmodell mit
Abbildungsdateien
101companies.org/wiki/
Contribution:hibernate
Typische Funktionalität
SQL-Dateien mit relationalem
Schema und Beispieldaten
Seite 113
Seite 114
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Eine POJO-Klasse
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Abbildung für Angestellte
public class Employee {
!
private
private
private
private
private
long id;
String name;
String address;
double salary;
boolean manager;
!
public long getId() {
return id;
}
@SuppressWarnings("unused")
private void setId(long id) {
this.id = id;
}
...
}
Seite 115
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
<hibernate-mapping>
<class name="org.softlang.company.Employee" table="EMPLOYEE">
<id name="id" column="ID">
<generator class="native" />
</id>
<property
<property
<property
<property
name="name" />
name="address" />
name="salary" />
name="manager" />
</class>
</hibernate-mapping>
Seite 116
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Abbildung für Abteilungen
<hibernate-mapping>
Konfiguration von Hibernate
<class name="org.softlang.company.Department" table="DEPARTMENT">
<id name="id" column="ID">
<generator class="native" />
</id>
<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>
<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>
<!-- 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>
</class>
</hibernate-mapping>
Seite 117
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Auslassungen
Seite 118
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
softlang.wikidot.com/course:dbintro
Danke für Ihre Aufmerksamkeit
und Teilnahme. Bitte evaluieren
Sie dieses Seminar.
•
ER-Modell
•
Trigger
•
Gespeicherte Prozeduren
•
Transaktionen
•
No-SQL
•
OO-Datenbanken
•
Datenbanken im Kontext von WebApps
Seite 119
Ihr SOFTLANG Team.
Prof. Dr. R. Lämmel
http://softlang.wikidot.com/startseite
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Seite 120
© 2014 Ralf Lämmel & SOFTLANG, Universität Koblenz-Landau
Herunterladen