Datenbanksysteme Teil 4 MySQL –Administration und Grundlagen DDL Data Definition Language Stefan Maihack Dipl. Ing. (FH) Datum: 28.10.2005 1 MySQL-Administration • • Um eine MySQL-Datenbank abzufragen, zu aktualisieren oder zu erstellen, wird das Kommandozeilenprogramm „mysql.exe“ benutzt. MySQL-Monitor Der MySQL-Monitor „mysql.exe“ steht unter: …\xampp\mysql\bin\mysql.exe Er sollte in der PFAD-Variablen des Benutzers eingetragen werden. • • Mit dem MySQL-Monitor ist es möglich, eine Verbindung zu jeder beliebigen MySQLDatenbank im Internet aufzubauen. Folgende Parameter können dem MySQL-Monitor mitgegeben werden: -h <host> Î Der Monitor verbindet sich mit dem angegeben Host. -u <user> Î Der Monitor verbindet sich mit dem angegeben User. -p<passwort> Î Der Monitor benutzt das angegebene Passwort. -C Î Während der Verbindung werden die Daten komprimiert. -D <database> Î Der Monitor verwendet die angegebene Datenbank. -P <port> Î Der Monitor verwendet den angegebenen Verbindungsport. -VERSION Î Zeigt die Version von MySQL an 2 MySQL-Administration • Aufrufbeispiele: Der Monitor verbindet sich lokal mit der Datenbank …\xampp\mysql\bin\mysql –u root Der Monitor verbindet sich remote mit der Datenbank …\xampp\mysql\bin\mysql –h www.mysql.com –u root –pmeinpasswort Der Monitor verbindet sich mit einer bestimmten Datenbank …\xampp\mysql\bin\mysql –u root –D <DB-Name> Der Monitor verbindet sich mit einer bestimmten Datenbank …\xampp\mysql\bin\mysql –u root –p <DB-Name> < <Script>.sql 3 MySQL-Administration • Folgende Steuerkommandos kennt der MySQL-Monitor: show databases; Î Gibt alle erzeugten Datenbanken zurück. Es sollte mindestens die Datenbank MySQL angezeigt werden. use <Datenbank>; Î Verwendet die Datenbank, welche angegeben wurde. Alle weiteren SQLKommandos beziehen sich darauf. show tables; Î Zeigt alle erzeugten Tabellen der aktuellen Datenbank an. desc <Tabelle>; Î Zeigt die Definition der Tabelle an. drop database <Datenbank> Î Löscht die angegebene Datenbank quit oder exit Î Beendet den SQL-Monitor. 4 MySQL-Administration • Bevor Tabellen angelegt werden können, muss eine Datenbank angelegt werden: CREATE DATABASE [IF NOT EXISTS] <Datenbankname>; • Durch den CREATE DATABASE-Befehl wird folgendes Verzeichnis für die Datenbank angelegt: „…\xampp\mysql\data\<Datenbankname>“. • In diesem Verzeichnis entstehen dann folgende Files: Î NAME.FRM: Î NAME.MYD: Î NAME.MYI: Speichert die Tabellendefinition Enthält die Daten der Tabelle Enthält den Index der Tabelle Modifizieren sie diese Dateien niemals, es sei denn, sie benutzen ein Dienstprogramm wie den MySQL-Monitor oder Ähnliches. 5 SQL-Befehle Allgemeines • • • • Was ist SQL (Structured Query Language)? SQL ist von IBM in Verbindung mit dem Datenbanksystem DB2 entwickelt worden. Erst als ORACLE diese Sprache für sein Datenbank einsetzte wurde SQL zum Standard erklärt. MySQL ist kompatibel mit dem SQL-Standard, wenn gleich MySQL zum einem nicht alle Elemente dieses Standards unterstützt und zum anderen zahlreiche Erweiterungen zu diesem Standard bietet. MySQL kann zum SQL92-Standard gezwungen werden, in dem der Dienst/Daemon mit „--ansi“ gestartet wird. Nicht unterstützte SQL-Statements (z.Zt.): Î Subselects (verschachtelte Abfragen) Î Views (gespeicherte Abfragen) Î Contraints mit Fremdschlüsseln und Transaktionen 6 SQL-Befehle SQL-Schreibweise • SQL kann in drei Kategorien eingeteilt werden, die in der Literatur auch als selbständige Sprachen betrachtet werden: DDL Î Data Definition Language DML Î Data Manipulation Language DCL Î Data Control Language • • • DDL: Enthält Befehle zur Erzeugung und Manipulation von Datenbankobjekten. Anlegen oder Bearbeiten von Datenbanken, Tabellen, Sichten oder Prozeduren z.B. CREATE, USE. DML: Enthält Befehle die auf die Daten einwirken, z.B. INSERT, UPDATE, DELETE, SELECT. DCL: (weniger umfangreich) Enthält Befehle zur Transaktionssteuerung. 7 SQL-Befehle Schreibweise • • • • • Eine SQL-Anweisung beginnt immer mit einem Verb, dass die Art der Anweisung festlegt. Solchen Verben sind: CREATE, SELECT oder UPDATE. Eine SQL-Anweisung endet mit einem Semikolon „;“. Zeichenketten stehen in Anführungszeichen – einfache oder doppelte. Es gibt reservierte Wörter: AS oder WHERE. Ist ein Attributname in einem Ausdruck nicht eindeutig – beispielsweise weil durch eine Verknüpfung mehrer Tabellen ein Attribut doppelt ist, kann dem Attributnamen der Tabellennamen durch einen Punkt getrennt voran gestellt werden. Z.B.: sapr3.gehaltstabelle • • • Groß- und Kleinschreibung der Syntax wird nicht berücksichtigt. Groß- und Kleinschreibung in Tabellen- und Db-Namen wird nur dann berücksichtigt, wenn das darunter liegende Dateisystem diese berücksichtigt. Tabellennamen und Sonderzeichen – insbesondere Leerzeichen werden mit dem „Accent grave“ – Zeichen ` eingeschlossen. 8 SQL-Befehle Schreibweise • Im Allgemeinen wird empfohlen, reservierte Wörter nicht als Tabellen- oder Attributnamen zu verwenden. Ebenso sollten sie auf Sonder- und Leerzeichen in diesen verzichten. • Der Ausdruck NULL steht für ein leeres Datum (NICHTS). NULL ist nicht zu verwechseln mit 0 oder „ “ (leere Zeichenkette). • SQL-Befehle sollten in Großbuchstaben, Tabellen- und Attributnamen dagegen in Kleinbuchstaben geschrieben werden. 9 DDL – Data Definition Language • • • Aufgabe der DDL ist es Schematas anzulegen, zu verändern und zu löschen. Operationen Î Konzeptuelles Modell Æ create table Æ drop table Æ alter table Æ… Î Externes Modell Æ create view Æ drop view Æ… Î Internes Modell Æ create index Æ drop index Æ… Nicht alle relationalen Datenbanken unterstützen alle Features 10 MySQL-Datentypen • Der Datentyp bestimmt, welche Art von Operationen mit einem gespeicherten Wert zulässig sind. • Numerische Typen: Î speichert Zahlen Î Operationen wie Addition, Substraktion, Division und Multiplikation Î Numerische Datentypen verbrauchen wenig Speicherplatz, insbesondere Integer-Zahlen. Î Es gibt prinzipiell zwei Arten von Numerischen Datentypen: Integer-Zahlen, Fließkommazahlen 11 MySQL-Datentypen • Integer-Zahlen TINYINT TINYINT UNSIGNED SMALLINT SMALLINT UNSIGNED MEDIUMINT MEDIUMINT UNSIGNED INT oder INTEGER INT UNSIGNED BIGINT BIGINT UNSIGNET Ganzzahlen von -128 bis +127 Ganzzahlen von 0 bis 255 Ganzzahlen von -32768 bis 32767 Ganzzahlen von 0 – 65535 Ganzzahlen von -8 Mio bis +8Mio Ganzzahlen von 0 bis 16Mio Ganzzahlen von -2Mrd bis +2Mrd Ganzzahlen von 0 bis 4Mrd Ganzzahlen von -9*1018 bis +9*1018 Ganzzahlen von 0 bis 18*1018 12 MySQL-Datentypen • Fließkommanzahlen FLOAT (X) FLOAT (M, D) DOUBLE DOUBLE(M, D) DECIMAL Î -3*1038 - +3*1038 Î M=Stellen gesamt; D=Dezimalstellen Î Fließkommanzahl mit doppelter Genauigkeit -2*10308 - +2*10308 Î wie Double Î gepackte Fließkommazahl -999.99 - +999.99 13 MySQL-Datentypen • Zeichenkettentypen Î Zeichenkette mit fester Länge und höchstens M Zeichen; M < 255 VARCHAR (M) Î Zeichenkette mit variabler Länge M < 255 TINYTEXT, TINYBLOB Î Zeichenkette oder Blob bis 255 Zeichen TEXT, BLOB Î Zeichenkette oder Blob bis 65535 Zeichen MEDIUMTEXT, MEDIUMBLOB Î 16 Mio Zeichen LONGTEXT, LONGBLOB Î 4Mrd Zeichen ENUM (´wert1´, ´wert2´,…) Î Die Zelle kann einen Wert aus einer Liste bis zu 65535 Werten annehmen. SET (´wert1´, ´wert2´,…) Î Menge. Die Zelle kann ein oder mehrere Elemente aus einer Liste bis zu 64 Werten enthalten. Groß- und Kleinschreibung nur bei den Typen TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB Bei CHAR und VARCHAR den Zusatz BINARY angeben, um zwischen Groß- und Kleinschreibung zu unterscheiden. CHAR (M) • • 14 MySQL-Datentypen • Datumtypen für Datum und Zeit DATE Î 01.01.1000 – 32.12.9999 im Format „YYYY-MM-DD“ TIME Î -838:59:59 - +838:59:59 im Format „HHH:MM:SS“ DATETIME Î YYYY-MM-DD HH-MM-SS Kombination aus DATE und TIME YEAR Î Jahreszahlen 1901 – 2155 Format „YYYY“ TIMESTAMP Î Unix-Zeit seit 01.01.1979 werden die Sekunden gezählt. Erlaubt das Speichern von Werten bis 2037. Format „YYYYMMDDHHMMSS“ 15 MySQL-Tabellenadministration DDL • Erzeugen einer Datenbank Bevor Tabellen angelegt werden können, muss eine DB angelegt werden. CREATE DATABASE [IF NOT EXISTS] <db_name>; • Î Im Dateiverzeichnis ..\XAMPP\mysql\data wird ein Unterverzeichnis mit dem Namen der Datenbank erzeugt „..\XAMPP\mysql\data\<db_name>“ Connect zur Datenbank Nun muss zur erzeugten Datenbank eine Verbindung aufgebaut werden …\xampp\mysql\bin\mysql –u root show databases; use <db_name>; 16 MySQL-Tabellenadministration DDL • Nun kann in mit der verbundenen Datenbank eine Tabelle angelegt werden CREATE [TEMPORARY] TABLE [IF NOT EXITS] <tabellenname> [(Tabellendefinition,…)] [Tabellenoptionen] [SELECT-Befehl] TEMPORARY: erzeugt ein flüchtige Tabelle. Sie besteht nur solange die Verbindung zur Datenbank besteht. • Tabellenoptionen: Angabe des Tabellentyps. Î BDB: Transaktionssichere Tabellen mit Seitensperren. Î InnoDB: Trabsaktionssichere Tabelle mit Zeilensperren (Auf Datensatzebene). Î HEAP: Tabellen im Hauptspeicher erzeugen. Î ISAM: Die original MySQL-Tabellen. Î MERGE: Vereinigung mehre physikalischer MyISAM Tabellen zu einer logischen Tabelle. Î MyISAM: Ersetzt ISAM-Tabellen und ist Standard seit MySQL 3.23.xx Der Tabellentyp wird in den [Tabellenoptionen} mit TYPE= angegeben. 17 MySQL-Tabellenadministration DDL - CREATE • Beispiel: CREATE TABLE CREATE TABLE strassen (ID INT NOT NULL AUTO_INCREMENT, kartenausschnitt INT NOT NULL, strassenname VARCHAR(50) NOT NULL, plz VARCHAR(5) NOT NULL, ort VARCHAR (50) NOT NULL, hausnummern VARCHAR(5) NOT NULL, xkorrd INT NOT NULL, ykorrd INT NOT NULL, PRIMARY KEY (ID)); • Ein externes Script aufrufen, innerhalb des MySQL-Monitors mysql –u root –p <DB-Name> < <Scriptname>.sql 18 MySQL-Tabellenadministration DDL – CREATE & ENUM, SET • • • • Den Spaltentyp ENUM und SET eigenen sich für Spaltenwerte, die aus einer gegebenen Menge von Zeichenfolgen ausgewählt werden. Die möglichen Zeichenfolgen (die Elemente der Menge) deklariert man beim Erstellen der Tabelle; danach lassen sich ausschließlich diese Werte in die Spalte einfügen. Erstellen einer Tabelle mit einer ENUM-Spalte, für eine Menge von drei Aufzählungszeichen; NULLWerte sind auch erlaut, ansonsten NOT NULL: CREATE TABLE bsp_tab (zahl ENUM(„ein“, „zwei“, „drei“) NULL) belag pepperoni SET kann im Gegensatz zu ENUM eine beliebige Anzahl von Elementen aufnehmen. CREATE TABLE pizza (belag SET („pepperoni“, „prawns“, „anchoview, tuna“) Als Ergebnis des Inserts kommt folgendes heraus: INSERT INTO pizza VALUES („“), („pepperoni“), („anachoviews, tuna“); anchoviews, tuna 19 MySQL-Tabellenadministration DDL • Löschen einer Tabelle DROP <Tabellenname>; • Tabellendefinition anzeigen DESC <Tabellenname>; • Umbenennen einer Tabelle RENAME TABLE <Tabellenname_alt> TO <Tabellenname_neu> [,<Tabellename_alt> TO <Tabellename_neu>,…]; 20 MySQL-Tabellenadministration DDL • Spalten/Attribute einer Tabelle hinzufügen ADD <Spaltendefinition> [FIRST | AFTER <Spaltenname>]; Î FIRST: Die neue Spalte wird am Anfang hinzugefügt. Î AFTER: Die Spalte wird nach dem angegebenen Spaltenname hinzugefügt. • Eine Spalte/Attribut ändern CHANGE <Spaltenname> <Spaltendefinition>; Î Ändert den Datentyp und den Spaltennamen MODIFY <Spaltendefinition>; Î Ändert nur den Datentyp der Spalte • Ein Attribut löschen ALTER TABLE <Tabellenname> DROP COLUMN <Spalte>; 21 MySQL-Tabellenadministration DDL - Beispiele • • • • Die Spalte „gebursdatum“ wird in die Tabelle „abonnenten“ hinzugefügt. ALTER TABLE abonnenten ADD COLUMN gebursdatum DATETIME; Die Spalte „gebrurtsdatum“ wird in der Tabelle „abonnenten“ wieder gelöscht. ALTER TABLE abonnenten DROP COLUMN gebrursdatum; Einfügen der Spalte „geburtsdatum“ direkt nach der Spalte „name“ ALTER TABLE abonnenten ADD COLUMN gebrutsname DATETIME AFTER name; Modifizieren der Spalte „email“, von 100 Zeichen auf 200 Zeichen. ALTER TABLE abonennten ADD COLUMN geburtsdatum DATETIME AFTER name, MODIFY email VARCHAR(200); Æ Beide Aktionen sind durch ein Komma getrennt, dadurch lassen sich alle Arten von Änderungen an der Tabelle durchführen. 22 Übung 1 - DDL • • Erstellen sie eine neue Datenbank in MySQL, die den Namen „Profukte“ haben soll. Erstellen sie eine Tabelle „ARTIKEL“ in MySQL, die folgende Attribute beinhalten soll: Î artikel_id Î Bezeichnung Î Datum der Erzeugung Î Allgemeine Beschreibung Î Artikelersteller Î Emailadresse Î Bild Î PRIMARY KEY • Vorüberlegung: Welche Datentypen werden benötigt? 23 MySQL – Indizes • Ein Index ist eine spezielle Baumstruktur, die es einer Datenbank ermöglicht, Daten schnell zu finden. • MySQL erlaubt, Spalten zu indizieren. • Die Begriffe Key (Schlüssel) und Index sind zwar genau genommen nicht das Gleiche, führen aber in SQL zum gleichen Ergebnis. • Die Syntax zum Erstellen, Ändern und Löschen eines Indizes ähnelt der Syntax zum Erstellen und Ändern von Spalten. • Ein Index verhält sich verhält sich wie eine externe Spalte der Tabelle. Deshalb kann man einen Index entfernen ohne irgendwelche Daten zu beeinflussen. 24 MySQL – Indizes • • Ein Index, auch als „Schlüssel“ genannt bezeichnet, ist ein Instrument für den schnellen Zugriff auf bestimmte Zeilen von Daten innerhalb einer Tabelle. Beispiel: Gegeben ist ein Tabelle „personen“, die Einzelheiten über Personen enthält. Wenn die DB aufgefordert wird, alle Zeilen entsprechend einem bestimmten Kriterium abzurufen, liest die DB die ganze Tabelle Zeile für Zeile und ruft dabei die Daten aller Zeilen ab, die dem Kriterium entsprechen. • Selbst wenn nur eine bestimmte Zeile abgerufen werden soll, muss die DB jede Zeile der Tabelle lesen. Das Lesen einer gesamten Tabelle wie dieser – ist eine Operation, die man als „Tabellenscan“ oder auch „Full Table Scan“ bezeichnet - Die Abfrage erledigt zwar die gestellte Aufgabe, ist aber im höchsten Maße ineffizient. Î Indizes helfen Leseoperationen zu beschleunigen. 25 MySQL – Indizes Index pers_id 1 Pers_id Name 3 2 1 Clare Scriven Tony Butler 3 2 John Schreiber 5 5 Peter Stamp 26 MySQL – Indizes Wann sind Indizes nicht sinnvoll? • Indizes sind vor allem bei Lese-Operationen sinnvoll. Bei Schreiboperationen erfordern sie zusätzlich Arbeit, um den Index zu aktualisieren. Z.B. bei einem Insert-Befehl, um eine neue Datenzeile einzufügen, müssen sämtliche Indizes für diese Tabelle auf den neusten Stand gebracht werden. • Î Bei Tabelle bei denen sehr viel Schreiboperationen stattfinden, besser keine Indizes verwenden. 27 MySQL – Indizes Die 4 Arten von Schlüssel Schlüssel zur eindeutigen Identifizierung: • Der Primärschlüssels: Î Jede Tabelle hat höchstens einen Primärschlüssel. Î Der Primärindex besteht immer aus einer Spalte Î Der Primärschlüssel identifiziert einen Datensatz eindeutig (z.B. Matrikelnummer). Î Alle beteiligten Spalten müssen als NOT NULL definiert sein. ALTER TABLE <Tabellenname> ADD PRIMARY KEY [<Schlüsselname>] (<Spalte1> [,<Spalte2>,…]); • Der eindeutige Schlüssel: Î Der eindeutige Schlüssel fordert, dass die Schlüssel-Attribute einzeln oder deren Kombination einmalig sind. Î Versucht man einen Datensatz einzufügen, obwohl bereits einer vorhanden ist, der die Schlüsselbedingung erfüllt, erhält man eine Fehlermeldung. (Keine doppelten Datensätze). ALTER TABLE <Tabellenname> ADD UNIQUE [(Schlüsselname)] (<Spalte1(n)> [,<Spalte2(n)>,…]); 28 MySQL - Indizes Schlüssel zur mehrdeutigen Identifizierung: • Der gewöhnliche Schlüssel: Î Ein gewöhnlicher Schlüssel kann wie ein Eindeutiger Schlüssel über eine oder mehrere Spalten erstellt werden. Î Ein solcher Schlüssel kann bei Zeichenketten-Attributen nur ein Teil eines Feldes indizieren. ALTER TABLE <Tabellenname> ADD INDEX | KEY [<Schlüsselname>] (<Spalte1(n) [,<Spalte2(n)>,…]); • Der vierte Indextyp, FULLTEXT, ist für die Geschwindigkeitsverbesserung bei Volltextsuchen in VARCHAR- und TEXT-Spalten vorgesehen.. Er arbeitet in Verbindung mit der MATCH-Funktion der WHERE-Klausel. (Erst ab der Version 3.23.23 verfügbar). ALTER TABLE <Tabellenname> ADD FULLTEXT | KEY [<Schlüsselname>] (<Spalte1(n) [,<Spalte2(n)>,…]); 29 MySQL - Indizes • Anzeigen der Schlüssel-Attribute Ob Felder einer Tabelle identifiziert sind, erkennt man in dem die Tabellendefinition ausgedruckt wird. DESC <Tabellenname>; Ergebnis kann sein: Schlüssel PRI UNI MUL • Î Î Î Anzeige in der Tabelle Primärschlüssel eindeutiger Schlüssel gewöhnlicher Schlüssel Mehr Informationen über die Schlüssel kann durch das folgende Kommando abgefragt werden: SHOW INDEX FROM <Tabellenname>; 30 MySQL – Indizes Beispiel CREATE TABLE bewohner ( vorname VARCHAR(50) NOT NULL, name VARCHAR(50) NOT NULL, ausweisnummer VARCHAR(30) NOT NULL, strassenname VARCHAR(50) NOT NULL, familienstand SET ('verheiratet','verwitwet','ledig','geschieden'), geschlecht SET ('männlich','weiblich') NOT NULL, anzahl_kinder INT NOT NULL, stadt VARCHAR(50), PRIMARY KEY (ausweisnummer)); 31 MySQL - Indizes • Schlüssel löschen: Um einen Schlüssel löschen zu können, muss dessen Namen in Erfahrung gebracht werden. Der Name eines Schlüssels kann auch anonym vergeben worden sein. ALTER TABLE DROP INDEX <Index-Name>; z.B.: ALTER TABLE DROP INDEX b; ALTER TABLE DROP PRIMARY KEY; 32 Übung 0 – MySQL • Erzeugen sie ein ERP-Diagramm, dass Bewohner und Strassen beschreibt. • Stellen sie die Beziehungen dar. • Das Modell soll später für eine kartografische Suche nach Bewohnern dienen bzw. Straßen hilfreich sein. 33 Übung 1 – MySQL DDL • Erzeugen sie eine Staatentabelle in MySQL mit folgenden Spalten: Î Laufende Nummer Î Kartenausschnitt Î Anzahl der Staatsangehörigen Î Anzahl der Städte Î Größe des Staates Î Kontinent des Staates Î Lage der Hauptstadt Î und einen primären Schlüssel • Vorüberlegung: Datentypen der Attribute 34 Übung 1 – MySQL DDL • Erzeugen sie eine Bewohnertabelle mit folgenden Spalten: Î Vorname Î Nachname Î Postleitzahl Î Stadt Î Straße Î Hausnummer Î Familienstand Î Anzahl der Kinder Î Alter Î Eigentümer Î Flurstücknummern • Vorüberlegung: Sinnvolle Datentypen der Attribute 35 Übung 2 – MySQL DDL • Nennen sie die Tabellen um in: staatentabelle Æ strassen bewohnertabelle Æ bewohner • Und erstellen sie zu beiden Tabellen noch einen eindeutigen Primär-Schlüssel. • Lassen sie sich die Tabellendefinition anzeigen. • Löschen sie die beiden Tabellen aus der Datenbank wieder. 36 Übung 3 – Tabelle erstellen und modifizieren 1. Erzeugen sie eine Tabelle in der Datenbank namens „people“ mit einem Feld „name“ des Typs „VARCHAR“ (50 Zeichen lang) und einem Feld für „email“ des Typs CHAR (100 Zeichen lang). 2. Ändern sie die Tabelle um, indem sie ein Feld mit Namen „phone“ hinzufügen. Das Feld soll den Typ VARCHAR haben, 50 Zeichen lang sein und unmittelbar nach dem Feld „name“ erscheinen. 3. Das Feld „name“ auf 100 Zeichen vergrößern, einen nicht eindeutigen Schlüssel für dieses Feld soll hinzugefügt werden und der Name des Feldes „email“ soll in „email_adresse“ geändert werden. 4. Lassen sie sich die Tabellenbeschreibung anzeigen. 37