MySQL und ERM ein Beispiel © Hans-Georg Beckmann 2002 Eine relationale Datenbank mit MYSQL MySQL arbeitet auf der Grundlage von SQL. Das System hat den besonderen Vorteil, dass es kostenlos genutzt werden kann. Zwar hat dieses Datenbanksystem nicht den gleichen Funktionsumfang, wie kommerzielle System ( z.B. ORACLE ) es kann aber in Hinsicht Geschwindigkeit und Datenvolumen durchaus mit den kommerziellen Systemen mithalten. Das Grundprinzip ist die Client - Server - Architektur, was bedeutet, dass der zentrale Server die Datenbanken verwaltet und die Benutzer über eine Clientprogramm ( von denen viele verschiedene existieren ) auf diese Datenbanken zugreifen. Dabei kann der Datenserver irgendwo auf dieser Welt stehen und die Benutzer greifen z.B. per Internet auf die Datenbanken zu. Datenbank-Client Eingabe einer Abfrage Darstellung der Ergebnisse Abfrage QUERY Ergebnis Datenbank-Server Datenbank Managment System DBMS Datenbanken DB Für die nichtkommerzielle Benutzung ist MySQL frei. Die genauen Benutzerbedingungen und auch das Programm selbst erhält man z.B. bei www.mysql.com Als gute Arbeitsgrundlage kann man "Das Einsteigerseminar MySQL" von Rolf Däßler, bhv Verlag 2001, ISBN 3-8266-7021-3 verwenden. In diesem Script soll es darum gehen, eine Datenbank "SCHULE" zu erzeugen, die auf dem erarbeiteten ER-Modell beruht. Es ist also nicht beabsichtigt, eine umfassende und gründliche Einführung in SQL zu geben. Nur die Aktionen und Befehle, die zu unserer Datenbank führen werden genauer dargestellt. Alles andere zu MySQL sollte man sich immer dann antun, wenn es nötig ist. Seite 21 MySQL installieren und starten © Hans-Georg Beckmann 2002 1.Schritt: Wie bekomme ich MySQL auf meinen Rechner ? Vielleicht war der Systemadministrator schon nett und das Programmpaket ist schon lange da ! Wenn das ber nicht der Fall ist oder, wenn man MySQL zu Hause installieren möchte, dann kommt nun ein wenig Arbeit. Man lädt sich das Programmpaket aus dem Interenet auf den heimischen Rechner. Unter www.mysql.com wird man in der Downloadsektion an einen HTTP- Server oder einen FTP-Server durchgereicht ( z.B bei der GWDG in Göttingen ). Dort lädt man die Datei als WINZIP herunter. Das ist durchaus wichtig, weil die Shareware WINZIP die Datei nicht nur entpackt, sondern auch gleich korrekt installiert, was einige andere Entzipper nicht machen. Die aktuelle stabile Version vonMySQL ist 3.23.49. Nach dem Entpacken und Installieren sollte sich auf dem Laufwerk C: ( ja , ja so heißt das bei Windows noch immer ..) ein Verzeichnis mysql befinden. In diesem Verzeichnis sind viele Unterverzeichnisse abgelegt: Das Verzeichnis mysql Seite 22 MySQL starten © Hans-Georg Beckmann 2002 Wichtig sind die folgenden Unterverzeichnisse: bin enthält alle ausführbaren Programme, die man für MySQL braucht. data enthält alle Datenbanken. Es liegen schon zwei Datenbanken vor: mysql und test. docs Dokumentation Alle anderen Verzeichnisse sind eher was für erfahrene Benutzer, die wir ja erst noch werden sollen. 2. Schritt : MySQL zum ersten Male starten Dazu muss man zuerst einen Blick in C:\mysql\bin werfen. Dort findet man eine Reihe wichtiger Programmteile von MySQL: 5 1 2 3 6 7 4 Das Verzeichnis mysql\bin Seite 23 MySQL starten © Hans-Georg Beckmann 2002 1 mysql.exe Datenbankclient und Kommandozeileneditor zur Kommunikation mit der Datenbank. Das hört sich kompliziert an, bedeutet aber nur, dass in diesem Programm ein Teil des DBSM und ein Clientprogramm zusammengefasst sind. 2 mysqladmin.exe Datenbankadministrationsprogramm 3 mysqld.exe Datenbankserver für Windows 95/98 4 mysqld-opt.exe Datenbankserver für Windows 95/98 der für Pentiumprozessoren optimiert wurde ( whow !) 5 mysqlimport.exe Programmm zum Import aus Textdateien ( u.a.) in bestehende Datenbanken 6 7 winmysqladmin.exe Der Versuch eines bentuzerfreundlichen Datenbankasdministrations programms mit grafischer Oberfläche + Hilfesystem. Im Verzeichnis mysql\data findet man für jede Datenbank einen eigenen Ordner. Dessen Name ist auch der Name der ganzen Datenbank. Das ist wichtig, weil es ja passieren kann, dass jemand aus der Windowsebene heraus einen Ordner mal umbenennt. Dann darf man sich nicht wundern, wenn MySQL seine Datenbanken nicht mehr wiederfindet. Das alles kann natürlich nur geschehen, wenn man als Chef des privaten Rechners Zugriff auf solche Möglichkeiten hat. Im Netzwerk wird das wohl kaum passieren. Angenommen, es existiert eine Datenbank SCHULE, die wiederum eine Tabelle ( Relation) enthält, die schueler heißt, dann gibt es: schueler.FRM eine Datei, mit der Tabellenstruktur schueler.MYD eine Datei, die die Datensätze enthält schueler.MYI eine Datei für den Index Nun zum ersten Start . Seite 24 MySQL starten © Hans-Georg Beckmann 2002 Der "klassische" Weg geht über die MS-DOS Kommandozeile. Wählen sie dazu START >> Programme >> MS-DOS Eingabeaufforderung. Es erscheint das DOS-Fenster mit der Meldung: C:\WINDOWS> und wartet auf unsere Eingaben. Nun muss zuerst der Datenbankserver gestartet werden, der dann im Hintergrung weiterläuft. Geben sie ein: C:\mysql\bin\mysqld Merken sie sich jetzt schon einmal, dass man am Ende der Arbeit diesen Server auch wieder korrekt herunterfahren muss: Seite 25 winmysqladmin © Hans-Georg Beckmann 2002 C:\mysql\bin\mysqladmin -u root shutdown Man kann sich das Leben natürlich auch ein wenig einfacher machen, wenn man vorher das passende Verzeichnis wählt. Also: C:\CD:\MYSQL\BIN Danach muss man immer nur noch den letzen Teil der Befehlszeile eingeben. Starten mit : mysqld Beenden mit mysqladmin -u root shutdown Mit dem Befehl mysqlshow wird das Systemaufgefodert, die aktuell vorhandenen Datenbanken zu zeigen. Man erhält das nebenstehene Bild mit den beiden vorhandenen Datenbanken. (Zeigen sie ruhig etwas Begeisterung über die schöne Bildschirmausgabe.) --------------------------------------------------------------------------------------------------------------------------Hier seien einige ketzerischen Bemerkungen erlaubt. Dass MySQL in dieser Form zu uns kommt ist recht traurig. Diese Art der Benutzeroberfläche ist nun seit mehr als 10 Jahren eine Zumutung für alle User, die nicht zu den Experten der Computerbenutzung gehören. Zwar macht es den wahren Könner aus, dass er oder sie sich mit Kommandozeilen in DOS oder UNIX bestens auskennen und allerlei kryptischen Befehle beherrschen ( von denen einige gleich noch kommen ), aber man kann sich des Eindrucks nicht erwehren, dass hier mit Absicht die "dummen" User abgeschreckt werden sollen, damit man sich selbst noch viel mehr als Experten und coolen Hacker verstehen kann. Immer wieder kann man von "Könnern" hören, dass doch diese Art der Bedienung "echt cool" sei, sie ist es aber nicht, und sie erfüllt keinen sichtbaren Zweck. Auch in der OpenSource-Programmierergilde gibt es genug Kompetenz, um gute Bedienugsoberflächen zu programmieren, ohne dass die Leistungsfähigkeit von MySQL leiden würde. Der Versuch von winmysqladmin.exe zeigt das schon ein wenig. Vielleicht sollten sich die Programmierer auch mal auf anderen Rechnersystemen umschauen, um Benutzeroberflächen zu sehen, die ein angenehmes Arbeiten ermöglichen. Seite 26 Datenbank anlegen © Hans-Georg Beckmann 2002 Eine andere Methode, den Datenbankserver zu starten und auch zu beenden besteht durch das schon erwähnte winmysqladmin.exe, das ebenfalls im bin-Verzeichnis liegt und keine MS-DOS Kommandozeile braucht. Starten sie es durch einen Doppelklick und für einen kurzen Moment erscheint ein Fenster, das sich aber gleich wieder automatisch schließt. Es taucht dafür ein kleines Symbol unten rechts auf, eine Ampel, die hoffentlich grün leuchtet. Das zeigt an, dass der Datenbankserver korrekt läuft. Bei entsprechender Installation kann man dieses Programm auch beim Starten von Windows automatisch mitstarten lassen. Klicken sie auf die kleine Ampel und wählen sie aus dem Popupmenü "Show me". Nun erscheint das komplette Fenster in dessen oberer Zeile eine ganze Reihe von Reitern zu sehen ist. Klicken sie auf DATABASES und sehen sie, welche Datenbanken jetzt aktiv sind. Mit einem Klick auf die rechte Maustaste erhält man kontextabhängige Klappmenüs und kann mit "Hide Me" das Fenster auch wieder verstecken. Das WinMySQLAdmin Fenster Seite 27 Datenbank anlegen © Hans-Georg Beckmann 2002 Dieses Programm erlaubt später auch einen Blick auf die innere Struktur der Datenbanken und wir werden es dann auch benutzen. Schließt man das Programm, dann wird auch der Datenbankserver heruntergefahren. 3.Schritt: Erstellen einer neuen Datenbank mit mysql Rufen sie wieder die MS-DOS -Eingabeanforderung auf. Es soll jetzt eine Datenbank mit dem Namen SCHULE eingerichtet werden. C:CD:\mysql\bin und C:\mysql\bin> mysqladmin -u root -p create schule Mit dem Befehl CREATE wird mysqladmin augefordert, die Datenbanbk SCHULE zu erzeugen. Das kann man auch mit winmysqladmin machen, wenn man mit einem Klick auf die rechte Maustaste ein Kontextmenü erscheinen läßt, das als obersten Punkt "Create Database" enthält. Es erscheint dann ein Dialogfenster, in dem man den Namen der Datenbank angeben kann. Welche Methode man auch wählt, MySQL legt eine neue Datenbank an, die noch nichts enthält. Seite 28 Tabellen anlegen © Hans-Georg Beckmann 2002 Wenn man danach im Eingabefenster mysql startet und den Befehl C:\mysql\bin>mysql und dann mysql > use schule; eingibt, bekommt man hoffentlich von MySQL einige Begrüßungszeilen zu sehen und mitgeteilt, dass nun die Datenbank SCHULE in Benutzung ist. In der Datenbank SCHULE sollen jetzt die Tabellen engelegt werden. Das sind ( wie im vorangegangenen Kapitel schon besprochen ) die Tabellen SCHUELER, KURSE und HATKURS. ( Hier nur in GROSSBUCHSTABEN , damit es dem Leser / der Leserin auch auffallen möge, dass dieses Tabellen zu erstellen sind). Für das Anlegen von Tabellen hat MySQL auch einige Anweisungen vorgesehen, die jetzt probiert werden. Durch use schule ist dafür gesorgt, dass die Tabellen der Datenbank SCHULE zugeordnet werden. Der Befehl CREATE TABLE erwartet, dass auch gleich die Attribute mitangegeben werden. Im Prinzip ist folgende Syntax zu beachten: CREATE TABLE name_der_Tabelle ( Attributname1 TYP , Attributname2 TPY ,......); Im obigen Beispiel sind also die Attribute KHJ, KURSTHEMA, KURLEHRERKURZ, KURSART und KURSNUMMER definiert worden, wobei nur das Kurshalbjahr ein Integer ist und alle anderen Attribute Strings aus Buchstaben sind. Wenn alles geklappt hat, erhält man eine Meldung der Art "Query OK" Seite 29 Tabellen anlegen © Hans-Georg Beckmann 2002 Machen sie keinen Tippfehler, sonst darf man alles noch einmal eingeben. Die Pfeile vor den Zeilen macht übrigens das System von selbst, wenn man ein Return eingibt. Es ist ein Zeichen dafür, dass MySQL eine noch nicht fertige Eingabe vorfindet. Erst, wenn ein Semikolon am Ende erscheint, gilt der Befehl als eingegeben. Genauso erzeugt man die Tabelle SCHUELER. (20) Fehlt also noch die Tabelle HATKURS, die genauso erzeugt wird. (20) Seite 30 Tabellenstruktur sehen © Hans-Georg Beckmann 2002 Der Befehl show tables; zeigt dann, welche Tabellen jetzt in der Datenbak enthalten sind: Damit sind die drei Relationen in der Datenbank festgelegt. Natürlich kann man Tabellen auch wieder löschen, das interessiert aber im Moment noch nicht. Die Struktur der Tabellen kann man mit dem EXPLAIN -Befehl anzeigen lassen. Probieren sie folgende Eingabe: explain hatkurs; Nun wird die Tabellenstruktur angezeigt: (20) Genauso geht das mit der Tabelle kurse: Seite 31 Daten importieren © Hans-Georg Beckmann 2002 Auf das Explain für die letzte Tabelle verzichten wird hier. Ein Problem ist aber nun offensichtlich die Dateneingabe. Es ist klar, dasss in MySQL nun auch in die Tabellen Daten direkt eingegeben werden können. Bei dieser Benutzeroberfläche ist das aber kein Vergnügen. Wenn man weiter bedenkt, dass dabei doch nur einige wenige "Spieldaten" in die Tabellen kommen, dann wird einzusehen sein, dass hier ein Datenimport her muss. Zu den Daten muss man aber einige Vorbemerkungen machen. Sie, die sie dieses Script lesen, sollen die Dateien übernehmen können. Dazu gäbe es mehrere Möglichkeiten. 1) Man könnte sie als fertige MySQL-Tabellen zur Verfügung stellen. Das soll aber nicht sein, damit sie den Datenimport selbst probieren können. 2) Man kann die Textdateien zur Verfügung stellen. Genau das ist die Absicht. Die Textdateien sind im Internet auf dem , Server zu finden, auf dem auch dieses Script liegt. Wenn das nicht der Fall sein sollte, dann bitte eine mail an: [email protected] und die Dateien können zugeschickt werden. Die Daten müssen als Textdateien vorliegen, in denen die einzelnen Datensätze duch ein RETURN voneinander getrennt sind und die einzelnen Felder ( Attribute) innerhalb eines Datensatzes durch Tabulatoren. Alle linearen Datenbankprogramme, aber auch TabellekalkulationsProgramme eröffnen die Möglichkeiten, Daten in der angegebenen Form als "Text mit Tab" zu exportieren. Die Daten, die wir gleich importieren wollen, liegen also in drei Textdateien vor und werden in das Verzeichnis kopiert, in dem sich auch die Dateien der Datenbank SCHULE befinden. Die Textdateien heissen: schueler.tab , kurse.tab und hatkurs.tab Die Daten haben etwas besonders an sich : sie sind echt ! Das ist eine Seltenheit und sollte sie nun auch entsprechend beeindrucken. Die Daten stammen aus einer echten Abiturdatei, die in einer einzigen Tabelle zusammengefasst ist. Diese Tabelle enthält alle relvanten Schülerdaten vom 11. Jahrgang bis zur Abiturprüfung. Mit dieser Datei Seite 32 Daten importieren © Hans-Georg Beckmann 2002 werden Zeugnisse und Schulbescheinigungen, Statistikerhebungen und Abiturzulassungen, persönliche Daten und Abiturzeugnisse erstellt und verwaltet. Zusammen hat ein Datensatz mehr als 900 (!) Felder. Attribute der Schülerdatei aus Filemaker Diese Monsterdatei wird mit dem Programm Filemaker verwaltet. Filemaker erlaubt es, bei der Definition von Feldinhalten mit Formeln und Auswertungen zu arbeiten, auf andere Dateien zuzugreifen und die ausgewählten Daten in sogenannten Layouts zu organisieren und darzustellen. Weiterhin kann die Arbeit in der Datenbank automatisiert oder mit einer Scriptsprache programmiert werden. ( Der Umgang mit dieser Datenbank wurde während der Arbeitstagung in Göttingen demonstriert. Das Scriptum dazu liegt als Material vor.) Ein kleiner Aussschnitt ist oben zu sehen und gibt einen Eindruck von der Größe der ursprünglichen Datenbank. Dieses Datenmonstrum ruft danach, normalisiert zu werden. Ein wenig davon wollen wir ja leisten. Seite 33 Daten importieren © Hans-Georg Beckmann 2002 Alle Daten wurden für die Tabelle SCHUELER anonymisiert. Alle Namen wurden verändert, alle Geburtsdaten wurden verändert. Alle Anschriften und sonstigen persönlichen Daten wurden verändert. Geschlecht, Alter, Kurswahlen, Noten und weitere Daten wurden erhalten. In der Tabelle für die KURSE wurden die Lehrernamen und Namenskürzel verändert, Kursnummern und Themen und Noten blieben jedoch erhalten. In der Tabelle HATKURS tauchen ID-Nummer und Kursnummer auf, die so auch in den anderen beiden Tabellen zu sehen sind. In den Textdateien, die man nun importieren will, müssen die Daten so organisiert sein, dass beim Einlesen auch die richtigen Felder den richtigen Attributen der Tabellen zugeordnet werden. Wenn man das sicher gestellt hat, reicht ein MySQL-Befehl aus, um den Datenimport zu realisieren. LOAD DATA INFILE erwartet als Parameter den Namen der Textdatei in Hochkomma (" ") und eine Angabe darüber, in welche Tabelle der Datenbak eingelesen werden soll. Bei der Angabe der Tabelle ist zu beachten, dass der Datenbankname gefogt von einem Punkt gefolgt vom Tabellennamen angegeben wird. Wenn alles geklappt hat, wird man mit einer netten Meldung des Systems belohnt. Dabei sollte man sich nicht irritieren lassen, wenn es auche eine Reihe von Warnungen gegeben hat. Seite 34 Daten anschauen © Hans-Georg Beckmann 2002 Nun bleibt aber die berechtigte Sorge, ob denn auch alle Daten so angekommen sind, wie wir das wollten. Es muss also mal in die Datenbank hineingeschaut werden. Probieren sie mysql> select * from schule.schueler; oder mysql > select * from schueler; Sie sollten nun alle Datensätze zu sehen bekommen: Die Form, in der man den Inhalt der Datei sieht ist hier recht unschön, da die vielen Attribute nicht in eine Zeile passen und daher auf mehrere Zeilen verteilt werden. Versuchen sie auch mysql > select * from kurse; Seite 35 Auswahl mit SELECT © Hans-Georg Beckmann 2002 Das sieht dann schon etwas besser aus, weil nicht ganz so viele Attribute auftauchen. Der Stern (* ) hinter SELECT besagt, dass alle Attribute der Tabelle dargestellt werden. Will man nur einige Attribute sehen, muss man genau angeben, welche: Probieren sie mysql > select Name,Vorname from schueler; Das sieht doch schon ganz anders aus ! Probieren sie nun: mysql > select kursthema,khj from kurse where kurslehrerkurz="Cq"; Hier wird noch eine weitere Einschränkung vorgenommen: Jetzt sollen aus der Tabelle KURSE die Attribute KURSTHEMA und Kurshalbjahr (KHJ ) angezeigt werden, mit der Bedingung, dass das Lehrerkürzel ( KURSLEHRERKURZ ) dem Textstring "Cq" entspricht. Das ist eine Auswahl ,die schon recht übersichtlich ist, wie man sehen kann. "Cq" Seite 36 Auswahl mit SELECT © Hans-Georg Beckmann 2002 Die SELECT - Anweisung erlaubt es also, aus einer Tabelle mit bestimmten Suchbedingungen Datensätze herauszufiltern und von diesen ausgwählte Attribute darzustellen. Weitere Beispiele für SELECT: Man kann die Anzahl von Datensätzen in einer Tabelle mit COUNT(*) festellen lassen. Probieren sie es auch mit den andere Tabellen aus. Man kann Abfragen mit einem logischen UND verbinden. Die Teile der Abfrage stehen dabei in Klammern und natürlich ist es das englische AND, das man verwenden muss. Wir suchen z.B. alle Kurse des zweiten Kurshalbjahres, die vom Lehrer mit dem Kürzel "Cq" angeboten wurden. Es waren zwei Kurse. Genauso sind Verknüpfungen mit OR und NOT möglich. Unscharfe Suche Nicht immer müssen Attributwerte exakt angegeben werden. Der Befehl select * from kurse where kursnummer like M% ; würde aus der Tabelle Kurse alle die Datensätze finden, deren Kursnummer mit einem M be- Seite 37 Auswahl mit SELECT © Hans-Georg Beckmann 2002 ginnt. Das dürften dann Mathematik- und Musikkurse sein. Das % - Zeichen ist hier ein Platzhalter, der die unscharfe Suche möglich macht. Suche in Bereichen Kann man bei einem Attribut einen Bereich angeben, dann ist eine Abfrage wie die folgende möglich: select * from kurse where KHJ between 2 and 4 Hier werden also alle Kurse gesucht, die im zweiten bis vierten Kurshalbjahr angeboten wurden. Das wäre auch mit select * from kurse where (KHJ>1) and (KHJ <=4) ; möglich gewesen. Verknüpfen von Tabellen Bevor wir nun zwei Tabellen miteinander verknüpfen, müssen einige Änderungen vorgenommen werden. Es sollen die Tabellen Schueler und Hatkurs mithilfe der ID_Nummer abgeglichen werden. Dazu muss in der Tabelle das eindeutige Feld ID_Nummer als Primärschlüssel deklariert werden. Das hätte man schon bei dem CREATE-Befehl miteinbauen können. Nun kommt es aber erst jetzt. Im ersten Schritt ist es Voraussetzug, das Feld ID_Nummer als nicht Null ( NOT NULL) festzulegen, denn leere Felder taugen nicht als Schlüsselfeld. Der Befehl, mit dem das geht ist ALTER TABLE: Geben sie ein: alter table schueler modify ID_Nummer char(20) not null; Nun wird der Primärschlüssel erklärt: alter table schueler add primary key(ID_Nummer); Die Tabellen schueler und hatkurs haben das gemeinsame Feld ID_Nummer, mit dem nun gear- Seite 38 Auswahl mit SELECT © Hans-Georg Beckmann 2002 beitet wird. Nun sollen Name und Vorname und Kursnote aller Schülerinnen und Schüler gesucht werden, die im Kurs mit der Kursnummer "Ma 11" sind. Der SELECT - Befehl ist: Hinter SELECT werden durch Komma getrennt alle Attribute angegeben, die man sehen will. Da sie aus verschiedenen Tabelle stammen, wird jeweils die Tabelle mitangegeben - also etwa schueler.vorname und hatkurs.note. Dann kommt das Schlüsselwort FROM und dahinter durch Komma getrennt die beiden beteiligten Tabellen. Dann kommt die WHERE - Bedingung. In der ersten Klammer wird die Verknüpfung hergestellt, wenn es heißt: schueler.id_nummer = hatkurs.id_nummer Die zweite Klammer enthält die Filterbedingung für die Tabelle. Es werden nur die Datensätze genommen, die der Kursnummer Ma 11 gehorchen. Man erhält schon ein nettes Ergebnis, wie zu sehen ist. Hätte man sich die Kursnummer mit ausgeben lassen, hätte man gemerkt, dass sowohl der Matheleistungskurs mit der Nummer Ma 11 als auch der Grundkurs mit der Nummer ma 11 aufgelistet ist. Das hat damit zu tun, das SQL keine Grossund Kleinschreibung unterscheidet. Aber da gab es ja noch ein Feld Kursart, mit dem man weiter filtern könnte... Seite 39 Auswahl mit SELECT © Hans-Georg Beckmann 2002 Die Verknüpfung wurde mit SELECT verwirklicht. Im Allgemeinen sorgt man dafür, das Abfrage und Verknüpfung in der Syntax getrennt werden. Es wird hier der INNER JOIN-Befehl benutzt. Wenn sie die dargestellte Abfrage sehen, fällt sicher auf, dass in der oberen Zeile wieder die Attribute aus den Tabellen angegeben sind. Nach dem FROM kommt dann der Name der Tabelle mit dem Schlüsselfeld, dann mit INNER JOIN die zu verknüpfende Tabelle. Hinter dem ON wird die Bedingung für die Verknüpfung angegeben. Erst danach kommt die Auswahlbedingung nach dem WHERE. Das Ergebnis ist wie auch oben eine Zensurenliste. Aufgaben Suchen sie aus der Tabelle Kurse alle Kurse mit ihren Themen, die von "Kr" unterrichtet werden. Suchen sie alle Kurse des dritte Kurshalbjahres, die von "Db" unterrichtet werden. Suchen sie in der Tabelle Kurse alle Deutschgrundkurse (Tip: Die beginnen alle mit einem dt) Suche alle Schüler, die im Leistungkurs En 11 enthalten sind. Seite 40 Auswahl mit SELECT © Hans-Georg Beckmann 2002 Weitere Beispiele Im Abschnitt "Datenbanken 2" sind SQL-Abfragen behandelt, die ebenfalls auf der Datenbank "Schule" beruhen. Daraus zwei Beispiele: Mit SELECT AVG(Feldname) kann man den Durchschnittswert eines Attributs einer Tabelle ausgeben lassen. Versuchen sie herauszufinden, ob Mädchen im Matheunterricht benachteiligt werden: Bei einer Durchschnittsnote von 7,7 können wir nun streiten. Das aber erst, wenn sie auch untersucht haben, wie es mit der Durchschnittsnote der Jungen aussieht. Schauen sie doch auch mal in den Leistungskursen vorbei: Als Ergänzung ist auf den nächsten Seiten noch einmal das Übungsmaterial von Fabian Meyer zu finden, das weitere Aufgaben un d Beispiele enthält. Seite 41 Übungen zu SQL © Fabian Meyer 2002 MySQL: Select und Join -- Das Handwerkzeug für Abfragen In diesem Abschnitt werden die wichtigsten Methoden für das "Befragen" von MySQL-Datenbanken erläutert. Die ersten Versuche mit SELECT wurden ja bereits in der MySQL-Einleitung (MYSQL.pdf) angestellt. Wir reissen dies hier deshalb nur kurz an und bauen dann darauf auf. SELECT Mittels dieses Befehls lassen sich beliebige Attribute aus beliebigen Tabellen auswählen. Dies kann man natürlich so bedingen, dass man sich genau die Daten geben lässt, welche man auch bekommen will. Man benötigt ja nicht immer gleich die ganze Datenbank. Andernfalls könnte man auch gleich mit einer großen Liste auf Papier arbeiten, der Aufwand wäre ähnlich. Man stelle sich unsere Beispieldatenbank "Schule" mal ausgedruckt vor: alleine die Tabelle "hatkurs" besitzt 3840 Instanzen! Bleiben wir mit unserem ersten Beispiel gleich bei dieser "Monster-Tabelle": SELECT * FROM `hatkurs` WHERE 1 LIMIT 0, 50; und siehe da? Was bekommen wir? Eine Tabelle mit nur 50 Einträgen und nicht 3840! Woran könnte es liegen? Natürlich an der "LIMIT"-Klausel: Diese besagt hier: Selectiere nur die Einträge 0 bis 50. Das "WHERE 1" besagt nur, daß keine weiteren Kriterien die Auswahl einschränken. Hier setzen wir nun an und schränken die Auswahl ein. Wie sieht eigentlich die Tabelle "hatkurs" aus? Da die Befehle für diese Abfragen bereits in der MySQL-Einführung vorgestellt wurden, zeige ich hier nur kurz die Struktur. "hatkurs" enthält: I D_Nummer Kur snummer Note Punkte char (20) char (5) char (2) i nt(11) Also suchen wir jetzt einmal alle Einträge aus "hatkurs", in denen Schüler 15 Punkte bekommen haben: SELECT * FROM hatkurs WHERE Punkte = 15; (Ich habe hier das LIMIT weggelassen, da ich weiß das es nicht allzu viele Datensätze mit 15 Punkten gibt ;-) ) Soweit ist das ganze noch ganz einleuchtend. Wo wir zuvor nicht weiter eingeschränkt haben, lassen wir uns nun nur Seite 42 Übungen zu SQL © Fabian Meyer 2002 diejenigen Datensätze ausgeben, wo die Punktzahl 15 beträgt. Select ist also recht simpel, nicht wahr? Schön und gut, aber was ist mit Joins? Dazu kommen wir jetzt! Wir wollen nun nicht nur diese obskuren Nummern da stehen haben, sondern hätten gerne gleich eine Auflistung welche Schüler hinter diesen Leistungen stecken. Um diese Information zu erhalten, müssen wir aber Daten aus einer zweiten Tabelle mit abfragen, und zwar auch nicht mit einer eigenständigen Anfrage, sondern direkt verknüpft mit unserer Abfrage, wer 15 Punkte hat. Genau dazu ist der "JOIN" gedacht. Mit "JOIN" lässt sich genau das Gewollte erreichen: Wir können zwei oder mehrere Tabellen-Abfragen miteinander verknüpfen. Die einfachste Methode in MySQL einen "JOIN" auszuführen ist mit dem Komma ",". In MySQL steht das Komma synonym für den Befehl JOIN, allerdings ist es mit dem Komma einfacher und leichter zu lesen, was die Abfrage bewirken soll. Zunächst einmal führen wir die Abfrage aus. Ich erkläre dann anhand dieser die Vorgehensweise: SELECT Schueler.Name, Schueler.Vorname, hatkurs.Kursnummer FROM Schueler, hatkurs WHERE Punkte = 15 AND hatkurs.ID_Nummer = Schueler.ID_Nummer; Aha! Das sieht doch schon komplizierter aus! Ist es aber prinzipiell nicht. Was machen wir da? Eigentlich nicht viel neues: Wir selektieren die Attribute "Name" und "Vorname" aus der Tabelle "Schueler" und "Kursnummer" aus "hatkurs", da wir hier mit einem JOIN arbeiten, müssen wir natürlich angeben aus welcher Tabelle die auszugebenden Daten kommen sollen. Die ID_Nummer beispielsweise ist in beiden Tabellen vorhanden, wollten wir diese mit ausgeben wüsste das MySQL-System nicht welche ID_Nummer ausgegeben werden soll (sprich aus welcher Tabelle die Nummer stammen soll). In dem "FROM"-Teil sehen wir dann das Komma als eigentlichen "JOIN"-Operator. Hier wird angegeben welche Tabellen gejoint werden sollen, in unserem Fall natürlich "Schueler" und "hatkurs". Der "WHERE"-Teil ist erstmal klar, "Punkte = 15" kennen wir ja schon, aber was kommt dann? Tja, man kann einfach mehrere Bedingungen in die "WHERE"-Klausel schreiben, indem man ein "AND" verwendet. Das "AND" funktioniert einfach wie ein "AND WHERE", sprich: wir können die Auswahl weiter eingrenzen. In unserem Fall sorgen wir mit der zweiten Bedingung Seite 43 Übungen zu SQL © Fabian Meyer 2002 dafür, daß nur die Schuelerdaten aus der Tabelle "Schueler" ausgegeben werden, deren ID_Nummern auch im Ergebnis unser Abfrage "Wer hat 15 Punkte bekommen?" auftauchen. Da "ID_Nummer" sowohl in "Schueler" als auch in "hatkurs" vorkommt, lassen sich diese Tabellen auf diese sinnvolle Art und Weise joinen. Soweit mit dieser Abfrage... Machen wir es doch nochmal mit einem Join von allen 3 Tabellen! Unsere Fragestellung: "Liste alle Schueler mit Name, Vorname und Geschlecht auf die 15 Punkte in einem Leistungskurs bekommen haben, sowie die Kursnummer und das Thema des Kurses." Das klingt jetzt erstmal sehr schwierig, ist es aber prinzipiell gar nicht. Man muss nur die einzelnen Bedingungen verknüpfen und die richtige Zusammenstellung finden: Bedingung, WHERE-Syntax: Leistungskurs, kurse.kursart = 'L' 15-Punkte, hatkurs.Punkte = 15 Also nicht viel neues, bisher oder? Nun bauen wir die Abfrage: SELECT s.Name, s.Vorname, s.Geschlecht, k.kursnummer, k.kursthema FROM Schueler s, kurse k, hatkurs h WHERE h.Punkte = 15 AND h.ID_Nummer = s.ID_Nummer AND h.kursnummer = k.kursnummer AND k.kursart='L'; So, was ist neu? Eigentlich nichts. Wir haben nur erstmal ein "Alias" für die Tabellen gesetzt: "Schueler s" bedeutet, daß die Tabelle "Schueler" in dieser Abfrage auch als "s" angesprochen werden kann, analog funktioniert das natürlich auch für die anderen Tabellen ("kurse" ist dann "k" und "hatkurs" ist dann "h"). Ansonsten haben wir nur eine dritte Tabelle hinzu genommen und unsere Bedingungen in SQL formuliert und hinzugefügt. Als Ergebnis bekommen wir eine schöne Antwort auf unsere Fragestellung. Es sollte in diesem kurzen Beitrag eigentlich deutlich geworden sein, daß man in SQL mit einfachen Befehlen auch komplizierte Fragestellungen zu lösen vermag. An Theorie soll das genügen, der Rest ist Übungssache. Seite 44