SQL-Befehle Kurzanleitung und Übungen zu MYSQL MYSQL ist ein leistungsfähiges, relationales Client-Server-Datenbanksystem. Es wird vor allem für Internet-Datenbanken viel verwendet und bietet für den Anwender eine Reihe von Vorteilen, z. B. die, dass es im Rahmen der nicht-kommerziellen Verwendung frei verfügbar ist (GPL=GNU Public License im Sinne der Open Source-Idee wie bei Linux). GPL-Software ist frei verfügbar, aber daraus entwickelte Programme müssen ebenfalls wieder der Öffentlichkeit frei zugänglich gemacht werden. Für kommerzielle Anwendungen ist das ein wenig komplizierter (vgl. dazu. http://www.gnu.org/copyleft/gpl.html). Die Befehlseingabe am MYSQL-Prompt (Bereitschaftszeichen) ist „SQL pur“ und lässt sich deshalb besonders gut zum Üben von SQL-Befehlen verwenden1. Sie gelangen zum MYSQL-Prompt, indem Sie entweder a) Im Windows-Explorer im Ordner C:\Apache\MYSQL\Bin die Datei mysql.exe per Doppelklick aktivieren, oder b) Sie wählen über Start, Programme, MSDOS-Eingabeaufforderung mit Dos-Befehlen zum gewünschten Ordner: C:\WINDOWS>cd\apache\mysql\bin MS-DOS zeigt durch den Wechsel des Bereitschaftszeichens an, dass man sich im gewünschten Ordner befindet. Tippen Sie dann mysql ein! C:\apache\mysql\bin>mysql Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3 to server version: 3.23.32-debug Type 'help;' or '\h' for help. Type '\c' to clear the buffer mysql> Das ist das MYSQL-Promptzeichen: Drücken Sie Alt Return, um von der Fensterdarstellung zu Vollbild zu wechseln! MySQL verlassen Sie mit dem Befehl: mysql> exit; MYSQL verabschiedet sich Bye 1 SQL-Befehle: Datenbanken und Tabellen anlegen Am Mysql-Prompt werden Befehle eingegeben. Sie können (müssen aber nicht) die ReturnTaste drücken, um die Eingabe auf mehrere Zeilen zu verteilen. Der Befehl wird mit einem ; (Semikolon) abgeschlossen – zwar funktionieren einige Befehle auch ohne Semikolon, aber besser ist es, sich generell daran zu gewöhnen. 1.1 Datenbank anlegen: Datenbanken werden mit dem Befehl CREATE DATABASE Datenbankname angelegt. Aufgabe: Legen Sie die Datenbank mit dem Namen UEBUNG an! 1 Bei der Beispieltabelle Sammlung und den beschriebenen Übungen orientiere ich mich zum Teil an: SQL in 21 Tagen, ISBN: 3-8272-2020-3 -1- SQL-Befehle Kurzanleitung und Übungen zu MYSQL Geben Sie anschließend am Prompt-Zeichen den Befehl mysql> show databases; Sie sehen zum Beispiel folgendes Ergebnis: +-----------+ | Database | +-----------+ | uebung | | mysql | MYSQL zeigt an, welche Datenbanken existieren | test | | waren | +-----------+ 6 rows in set (0.05 sec) 1.2 Datenbank wechseln Mit dem Befehl use Datenbankname wird die aktuelle Datenbank gewechselt. Aufgabe: Geben Sie ein: mysql>use mysql; Database changed Aufgabe: Lassen Sie die Tabellen anzeigen: mysql> show tables; +-----------------+ | Tables_in_mysql | +-----------------+ In MYSQL gibt es eine Systemdatenbank mit dem | columns_priv | Namen mysql. Sie enthält alle Einstellungen ein| db | schließlich der Zugriffsrechte. | host | | tables_priv | | user | +-----------------+ 5 rows in set (0.00 sec) Aufgabe: Wechseln Sie wieder zur Datenbank UEBUNG. 1.3 Tabelle erstellen (create table) In der Datenbank UEBUNG soll jetzt die erste Tabelle angelegt werden. Der Name der Tabelle soll Sammlung sein. (Beispiel aus: SQL in 21 Tagen, Kap. 8) mysql> create table sammlung( -> stueck varchar(30) NOT NULL, -> wert double, -> text varchar(50) -> ); Query OK, 0 rows affected (0.06 sec) Diese Tabelle wird eingerichtet: Aufgabe: Geben Sie jetzt den Befehl: mysql> show tables; +----------------+ | Tables_in_it05 | +----------------+ | sammlung | +----------------+ 1 row in set (0.05 sec) MYSQL zeigt an, dass die Tabelle existiert 2 Daten eingeben, ändern und löschen Daten über SQL-Befehle einzugeben ist zugegebenermaßen etwas mühselig. Niemand wird in der Praxis Tausende Datensätze über den Befehl insert into einfügen. Dennoch ist im sinnvoll für das verständnis von SQL, wenn man diese Befehlseingabe beherrscht. Sie werden später Möglichkeiten kennenlernen, auch im Rahmen von MYSQL mit sogenannten -2- SQL-Befehle Kurzanleitung und Übungen zu MYSQL Frontends zu arbeiten, also Benutzeroberflächen, die „an vordester Front“ stehen. Es ist zum Beispiel auch möglich, Access als Eingabehilfe für MYSQL zu nutzen, indem ein ODBCTreiber eingerichtet wird. 2.1 Daten eingeben (insert into) Jetzt sollen Daten in die Tabelle eingegeben werden. Dies geschieht mit dem Befehl insert into. Die Syntax der Anweisung lautet: INSERT INTO Tabellenname (Spalte1, Spalte2...) VALUES (Wert1, Wert2...) Aufgabe: Geben Sie ein: mysql> insert into sammlung( -> stueck,wert,text) -> values( -> 'Wegweiser',300,'fehlt jetzt in Koeln' -> ); Query OK, 1 row affected (0.06 sec) Aufgabe: Lassen Sie jetzt die Tabelle anzeigen: mysql> select * from sammlung; +-----------+------+----------------------+ | stueck | wert | text | +-----------+------+----------------------+ | Wegweiser | 300 | fehlt jetzt in Koeln | +-----------+------+----------------------+ Man kann mit dem insert-Befehl auch Daten einfügen, ohne die Spalten dabei anzugeben. Dabei werden die Daten in der Reihenfolge, wie man sie schreibt, in die Spalten eingefügt: Aufgabe: Nehmen Sie den Datensatz auf: mysql> insert into sammlung -> values ('Kronleuchter',2000.00,'antikes Stück'); Query OK, 1 row affected (0.11 sec) Aufgabe: Schauen Sie nach, ob das Ergebnis stimmt: mysql> select * from sammlung; +--------------+------+----------------------+ | stueck | wert | text | +--------------+------+----------------------+ | Kronleuchter | 2000 | antikes Stück | | Wegweiser | 300 | fehlt jetzt in Koeln | +--------------+------+----------------------+ 2 rows in set (0.05 sec) Aufgabe: Nehmen Sie zwei weitere Datensätze auf. Die Syntax ist wie vorher beschrieben. Das Ergebnis soll hinterher sein: mysql> select * from sammlung; +--------------+------+----------------------+ | stueck | wert | text | +--------------+------+----------------------+ | Kronleuchter | 2000 | antikes Stück | | Wegweiser | 300 | fehlt jetzt in Koeln | | Kette | 200 | Erbstueck | | Barbie | 250 | Geschenk von Susi | +--------------+------+----------------------+ 4 rows in set (0.00 sec) -3- SQL-Befehle Kurzanleitung und Übungen zu MYSQL 2.1.1 Einzelne Felder eingeben Es ist auch möglich, einzelne Werte in einzelne Felder einzugeben, z. B. dann, wenn noch nicht alle Informationen vorliegen. Angenommen, in die Tabelle Sammlung soll ein Armband aufgenommen werden, es wird also zunächst nur die Spalte stueck mit Inhalt gefüllt: mysql> insert into sammlung -> (stueck) -> values('Armband'); Query OK, 1 row affected (0.17 sec) MYSQL zeigt dann an: mysql> select * from sammlung; +--------------+------+----------------------+ | stueck | wert | text | +--------------+------+----------------------+ | Kronleuchter | 2000 | antikes Stück | .... | Armband | NULL | NULL | +--------------+------+----------------------+ Aufgabe: Fügen Sie noch einen Datensatz an. Der Eintrag in die Spalte stueck soll nur ‚Uhr’ betragen’. Wenn später die anderen Felder eingegeben werden, dann muss mit dem update-Befehl und einer Where-Klausel gearbeitet werden, denn der Datenbank muss ja mitgeteilt werden, um welchen Datensatz es sich bei der Eingabe handelt. 2.2 Werte in Feldern ändern (update) Um Änderungen an den Daten vorzunehmen, brauchen Sie den Befehl update. Die Syntax lautet: UPDATE Tabellenname SET Spaltenname1 = Wert1 [, Spaltenname2 = Wert2]... WHERE Suchbedingung Beispiel: In der Tabelle Sammlung wird der Wert der Kette auf 900 erhöht UPDATE SAMMLUNG SET WERT = 900 WHERE STUECK = 'KETTE'; Aufgabe: Führen Sie diese Änderung durch! Vorsicht: ohne where-Klausel werden alle Werte ersetzt: UPDATE SAMMLUNG SET WERT = 555; alle Spalten hätten dann den Wert 555 Aufgabe: 1) Ändern Sie den Wert der Barbie auf 350 2) Ändern Sie den Text (drittes Feld) im Datensatz, der die Kette beschreibt, auf: Kauf in Lissabonn 3) Ändern Sie die Bezeichnung im Feld Stueck von Wegweiser auf Verkehrszeichen Aufgabe: Lassen Sie die Daten wieder anzeigen. mysql> select * from sammlung; +----------------+------+----------------------+ | stueck | wert | text | +----------------+------+----------------------+ | Kronleuchter | 2000 | antikes Stück | | Verkehrszeichen| 300 | fehlt jetzt in Koeln | | Kette | 900 | Kauf in Lissabonn | | Barbie | 350 | Geschenk von Susi | -4- b. w.! SQL-Befehle Kurzanleitung und Übungen zu MYSQL | Armband | | NULL | | Uhr | | NULL | +--------------+------+----------------------+ 5 rows in set (0.00 sec) NULL steht bekanntlich nicht für den Zahlenwert 0, sondern für „Nicht vorhanden“. Wenn die Eintragung NULL als störend empfunden wird, dann kann man die Felder stattdessen mit einem Leerzeichen füllen. Jetzt sollen auch die fehlenden Einträge beim Armband und der Kette ersetzt werden. Aufgabe: Setzen Sie mit dem folgenden Befehl den Wert des Armbands auf 1000 fest. mysql> update sammlung -> set wert=1000 -> where stueck='Armband'; Query OK, 1 row affected (0.00 sec) Aufgabe: Beim Datensatz ‚Armband’ soll der text als ‚Gold mit Halbedelsteinen’ eingetragen werden. 2.2.1 Mehrere Felder mit einem SQL-Befehl eintragen: Im Datensatz, der Informationen zur Uhr aufnehmen sollte, sind noch Felder unausgefüllt. Diese sollen mit dem folgenden Befehl gefüllt werden: mysql> update sammlung -> set wert=600,text='geerbt von Onkel Heinz' -> where stueck='Uhr'; Query OK, 1 row affected (0.00 sec) Die zweite Zeile -> set wert=600,text='geerbt von Onkel Heinz' zeigt, wie die Felder nacheinander, getrennt durch Kommas, gefüllt werden können. 2.3 Daten in andere Tabellen schreiben Die Syntax, um alle Daten von einer Originaltabelle z. B. in eine Sicherungstabelle zu schreben, lautet: insert into sicherungstabelle select * from originaltabelle; Wenn also alle Felder der Tabelle Sammlung in die Tabelle Sicherung geschrieben werden sollen, lautet der Befehl also: insert into sicherung select * from sammlung; Dazu muss allerdings die Tabelle Sicherung erst angelegt worden sein. Sie soll dieselben Felder mit denselben Datentypen wie die Originaltabelle bekommen. Aufgabe: Legen Sie zunächst die Tabelle Sicherung an: mysql> create table sicherung( -> stueck varchar(30) not null, -> wert double, -> text varchar(50) -> ); Query OK, 0 rows affected (0.06 sec) Aufgabe: Lassen Sie jetzt die Daten in die Tabelle schreiben: mysql> insert into sicherung -> select * from sammlung; Query OK, 6 row affected (0.06 sec) -5- SQL-Befehle Kurzanleitung und Übungen zu MYSQL Aufgabe: Sehen Sie jetzt nach, ob sich die Daten in der Tabelle Sicherung befinden: mysql> select * from sicherung; +--------------+------+--------------------------+ | stueck | wert | text | +--------------+------+--------------------------+ | Kronleuchter | 2000 | antikes Stück | | Wegweiser | 300 | fehlt jetzt in Koeln | | Kette | 900 | Kauf in Lissabonn | | Barbie | 350 | Geschenk von Susi | | Armband | 1000 | Gold mit Halbedelsteinen | | Uhr | 600 | geerbt von Onkel Heinz | +--------------+------+--------------------------+ 2.4 Löschen von Datensätzen Die Syntax des Befehls, mit dem Sie Datensätze aus einer Tabelle löschen können, lautet: DELETE FROM Tabellenname WHERE Bedingung Aufgabe: Löschen Sie mit dem folgenden Befehl den Kronleuchter aus der Tabelle Sammlung: delete from sammlung where stueck=’Kronleuchter’; Aufgabe: Löschen Sie außerdem alle Daten, deren Wert unter 500 liegt: delete from uebung where wert<500; Jetzt ist das Ergebnis: mysql> select * from sammlung; +--------------+------+--------------------------+ | stueck | wert | text | +--------------+------+--------------------------+ | Kette | 900 | Kauf in Lissabonn | | Armband | 1000 | Gold mit Halbedelsteinen | | Uhr | 600 | geerbt von Onkel Heinz | +--------------+------+--------------------------+ Damit die Daten wieder vorliegen, sollen sie nun aus der Sicherungstabelle zurückgeschrieben werden. Dabei würden allerdings Duplikate angelegt, also die zwei Datensätze, die noch vorhanden sind, wären anschließend doppelt vorhanden. Der Einfachheit halber löschen wir die beiden Datensätze und schreiben dann die Sicherungstabelle zurück. Aufgabe: Geben Sie zunächst ein: mysql> delete from sammlung; Query OK, 0 rows affected (0.05 sec) Sie sehen, dass ohne Angabe von where-Kriterien alles gelöscht wird. Aufgabe: Testen Sie: mysql> select * from sammlung; Empty set (0.00 sec) Aufgabe: Geben Sie zum „Zurückschreiben“ den Befehl ein: mysql> insert into sammlung -l> select * from sicherung; Aufgabe: Sehen Sie dann mit dem select-Befehl nach, ob alle Daten in der Tabelle Sammlung und in der Tabelle Sicherung wieder da sind (5 Datensätze) -6- SQL-Befehle Kurzanleitung und Übungen zu MYSQL 2.5 Löschen von Datenbanken und Tabellen Mit dem Befehl drop database <name> löschen Sie eine komplette Datenbank. Aufgabe: Erzeugen Sie eine Datenbank mit dem Namen IT_Test. create database IT_Test Schauen Sie jetzt nach, ob die Datenbank existiert: show databases; +-----------+ | Database | +-----------+ | IT_Test | | uebung | | mysql | | test | | waren | +--------------------+ Aufgabe: Löschen Sie die Datenbank wieder: drop database IT_Test; Wenn Sie anschließend wieder nachsehen, ist die Datenbank gelöscht: show databases +-----------+ | Database | +-----------+ | uebung | | mysql | | test | | waren | +-----------+ Generell ist hier zu beachten, dass manche Datenbanksysteme kein Löschen einer kompletten Datenbank zulassen. Z. B. kann man in Access keine Datenbank löschen, man löscht einfach die Datei auf der Windows-Ebene. Wenn mysql bei einem Provider eingesetzt wird, um eine Internet-Datenbank aufzubauen und zu pflegen, dann ist es in der Regel nicht möglich, mehrere Datenbanken zu erstellen, sondern man bekommt genau eine Datenbank, deren Name oft aus dem Nutzernamen abgeleitet wird. Beispielsweise bei Lycos-Tripod (kostenlose MySQL-Datenbank, wenn der Benutzername rokr lautet, dann heißt automatisch die Datenbank rokr_de_db. Diese Datenbank kann nicht gelöscht werden. Innerhalb der Datenbank können Tabellen erstellt und gelöscht werden. 2.5.1 Löschen von Tabellen Eine Tabelle innerhalb der Datenbank kann gelöscht werden, wenn man sich in der Datenbank befindet, wenn also vorher mit use <Datenbank> die Datenbank ausgewählt wurde. Der Befehl ist ähnlich wie der zum Löschen einer Datenbank drop table <Name>; löscht die Datenbanktabelle. Die Tabelle Sicherung ist gewissermaßen doppelt vorhanden, kann also gelöscht und wieder neu erstellt werden. Aufgabe: Geben Sie ein drop table sicherung; und anschließend: show tables; um zu sehen, dass die Tabelle nicht mehr existiert. -7- SQL-Befehle Kurzanleitung und Übungen zu MYSQL Bevor jetzt die Daten wieder in die Sicherungstabelle geschrieben werden, muss sie erst wieder mit create table erstellt werden: mysql> create table sicherung( -> stueck varchar(30) not null, -> wert double, -> text varchar(50) -> ); Query OK, 0 rows affected (0.06 sec) Aufgabe: Lassen Sie jetzt wieder die Daten in die Tabelle schreiben: mysql> insert into sicherung -> select * from sammlung; Query OK, 1 row affected (0.06 sec) 2.6 Tabellen ändern: alter table Mit dem Befehl alter table ist es möglich, die Struktur einer Tabelle im Nachhinein zu ändern. Die Syntax des Befehls lautet: ALTER TABLE Tabellenname <ADD Spaltenname Datentyp; | MODIFY Spaltenname Datentyp;> Man kann mit diesem Befehl also Spalten zu einer Tabelle hinzufügen oder verändern. Aufgabe: Zur Tabelle Sammlung soll eine Spalte Kaufdatum (Typ: Date) hinzugefügt werden: mysql> alter table sammlung -> add Kaufdatum date; Query OK, 5 rows affected (0.11 sec) Es ist klar, dass die Felder zunächst natürlich noch leer sind: mysql> select * from sammlung; +--------------+------+--------------------------+-----------+ | stueck | wert | text | Kaufdatum | +--------------+------+--------------------------+-----------+ | Kronleuchter | 2000 | antikes Stück | NULL | | Kette | 200 | Erbstueck | NULL | |...... ... ... ... | +--------------+------+--------------------------+-----------+ 5 rows in set (0.05 sec) Aufgabe: Der Datensatz, in dem die Informationen über die Kette gespeichert sind, soll jetzt mit einem Datum, und zwar dem 12. Januar 2003,gefüllt werden. Das Datum muss in der Form Jahr-Monat-Tag eingegeben werden. mysql> update sammlung -> set kaufdatum='2003-01-12' -> where stueck='Kette'; Query OK, 1 row affected (0.00 sec) Schauen Sie nach: mysql> select * from sammlung; +--------------+------+--------------------------+----+------------+ | stueck | wert | text | ID | Kaufdatum | +--------------+------+--------------------------+----+------------+ | Kronleuchter | 2000 | antikes Stück | 1 | NULL | | Kette | 200 | Erbstueck | 2 | 2003-01-12 | | Barbie | 250 | Geschenk von Susi | 3 | NULL | | Armband | 1000 | Gold mit Halbedelsteinen | 4 | NULL | | Uhr | 600 | geerbt von Onkel Heinz | 5 | NULL | +--------------+------+--------------------------+----+------------+ -8- SQL-Befehle Kurzanleitung und Übungen zu MYSQL Aufgabe: Setzen Sie jetzt noch folgende Datumsangaben ein: Kronleuchter 20.03.2002 Armband 30.12.1998 Bisher ist zu der Tabelle Sammlung noch kein ID-Feld vorhanden. Mit dem folgenden Befehl soll eine Spalte namens ID erstellt werden, Typ: Smallint, das Feld soll ein Autowert-Feld sein (=Auto-Increment). Diese Auto-Increment-Spalten müssen außerdem indiziert sein. Aufgabe: Nehmen Sie diese Änderung vor: mysql> alter table sammlung add ID smallint NOT NULL Auto_Increment, -> add index (ID); Query OK, 5 rows affected (0.11 sec) Sie sehen jetzt in der Tabelle: mysql> select * from sammlung; +--------------+------+--------------------------+------------+----+ | stueck | wert | text | Kaufdatum | ID | +--------------+------+--------------------------+------------+----+ | Kronleuchter | 2000 | antikes Stück | 0000-00-00 | 1 | | Kette | 200 | Erbstueck | 2003-01-12 | 2 | | Barbie | 250 | Geschenk von Susi | NULL | 3 | | Armband | 1000 | Gold mit Halbedelsteinen | 0000-00-00 | 4 | | Uhr | 600 | geerbt von Onkel Heinz | NULL | 5 | +--------------+------+--------------------------+------------+----+ 5 rows in set (0.11 sec) Anschließend fällt auf, dass wir das neue ID-Feld nicht als Primärschlüssel gesetzt haben. Dies wird auch wieder mit alter table gemacht. Geben Sie dazu den Befehl ein: mysql> alter table sammlung -> add primary key (ID); Query OK, 5 rows affected (0.00 sec) 2.7 Umbenennen Mit dem Befehl alter table ist es möglich, den Namen von Tabellen zu ändern. Der folgende Befehl benennt die Tabelle Sammlung in Sachen um: mysql> alter table sammlung rename Sachen; Query OK, 0 rows affected (0.06 sec) Anschließend sehen Sie: mysql> show tables; +----------------+ | Tables_in_it05 | +----------------+ | sachen | | sicherung | +----------------+ 2 rows in set (0.05 sec) Sie können mit alter table aber auch Spalten umbenennen. Der folgende Befehl benennt die Spalte stueck in bezeichnung um. Zu beachten ist, dass man dabei den Datentyp angeben muss, denn er könnte auch geändert werden. mysql> alter table sachen change stueck bezeichnung varchar(30); Genauso könnte man die Feldlänge des Feldes von 30 auf 40 ändern: mysql> alter table sachen change bezeichnung bezeichnung varchar(40); Aufgabe: Nehmen Sie diese Änderungen vor! -9- SQL-Befehle Kurzanleitung und Übungen zu MYSQL Lösung zum Einsetzen des Datums: mysql> update sachen -> set kaufdatum=2002-03-30 -> where bezeichnung='Kronleuchter'; Query OK, 1 row affected (0.06 sec) Rows matched: 1 Changed: 1 Warnings: 1 mysql> update sachen -> set kaufdatum=1998-12-30 -> where bezeichnung='Armband'; Query OK, 1 row affected (0.06 sec) Rows matched: 1 Changed: 1 Warnings: 1 Aufgabe: Erzeugen Sie an der MySQL-Eingabeaufforderung eine Datenbank namens PC_Artikel. In der Datenbank sollen dann drei Tabellen mit den abgebildeten Datensätzen angelegt werden. Der Primärschlüssel wird jeweils auf das links stehende Feld gesetzt. Überlegen Sie, welche Datentypen sinnvoll sind! Tabelle: Produkte Produkt Nr 1 2 3 Bezeichnung Monitor 19 Zoll Maus mit Scrollrad Mauspad Gewicht 12,3 0,07 0,01 Menge 30 100 500 Tabelle: Verkaeufer VNR 10 20 30 3 Name Kasub Moltke Trieneken Vorname Jaromir Annegret Hans Tabelle: Verkauf VK Nr 1 2 3 4 5 VNR 10 10 20 20 30 Produkt Nr 2 3 2 3 1 Datum 16.06.2003 17.06.2003 16.06.2003 18.06.2003 18.06.2003 Fragen Sie folgende Daten ab: 1. Wieviele Artikel (Datensätze) sind gespeichert? 2. Wie heißt der Verkäufer mit der VK_Nr 30? 3. Wer verkaufte etwas am 18.06.2003? 4. Wieviel wiegen alle vorrätigen Monitore? 5. Wie ist die Bezeichnung des/der Artikel, die von der Verkäuferin Annegret Moltke verkauft wurden? - 10 - SQL-Befehle Kurzanleitung und Übungen zu MYSQL Jetzt sollen einige Änderungen an der Tabellenstruktur vorgenommen werden: a) in der Tabelle Verkaeufer wird das Feld Gehalt hinzugefügt. Geben Sie dann die folgenden Zahlen ein: Kasub 1878,89 / Moltke 1389;90 / Trieneken 1478,12 b) in der Tabelle Verkaeufer soll das Feld Vorname auf Varchar(25) gesetzt werden. c) in der Tabelle Produkt soll das Feld Menge in die Bezeichnung vorrätig geändert werden. - 11 - SQL-Befehle Kurzanleitung und Übungen zu MYSQL 4 MySQLDUMP: Import und Export von Datenbanken Zu MySQL gehört ein Zusatzprogramm mit dem Namen MySQLDUMP, mit dem Sie sehr effektiv sowohl die Struktur als auch den Inhalt von Datenbanktabellen bzw. ganzen Datenbanken in eine Datei geschrieben werden kann. Dieses Programm befibndet sich im Ordner C:\Mysql\Bin Die folgenden Befehle werden nicht „innerhalb“, also vom Prompt aus, gegeben, sondern von der MS-DOS-Eingabeaufforderung aus. Die Syntax ist folgende: mysqldump datenbankname > dumpdatei.sql [die Dateiergänzung ist beliebig] Um beispielsweise eine Datei mit den Befehlen zum Erzeugen der Datenbanktabelle sicherung aus der Datenbank Uebung zu machen, geben Sie ein: C:\mysql\bin>mysqldump it04 sicherung >sich.sql Um zu sehen, dass die Datei existiert, lassen Sie sich den Inhalt anzeigen: C:\mysql\bin>dir sich.sql Es erfolgt z. B. diese Ausgabe: Verzeichnis von C:\mysql\bin SICH SQL 745 19.06.03 22:12 sich.sql 1 Datei(en) 745 Bytes Aufgabe: Öffnen Sie diese Datei mit dem Editor, dann sehen Sie (Abb. nächste Seite) die SQL-Befehle in der Textdatei, die nötig gewesen wären, um diese Datei manuell anzulegen und mit dem Befehl insert into mit Daten zu füllen. Neben der Notwendigkeit, einen Dump zu erzeugen, um Dateien z. B. als Datenbank beim Provider anzulegen, ergibt sich damit ein wirkungsvolles Werkzeug, wenn es darum geht, Sicherungen von Datenbanken anzulegen. - 12 - SQL-Befehle Kurzanleitung und Übungen zu MYSQL Um eine solche Textdatei wieder zurückzusichern, braucht man die umgekehrte Variante des Befehls: mysql datenbankname < dumpdatei.dump Dazu ist es dann ggf. erforderlich, eine neue Datenbank erst anzulegen. Gehen Sie zum Beispiel so vor: 1. Starten Sie MySQL 2. Erzeugen Sie dort eine Datenbank namens uebung2 3. Verlassen Sie Mysql wieder 4. Geben Sie an der DOS-Eingabeaufforderung ein: mysql uebung2 < sich.sql 5. Starten Sie erneut MySQL 6. Wechseln Sie zur Datenbank uebung 2 7. Schauen Sie dort mit dem select-Befehl in die Tabelle sicherung. - 13 - SQL-Befehle Kurzanleitung und Übungen zu MYSQL Aufgabe: Kopieren Sie den Ordner Schulungen in Ihren MySQL-Datenbankordner. Es handelt sich dabei um eine MySQL-Datenbank. Kopieren Sie außerdem die datei demodaten.sql in den Ordner MySQL\BIN Dies ist der Dump einer SQL-Datei. 1. Starten Sie MySQL und wechseln Sie zu der Datenbank Schulungen. 2. Sehen Sie sich die Tabellen an. Lösen Sie zunächst die folgenden Aufgaben mit SQL: a) Lassen Sie sich alle Daten zum Kurs Dreamweaver 4 anzeigen. b) Welche Kurse besuchte Oliver Müller? c) Ermitteln Sie die Adresse der Stadtwerke Willingen. 3. Wechseln Sie zur Windows-Eingabeaufforderung und erstellen Sie einen Dump von der Datenbank. Geben Sie als Dateinamen Schulungen.sql ein. 4. Öffnen Sie die erzeugte Datei mit dem Editor und sehen Sie sich die SQLBefehle an. 5. Machen Sie noch einmal einen Dump namens Teilnehmer, aber nur von den Teilnehmern aus der Datenbank. 6. Öffnen Sie die erzeugte Datei mit dem Editor und sehen Sie sich die SQLBefehle an. 7. Erzeugen Sie nun eine Mysql-Datenbank aus der Datei demodaten.sql. Dazu müssen Sie sich erst die daten ansehen und sie eventuell angleichen, um sie als Dump zu nutzen. 8. Starten Sie MySQL und sehen Sie sich die Daten an. 9. Jetzt sollen die Daten zusammengebracht werden: Aus der Datenbank Schulungen und aus der Tabelle Dozenten (aus Demodaten.sql) soll eine Datenbank werden. Überlegen Sie selbst, wie Sie dazu vorgehen müssen. - 14 - SQL-Befehle Kurzanleitung und Übungen zu MYSQL 5 Textdateien in Mysql einlesen Sie haben gesehen, dass die Eingabe von Daten über den Befehl insert into sehr mühsam ist. In der Praxis ist es oft erforderlich, Daten, die zuerst mit anderen Programmen erstellt und bearbeitet worden sind, zu übernehmen. Dazu bietet sich der Befehl load data an. Mit diesem Befehl werden Daten mit hoher Geschwindigkeit in die Datenbanktabelle eingelesen. Vorab muss diese Tabelle von der Struktur her erstellt worden sein, die Felder mit den Datentypen, der Primärschlüssel usw. muss festgelegt worden sein. Textdateien, in denen sich die Datensätze jeweils in einer Zeile, getrennt durch Tabstop-Zeichen, Semikolon oder Komma, befinden, lassen sich aus allen Programmen erzeugen (z. B. Word, Excel, Access), und auch Uralt-Datenbank erlauben es, Daten in dieser Form zu exportieren. Mit dieser Methode ist es also kein Problem, Riesen-Datenbestände, die in einem x-beliebigen Format vorliegen, ins Internet zu stellen, um weltweit den Zugriff auf diese Daten zu haben. Die Syntax des Befehls ist folgende: LOAD DATA [LOCAL] INFILE 'file_name.txt' [REPLACE | IGNORE] INTO TABLE tbl_name [FIELDS [TERMINATED BY '\t'] [OPTIONALLY] ENCLOSED BY "] [ESCAPED BY '\\' ]] [LINES TERMINATED BY '\n'] [IGNORE number LINES] [(col_name,...)] Wenn das Schlüsselwort LOCAL angegeben wurde, dann wird die Datei von dem Client Host gelesen. Falls nicht, dann muß sich die Datei auf dem Server befinden. Die Schlüsselworte REPLACE und IGNORE bestimmen, was mit exisiterenden Einträge geschieht, wenn die neu eingelesenen Daten denselben Wert im Schlüsselfeld haben. Wenn REPLACE angegeben wird, ersetzen neue Einträge alte, die dieselben KEY VALUES besitzen. Wenn IGNORE angegeben wird, dann werden diese Einträge übergangen. Ohne Angabe wird ein Fehler ausgegeben, wenn ein doppelter KEY VALUE auftritt. Wenn zu fields und lines nichts angegeben wird, dann gilt: Die Werte in den Zeilen sind durch Tabulatorzeichen getrennt, und es gibt keine Anführungszeichen bei Textfeldern. Die rechts abgebildete Word-Datei, gespeichert als Nur-Text-Datei in dem Ordner, in dem sich die Datenbankdatei befindet, mit dem Dateinamen namen2.txt, mit den Feldern: NR, Name,Vorname, Geschlecht wird also mit folgendem Befehl in mysql eingelesen: mysql> load data infile 'namen2.txt' into table adr2; Sind die Felder durch andere Zeichen getrennt, wie hier in der Datei namen.txt durch Semikolons, dann muss das Trennzeichen angegeben werden: 1;Mueller;Ernst;m 2;Schmitz;Hans;m 3;Mayer;Juergen;m 4;Moeller;Peter;m 5;Gaertner;Luise;w mysql> load data infile 'namen.txt' into table adr fields terminated by ";“ ; Voraussetzung dabei ist aber, dass die Tabelle vorher mit create table erstellt wird (oder vorher schon bestand). - 15 - SQL-Befehle Kurzanleitung und Übungen zu MYSQL Aufgabe: Erstellen Sie die datei adr: mysql> use uebung Database changed mysql> create table adr ( -> id tinyint(3) NOT NULL Primary Key, -> name varchar(30), -> vorname varchar(20), -> geschlecht varchar(1) -> ); Query OK, 0 rows affected (0.16 sec) Aufgabe: Kopieren Sie die Datei namen2.txt in den Ordner, in dem sich die Datenbankdatei uebung befindet (z.B: C:\mysql\data\uebung ). Aufgabe: Lesen Sie jetzt die Daten in die Datei ein: mysql> load data infile 'namen2.txt' into table adr2; Schauen Sie jetzt die Daten an: select * from adr2 | id | name | vorname | geschlecht | +----+------------+---------+------------+ | 1 | Mueller | Ernst | m | | 2 | Schmitz | Hans | m | | 3 | Mayer | Juergen | m | | 4 | Moeller | Peter | m | …. +----+------------+---------+------------+ 19 rows in set (0.05 sec) Aufgabe: Verfahren Sie ebenso mit der Datei namen.txt. Sie ist, wie oben erwähnt, durch Semikolons getrennt. Sie muss also zuerst genauso erstellt werden: mysql> create table adr ( -> id tinyint(3) NOT NULL Primary Key, -> name varchar(30), -> vorname varchar(20), -> geschlecht varchar(1) -> ); Dann brauchen Sie den vorher erwähnten Befehl: load data infile 'namen.txt' into table adr fields terminated by ";“ ; 5.1 Textdateien aus Mysql-Dateien erzeugen SELECT ... INTO OUTFILE ist das Gegenstück zu LOAD DATA INFILE. Wenn Sie also Daten aus einer mysql-Tabelle in eine ASCII-Datei auslesen wollen, benötigen Sie diesen Befehl. SELECT .* |.Felder.. INTO OUTFILE 'Dateiname' from ... where... Aufgabe: Geben Sie die Tabelle Sicherung aus der Datenbank Uebung in eine Tabelle namens sicher.txt aus. Wenn Sie die Tabelle anschließend in Word öffnen, sollte sie so aussehen: - 16 - SQL-Befehle Kurzanleitung und Übungen zu MYSQL Lösung: mysql> select * into outfile 'sicher.txt' -> from sicherung; Query OK, 5 rows affected (0.11 sec) Aufgabe: Ihnen liegt eine Excel-Arbeitsmappe Metallwaren.xls mit den hier abgebildeten vier Tabellen Kunde, Waren, Bestellung und Bestelldetails vor. Diese Tabellen sollen in eine MYSQL-Datenbank übertragen werden. Die Schritte, die dafür erforderlich sind: 1. Excel-Tabellen in Textdatei übertragen (csv-Datei) (4x) 2. In MySQL jeweils die Tabellenstruktur erzeugen 3. Daten mit load data infile einlesen Lösung: zunächst Datenbank anlegen mysql> create database metallwaren -> ; Query OK, 1 row affected (0.05 sec) Datenbank anlegen dann in Excel: aus der Tabelle Kunde die erste Zeile mit den Spaltenüberschriften löschen (weil sie ja als Feldname in der Datenbank definiert werden müssen und nicht die erste Zeile der Tabelle sein dürfen) anschließend als csv-Datei im Ordner C:\apache\mysql\data\metallwaren speichern, dann Excel-Tabelle schließen jetzt zu MySQL wechseln, die Datenbank öffnen und die Tabelle Kunde anlegen mysql> use metallwaren; Tabelle erzeugen - 17 - SQL-Befehle Kurzanleitung und Übungen zu MYSQL Database changed mysql> create table kunde( -> kundennummer tinyint(3) auto_increment NOT NULL PRIMary Key, -> name varchar(20), -> vorname varchar(20), -> Strasse varchar(30), -> PLZ int(5), -> Ort varchar(20) -> ); Query OK, 0 rows affected (0.06 sec) mysql> load data infile 'kunde.csv' into table kunde -> fields terminated by ";"; Query OK, 4 rows affected (0.00 sec) Texttabelle einlesen Records: 4 Deleted: 0 Skipped: 0 Warnings: 4 mysql> select * from kunde; +--------------+-----------+---------+-------------------+-------+--------+ | kundennummer | name | vorname | Strasse | PLZ | Ort +--------------+---------+---------+------------------------+-------+----1 | Schulte | Willi | Stra_burger Stra_e 10 | 50968 | Koeln" | 2 | Boll | Anna | Essenberger Stra_e 3 | 53844 | Troisdorf" | 3 | Segers | Gerd | Bonner Stra_e 12 | 53844 | Troisdorf" | 4 | Maassen | Karl | Schoenhauser Stra_e 64 | 50967 | Koeln" +--------------+---------+---------+------------------------+-------+---+ 5 rows in set (0.00 sec) Aufgabe: Verfahren Sie entsprechend mit den anderen Tabellen, also auch hier wieder: 1. Excel-Tabellen in Textdatei übertragen (csv-Datei) 2. In MySQL die Tabellenstruktur erzeugen 3. Daten mit load data infile einlesen - 18 - SQL-Befehle Kurzanleitung und Übungen zu MYSQL Aufgabe: Machen Sie jetzt die folgenden Abfragen über SQL-Befehle: 1. In welchem Ort wohnt der Kunde namens Schulte? ’ 2. An welchem Datum kaufte der Kunde namens Maassen etwas? 3. Von welchem Artikeln sind mindestens 5000 Stück auf Lager? 4. Wwelche Waren wurden mit der Bestellnummer 10 verkauft? 5. Der Kunde Schulte meldet eine neue Adresse. Er wohnt jetzt in der Gartenstraße 45 (Wohnort bleibt) 6. Erhöhen Sie die Verkaufspreise für die Artikel ab Artikel_ID 4 um 10 %. 7. Ändern Sie die Spaltenüberschrift Kundennummer in der Tabelle Bestellung in KNR 8. Fügen Sie ein Feld Rabattstufe zur Tabelle Kunde hinzu. Tragen Sie dann Werte ein: 9. Der neue Lagerbestand für Dübel soll 1500 betragen. Name Schulte Boll Segers Maassen Rabattstufe 1 1 2 2 10. Welcher Artikel hat den höchsten Lagerbestand? 11. An welchem Ort wohnt der Kunde, an den die Bestellnummer 20 ging? 12. Welche Menge an Bolzen kaufte die Kundin Boll? 13. Fügen Sie eine neue Bestellung (Bestellnummer 30) des Kunden Segers hinzu. Er bestellt am 29.01.03 folgende Artikel: 1000 Nieten und 500 Bolzen. Nehmen Sie die erforderlichen Datensätze auf. - 19 - SQL-Befehle Kurzanleitung und Übungen zu MYSQL Lösungen zu S. 14: 1. SELECT ort FROM kunde where name = "Schulte" 2. select be.bestelldatum, ku.name from bestellung be, kunde ku where ku.name="Maassen" and ku.kundennummer=be.kundennummer 3. SELECT artikel FROM waren where lagerbestand > 5000 4. select a.artikel, bd.bestellnr from artikel a, bestelldetails bd where a.artikel_ID=bd.waren_ID and bd.Bestellnr=10 5. update kunde set straße=Gartenstraße 45“ where name = “Schulte“ 6. update artikel set vk_preis = vk_preis*1.1 where Artikel_ID >= 4 - 20 - SQL-Befehle Kurzanleitung und Übungen zu MYSQL - 21 -