Relationen und SQL

Werbung
Einführung in die
Informatik II
Die Structured Query Language SQL
Prof. Dr. Nikolaus Wulff
SQL
• Das E/R-Modell lässt sich eins zu eins auf ein Tabellenschema abbilden. Benötigt wird eine Syntax, um
Tabellen zu definieren und zu manipulieren.
• Relationale Datenbanken bieten hierzu SQL als
Sprache an, die unterschiedliche Aspekte vereint:
– Die Data Definition Language (DDL), definiert die
Schemata per create/drop Tabelle.
– Die Data Manipulation Language (DML) verändert
Tabelleneinträge per insert- und update- und sucht
Einträge per select-Anweisung.
– Die Data Control Language (DCL) vergibt Rechte und
Rollen an Benutzer/Gruppen per grant-Befehl.
Prof. Dr. Nikolaus Wulff
Informatik II
2
Befehlsübersicht (Ausschnitt)
• CREATE TABLE relation (Attribut Typ Liste)
– Erzeugt das Relationsschema als Tabelle
• INSERT INTO relation (Attribut Liste) VALUES...
– Fügt einen Satz in die Tabelle ein
• UPDATE relation SET attribut=value ...
– Verändert einen oder mehrere Sätze der Tabelle
• SELECT * FROM relation
– Liefert alle Elemente der Relationsmenge
• SELECT (Attribut Typ Liste) FROM relation
– Liefert die Projektion T der Relationsmenge
• SELECT * FROM relation WHERE (Bedingung)
– Liefert per Selektion  Θ eine Teilmenge
Prof. Dr. Nikolaus Wulff
Informatik II
3
E/R-Modell und Codierung
• In modernen Anwendungen entwickelt sich das E/RModell meistens parallel zum Quellcode.
• C-Struts, Pascal-Records oder Java Klassen dienen als
Schablone für das Tabellenschema. Zu jedem Attribut
des Struktur/Klasse gehört ein Attribut des Tabellen /
Relationenschema:
create table Person
id
integer not null,
name
varchar(30),
gewicht float,
schuhe integer,
primary key(id);
Prof. Dr. Nikolaus Wulff
Informatik II
Erzeugung der
Relation „Person“
als Tabelle
4
Datenbank Sitzung
• Alle Datenbankhersteller bieten Werkzeuge zum
Administrieren der Datenbank. Im einfachsten Fall als
Konsolenanwendung in einer DOS/Unix-Shell:
mysql> show tables;
Empty set (0.00 sec)
mysql> create table person (id integer not null,
name varchar(30), gewicht float, primary key(id));
Query OK, 0 rows affected (0.05 sec)
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| person
|
+----------------+
Attribut „Schuhe“
1 row in set (0.00 sec)
wurde vergessen...
mysql>
Prof. Dr. Nikolaus Wulff
Informatik II
5
Anzeigen des Schemas
• Überprüfung des neu angelegten Schema für die
Person Tabelle per „describe“-Befehl...
Prof. Dr. Nikolaus Wulff
Informatik II
6
MySQL Control Center
• Komfortabler ist ein graphisches Werkzeug:
Das Schema
der Tabelle
Die
Personen
Tabelle
Prof. Dr. Nikolaus Wulff
Informatik II
7
Tabelle füllen
• Noch ist die Tabelle leer, mit dem insert Befehl lassen
sich neue Datensätze anlegen:
insert into Person (id,
values (1,'Tom',
insert into Person (id,
values (2,'Bob',
Prof. Dr. Nikolaus Wulff
Informatik II
name, gewicht)
78.6);
name, gewicht)
82);
8
Tabelle anzeigen
• Mit dem select Befehl lässt sich der Inhalt/die Menge
einer Tabelle ausgeben:
– select * from Person
– Es werden alle Elemente mit allen Attributen ermittelt.
• Eine Projektion T wird durch die Angabe des
Schemas T erzielt:
– select (name,gewicht) from Person
– Liefert von allen Elementen nur Name und Gewicht
• Eine Selektion  Θ erfolgt durch Angabe einer
Bedingung in einer where-Klausel:
select * from Person where name like '%o%'
– Liefert die Daten von Tom und Bob...
Prof. Dr. Nikolaus Wulff
Informatik II
9
Eindeutiger Primary Key
• Das Primary Key Feld (hier id) muss eindeutig sein,
kein Datensatz mit dem selben Schlüssel lässt sich ein
zweites Mal einfügen:
• Ein leeres Feld (hier gewicht) ist erlaubt, allerdings
nicht beim Primary Key!
Prof. Dr. Nikolaus Wulff
Informatik II
10
Update Befehl
• Existierende Datensätze lassen sich nachträglich per
update-Befehl verändern:
update person set gewicht=80;
• Dummerweise wurden so alle Gewichte verändert!
Update ist eine Mengenoperation...
Prof. Dr. Nikolaus Wulff
Informatik II
11
Update - where
• Um gezielt eine Teilmenge zu manipulieren, muss
diese mit einer where-Bedingung selektiert werden:
update person set ... where name='Kai'
• Es wird erst die Treffermenge mit where selektiert
und anschließend darauf update ausgeführt.
Prof. Dr. Nikolaus Wulff
Informatik II
12
Join / Kartesisches Produkt
• Tabellen lassen sich vereinen, hier person⊗groesse:
Beachte:
select p.name, ..., g.groesse
from person as p,
groesse as g
• Die Projektion π =(name,gewicht,groesse) wurde
angewandt, jedoch die Selektion σ fehlt.
• Mit person as p werden kurze Alias Namen vergeben.
Prof. Dr. Nikolaus Wulff
Informatik II
13
θ - Join
• Mit der where Bedingung p.id = g.id und
anschließender Projektion erfolgt die richtige
Zuordnung:
Selektion σ ohne
Projektion π ...
Selektion σ mit
Projektion π.
Prof. Dr. Nikolaus Wulff
Informatik II
14
Views
• Kreuzprodukte, Projektionen und Selektionen können
als eine bestimmte Sicht auf die Relationen der Datenbank angesehen werden.
• In Form einer View lässt sich dieses Konzept direkt
als eine „pseudo Tabelle/Relation“ innerhalb einer DB
realisieren:
create view vPerson as select p.id, p.name, p.gewicht, g.groesse
from person as p, groesse as g where p.id = g.id;
• Diese Anweisung erzeugt eine View auf die per select
ausgewählte Untermenge der Relationen P und G.
Prof. Dr. Nikolaus Wulff
Informatik II
15
Views sind auch Relationen
• Views als spezielle Form
einer Relation lassen
sich per select anzeigen.
• Die where Bedingung
der select Definition
wird berücksichtigt:
– Tim gehört nicht mit zur
View Relation...
• Auf der View lassen sich
Selektion, Projektion
und Kreuzprodukt
anwenden...
Prof. Dr. Nikolaus Wulff
Informatik II
16
Views Pro und Contra
• Schwieriger werden insert und update Methoden bei
Views, es müssten in dem Beispiel zwei Tabellen
geändert werden.
• Es z.B. nicht klar, ob bei der insert/update-Methode
das Attribut name bei P oder G gesetzt werden soll...
• Es müssen also beide Tabellen der View explizit
geändert werden, um Konsistenz zu erreichen.
• Views eignen sich zum Anzeigen und Selektieren,
sind aber nicht für insert und update geeignet.
• Mit Views können für Benutzergruppen „Nur-Lese“
Zugriffe einfach ermöglicht werden.
Prof. Dr. Nikolaus Wulff
Informatik II
17
Suchen und Index
• Meistens werden Daten nicht nur gespeichert, sondern
sie müssen auch schnell wieder gefunden werden.
• Hierzu bietet die SQL where-Klausel geeignete
Operatoren an:
– where id=5, where name like 'B%', where gewicht < 60,...
• Damit diese Suche möglichst effizient erfolgt werden
häufig benötigte Attributspalten mit einem Index
versehen:
create index name_idx on person(name);
• Datenbanksysteme können intern einen „Bind-Plan“
erstellen, um Zugriffe zu optimieren.
Prof. Dr. Nikolaus Wulff
Informatik II
18
SQL Funktionen
• SQL bietet Funktionen
über den Relationen.
• Statistische Funktionen:
– min/max/avg/median
• Kardinalität: count
• Summierung: sum
Rundungsfehler
des Typen float...
Prof. Dr. Nikolaus Wulff
Informatik II
19
SQL in Programmiersprachen
• Natürlich lässt sich eine DB nicht nur per SQL von
der Konsole aus verwenden.
• Fast alle Programmiersprachen bieten Möglichkeiten
SQL direkt in den Quellcode einzubetten.
• Java sieht hierzu das Paket java.sql vor, es gibt dort:
– Eine Datenbankverbindung: Connection.
– Eine SQL-Anweisung: Statement
• dieses lässt sich als insert, update, where-Klausel etc
parametriesieren.
– Eine SQL-Ergebnismenge: ResultSet
• über diese Menge kann, wie bei einer Collection, in einer Schleife
iteriert werden, um Java Objekte aus zu instanziieren.
Prof. Dr. Nikolaus Wulff
Informatik II
20
Jdbc SQL API
Prof. Dr. Nikolaus Wulff
Informatik II
21
Book insert per SQL
protected void insert(Book obj) throws SQLException {
StringBuffer sql = new StringBuffer(INSERT);
sql.append(getTableName());
sql.append(" (id,isbn,author,title,description,price)");
sql.append(" values(");
sql.append(obj.getId());
sql.append(", '");
sql.append(obj.getIsbn());
sql.append("','");
sql.append(obj.getAuthor());
sql.append("','");
sql.append(obj.getTitle());
sql.append("','");
sql.append(obj.getDescription());
sql.append("',");
sql.append(obj.getPrice());
sql.append(")");
executeSQL(sql.toString());
}
Prof. Dr. Nikolaus Wulff
Informatik II
22
Eine generische SQL Query
public Collection<T> executeQuery(String where)
throws SQLException {
Connection con = getConnection();
ResultSet set; Statement stm;
ArrayList<T> result = new ArrayList<T>();
String sql = "SELECT * FROM " + getTableName()+ where;
try {
stm = con.createStatement();
set = stm.executeQuery(sql);
while (set.next()) {
T obj = mappSetToInstance(con, set);
result.add(obj);
}
} catch (SQLException e) {
handleError(e);
} finally {
releaseResources(false, con, stm, set);
}
return result;
}
Prof. Dr. Nikolaus Wulff
Informatik II
23
Zusammenfassung
• Datenbanken bieten dank SQL eine einheitliche
Schnittstelle für die Benutzer und den Anwendungsentwickler.
• Datenbanksysteme eignen sich für große Datenmengen und erlauben dank Indizierung effiziente
Suchabfragen.
• SQL lässt sich gut in Programme einbetten und liefert
performante Antwortszeiten.
• Viele Objektorientierte Sprachen bieten OR-Mapper,
die vom objektorientierten UML-Modell auf das
relationale E/R-Modell transformieren.
Prof. Dr. Nikolaus Wulff
Informatik II
24
Herunterladen