Äquiselektion (Äquirestriktion) in SQL (MySQL )
Vorbereitung
Zum Nachvollziehen der folgenden Beispiele kann das folgende Skript in einen MySQL-Klienten kopiert werden. Der Inhalt dieses Skripts kann aber ansonsten ignoriert werden. Bei Kopieren ist darauf zu achten, nur genau den Text von »DROP« bis zum letzten »;« zu kopieren und dann die Eingabetaste zu drücken.
- Skript (MySQL )
DROP SCHEMA S; CREATE SCHEMA S; USE S;
CREATE TABLE PAAR ( LINKS VARCHAR ( 255 ), RECHTS VARCHAR ( 255 ));
INSERT INTO PAAR ( LINKS, RECHTS ) VALUES ( 'D', 'D' );
INSERT INTO PAAR ( LINKS, RECHTS ) VALUES ( 'D', 'E' );
INSERT INTO PAAR ( LINKS, RECHTS ) VALUES ( 'E', 'D' );
INSERT INTO PAAR ( LINKS, RECHTS ) VALUES ( 'E', 'E' );
SELECT * FROM PAAR;
Darstellung einer Beispieltabelle
Die folgende Tabelle enthält zwei Spalten mit insgesamt vier Kombinationen der Buchstaben »D« und »E«. Diese Tabelle soll hier keine spezielle Bedeutung haben, sondern ist ein künstlich vereinfachtes Beispiel.
- Konsole (MySQL, E92, C99, C03)
SELECT * FROM PAAR;
+-------+--------+
| LINKS | RECHTS |
+-------+--------+
| D | D |
| D | E |
| E | D |
| E | E |
+-------+--------+
Die folgende SELECT-Anweisung gibt die gleiche Tabelle wie zuvor mit expliziter Angabe der Spaltennamen aus.
- Konsole (MySQL, E92, C99, C03)
SELECT LINKS, RECHTS FROM PAAR;
+-------+--------+
| LINKS | RECHTS |
+-------+--------+
| D | D |
| D | E |
| E | D |
| E | E |
+-------+--------+
Selektion in SQL (MySQL )
Unter eine Selektion (auch „Restriktion“ genannt) versteht man allgemein eine Auswahl von Zeilen einer Tabelle.
Wenn man eine Tabelle als eine Menge von Zeilen ansieht, so ist die Selektion die Bildung einer Teilmenge (Auswahl).
- Selektion
.--------------.
| |
| |
|##############|
| |
'--------------'
Zum Vergleich: Unter einer Projektion versteht man ja, wie schon behandelt wurde, eine Auswahl von Spalten.
- Projektion
.--------------.
| ### |
| ### |
| ### |
| ### |
| ### |
| ### |
| ### |
| ### |
'--------------'
Äquiselektion mit zwei Spaltennamen
Unter einer Äquiselektion (Äquirestriktion ) verstehen wir hier die Auswahl von Zeilen durch Angabe einer Gleichheitsbedingung.
Diese Bezeichnung Äquiselektion ist zwar nicht allgemein üblich, jedoch ist die Bezeichnung „Selektion“ allgemein üblich, und „Äqui-“ ist ein bekanntes Präfix.
(Das lateinische Adjektiv "aequus " /ˈaɪ.kʷus/ bedeutet „gleich“.)
Im folgenden Beispiel wird eine Äquirestriktion gezeigt, welche die Gleichheit der Werte zweier Spalten verlangt.
Durch die Bedingung »WHERE LINKS = RECHTS« am Ende der folgenden Select-Abfrage wird verlangt, daß nur noch die Spalten im Ergebnis der Abfrage vorkommen, bei denen der Wert in der Spalte »LINKS« gleich dem Wert in der Spalte »RECHTS« ist.
- Konsole (MySQL, E92, C99, C03)
SELECT LINKS, RECHTS FROM PAAR WHERE LINKS = RECHTS;
+-------+--------+
| LINKS | RECHTS |
+-------+--------+
| D | D |
| E | E |
+-------+--------+
Die Reihenfolge der Klauseln im Quelltext lautet: »SELECT«, »FROM«, »WHERE« (beispielsweise: »SELECT LINKS, RECHTS«, »FROM PAAR«, »WHERE LINKS = RECHTS;«).
Äquiselektion mit einem Spaltennamen und einem Zeichenfolgenliteral
- Aussprachehinweis
“flower ” /ˈflaʊɚ/
- Skript (MySQL )
DROP SCHEMA S; CREATE SCHEMA S; USE S;
CREATE TABLE ENGLISCHDEUTSCH ( ENGLISCH VARCHAR ( 255 ), DEUTSCH VARCHAR ( 255 ));
INSERT INTO ENGLISCHDEUTSCH ( ENGLISCH, DEUTSCH ) VALUES ( 'train', 'Zug' );
INSERT INTO ENGLISCHDEUTSCH ( ENGLISCH, DEUTSCH ) VALUES ( 'rain', 'Regen' );
INSERT INTO ENGLISCHDEUTSCH ( ENGLISCH, DEUTSCH ) VALUES ( 'star', 'Stern' );
INSERT INTO ENGLISCHDEUTSCH ( ENGLISCH, DEUTSCH ) VALUES ( 'flower', 'Blume' );
INSERT INTO ENGLISCHDEUTSCH ( ENGLISCH, DEUTSCH ) VALUES ( 'table', 'Tisch' );
INSERT INTO ENGLISCHDEUTSCH ( ENGLISCH, DEUTSCH ) VALUES ( 'table', 'Tabelle' );
INSERT INTO ENGLISCHDEUTSCH ( ENGLISCH, DEUTSCH ) VALUES ( 'schedule', 'Tabelle' );
INSERT INTO ENGLISCHDEUTSCH ( ENGLISCH, DEUTSCH ) VALUES ( 'light', 'Licht' );
INSERT INTO ENGLISCHDEUTSCH ( ENGLISCH, DEUTSCH ) VALUES ( 'dog', 'Hund' );
Das obige Skript sollte zur Vorbereitung dieses Abschnittes in die Datenbankkonsole kopiert werden.
In diesem Skript findet man die Textwerte der einzelnen Spalten, wie beispielsweise »'train'« zwischen Apostrophe geschrieben. Solch eine Angabe eines Texten mit Apostrophen nennt man ein Zeichenfolgenliteral.
Ein Text in Apostrophen wird nicht als Name einer Spalte interpretiert, sondern steht für diesen wörtlichen Text (ohne die Apostrophe). Solch eine Angabe kann auch auf einer Seite des Gleichheitszeichens verwendet werden. So kann in einer Tabelle gezielt eine Zeile mit einem bestimmten Wert in einer bestimmten Spalte herausgegriffen werden.
Spaltennamen und Zeichenfolgenliteral sind beides sogenannte Ausdrücke. Man kann also sagen, daß sich auf einer Seite des Gleichheitszeichen stets ein Ausdruck befinden muß.
Wir stellen zunächst die Basistabelle dar, welche Übersetzungen von Wörtern enthält. Zu einem englischen Worte in der Spalte »ENGLISCH« findet man ein unter Umständen als deutsche Übersetzung jenes englischen Wortes mögliches deutsches Wort in derselben Zeile in der Spalte »DEUTSCH«. Umgekehrt findet man auch zu einem deutschen Worte in der Spalte »DEUTSCH« ein unter Umständen als englische Übersetzung jenes deutschen Wortes mögliches englisches Wort in derselben Zeile in der Spalte »ENGLISCH«. Beispielsweise ist eine mögliche deutsche Übersetzung des englischen Wortes »train« das deutsche Wort »Zug«, und eine mögliche englische Übersetzung des deutschen Wortes »Zug« ist das englische Wort »train«.
- Konsole
SELECT * FROM ENGLISCHDEUTSCH;
+----------+---------+
| ENGLISCH | DEUTSCH |
+----------+---------+
| train | Zug |
| rain | Regen |
| star | Stern |
| flower | Blume |
| table | Tisch |
| table | Tabelle |
| schedule | Tabelle |
| light | Licht |
| dog | Hund |
+----------+---------+
Die Äquiselektion mit Zeichenfolgenliteralen erlaubt das Nachschlagen eines Wortes in einer Tabelle mit Übersetzungen. Das folgende Beispiel zeigt die Abfrage der deutschen Übersetzung des englischen Wortes »star«. Man beachte, daß hier die Selektion mit der Spalte »ENGLISCH« erfolgt, aber dann auf die Spalte »DEUTSCH« projiziert wird.
- Konsole
SELECT * FROM ENGLISCHDEUTSCH WHERE ENGLISCH = 'star';
+----------+---------+
| ENGLISCH | DEUTSCH |
+----------+---------+
| star | Stern |
+----------+---------+- Konsole
SELECT DEUTSCH FROM ENGLISCHDEUTSCH WHERE ENGLISCH = 'star';
+---------+
| DEUTSCH |
+---------+
| Stern |
+---------+
Eine Relation kann immer in „beide Richtungen“ verwendet werden. Daher ist es auch möglich zu einem deutschen Wort das entsprechende englische Wort zu finden. Hier erfolgt die Selektion mit der Spalte »DEUTSCH«, aber es wird dann auf die Spalte »ENGLISCH« projiziert.
- Konsole
SELECT * FROM ENGLISCHDEUTSCH WHERE DEUTSCH = 'Blume';
+----------+---------+
| ENGLISCH | DEUTSCH |
+----------+---------+
| flower | Blume |
+----------+---------+- Konsole
SELECT ENGLISCH FROM ENGLISCHDEUTSCH WHERE DEUTSCH = 'Blume';
+----------+
| ENGLISCH |
+----------+
| flower |
+----------+
Die beiden voranstehenden Beispiele zeigen auch, daß die in der WHERE-Bedingung verwendete Spalten nicht in der SELECT-Liste vorkommen muß.
Dabei kann ein Wort auch mehrere Übersetzungen haben.
- Konsole
SELECT * FROM ENGLISCHDEUTSCH WHERE ENGLISCH = 'table';
+----------+---------+
| ENGLISCH | DEUTSCH |
+----------+---------+
| table | Tisch |
| table | Tabelle |
+----------+---------+
Die Ergebnistabelle ist nun keine skalare Tabelle mehr:
- Konsole
SELECT DEUTSCH FROM ENGLISCHDEUTSCH WHERE ENGLISCH = 'table';
+---------+
| DEUTSCH |
+---------+
| Tisch |
| Tabelle |
+---------+- Konsole
SELECT * FROM ENGLISCHDEUTSCH WHERE DEUTSCH = 'Tabelle';
+----------+---------+
| ENGLISCH | DEUTSCH |
+----------+---------+
| table | Tabelle |
| schedule | Tabelle |
+----------+---------+- Konsole
SELECT ENGLISCH FROM ENGLISCHDEUTSCH WHERE DEUTSCH = 'Tabelle';
+----------+
| ENGLISCH |
+----------+
| table |
| schedule |
+----------+
Eine solche Beziehung zwischen zwei Mengen, die auch solche Mehrdeutigkeiten zuläßt, wird in der Mathematik „Relation“ genannt. Aus der Theorie dieser Relationen entstand die Idee für relationale Datenbanken, in denen eine Tabelle jeweils eine Relation darstellt.
Eine relationale Datenbank erlaubt es, Daten in „jede Richtung“ (wie „Deutsch-Englisch“ oder „Englisch-Deutsch“) zu durchsuchen und Mehrdeutigkeiten darzustellen. Diese Fähigkeiten basieren auf dem zugrundegelegten Modell mathematischer Relationen und zeichnen relationale Datenbanken vor einigen anderen Arten von Datenbanken aus.
Verarbeitung von Benutzereingaben eines Web -Wörterbuchs
Das Diagramm stellt folgendes dar: Der Benutzer kann auf einer HTML-Seite ein Wort eingeben, dieses Wort (z.B. »rain«) wird von PHP in einen Abfagerahmen eingesetzt und an die Datenbank weitergeleitet, welche eine Antwort (z.B. »Regen«) findet, die dann von PHP wieder ein eine HTML-Seite eingesetzt wird.
- Eingabeverarbeitung
Benutzer -------------------.
| |
| Einlesen |
| durch HTML- -----------. |
HTTP/HTTPS | Formular | |
V | |
Wort "rain" | |
| | |
| Einsetzen -----. | |
| durch PHP | | |
| | | |
V | | |
SELECT DEUTSCH FROM ENGLISCHDEUTSCH WHERE ENGLISCH = 'rain'; | | |
| | | |
| Verarbeitung | | |
| durch die | | |
| Datenbank | | |
V SQL PHP HTML Benutzer
+---------+ | | |
| DEUTSCH | | | |
+---------+ | | |
| Regen | | | |
+---------+ | | |
| | | |
| Einsetzen in | | |
| HTML-Seite -----' | |
| durch PHP | |
V | |
Web-Seite mit Antwort "Regen" -----------' |
| |
| |
| |
HTTP/HTTPS | |
V |
Benutzer --------------------'- Ein Web-Formular zur Eingabe eines englischen Wortes
<form action="program.php" method="post">
<input type="text" name="input">
</form>- Eine Abfrageschablone mit Lücke »…«
- SELECT DEUTSCH FROM ENGLISCHDEUTSCH WHERE ENGLISCH = '…';
- Eine HTML-Antwort-Schablone mit Lücke »…«
- <!DOCTYPE html><html><head><title>Deutsche Übersetzung</title></head>
<body><p>Die deutsche Übersetzung lautet: ….</p></body></html> - Ein Stapel von Sprachen/Techniken
- Benutzer
HTML vorderes Ende
HTTP/HTTPS ------------------------------------------------------------
PHP
SQL hinteres Ende
Datenbank - berufliche Rollen
- Front-End-Developer Techniken, die nahe am Benutzer sind: HTML, CSS, JavaScript, Design
- Back-End-Developer Techniken, die weiter entfernt vom Benutzer sind: SQL und eine Sprache wie PHP oder Java (oder Python, Ruby, C#, JavaScript ), Gehalt 2018: in Startup 51.250, in großem Unternehmen 78.000 Euro
- Full-Stack-Developer Front-End und Back-End Developer in einer Person (jener Begriff wurde um 2011 durch die Entwicklungsabteilung von Facebook populär gemacht), Gehalt 2018: in großem Unternehmen 91.000 Euro. Full-Stack-Developer sind (neben Dev-Op-Spezialisten) die am besten verdienenden IT-Arbeiter (Stand: 2018).
Projektion und Selektion ⃗²
Erstaunlicherweise werden in SQL Angaben für eine Projektion hinter »SELECT« geschrieben, während Angaben für eine Selektion hinter »WHERE« geschrieben werden.
- Befehlsaufbau
- SELECT 〈Spalten für Projektion 〉 FROM 〈Datenquelle 〉 WHERE 〈Bedingungen für Selektion 〉
Übungsfragen
/ Einfügen von Zeichenfolgen
Die Eingabe eines Benutzers wird von einem Programm an Stelle der Ellipse »…« in die folgende Schablone eingesetzt. Das erhaltene Skript wird dann an die Datenbank geschickt.
Was muß der Benutzer eingeben, um die Tabelle »ENGLISCHDEUTSCH« zu löschen?
- Schablone
- SELECT DEUTSCH FROM ENGLISCHDEUTSCH WHERE ENGLISCH = '…';
/ Gefahr von Softwarefehlern
Welcher Fehler steht in der “OWASP Top 10 Vulnerabilities List ” auf Platz 1, und worum handelt es sich dabei?
(resources.whitesourcesoftware.com/blog-whitesource/owasp-top-10-vulnerabilities)
Übungsaufgaben
/ Hauptsstädte
- Skript (MySQL )
DROP SCHEMA S; CREATE SCHEMA S; USE S;
CREATE TABLE LAND ( LAND VARCHAR ( 255 ), HAUPTSTADT VARCHAR ( 255 ));
INSERT INTO LAND ( LAND, HAUPTSTADT ) VALUES ( 'Frankreich', 'Paris' );
INSERT INTO LAND ( LAND, HAUPTSTADT ) VALUES ( 'Griechenland', 'Athen' );
INSERT INTO LAND ( LAND, HAUPTSTADT ) VALUES ( 'San Marino', 'San Marino' );
INSERT INTO LAND ( LAND, HAUPTSTADT ) VALUES ( 'Vatikanstadt', 'Vatikanstadt' );
INSERT INTO LAND ( LAND, HAUPTSTADT ) VALUES ( 'Italien', 'Rom' );
INSERT INTO LAND ( LAND, HAUPTSTADT ) VALUES ( 'Luxemburg', 'Luxemburg' );
INSERT INTO LAND ( LAND, HAUPTSTADT ) VALUES ( 'Schweden', 'Stockholm' );
INSERT INTO LAND ( LAND, HAUPTSTADT ) VALUES ( 'Monaco', 'Monaco' );
Die Tabelle »LAND« enthält einige Länder samt ihren Hauptstädten.
- Konsole
SELECT * FROM LAND;
+--------------+---------------+
| LAND | HAUPTSTADT |
+--------------+---------------+
| Frankreich | Paris |
| Griechenland | Athen |
| San Marino | San Marino |
| Vatikanstadt | Vatikanstadt |
| Italien | Rom |
| Luxemburg | Luxemburg |
| Schweden | Stockholm |
| Monaco | Monaco |
+--------------+---------------+- Konsole
SELECT LAND, HAUPTSTADT FROM LAND;
+--------------+---------------+
| LAND | HAUPTSTADT |
+--------------+---------------+
| Frankreich | Paris |
| Griechenland | Athen |
| San Marino | San Marino |
| Vatikanstadt | Vatikanstadt |
| Italien | Rom |
| Luxemburg | Luxemburg |
| Schweden | Stockholm |
| Monaco | Monaco |
+--------------+---------------+
Fragen Sie den Namen der Hauptstadt von Italien mit einer Äquiselektion mit Zeichenfolgenliteralen ab.
/ Land finden
Fragen Sie unter Verwendung der Tabelle der vorigen Aufgabe ab, von welchem Land Paris Hauptstadt ist.
/ Gleichnamige Hauptsstädte
Erstellen Sie aus der Basistabelle »LAND« (der vorvorigen Aufgabe) die folgende Ausgabe, in der alle Länder der Tabelle mit gleichnamiger Hauptstadt vorkommen.
- Konsole
+--------------+--------------+
| LAND | HAUPTSTADT |
+--------------+--------------+
| San Marino | San Marino |
| Vatikanstadt | Vatikanstadt |
| Luxemburg | Luxemburg |
| Monaco | Monaco |
+--------------+--------------+
/ View »GLEICHNAMIGE«
Erstellen Sie ein View »GLEICHNAMIGE« mit der Abfrage aus der vorigen Übungsaufgabe.
Reserveaufgaben
/ Interlinguale Homonyme
- Skript (MySQL )
DROP SCHEMA S; CREATE SCHEMA S; USE S;
CREATE TABLE WOERTER ( DEUTSCH VARCHAR ( 255 ), ENGLISCH VARCHAR ( 255 ));
INSERT INTO WOERTER ( DEUTSCH, ENGLISCH ) VALUES ( 'Apfel', 'apple' );
INSERT INTO WOERTER ( DEUTSCH, ENGLISCH ) VALUES ( 'dissonant', 'dissonant' );
INSERT INTO WOERTER ( DEUTSCH, ENGLISCH ) VALUES ( 'ernennen', 'appoint' );
INSERT INTO WOERTER ( DEUTSCH, ENGLISCH ) VALUES ( 'horizontal', 'horizontal' );
INSERT INTO WOERTER ( DEUTSCH, ENGLISCH ) VALUES ( 'Haus', 'house' );
INSERT INTO WOERTER ( DEUTSCH, ENGLISCH ) VALUES ( 'Kategorie', 'category' );
Die Tabelle »WOERTER« enthält einige Paare von Wörtern mit gleicher Bedeutung.
- Konsole
SELECT * FROM WOERTER;
+------------+------------+
| DEUTSCH | ENGLISCH |
+------------+------------+
| Apfel | apple |
| dissonant | dissonant |
| ernennen | appoint |
| horizontal | horizontal |
| Haus | house |
| Kategorie | category |
+------------+------------+- Konsole
SELECT DEUTSCH, ENGLISCH FROM WOERTER;
+------------+------------+
| DEUTSCH | ENGLISCH |
+------------+------------+
| Apfel | apple |
| dissonant | dissonant |
| ernennen | appoint |
| horizontal | horizontal |
| Haus | house |
| Kategorie | category |
+------------+------------+
1.) a) Fragen Sie das englische Wort für „Kategorie“ mit einer Äquiselektion mit Zeichenfolgenliteralen ab. b) Fragen Sie das deutsche Wort für “appoint ” ab.
2.) Erstellen Sie aus der Basistabelle »WOERTER« die folgende Ausgabe, in der alle Wörter der Tabelle mit gleicher Bedeutung und gleicher Schreibweise aufgeführt werden.
- Konsole
+------------+------------+
| DEUTSCH | ENGLISCH |
+------------+------------+
| dissonant | dissonant |
| horizontal | horizontal |
+------------+------------+
3.) Erstellen Sie dann ein View »Homonyme« mit dieser Abfrage.
/ Zuordnungen *
- Skript (MySQL )
DROP SCHEMA S; CREATE SCHEMA S; USE S;
CREATE TABLE SPRACHE ( LAND VARCHAR ( 255 ), BEZEICHNUNG VARCHAR ( 255 ), SPRACHLAND VARCHAR ( 255 ), SPRACHE VARCHAR ( 255 ));
INSERT INTO SPRACHE ( LAND, BEZEICHNUNG, SPRACHLAND, SPRACHE ) VALUES ( '1', 'Italien', '1', 'Italienisch' );
INSERT INTO SPRACHE ( LAND, BEZEICHNUNG, SPRACHLAND, SPRACHE ) VALUES ( '1', 'Italien', '3', 'Norwegisch' );
INSERT INTO SPRACHE ( LAND, BEZEICHNUNG, SPRACHLAND, SPRACHE ) VALUES ( '1', 'Italien', '2', 'Spanisch' );
INSERT INTO SPRACHE ( LAND, BEZEICHNUNG, SPRACHLAND, SPRACHE ) VALUES ( '2', 'Spanien', '1', 'Italienisch' );
INSERT INTO SPRACHE ( LAND, BEZEICHNUNG, SPRACHLAND, SPRACHE ) VALUES ( '2', 'Spanien', '3', 'Norwegisch' );
INSERT INTO SPRACHE ( LAND, BEZEICHNUNG, SPRACHLAND, SPRACHE ) VALUES ( '2', 'Spanien', '2', 'Spanisch' );
INSERT INTO SPRACHE ( LAND, BEZEICHNUNG, SPRACHLAND, SPRACHE ) VALUES ( '3', 'Norwegen', '1', 'Italienisch' );
INSERT INTO SPRACHE ( LAND, BEZEICHNUNG, SPRACHLAND, SPRACHE ) VALUES ( '3', 'Norwegen', '3', 'Norwegisch' );
INSERT INTO SPRACHE ( LAND, BEZEICHNUNG, SPRACHLAND, SPRACHE ) VALUES ( '3', 'Norwegen', '2', 'Spanisch' );
Die Tabelle »Sprache« enthält links Länder mit ihrer Kennzahl (»LAND«) und rechts zu jeder Länderkennzahl (»SPRACHLAND«) die Landessprache.
Um bestimmten Formen der Abfrage zu ermöglichen, wurde dabei zu jeder Kombination aus einem Land und einer Sprache eine Zeile angelegt, auch wenn die Sprache einer Zeile nicht die hauptsächlich in dem Land gesprochene Sprache ist. Die Spalte »SPRACHLAND« gibt aber zu jeder Sprache in der Spalte »SPRACHE« die Kennzahl des Landes an, in dem diese Sprache hauptsächlich gesprochen wird.
- Tabellendokumentation
- Schema »S«
- Tabelle »Sprache«
- Felder
- »LAND« Kennzahl des Landes in der Spalte »BEZEICHNUNG«.
- »BEZEICHNUNG« Name eines Landes.
- »SPRACHLAND« Kennzahl des Landes, welches zu der Sprache aus der Spalte »SPRACHE« gehört.
- »SPRACHE« Name einer Sprache.
- Konsole
SELECT * FROM SPRACHE;
+------+-------------+------------+-------------+
| LAND | BEZEICHNUNG | SPRACHLAND | SPRACHE |
+------+-------------+------------+-------------+
| 1 | Italien | 1 | Italienisch |
| 1 | Italien | 3 | Norwegisch |
| 1 | Italien | 2 | Spanisch |
| 2 | Spanien | 1 | Italienisch |
| 2 | Spanien | 3 | Norwegisch |
| 2 | Spanien | 2 | Spanisch |
| 3 | Norwegen | 1 | Italienisch |
| 3 | Norwegen | 3 | Norwegisch |
| 3 | Norwegen | 2 | Spanisch |
+------+-------------+------------+-------------+- Konsole
SELECT LAND, BEZEICHNUNG, SPRACHLAND, SPRACHE FROM SPRACHE;
+------+-------------+------------+-------------+
| LAND | BEZEICHNUNG | SPRACHLAND | SPRACHE |
+------+-------------+------------+-------------+
| 1 | Italien | 1 | Italienisch |
| 1 | Italien | 3 | Norwegisch |
| 1 | Italien | 2 | Spanisch |
| 2 | Spanien | 1 | Italienisch |
| 2 | Spanien | 3 | Norwegisch |
| 2 | Spanien | 2 | Spanisch |
| 3 | Norwegen | 1 | Italienisch |
| 3 | Norwegen | 3 | Norwegisch |
| 3 | Norwegen | 2 | Spanisch |
+------+-------------+------------+-------------+
1.) Erstellen Sie daraus die folgende Ausgabe, in der zu jeder Sprache jeweils das passende Land angezeigt wird, indem Sie eine Äquiselektion unter Verwendung der Spalte »SPRACHLAND« schreiben.
- Konsole
+-------------+-------------+
| SPRACHE | BEZEICHNUNG |
+-------------+-------------+
| Italienisch | Italien |
| Norwegisch | Norwegen |
| Spanisch | Spanien |
+-------------+-------------+
2.) Erstellen Sie einen View »SPRACHLAND« mit der von Ihnen geschrieben Abfrage.
3.) Erstellen Sie eine auf den View »SPRACHLAND« aufbauende Abfrage (mit »FROM SPRACHLAND«), die eine skalare Tabelle ergibt, in der die Sprache steht, die man in Italien spricht (also Italienisch). (Dabei soll in der Abfrage das Wort »Italien« vorkommen, aber nicht »Italienisch« – das soll sich die Abfrage an Hand des Landes selbst aus der Tabelle »SPRACHLAND« heraussuchen.)
Kombination mehrerer Bedingungen *
Durch Verwendung eines Views können wir auch mehrere Bedingungen miteinander kombinieren :
- Skript (MySQL )
DROP SCHEMA S; CREATE SCHEMA S; USE S;
CREATE TABLE MISCHUNG ( FARBE1 VARCHAR ( 255 ), FARBE2 VARCHAR ( 255 ), ERGEBNIS VARCHAR ( 255 ));
INSERT INTO MISCHUNG ( FARBE1, FARBE2, ERGEBNIS ) VALUES ( 'Rot', 'Gelb', 'Orange' );
INSERT INTO MISCHUNG ( FARBE1, FARBE2, ERGEBNIS ) VALUES ( 'Rot', 'Blau', 'Violett' );
INSERT INTO MISCHUNG ( FARBE1, FARBE2, ERGEBNIS ) VALUES ( 'Blau', 'Gelb', 'Gruen' );- Konsole
SELECT * FROM MISCHUNG;
+--------+--------+----------+
| FARBE1 | FARBE2 | ERGEBNIS |
+--------+--------+----------+
| Rot | Gelb | Orange |
| Rot | Blau | Violett |
| Blau | Gelb | Gruen |
+--------+--------+----------+
Zuerst legen wir ein View mit allen Datensätzen an, bei denen die Farbe 1 Rot ist.
- Konsole
CREATE VIEW ROTMISCHUNG AS SELECT * FROM MISCHUNG WHERE FARBE1 = 'Rot';
SELECT * FROM ROTMISCHUNG;
+--------+--------+----------+
| FARBE1 | FARBE2 | ERGEBNIS |
+--------+--------+----------+
| Rot | Gelb | Orange |
| Rot | Blau | Violett |
+--------+--------+----------+
Aus dem im vorigen Schritt aufgebauten View können wir dann alle Datensätze auswählen, bei denen die Farbe 2 Blau ist.
So erhalten wir aus der Tabelle Violett als Mischfarbe von Rot und Blau.
- Konsole
SELECT * FROM ROTMISCHUNG WHERE FARBE2 = 'Blau';
+--------+--------+----------+
| FARBE1 | FARBE2 | ERGEBNIS |
+--------+--------+----------+
| Rot | Blau | Violett |
+--------+--------+----------+- Konsole
SELECT ERGEBNIS FROM ROTMISCHUNG WHERE FARBE2 = 'Blau';
+----------+
| ERGEBNIS |
+----------+
| Violett |
+----------+