Web Technologien – Klassische Datenbanken am Beispiel von MySQL Univ.-Prof. Dr.-Ing. Wolfgang Maass Chair in Information and Service Systems Department of Law and Economics WS 2011/2012 Wednesdays, 8:00 – 10:00 a.m. Room HS 021, B4 1 • Die Skriptsprache PHP ermöglicht die Erstellung komplexer Serverskripte, welche Formulardaten, Sessions und Cookies lesen und schreiben können 15.11.11 Univ.-Prof. Dr.-Ing. Wolfgang Maass Server • Der Linux, Apache, MySQL, PHP Stack (= LAMP) ist eine Sammlung von Open Source Standardsoftware zur Realisierung serverseitiger dynamischer Websites Client Wrap-Up Browser PHP Apache , (Python, Perl) MySQL Linux Slide 2 MySQL • Am weitesten verbreitetes Open Source „Database Management System“ (DBMS) der Welt • Erstmals 1997 als Version 3.21 veröffentlicht um zu zeigen, dass bereits viele Jahre der Erfahrung im Produkt stecken • Die aktuellste Version 5.5.17 steht für eine Vielzahl verschiedenster Betriebssysteme zur Verfügung • Verfügbar in verschiedenen Versionen mit unterschiedlichem Leistungsumfang, darunter die kostenfreie „Community Edition“ (siehe www.mysql.de) 15.11.11 Univ.-Prof. Dr.-Ing. Wolfgang Maass Slide 3 Datenbank Management System • Set aus Komponenten zur Definierung, Erstellung und Verwaltung von Datenbanken • Datenbanken können Daten persistent speichern, durchsuchen und verwalten • Bei MySQL handelt es sich um ein relationales Datenbanksystem (RDBMS) • Relationale Datenbanken, nach dem von Edgar F. Codd 1970 entwickelten Modell, beinhalten teilweise untereinander verknüpfte Tabellen zur Speicherung von Daten 15.11.11 Univ.-Prof. Dr.-Ing. Wolfgang Maass Anwendung DBMS Datenbank-­‐ Dateien Datenbanksystem Slide 4 Aufgaben eines DBMS • Datensicherheit im Sinne von Zugriffsrechten und Datenverlust • Transaktionen zur Ermöglichung von Rollbacks und zur Sicherung der Datenintegrität • Datenintegrität nach fest definierten Constraints (z.B. Foreign Key) • Anfrageoptimierung durch Bereitstellung einer Sprache welche erst intern in logische Operationen übersetzt wird • Anwendungsunterstützung durch Bereitstellung von Triggern und gespeicherten Prozeduren • Mehrbenutzerfähigkeit durch Berechtigungsvergabe und Locking-Mechanismen 15.11.11 Univ.-Prof. Dr.-Ing. Wolfgang Maass Slide 5 Tabellen in relationalen Datenbanken Tabelle Kunden Kundennummer Name Kundentyp 10000 Max Müller 0 10001 Franziska Maier 0 10002 Schmid und Söhne GmbH 1 Tabelle Kundentypen 15.11.11 TypID Typbezeichnung 0 Privatkunde 1 Geschäftskunde Univ.-Prof. Dr.-Ing. Wolfgang Maass Slide 6 Terminologie • Datenbank/Database: Ein Behältnis zum Speichern von Daten • Tabelle/Table: Der Teil einer Datenbank die die Daten enthält. Eine Tabelle hat Spalten/ Columns zur Speicherung der zeilenweise abgelegten Daten mit ihren Attributen. • Spalten/Columns: Jede Spalte enthält ein Attribut eines Datensatzes in einem festgelegten Datentyp (string, integer, date etc.) • Zeile/Row: Der Datensatz/Record in einer Tabelle • Primärschlüssel/Primary Key: Eine oder mehrere Spalten, welche eindeutige Werte zur Referenzierung eines Datensatzes enthalten • Index: Spalten welche häufig zur Filterung von Ergebnissen eingesetzt werden können zum Performance-Gewinn als Indices markiert werden 15.11.11 Univ.-Prof. Dr.-Ing. Wolfgang Maass Slide 7 SQL • SQL ist die Standardsprache zur Interaktion mit relationalen Datenbanken und entstand aus der bereits Anfang der 70er entwickelten Sprache Sequel • Verschiedene Datenbanksysteme haben ihren eigenen Dialekt • SQL besteht aus Befehlen dreier Kategorien: 1. Data Definition Language (DDL) zur Verwaltung der Datenbanken und deren Struktur 2. Data Manipulation Language (DML) zur Verwaltung der Daten innerhalb einer Datenbank (à CRUD) 3. Data Control Language (DCL) zum Transaktionsmanagement für „Locks“ and „Rollbacks“, zur Zugriffssteuerung und zur Datenüberprüfung/-korrektur/-aufbereitung 15.11.11 Univ.-Prof. Dr.-Ing. Wolfgang Maass Slide 8 Entwicklung eines Datenbankmodells Kernfragen: • Welche Tabellen benötige ich? • Welche Spalten in den Tabellen benötige ich? • Wie sehen die möglichen Beziehungen zwischen den verschiedenen Datensätzen aus? Hilfsmittel: Entity-Relationship Model (ERM) KN Straße 1 Name ... Tabelle Kunden Kunde n hat Adresse Stadt ... (siehe Peter Chen, 1976) 15.11.11 Univ.-Prof. Dr.-Ing. Wolfgang Maass Kundennummer Name 10000 Max Müller 10001 Franziska Maier 10002 Schmid und Söhne GmbH Tabelle Adressen AdressID Kundennummer Straße 0 10000 Hauptstraße 1 10000 Bahnhofsstraße Slide 9 ... SQL Syntax • Befehle müssen immer mit einem Strichpunkt terminiert werden • Bei Namen wird die Groß-/Kleinschreibung beachtet, bei Befehlen nicht • Namen von Datenbanken, Tabellen und Spalten müssen in Akzentsymbole (`) eingefasst werden • String-Werte müssen in einfache Anführungszeichen (') eingefasst werden select * from table `Kunden` where `Name`='Maier'; (weitere Datentypen unter http://dev.mysql.com/doc/refman/5.1/de/data-type-overview.html) 15.11.11 Univ.-Prof. Dr.-Ing. Wolfgang Maass Slide 10 Anlegen von Datenbanken und Tabellen (DDL) SQL Kommandozeile • Mit „create“ können Datenbanken und Tabellen erstellt werden • Mittels „use“ kann zwischen Datenbanken gewechselt werden • Bei der Tabellenerstellung muss jeder Spalte ein Typ (int, varchar, boolean etc.) zugewiesen werden • Über weitere Schlüsselwörter können z.B. ein Primärschlüssel oder automatisch hochzählende Werte definiert werden • Mit „drop“ können Datenbanken und Tabellen wieder gelöscht werden mysql> create database `Shop`; Query OK, 1 row affected (0.00 sec) mysql> use `Shop`; Database changed mysql> create table `Kunden` (`Kundennummer` INT NOT NULL AUTO_INCREMENT, `Name` VARCHAR(45), PRIMARY KEY (`Kundennummer`)); Query OK, 0 rows affected (0.02 sec) mysql> drop table `Kunden`; Query OK, 0 rows affected (0.00 sec) mysql> drop database `Shop`; Query OK, 0 rows affected (0.04 sec) (weitere Datentypen unter http://dev.mysql.com/doc/refman/5.1/de/data-type-overview.html) 15.11.11 Univ.-Prof. Dr.-Ing. Wolfgang Maass Slide 11 DDL und DCL mittels GUI Tools 15.11.11 Univ.-Prof. Dr.-Ing. Wolfgang Maass Slide 12 Datensätze anlegen SQL Kommandozeile • Mit dem Befehl „insert into“ können Datensätze in einer Datenbank angelegt werden • Ist ein Feld als „AUTO_INCREMENT“ definiert wird dieses automatisch mit dem nächsthöheren Wert befüllt • Felder die als „NOT NULL“ definiert sind müssen befüllt werden • Felder die als PRIMARY KEY oder eindeutige Indices definiert sind müssen die Eindeutigkeit in der Tabelle einhalten 15.11.11 mysql> insert into `Shop`.`Kunden` (`Name`, `Hausnummer`) values ('Max Müller', 2); Query OK, 1 row affected (0.00 sec) oder alternativ mysql> insert into `Shop`.Kunden set `Name`='Franziska Maier', `Hausnummer`=5; Query OK, 1 row affected (0.00 sec) Univ.-Prof. Dr.-Ing. Wolfgang Maass Slide 13 Datensätze abfragen • Mit dem Befehl „select“ können in einer Datenbank existierende Datensätze abgefragt werden • Der Befehl erwartet eine Angabe welche Werte aus der Ergebnismenge zurückgegeben werden sollen; diese kann sein: • „*“ für alle Ergebniswerte • Eine kommagetrennte Liste aus Spaltennamen • 15.11.11 Der Befehl „select distinct“ schließt doppelte Ergebnisse in der Ergebnismenge aus SQL Kommandozeile mysql> select * from `Shop`.`Kunden`; +--------------+-----------------+------------+! | Kundennummer | Name | Hausnummer | +--------------+-----------------+------------+! | 1 | Max Müller | 2 |! | 2 | Franziska Maier | 5 |! +--------------+-----------------+------------+! 2 rows in set (0.00 sec) mysql> select `Name` from `Shop`.`Kunden`; ! +-----------------+! | Name |! +-----------------+! | Max Müller |! | Franziska Maier |! +-----------------+! 2 rows in set (0.00 sec) Univ.-Prof. Dr.-Ing. Wolfgang Maass Slide 14 Datensätze filtern und sortieren • Über den Befehl „where“ kann die Ergebnismenge durch Filter eingeschränkt werden • Der Befehl „order by“ erlaubt es, durch die Parameter „asc“ und „desc“ die Ergebnismenge auf- oder absteigend nach bestimmten Spalten zu sortieren • Weitere Filter/Sortierungen werden kommagetrennt hintereinander geschrieben 15.11.11 SQL Kommandozeile mysql> select * from `Shop`.`Kunden` where `Kundennummer`=2; +--------------+-----------------+------------+! | Kundennummer | Name | Hausnummer | +--------------+-----------------+------------+! | 2 | Franziska Maier | 5 |! +--------------+-----------------+------------+! 1 row in set (0.00 sec) mysql> select * from `Shop`.`Kunden` order by `Name` asc; +--------------+-----------------+------------+! | Kundennummer | Name | Hausnummer | +--------------+-----------------+------------+! | 2 | Franziska Maier | 5 |! | 1 | Max Müller | 2 |! +--------------+-----------------+------------+! 2 rows in set (0.00 sec) Univ.-Prof. Dr.-Ing. Wolfgang Maass Slide 15 Datensätze ändern und löschen • Die Befehle „update...set“ und „delete from“ ermöglichen das ändern und löschen von Datensätzen • Um nicht alle Datensätze einer Tabelle zu ändern oder zu löschen, können die Befehle mit dem Befehl „where“ kombiniert werden • Die beiden Befehle werden lediglich auf die Ergebnismenge angewendet 15.11.11 SQL Kommandozeile mysql> update `Shop`.`Kunden` set `Name`='Franziska Müller' where `Kundennummer`=2; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> delete from`Shop`.`Kunden` where `Kundennummer`=1; Query OK, 1 row affected (0.00 sec) mysql> select * from `Shop`.`Kunden`; +--------------+------------------+------------+! | Kundennummer | Name | Hausnummer | +--------------+------------------+------------+! | 2 | Franziska Müller | 5 |! +--------------+------------------+------------+! 1 row in set (0.00 sec) Univ.-Prof. Dr.-Ing. Wolfgang Maass Slide 16 Verknüpfte Datenanfragen • Über sog. Joins können Inhalte verschiedener Tabellen in einer Anfrage abgefragt werden • Über Referenzen der verschiedenen Tabellen untereinander können Datensätze mit anderen in Bezug gesetzt werden Beispiel: Abfrage aller Kunden aus der Tabelle Kunden und dazu jeweils die passende Adresse aus der Tabelle Adressen, referenziert über die Kundennummer Tabelle Kunden Kundennummer Name 1 Max Müller 2 AdressID Franziska Maier 1 2 Kundennummer Straße ... 2 Bahnhofsstraße 1 Hauptstraße Tabelle Adressen SQL Kommandozeile mysql> select * from `Shop`.`Kunden` join `Shop`.`Adressen` on `Kunden`.`Kundennummer`= `Adressen`.`Kundennummer`; +--------------+-----------------+-----------+--------------+-----------------+! | Kundennummer | Name | AddressId | Kundennummer | Straße |! +--------------+-----------------+-----------+--------------+-----------------+! | 1 | Max Müller | 2 | 1 | Hauptstraße |! | 2 | Franziska Maier | 1 | 2 | Bahnhofsstraße |! +--------------+-----------------+-----------+--------------+-----------------+! 2 rows in set (0.00 sec) 15.11.11 Univ.-Prof. Dr.-Ing. Wolfgang Maass Slide 17 MySQL & PHP • Zur einfachen Verknüpfung einer MySQL-Datenbank mit PHP stellt PHP die MySQL Extension bereit • Die MySQL Extension bietet ein umfangreiches Set von Funktionen um mit Datensätzen in MySQL Datenbanken zu arbeiten • Mit der Extension können MySQL Datensätze zu PHP Arrays umgewandelt werden, was den Zugriff auf Ergebnisse erheblich erleichtert • Alle angeboten Funktionen sind auf der PHP Website dokumentiert: http://www.php.net/manual/de/ref.mysql.php 15.11.11 Univ.-Prof. Dr.-Ing. Wolfgang Maass Slide 18 MySQL & PHP Beispiel PHPAndMySQL.php 15.11.11 Univ.-Prof. Dr.-Ing. Wolfgang Maass Slide 19 Literatur Bücher: • Hugh E. Williams, David Lane Web Database Applications with PHP & MySQL ISBN-10: 0596000413 • Paul DuBois MySQL Cookbook ISBN-10: 059652708X, ISBN-13: 978-0596527082 Web: • http://www.mysql.de/ • http://dev.mysql.com/ Artikel: • Peter Pin-shan Chen: The Entity-Relationship Model: Toward a Unified View of Data, ACM Transactions on Database Systems, Vol. 1, p. 9-36, 1976 15.11.11 Univ.-Prof. Dr.-Ing. Wolfgang Maass Slide 20 Univ.-Prof. Dr.-Ing. Wolfgang Maass Chair in Information and Service Systems Saarland University, Germany Univ.-Prof. Dr.-Ing. Wolfgang Maass