Einführung in MySQL SQL (Structured Query Language) ist eine Computersprache zum Speichern, Bearbeiten und Abfragen von Daten in relationalen Datenbanken. Eine relationale Datenbank kann man sich als eine Sammlung von Tabellen (den Relationen) vorstellen, in welchen Datensätze abgespeichert sind. Jede Zeile (Tupel) in einer Tabelle ist ein Datensatz. Jedes Tupel besteht aus einer Reihe von Attributen (Eigenschaften), den Spalten der Tabelle. Eine erste Version von SQL erschien 1974, als eine Arbeitsgruppe bei IBM den ersten Prototyp einer relationalen Datenbank entwickelte. Die erste kommerzielle relationale Datenbank wurde von Relational Software (der späteren Firma Oracle) auf den Markt gebracht. SQL-Befehle zur Tabellen-Bearbeitung CREATE TABLE Tabellen stellen die Grundstruktur für die Speicherung von Daten in der Datenbank dar. Da der Datenbankanbieter in den meisten Fällen nicht im Voraus wissen kann, wie Ihre Anforderungen an die Datenspeicherung genau aussehen, ist davon auszugehen, dass Sie die Tabellen in der Datenbank selbst erzeugen müssen. Bevor wir näher auf die SQL-Syntax für CREATE TABLE eingehen, sollten wir zunächst verstehen, wie eine Tabelle aufgebaut ist. Tabellen sind in Zeilen und Spalten aufgeteilt. Bei einer Tabelle für Kundendaten könnten die Spalten beispielsweise Informationen wie Vorname, Nachname, Strasse, Wohnort, Land, Geburtsdatum usw. enthalten. Bei der Definition einer Tabelle, geben wir dementsprechend die Spaltenkopfzeilen und die Datentypen für die jeweilige Spalte an. Wenn wir eine Tabelle definieren, müssen wir für jede Spalte den zugehörigen Datentyp angeben (z. B. für 'Vorname' den Typ CHAR(50), also einen aus 50 Zeichen bestehenden String). Die SQL-Syntax für den Befehl CREATE TABLE sieht folgendermassen aus: CREATE TABLE "Tabellen_Name" ("Spalte 1" "Datentyp_für_Spalte_1", "Spalte 2" "Datentyp_für_Spalte_2", ... ); Zur Erstellung der oben beschriebenen Kundentabelle würden wir also eingeben (mit Angabe von Datentypen): CREATE TABLE KUNDE ( Kunde_ID INT NOT NULL AUTO_INCREMENT , Nachname VARCHAR( 30 ) NOT NULL , Vorname VARCHAR( 20 ) NOT NULL , Strasse VARCHAR( 40 ) NOT NULL , PLZ VARCHAR( 10 ) NOT NULL , Ort VARCHAR( 30 ) NOT NULL , Geburtsdatum DATE NOT NULL); INSERT INTO Wie gelangen die Datenzeilen in die Tabellen? Um diese Frage geht es in den nächsten Abschnitten, welche die Anweisungen INSERT und UPDATE behandeln. In SQL gibt es im Wesentlichen zwei Methoden zum Einfügen (INSERT) von Daten in eine Tabelle: Bei der einen wird jeweils eine Zeile eingefügt und bei der anderen mehrere gleichzeitig. Sehen wir uns zunächst den Befehl zum Einfügen (INSERT) einzelner Datenzeilen an. Die Syntax für die entsprechende Funktion sieht folgendermassen aus: INSERT INTO "Tabellen_Name" ("Spalte1", "Spalte2", ...) VALUES ("Wert1", "Wert2", ...); Beispielsweise könnten wir in oben erstellter Tabelle KUNDE folgende Einträge vornehmen: INSERT INTO `KUNDE` (`Kunde_ID`, `Nachname`, `Vorname`, `Strasse`, `PLZ`, `Ort`, `Geburtsdatum`) VALUES (NULL, 'Sorglos', 'Susi', 'Himmelsweg 7', '5555', 'Sternlingen', '2000-12-24'), (NULL, 'Masorati', 'Ricki', 'Schnellstrasse 200', '1001', 'Rasingen', '1984-01-01'), (NULL, 'Ratlos', 'Rudi', 'Schwermutgasse 3', '9998', 'Stahlikon', '2001-02-03'); Hinweis: Beachten Sie bitte, dass die Attributwerte mit einfachen Anführungszeichen versehen sein müssen. UPDATE In bestimmten Fällen kann es erforderlich sein, bereits vorhandene Daten zu aktualisieren. Dies können wir mit dem Befehl UPDATE tun. Die entsprechende Syntax lautet: UPDATE "Tabellen_Name" SET "Spalte1" = [Wert] WHERE {Bedingung}; ALTER TABLE Nach der Erstellung einer Tabelle in der Datenbank gibt es viele Anlässe für die Änderung der Struktur dieser Tabelle. Typische Vorgänge sind: Spalten hinzufügen Spalten löschen Spaltennamen ändern Datentyp einer Spalte ändern Beachten Sie bitte, dass es sich hierbei nicht um eine vollständige Liste handelt. Der Befehl ALTER TABLE wird auch bei anderer Gelegenheit verwendet, beispielsweise zum Ändern der Primärschlüsseldefinition. Die SQL-Syntax für den Befehl ALTER TABLE sieht folgendermassen aus: ALTER TABLE "Tabellen_Name" [Alter Spezifikation]; [Alter Spezifikation] hängt von der Art der gewünschten Änderung ab. Für die oben aufgeführten Anwendungszwecke lauten die entsprechenden Anweisungen: Spalte hinzufügen: ADD "Spalte 1" "Datentyp für Spalte 1"; Spalte löschen: DROP "Spalte 1"; Spaltenname ändern: CHANGE "alter Spaltenname" "neuer Spaltenname" "Datentyp für neuen Spaltennamen"; Datentyp einer Spalte ändern: MODIFY "Spalte 1" "neuer Datentyp"; Es folgen nun Übungen für die einzelnen Vorgänge, unter Verwendung der im Abschnitt CREATE TABLE erzeugten "Kunden"-Tabelle. Zunächst fügen wir eine Spalte "Geschlecht" (1 Zeichen) zu dieser Tabelle hinzu. Wie heisst der Befehl? .............................................................. .................................... Als nächstes benennen wir die Spalte "Strasse" in "Str." (max. 50 Zeichen) um. Wie heisst der Befehl? .............................................................. .................................... Dann ändern wir den Datentyp der Spalte "Ort" zu CHAR(30). Wie heisst der Befehl? .............................................................. .................................... Schliesslich löschen wir die Spalte "Geschlecht" wieder. Wie heisst der Befehl? .............................................................. .................................... Primärschlüssel Ein Primärschlüssel dient der eindeutigen Identifizierung der einzelnen Zeilen in einer Tabelle. Er kann entweder Teil des eigentlichen Datensatzes oder ein künstliches Feld sein (das mit dem Datensatz nichts zu tun hat). Ein Primärschlüssel kann aus einem oder mehreren Feldern einer Tabelle bestehen. Primärschlüssel, die aus mehreren Attributen bestehen, werden als zusammengesetzte Schlüssel bezeichnet. Primärschlüssel können entweder bei der Erstellung der Tabelle (mit CREATE TABLE) oder bei der Änderung der vorhandenen Tabellenstruktur (mit ALTER TABLE) definiert werden. Definition eines Primärschlüssels während der Erzeugung einer Tabelle: CREATE TABLE KUNDE (Kunde_ID integer PRIMARY KEY, Nachname_Name varchar(30), Vorname varchar(30)); Definition eines Primärschlüssels während der Änderung einer Tabelle: ALTER TABLE KUNDE ADD PRIMARY KEY (Kunde_ID); Hinweis: Vor Verwendung des Befehls ALTER TABLE zur Hinzufügung eines Primärschlüssels müssen Sie sicherstellen, dass das entsprechende Feld als 'NOT NULL' definiert ist, d.h. NULL ist kein akzeptabler Wert für dieses Feld. Fremdschlüssel Ein Fremdschlüssel ist ein Feld (oder mehrere Felder), das auf den Primärschlüssel einer anderen Tabelle verweist. Zweck des Fremdschlüssels ist es, die referentielle Integrität der Daten sicherzustellen. Die referentielle Integrität verhindert bei Löschprozessen das Entstehen von verwaisten Datensätzen: Nehmen wir zum Beispiel an, es liegen zwei Tabellen vor, eine Kundentabelle mit allen Kundendaten und eine Bestellungstabelle mit allen Kundenaufträgen. Die Bedingung lautet nun, dass alle Aufträge einem bereits in der Kundentabelle verzeichneten Kunde zugewiesen sein müssen. In diesem Fall platzieren wir einen Fremdschlüssel in die Bestellungstabelle und setzen ihn in Bezug zum Primärschlüssel der Kundentabelle. Auf diese Weise ist sichergestellt, dass alle Aufträge in der Bestellungstabelle einem Kunden in der Kundentabelle zugeordnet sind. Mit anderen Worten, die Bestellungstabelle kann keine Daten zu einem Kunden enthalten, der nicht in der Kundentabelle aufgeführt ist. Die beiden Tabellen sind wie folgt strukturiert: Tabelle KUNDE Spaltenname Merkmal Kunde_ID Primärschlüssel Nachname Vorname Tabelle BESTELLUNGEN Spaltenname Merkmal Bestellung_ID Primärschlüssel Kunde_ID Fremdschlüssel Bestelldatum Im oben stehenden Beispiel ist die Spalte KUNDE_ID in der Tabelle BESTELLUNGEN ein Fremdschlüssel, der auf die Spalte Kunde_ID der Tabelle KUNDE verweist. Es folgen Beispiele für die Definition des Fremdschlüssels während der Erzeugung der Tabelle BESTELLUNGEN: CREATE TABLE BESTELLUNGEN (Bestellung_ID integer, Kunde_ID integer, Bestelldatum DATE, PRIMARY KEY (Bestellung_ID), FOREIGN KEY (Kunde_ID) REFERENCES KUNDE (Kunde_ID)); Nachträgliches Einfügen des Fremdschlüssels in die Tabelle BESTELLUNGEN: ALTER TABLE BESTELLUNGEN ADD FOREIGN KEY (Kunde_ID) REFERENCES KUNDE (Kunde_ID); DROP TABLE Manchmal ist es wünschenswert, eine Tabelle aus der Datenbank zu löschen. Zum Glück gibt es mit DROP TABLE einen entsprechenden SQL-Befehl: DROP TABLE "Tabellen_Name"; DELETE FROM Manchmal ist es wünschenswert, Datensätze aus einer Tabelle zu entfernen. Dies können wir mit dem Befehl DELETE FROM erreichen. Die entsprechende Syntax lautet: DELETE FROM "Tabellen_Name" WHERE {Bedingung}; Am einfachsten lässt sich dies mit einem Beispiel verdeutlichen. Nehmen wir an, dass folgende Tabelle vorliegt, die Sie zuerst mit CREATE TABLE und INSERT INTO noch erzeugen müssen: Tabelle TAGESUMSAETZE Filiale Los Angeles San Diego Los Angeles Boston Betrag 1500 SFr. 250 SFr. 300 SFr. 700 SFr. Datum 05.Jan.1999 07.Jan.1999 08.Jan.1999 08.Jan.1999 und wir möchten alle Daten zu „Los Angeles“ aus dieser Tabelle entfernen. Dazu verwenden wir folgende SQL-Anweisung: .............................................................. .................................... SQL-Abfrage-Befehle SELECT Eine häufige Anwendung ist die Auswahl von Daten aus den Tabellen einer Datenbank. Und damit kommen wir schon zu zwei Schlüsselwörtern: wir wählen (SELECT) Daten aus (FROM) einer Tabelle. SELECT "Spalten_Name" { , "Spalten_Name"} FROM "Tabellen_Name"; Wollen wir alle Datensätze einer Tabelle ausgeben, so geben wir folgenden SQL-Befehl ein: SELECT * FROM "Tabellen_Name"; WHERE Nehmen wir an, wir möchten nur Daten aus einer Tabelle auswählen, die bestimmte Bedingungen erfüllen. Zum Beispiel nur Warenhäuser mit einem Umsatz von mehr als 1.000 SFr.. Dazu verwenden wir das Schlüsselwort WHERE. Die Syntax sieht folgendermassen aus: SELECT "Spalten_Name" FROM "Tabellen_Name" WHERE "Bedingung"; Um zum Beispiel alle Filialen mit einem Umsatz von mehr als 1‘000 SFr. in der Tabelle TAGESUMSAETZE auszuwählen, geben wir ein: .............................................................. .................................... AND OR Im vorhergehenden Abschnitt haben wir das Schlüsselwort WHERE kennen gelernt, mit dem sich Daten aus einer Tabelle auswählen lassen, die bestimmte Bedingungen erfüllen. Dabei kann es sich um eine einfache Bedingung (wie im vorigen Beispiel) oder eine zusammengesetzte Bedingung handeln. Zusammengesetzte Bedingungen bestehen aus mehreren durch AND oder OR verbundenen einfachen Bedingungen. Eine einzelne SQLAnweisung kann eine unbegrenzte Anzahl einfacher Bedingungen enthalten. Die Syntax für eine zusammengesetzte Bedingung sieht wie folgt aus: SELECT "Spalten_Name" FROM "Tabellen_Name" WHERE "einfache Bedingung" {[AND|OR] "einfache Bedingung"}+ Das Symbol „{}+“ bedeutet, dass der Ausdruck in der Klammer einmal oder mehrere Male auftreten kann. Beachten Sie, dass AND und OR austauschbar verwendet werden können. Zusätzlich kann mit dem Klammersymbol () die Reihenfolge der Bedingungen angegeben werden. Mit welchem SQL-Befehl können Sie alle Filialen mit einem Umsatz von mehr als 1‘000 SFr. oder alle Warenhäuser mit einem Umsatz von weniger als 500 SFr., aber mehr als 275 SFr. in der Tabelle TAGESUMSAETZE auswählen? .............................................................. .................................... LIKE LIKE ist ein weiteres Schlüsselwort, das in der WHERE-Klausel Verwendung findet. Im Wesentlichen ermöglicht LIKE eine Suche auf der Grundlage eines Musters an Stelle einer genauen Angabe (wie bei IN) oder der Definition eines Bereichs (wie bei BETWEEN). Konsultieren Sie für IN und BETWEEN SQL-Referenzen im Internet. Die Syntax für LIKE sieht folgendermassen aus: SELECT "Spalten_Name" FROM "Tabellen_Name" WHERE "Spalten_Name" LIKE {MUSTER}; {MUSTER} besteht oft aus regulären Ausdrücken. Hier einige Beispiele: 'A_Z': Alle Zeichenketten die mit einem 'A' beginnen, worauf ein weiteres Zeichen folgt, und mit einem 'Z' enden. 'ABZ' und 'A2Z' würden beispielsweise diese Bedingung erfüllen, 'AKKZ' hingegen nicht. 'ABC%': Alle Zeichenketten, die mit 'ABC' beginnen. Sowohl 'ABCD' als auch 'ABCABC' würden zum Beispiel diese Bedingung erfüllen. '%XYZ': Alle Zeichenketten, die auf 'XYZ' enden. So würden beispielsweise sowohl 'WXYZ' als auch 'ZZXYZ' diese Bedingung erfüllen. '%AN%': Alle Zeichenketten, die an irgendeiner Stelle das Muster 'AN' enthalten. Sowohl 'LOS ANGELES' als auch 'SAN FRANCISCO' würden zum Beispiel diese Bedingung erfüllen. Wir möchten nun alle Filialen finden, deren Name 'an' enthält. Was müssen wir eingeben? .............................................................. .................................... ORDER BY Bisher haben wir uns mit dem Abrufen von Daten aus einer Tabelle unter Verwendung der Befehle SELECT und WHERE beschäftigt. In vielen Fällen müssen die ausgegebenen Daten jedoch auf eine bestimmte Weise sortiert werden. Dies könnte beispielsweise in aufsteigender oder absteigender Reihenfolge geschehen. In solchen Fällen können wir das Schlüsselwort ORDER BY einsetzen. Die Syntax für eine ORDER BY-Anweisung sieht wie folgt aus: SELECT "Spalten_Name" FROM "Tabellen_Name" [WHERE "Bedingung"] ORDER BY "Spalten_Name" [ASC, DESC]; Das Symbol „[ ]“ bedeutet, dass die WHERE-Anweisung optional ist. Ist eine WHEREKlausel vorhanden, steht sie vor der ORDER BY-Klausel. „ASC“ bedeutet, dass die Ergebnisse in aufsteigender Reihenfolge angezeigt werden, „DESC“, dass sie in absteigender Reihenfolge erscheinen. Findet sich keine diesbezügliche Angabe, wird die Voreinstellung „ASC“ verwendet. Es besteht die Möglichkeit, nach mehr als einer Spalte zu sortieren. In diesem Fall sieht die ORDER BY-Klausel wie folgt aus: ORDER BY "Spalten_Name1" [ASC, DESC], "Spalten_Name2" [ASC, DESC]; So könnten wir zum Beispiel den Inhalt der Tabelle TAGESUMSAETZE nach Euro-Beträgen in absteigender Reihenfolge sortieren und hierzu folgenden SQL-Befehl eingeben: .............................................................. .................................... Zusätzlich zum Spaltennamen lässt sich auch mit der Spaltenposition (basierend auf der SQL-Abfrage) angeben, auf welche Spalte die ORDER BY-Klausel bezogen werden soll. Die erste Spalte ist 1, die zweite 2 usw. Im obigen Beispiel werden die gleichen Ergebnisse mit folgendem Befehl erreicht: SELECT Filiale, Betrag, Datum FROM TAGESUMSAETZE ORDER BY 2 DESC; Funktionen Natürlich liegt die Frage nahe, ob wir auch Rechenoperationen wie Addition oder Mittelwertbildung vornehmen können. Die Antwort lautet: ja. SQL verfügt über mehrere arithmetische Funktionen, und zwar: AVG COUNT MAX MIN SUM Berechnet den Durchschnitt der Spaltenwerte. Zählt die Anzahl der Werte in der Spalte. Nennt den grössten Wert in der Spalte. Evaluiert den kleinsten Wert innerhalb der Spalte. Gibt die Summe der Spaltenwerte zurück. Die Syntax für die Funktionen sieht folgendermassen aus: SELECT "Funktion" ("Spalten_Name") FROM "Tabellen_Name"; Um zum Beispiel die Summe aller Tagesumsätze sämtlicher Filialen zu erhalten, geben wir ein: .............................................................. .................................... COUNT und DISTINCT Die Funktion COUNT haben Sie bereits im vorangegangenen Abschnitt kennengelernt: Sie erlaubt die Zählung (COUNT) der Zeilen in einer bestimmten Tabelle. Die Syntax lautet bekanntermassen: SELECT COUNT ([DISTINCT] "Spalten_Name") FROM "Tabellen_Name"; COUNT und DISTINCT können zusammen in einer Anweisung verwendet werden, um die Anzahl der individuellen Einträge in einer Tabelle auszulesen. Um zum Beispiel die Anzahl unterschiedlicher Filialen herauszufinden, müssen Sie eingeben: .............................................................. .................................... Notieren Sie nun, was die DISTINCT-Klausel bewirkt: GROUP BY Erinnern Sie sich an die Berechnung des Gesamtumsatzes für alle Warenhäuser mit Hilfe des Schlüsselworts SUM? Wie kann nun der Gesamtumsatz jeder einzelnen Filiale berechnet werden? Dazu sind zwei Dinge erforderlich: Erstens müssen wir sowohl den Filialnamen als auch den Gesamtumsatz auswählen. Zweitens müssen wir sicherstellen, dass alle Absatzzahlen nach Filialen gruppiert sind. Die entsprechende SQL-Syntax lautet: SELECT "Spalten_Name 1", SUM("Spalten_Name 2") FROM "Tabellen_Name" GROUP BY "Spalten_Name 1"; Das Schlüsselwort GROUP BY wird verwendet, wenn mehrere Spalten aus einer Tabelle (oder mehreren Tabellen) ausgewählt werden und mindestens ein arithmetischer Operator in der SELECT-Anweisung enthalten ist. In diesem Fall müssen wir nach allen anderen ausgewählten Spalten GRUPPIEREN, d. h. nach allen Spalten ausser derjenigen, auf die sich der arithmetische Operator bezieht. Angepasst auf unser Filialmodell lautet der SQL-Befehl: .............................................................. .................................... Können Sie das Ergebnis auch nach absteigenden Umsatzzahlen anzeigen lassen? Wie lautet der entsprechende Befehl? .............................................................. .................................... JOIN (fakultativ) Sehen wir uns nun den Begriff des Verbunds, des Joins, näher an. Eine korrekte JoinVerknüpfung in SQL setzt viele der bisher vorgestellten Elemente voraus. Nehmen wir an, es liegen die folgenden zwei Tabellen vor, Tabelle TAGESUMSAETZE Filiale Los Angeles San Diego Los Angeles Boston Betrag 1500 SFr. 250 SFr. 300 SFr. 700 SFr. Datum 05.Jan.1999 07.Jan.1999 08.Jan.1999 08.Jan.1999 Tabelle GEOGRAPHIE Region Ost Ost West West Filiale Boston New York Los Angeles San Diego und wir möchten den Umsatz pro Region ermitteln. Die Tabelle GEOGRAPHIE enthält Informationen zu Regionen und Filialen und die Tabelle TAGESUMSAETZE enthält Umsatzdaten für die einzelnen Warenhäuser. Um nun die Umsatzdaten für die jeweiligen Regionen anzeigen zu lassen, müssen wir die Daten der beiden Tabellen miteinander kombinieren. Wenn wir uns die beiden Tabellen genauer ansehen, stellen wir fest, dass sie über das gemeinsame Attribut "Filiale" verknüpft sind. Hier zunächst die SQL-Anweisung, die Verwendung der einzelnen Segmente wird dann anschliessend erläutert: SELECT A1.Region REGION, SUM (A2.Betrag) UMSATZ FROM GEOGRAPHIE A1, TAGESUMSAETZE A2 WHERE A1.Filiale = A2.Filiale GROUP BY A1.Region; Die ersten beiden Zeilen weisen SQL an, zwei Felder auszuwählen. Das erste ist das Feld „Region“ aus der Tabelle GEOGRAPHIE (mit dem Alias REGION) und das zweite die Summe des Felds „Betrag“ aus der Tabelle TAGESUMSAETZE (mit dem Alias UMSATZ). Beachten Sie die Verwendung der Tabellen-Aliasse: GEOGRAPHIE hat den Alias „A1“ und TAGESUMSAETZE den Alias „A2“. Ohne die Aliasnamen sähe die erste Zeile wie folgt aus: SELECT GEOGRAPHIE.Region REGION, SUM(TAGESUMSAETZE.Betrag) UMSATZ und wäre somit deutlich unübersichtlicher. Im Wesentlichen machen Tabellenaliasse die gesamte SQL-Anweisung verständlicher, insbesondere wenn mehrere Tabellen mit einbezogen sind. Sehen wir uns nun die dritte Zeile mit der WHERE-Anweisung genauer an. Hier wird die Verbundbedingung festgelegt. Im vorliegenden Fall möchten wir sicherstellen, dass der Inhalt im Feld „Filiale“ in der Tabelle GEOGRAPHIE demjenigen in der Tabelle TAGESUMSAETZE entspricht. Dies erreichen wir, indem wir die Inhalte gleichsetzen. Diese WHERE-Anweisung ist entscheidend für die richtige Ausgabe. Ohne korrekte WHEREAnweisung ergibt sich ein kartesischer Verbund. Damit würde die Abfrage alle möglichen Kombinationen der zwei Tabellen (oder wie gross auch immer die Anzahl der Tabellen in der FROM-Anweisung ist) ausgeben. Im vorliegenden Fall wäre das Ergebnis eines kartesischen Verbunds eine Gesamtzahl von 4 x 4 = 16 Zeilen. UNION (fakultativ) Der SQL-Befehl UNION vereinigt die Ergebnisse zweier Abfragen. Damit ähnelt UNION in gewisser Hinsicht dem Begriff des JOIN, da beide Befehle für aufeinander bezogene Daten in unterschiedlichen Tabellen verwendet werden. Bei UNION gilt jedoch die Einschränkung, dass alle entsprechenden Spalten vom gleichen Datentyp sein müssen. Auch werden mit UNION nur unterschiedliche Werte ausgewählt, also mehrfach vorkommende Ergebnistupel entfernt (ähnlich wie bei SELECT DISTINCT). Die Syntax lautet: [SQL-Anweisung 1] UNION [SQL-Anweisung 2]; Liegen z. B. folgende zwei Tabellen vor, Tabelle TAGESUMSAETZE Filiale Los Angeles San Diego Los Angeles Boston Betrag 1500 SFr. 250 SFr. 300 SFr. 700 SFr. Datum 05.Jan.1999 07.Jan.1999 08.Jan.1999 08.Jan.1999 Tabelle INTERNETVERKAEUFE Datum 07.Jan.1999 10.Jan.1999 11.Jan.1999 12.Jan.1999 Betrag 250 SFr. 535 SFr. 320 SFr. 750 SFr. und wir möchten alle Tage herausfinden, an denen sowohl in einer der Filialen als auch über den Internet-Shop ein Verkaufsvorgang stattgefunden hat, verwenden wir folgende SQL-Anweisung: SELECT Datum FROM TAGESUMSAETZE UNION SELECT Datum FROM INTERNETVERKAEUFE Welches Ergebnis erhalten wir mit "SELECT DISTINCT Datum" durch Eingabe des folgenden Befehls? SELECT DISTINCT Datum FROM TAGESUMSAETZE UNION SELECT DISTINCT Datum FROM INTERNETVERKAEUFE MySQL-Datentypen Datentyp Bedeutung, Bereich Speicherbedarf Numerische Datentypen INT Ganzzahl (Standard), -2147283648 bis 2147283647 (0 bis 4294967295) 4 Byte FLOAT Fliesskommazahl, einfache Genauigkeit 4 Byte DOUBLE Fliesskommazahl, doppelte Genauigkeit 8 Byte DECIMAL(G,N) Festkommazahl, Länge G mit N Nachkommastellen Grösse G+2 Byte Datums- und Uhrzeit-Datentypen DATE Datum, Format: YYYY-MM-DD 3 Byte DATETIME Datum und Uhrzeit, Format: YYYY-MM-DD hh:mm:ss 8 Byte TIME Uhrzeit, Format hh:mm:ss 3 Byte Zeichenketten-Datentypen CHAR(G) Zeichenkette mit fester Grösse G, max. 255 Zeichen Grösse G Byte VARCHAR(G) Zeichenkette mit variabler Grösse G, max. 255 Zeichen Grösse G Byte ENUM('wert1','wert2',...) Auflistung, Auswahl nur eines Feldes 65535 Elemente SET('wert1','wert2',...) Auflistung, Mehrfachauswahl 64 Elemente Eigenschaften der Datentypen AUTO_INCREMENT = automatische Nummerierung DEFAULT 'wert' = Vorgabewert NOT NULL = nicht leer, Wert ist erforderlich UNIQUE = Wert darf nur 1x vorkommen, keine Wiederholungen UNSIGNED = ohne Vorzeichen, nur positive Zahlen PRIMARY KEY = Primärschlüssel ZEROFILL = Zahl mit führenden Nullen versehen Quellen: http://sql.1keydata.com/de/ http://bkb-netz1.dynalias.org/grantz/db/sql/hilfen/mysql-datentypen.html Lösungen: 1) ALTER TABLE KUNDE ADD Geschlecht CHAR(1); 2) ALTER TABLE KUNDE CHANGE Strasse Str CHAR(50); 3) ALTER TABLE KUNDE MODIFY Ort CHAR(30); 4) ALTER TABLE KUNDE DROP Geschlecht; 5) DELETE FROM TAGESUMSAETZE WHERE Filiale = `Los Angeles` 6) SELECT Filiale FROM TAGESUMSAETZE WHERE Betrag > 1000; 7) SELECT Filiale FROM TAGESUMSAETZE WHERE Betrag > 1000 OR (Betrag < 500 AND Betrag > 275) 8) SELECT * FROM TAGESUMSAETZE WHERE Filiale LIKE '%an%' 9) SELECT Filiale, Betrag, Datum FROM TAGESUMSAETZE ORDER BY Betrag DESC; 10) SELECT SUM (Betrag) FROM TAGESUMSAETZE 11) SELECT COUNT (DISTINCT Filiale) FROM TAGESUMSAETZE; 12) SELECT Filiale, SUM(Betrag) FROM TAGESUMSAETZE GROUP BY Filiale; 13) SELECT Filiale, SUM(Betrag) FROM TAGESUMSAETZE GROUP BY Betrag DESC;