Sortieren in SQL (MySQL )
Vorbereitung
- Skript (MySQL )
WARNINGS; SET sql_mode = 'ANSI,TRADITIONAL';
DROP SCHEMA IF EXISTS S; CREATE SCHEMA S; USE S;CREATE TABLE PLANET ( PLANET VARCHAR( 255 ) PRIMARY KEY, NAME VARCHAR( 255 ));
INSERT INTO PLANET( PLANET, NAME )VALUES( '10', 'Mars' );
INSERT INTO PLANET( PLANET, NAME )VALUES( '2', 'Venus' );
INSERT INTO PLANET( PLANET, NAME )VALUES( '3', 'Erde' );
INSERT INTO PLANET( PLANET, NAME )VALUES( '1', 'Merkur' );CREATE TABLE KUNDE ( KUNDE INT PRIMARY KEY, VORNAME VARCHAR( 255 ), NACHNAME VARCHAR( 255 ));
INSERT INTO KUNDE( KUNDE, VORNAME, NACHNAME )VALUES( 23, 'Friederike', 'Nordbeck' );
INSERT INTO KUNDE( KUNDE, VORNAME, NACHNAME )VALUES( 2, 'Michael', 'Rosowski' );
INSERT INTO KUNDE( KUNDE, VORNAME, NACHNAME )VALUES( 14, 'Birgit', 'Rosowski' );
INSERT INTO KUNDE( KUNDE, VORNAME, NACHNAME )VALUES( 9, 'Bodo', 'Rosowski' );
INSERT INTO KUNDE( KUNDE, VORNAME, NACHNAME )VALUES( 6, 'Simon', 'Rosowski' );
INSERT INTO KUNDE( KUNDE, VORNAME, NACHNAME )VALUES( 5, 'Frank', 'Aldegeerds' );
INSERT INTO KUNDE( KUNDE, VORNAME, NACHNAME )VALUES( 1, 'Eelco', 'Fischbach' );SELECT * FROM PLANET;
SELECT * FROM KUNDE;
Reihenfolge von Zeilen
Die Reihenfolge der Ausgabe von einzelnen Zeilen einer Tabelle ist durch SQL nicht bestimmt.
- Konsole
SELECT * FROM PLANET;
+--------+--------+
| PLANET | NAME |
+--------+--------+
| 10 | Mars |
| 2 | Venus |
| 3 | Erde |
| 1 | Merkur |
+--------+--------+
Sortieren nach einer Spalte
Durch Verwendung einer ORDER-BY-Klausel kann jedoch Sortierung nach einer bestimmten Spalte verlangt werden.
- Konsole
SELECT NAME, PLANET FROM PLANET ORDER BY NAME;
+--------+--------+
| NAME | PLANET |
+--------+--------+
| Erde | 3 |
| Mars | 10 |
| Merkur | 1 |
| Venus | 2 |
+--------+--------+
Die ORDER-BY-Klausel muß hinter der WHERE-Klausel stehen.
Aufsteigend oder Absteigend?
Durch Verwendung von »ASC« (“ascending ” – „aufsteigend“) oder »DESC« (“descending ” – „absteigend“) kann die Sortierrichtung festgelegt werden. Erfolgt keine solche Festlegung, wird aufsteigend sortiert.
- Konsole
SELECT NAME, PLANET FROM PLANET ORDER BY NAME ASC;
+--------+--------+
| NAME | PLANET |
+--------+--------+
| Erde | 3 |
| Mars | 10 |
| Merkur | 1 |
| Venus | 2 |
+--------+--------+SELECT NAME, PLANET FROM PLANET ORDER BY NAME DESC;
+--------+--------+
| NAME | PLANET |
+--------+--------+
| Venus | 2 |
| Merkur | 1 |
| Mars | 10 |
| Erde | 3 |
+--------+--------+
Kombination von Spalten
Es kann auch nach einer Kombination von Spalten sortiert werden, beispielsweise zuerst nach dem Nachnamen und dann nach dem Vornamen.
- Konsole
SELECT NACHNAME, VORNAME, KUNDE FROM KUNDE ORDER BY NACHNAME, VORNAME;
+------------+------------+-------+
| NACHNAME | VORNAME | KUNDE |
+------------+------------+-------+
| Aldegeerds | Frank | 5 |
| Fischbach | Eelco | 1 |
| Nordbeck | Friederike | 23 |
| Rosowski | Birgit | 14 |
| Rosowski | Bodo | 9 |
| Rosowski | Michael | 2 |
| Rosowski | Simon | 6 |
+------------+------------+-------+
»DESC« oder »ASC« bezieht sich immer nur auf die direkt vorangehende Spalte!
- Konsole
SELECT NACHNAME, VORNAME, KUNDE FROM KUNDE ORDER BY NACHNAME, VORNAME DESC;
+------------+------------+-------+
| NACHNAME | VORNAME | KUNDE |
+------------+------------+-------+
| Aldegeerds | Frank | 5 |
| Fischbach | Eelco | 1 |
| Nordbeck | Friederike | 23 |
| Rosowski | Simon | 6 |
| Rosowski | Michael | 2 |
| Rosowski | Bodo | 9 |
| Rosowski | Birgit | 14 |
+------------+------------+-------+SELECT NACHNAME, VORNAME, KUNDE FROM KUNDE ORDER BY NACHNAME DESC, VORNAME DESC;
+------------+------------+-------+
| NACHNAME | VORNAME | KUNDE |
+------------+------------+-------+
| Rosowski | Simon | 6 |
| Rosowski | Michael | 2 |
| Rosowski | Bodo | 9 |
| Rosowski | Birgit | 14 |
| Nordbeck | Friederike | 23 |
| Fischbach | Eelco | 1 |
| Aldegeerds | Frank | 5 |
+------------+------------+-------+
Einfluß des Datentyps auf die Sortierung
Auch Numerale (Zahlwörter) werden lexikographisch aufsteigend sortiert, falls der Spaltentyp ein VARCHAR-Typ ist (bei einem INT-Typ werden sie jedoch nach ihrem Zahlenwert sortiert).
- Konsole
SELECT * FROM PLANET ORDER BY PLANET;
+--------+--------+
| PLANET | NAME |
+--------+--------+
| 1 | Merkur |
| 10 | Mars |
| 2 | Venus |
| 3 | Erde |
+--------+--------+SELECT * FROM KUNDE ORDER BY KUNDE;
+-------+------------+------------+
| KUNDE | VORNAME | NACHNAME |
+-------+------------+------------+
| 1 | Eelco | Fischbach |
| 2 | Michael | Rosowski |
| 5 | Frank | Aldegeerds |
| 6 | Simon | Rosowski |
| 9 | Bodo | Rosowski |
| 14 | Birgit | Rosowski |
| 23 | Friederike | Nordbeck |
+-------+------------+------------+
»LIMIT«
Durch eine LIMIT-Klausel kann die Anzahl der Zeilen auf die ersten Zeilen eines Ergebnisses beschränkt werden.
Eine zusätzliche OFFSET-Klausel erlaubt es, einen Versatz festzulegen.
main.sql
WARNINGS; SET sql_mode = 'ANSI,TRADITIONAL';
DROP SCHEMA IF EXISTS S; CREATE SCHEMA S; USE S;
CREATE TABLE PLANET ( PLANET VARCHAR( 255 ) PRIMARY KEY, NAME VARCHAR( 255 ));
INSERT INTO PLANET( PLANET, NAME )VALUES( '10', 'Mars' );
INSERT INTO PLANET( PLANET, NAME )VALUES( '2', 'Venus' );
INSERT INTO PLANET( PLANET, NAME )VALUES( '3', 'Erde' );
INSERT INTO PLANET( PLANET, NAME )VALUES( '1', 'Merkur' );SELECT NAME FROM PLANET ORDER BY NAME;
SELECT NAME FROM PLANET ORDER BY NAME LIMIT 2;
SELECT NAME FROM PLANET ORDER BY NAME LIMIT 1;
SELECT NAME FROM PLANET ORDER BY NAME DESC LIMIT 1;
SELECT NAME FROM PLANET ORDER BY NAME LIMIT 2 OFFSET 2;
SELECT NAME FROM PLANET ORDER BY NAME LIMIT 1 OFFSET 1;
- Protokoll
+--------+
| NAME |
+--------+
| Erde |
| Mars |
| Merkur |
| Venus |
+--------+
+------+
| NAME |
+------+
| Erde |
| Mars |
+------+
+------+
| NAME |
+------+
| Erde |
+------+
+-------+
| NAME |
+-------+
| Venus |
+-------+
+--------+
| NAME |
+--------+
| Merkur |
| Venus |
+--------+
+------+
| NAME |
+------+
| Mars |
+------+
Mit Hilfe von »ORDER BY«, »LIMIT« und »OFFSET« kann leicht der größte, kleinste, zweitgrößte, zweitkleinste u.s.w. Wert einer Spalte ermittelt werden.
Manchmal werden bestimmte Ausschnitte aus größeren Tabellen mit Hilfe von »LIMIT« und »OFFSET« ausgewählt, dies kann für ein Datenbanksystem relativ zeitaufwendig sein, könnte also ein Grund für eine verminderte Leistung darstellen.
Sortieren nach berechneten Werten ⃗
An Stelle einer Spalte (wie »PLANET«) kann auch ein beliebiger Ausdruck (wie »-PLANET«) angegeben werden.
- Konsole
SELECT NAME, PLANET FROM PLANET ORDER BY PLANET;
+--------+--------+
| NAME | PLANET |
+--------+--------+
| Merkur | 1 |
| Mars | 10 |
| Venus | 2 |
| Erde | 3 |
+--------+--------+SELECT NAME, PLANET FROM PLANET ORDER BY -PLANET;
+--------+--------+
| NAME | PLANET |
+--------+--------+
| Mars | 10 |
| Erde | 3 |
| Venus | 2 |
| Merkur | 1 |
+--------+--------+
Nach »ORDER BY PLANET« wird wegen des Spaltentyps »VARCHAR« lexikographisch sortiert.
Nach »ORDER BY -PLANET« wird numerisch sortiert, da der Operator »-« aus einem VARCHAR-Wert eine Zahl macht. Da diese Zahl das Negative des Zahlenwertes in der Spalte ist, wird außerdem absteigend sortiert.
Groß- und Kleinschreibung ⃗
Groß- und Kleinschreibung ist beim Sortieren normalerweise nicht signifikant. Um dies zu ändern kann »ORDER BY BINARY« verwendet werden.
main.sql
WARNINGS; SET sql_mode = 'ANSI,TRADITIONAL';
DROP SCHEMA IF EXISTS S; CREATE SCHEMA S; USE S;CREATE TABLE BEISPIEL ( BUCHSTABE CHAR( 1 )PRIMARY KEY );
INSERT INTO BEISPIEL( BUCHSTABE )VALUES( 'A' );
INSERT INTO BEISPIEL( BUCHSTABE )VALUES( 'E' );
INSERT INTO BEISPIEL( BUCHSTABE )VALUES( 'b' );SELECT BUCHSTABE FROM BEISPIEL ORDER BY BUCHSTABE;
SELECT BUCHSTABE FROM BEISPIEL ORDER BY BINARY BUCHSTABE;
- Protokoll
+-----------+
| BUCHSTABE |
+-----------+
| A |
| b |
| E |
+-----------+
+-----------+
| BUCHSTABE |
+-----------+
| A |
| E |
| b |
+-----------+
Falls sowohl »A« als auch »a« eingetragen können werden sollen, wäre statt »CHAR« »BINARY« zu verwenden, aber dann bedeutet »ORDER BY« immer »ORDER BY BINARY«.
main.sql
WARNINGS; SET sql_mode = 'ANSI,TRADITIONAL';
DROP SCHEMA IF EXISTS S; CREATE SCHEMA S; USE S;CREATE TABLE BEISPIEL ( BUCHSTABE BINARY( 1 )PRIMARY KEY );
INSERT INTO BEISPIEL( BUCHSTABE )VALUES( 'A' );
INSERT INTO BEISPIEL( BUCHSTABE )VALUES( 'E' );
INSERT INTO BEISPIEL( BUCHSTABE )VALUES( 'b' );SELECT BUCHSTABE FROM BEISPIEL ORDER BY BUCHSTABE;
SELECT BUCHSTABE FROM BEISPIEL ORDER BY BINARY BUCHSTABE;
- Protokoll
+-----------+
| BUCHSTABE |
+-----------+
| A |
| E |
| b |
+-----------+
+-----------+
| BUCHSTABE |
+-----------+
| A |
| E |
| b |
+-----------+main.sql
WARNINGS; SET sql_mode = 'ANSI,TRADITIONAL';
DROP SCHEMA IF EXISTS S; CREATE SCHEMA S; USE S;CREATE TABLE BEISPIEL ( BUCHSTABE CHAR( 1 )PRIMARY KEY );
INSERT INTO BEISPIEL( BUCHSTABE )VALUES( 'a' );
INSERT INTO BEISPIEL( BUCHSTABE )VALUES( 'A' );SELECT BUCHSTABE FROM BEISPIEL;
- Protokoll
ERROR 1062 (23000) at line 5 in file: 'main.sql': Duplicate entry 'A' for key 'PRIMARY'
main.sql
WARNINGS; SET sql_mode = 'ANSI,TRADITIONAL';
DROP SCHEMA IF EXISTS S; CREATE SCHEMA S; USE S;CREATE TABLE BEISPIEL ( BUCHSTABE BINARY( 1 )PRIMARY KEY );
INSERT INTO BEISPIEL( BUCHSTABE )VALUES( 'a' );
INSERT INTO BEISPIEL( BUCHSTABE )VALUES( 'A' );SELECT BUCHSTABE FROM BEISPIEL;
- Protokoll
+-----------+
| BUCHSTABE |
+-----------+
| A |
| a |
+-----------+
Angabe einer Spalte über ihre Position ⃗
Ein Spalte kann auch über ihre Position in der Tabelle angegeben werden. (Dabei hat eine Spalte im relationalen Modell gar keine Position.)
Hierzu darf nur ein einfaches Numerale verwendet werden, kein Ausdruck mit Operatoren.
Diese Möglichkeit erlaubt es, sich auf berechnete Spalten zu beziehen, wofür allerdings auch ein mit »AS« vergebener Spaltenname verwendet werden könnte.
main.sql
WARNINGS; SET sql_mode = 'ANSI,TRADITIONAL';
DROP SCHEMA IF EXISTS S; CREATE SCHEMA S; USE S;CREATE TABLE BEISPIEL ( ZAHL INT PRIMARY KEY );
INSERT INTO BEISPIEL( ZAHL )VALUES( 12 );
INSERT INTO BEISPIEL( ZAHL )VALUES( 15 );SELECT ZAHL, -ZAHL AS B FROM BEISPIEL ORDER BY ZAHL;
SELECT ZAHL, -ZAHL AS B FROM BEISPIEL ORDER BY 1;
SELECT ZAHL, -ZAHL AS B FROM BEISPIEL ORDER BY B;
SELECT ZAHL, -ZAHL AS B FROM BEISPIEL ORDER BY 2;
SELECT ZAHL, -ZAHL AS B FROM BEISPIEL ORDER BY -1;
- Protokoll
+------+-----+
| ZAHL | B |
+------+-----+
| 12 | -12 |
| 15 | -15 |
+------+-----+
+------+-----+
| ZAHL | B |
+------+-----+
| 12 | -12 |
| 15 | -15 |
+------+-----+
+------+-----+
| ZAHL | B |
+------+-----+
| 15 | -15 |
| 12 | -12 |
+------+-----+
+------+-----+
| ZAHL | B |
+------+-----+
| 15 | -15 |
| 12 | -12 |
+------+-----+
+------+-----+
| ZAHL | B |
+------+-----+
| 12 | -12 |
| 15 | -15 |
+------+-----+
Im letzten Falle mit »-1« wird so sortiert, als gäbe es eine weitere Spalte, die in jeder Zeile den Wert »-1« enthält und dann nach jener Spalte sortiert – also praktisch gar nicht.
Sortieren und »UNION« ⃗
Eine ORDER-BY-Klausel hinter einer UNION-Anwendung bezieht sich auf das Ergebnis der UNION-Anwendung (und nicht nur auf das Ergebnis der direkt voranstehenden Abfrage).
- Skript (MySQL )
DROP SCHEMA D; CREATE SCHEMA D; USE D;
CREATE TABLE FRAU
( VORNAME VARCHAR ( 255 ),
NACHNAME VARCHAR ( 255 ));INSERT INTO FRAU ( VORNAME, NACHNAME ) VALUES ( 'Anita', 'Holm' );
INSERT INTO FRAU ( VORNAME, NACHNAME ) VALUES ( 'Cathrin', 'Naumann' );
INSERT INTO FRAU ( VORNAME, NACHNAME ) VALUES ( 'Simone', 'Meijer' );CREATE TABLE MANN
( VORNAME VARCHAR ( 255 ),
NACHNAME VARCHAR ( 255 ));INSERT INTO MANN ( VORNAME, NACHNAME ) VALUES ( 'Nicolas', 'Zeeck' );
INSERT INTO MANN ( VORNAME, NACHNAME ) VALUES ( 'Christian', 'Moorwessel' );
INSERT INTO MANN ( VORNAME, NACHNAME ) VALUES ( 'Michael', 'Aldekamp' );SELECT * FROM FRAU;
SELECT * FROM MANN;
SELECT NACHNAME, VORNAME, 'w' AS GESCHLECHT FROM FRAU
UNION
SELECT NACHNAME, VORNAME, 'm' AS GESCHLECHT FROM MANNORDER BY NACHNAME, VORNAME, GESCHLECHT;
+------------+-----------+------------+
| NACHNAME | VORNAME | GESCHLECHT |
+------------+-----------+------------+
| Aldekamp | Michael | m |
| Holm | Anita | w |
| Meijer | Simone | w |
| Moorwessel | Christian | m |
| Naumann | Cathrin | w |
| Zeeck | Nicolas | m |
+------------+-----------+------------+
Sortieren und Register ⃗
In vielen Fällen kann die Registrierung einer Spalte das Sortieren über jene Spalte beschleunigen.
Sortieren mit Umlauten *
Bei Verwendung von Umlauten ist es in manchen Fällen nötig, die gewünschte Sortierart mit »COLLATE utf8_german2_ci« anzugeben.
(Unter Windows 7 ist statt »utf8« »latin1« zu verwenden.)
Die Angabe enthält zum einen die verwendete Zeichenkodierung »utf8« und dann das zu verwendende Sortierverfahren »german2_ci«.
Die Details der verschiedenen Zeichenkodierungen, die MySQL verwenden kann, sind kompliziert, und sollen hier noch nicht vertieft werden.
WARNINGS; SET sql_mode = 'ANSI,TRADITIONAL';
DROP SCHEMA IF EXISTS S; CREATE SCHEMA S; USE S;CREATE TABLE BUCHSTABE ( BUCHSTABE INTEGER, BUCHSTABENTEXT VARCHAR( 255 ));
INSERT INTO BUCHSTABE ( BUCHSTABE, BUCHSTABENTEXT )VALUES( 1, 'a' );
INSERT INTO BUCHSTABE ( BUCHSTABE, BUCHSTABENTEXT )VALUES( 2, 'o' );
INSERT INTO BUCHSTABE ( BUCHSTABE, BUCHSTABENTEXT )VALUES( 3, 'u' );
INSERT INTO BUCHSTABE ( BUCHSTABE, BUCHSTABENTEXT )VALUES( 4, 'ä' );
INSERT INTO BUCHSTABE ( BUCHSTABE, BUCHSTABENTEXT )VALUES( 5, 'ö' );
INSERT INTO BUCHSTABE ( BUCHSTABE, BUCHSTABENTEXT )VALUES( 6, 'ü' );SELECT * FROM BUCHSTABE ORDER BY BUCHSTABENTEXT COLLATE utf8_german2_ci;
+-----------+----------------+
| BUCHSTABE | BUCHSTABENTEXT |
+-----------+----------------+
| 1 | a |
| 4 | ä |
| 2 | o |
| 5 | ö |
| 3 | u |
| 6 | ü |
+-----------+----------------+SELECT * FROM BUCHSTABE ORDER BY BUCHSTABENTEXT COLLATE utf8_unicode_520_ci;
+-----------+----------------+
| BUCHSTABE | BUCHSTABENTEXT |
+-----------+----------------+
| 1 | a |
| 4 | ä |
| 2 | o |
| 5 | ö |
| 3 | u |
| 6 | ü |
+-----------+----------------+SELECT * FROM BUCHSTABE ORDER BY BUCHSTABENTEXT COLLATE utf8_bin;
+-----------+----------------+
| BUCHSTABE | BUCHSTABENTEXT |
+-----------+----------------+
| 1 | a |
| 2 | o |
| 3 | u |
| 4 | ä |
| 5 | ö |
| 6 | ü |
+-----------+----------------+
Beispiel Das symmetrische kartesische Produkt zweier Tabellen ⃗
Das symmetrische kartesische Produkt zweier Tabellen ist die Vereinigung des kartesischen Produkts der beiden Tabellen mit dem kartesischen Produkt der beiden Tabellen mit vertauschter Reihenfolge der Faktoren.
Beispielsweise sollen in einem Schach-Turnier jeder der Spieler einer Mannschaft M gegen jeden der Spieler einer Mannschaft W zweimal antreten: Einmal soll der Spieler aus A mit Weiß spielen und einmal der Spieler aus B.
main.sql
WARNINGS; SET sql_mode = 'ANSI,TRADITIONAL';
DROP SCHEMA S; CREATE SCHEMA S; USE S;CREATE TABLE M ( NAME VARCHAR ( 255 ));
INSERT INTO M ( NAME ) VALUES ( 'Rudolf' );
INSERT INTO M ( NAME ) VALUES ( 'Werner' );
INSERT INTO M ( NAME ) VALUES ( 'Reinhard' );CREATE TABLE W ( NAME VARCHAR ( 255 ));
INSERT INTO W ( NAME ) VALUES ( 'Heike' );
INSERT INTO W ( NAME ) VALUES ( 'Claudia' );
INSERT INTO W ( NAME ) VALUES ( 'Anita' );SELECT M.NAME AS WEISS, W.NAME AS SCHWARZ FROM M INNER JOIN W
UNION
SELECT W.NAME AS WEISS, M.NAME AS SCHWARZ FROM W INNER JOIN M- Protokoll
+----------+----------+
| WEISS | SCHWARZ |
+----------+----------+
| Rudolf | Heike |
| Werner | Heike |
| Reinhard | Heike |
| Rudolf | Claudia |
| Werner | Claudia |
| Reinhard | Claudia |
| Rudolf | Anita |
| Werner | Anita |
| Reinhard | Anita |
| Heike | Rudolf |
| Claudia | Rudolf |
| Anita | Rudolf |
| Heike | Werner |
| Claudia | Werner |
| Anita | Werner |
| Heike | Reinhard |
| Claudia | Reinhard |
| Anita | Reinhard |
+----------+----------+
Eine UNION-Abfrage erlaubt auch noch einer ORDER-BY--Klausel.
main.sql
WARNINGS; SET sql_mode = 'ANSI,TRADITIONAL';
DROP SCHEMA S; CREATE SCHEMA S; USE S;CREATE TABLE M ( NAME VARCHAR ( 255 ));
INSERT INTO M ( NAME ) VALUES ( 'Rudolf' );
INSERT INTO M ( NAME ) VALUES ( 'Werner' );
INSERT INTO M ( NAME ) VALUES ( 'Reinhard' );CREATE TABLE W ( NAME VARCHAR ( 255 ));
INSERT INTO W ( NAME ) VALUES ( 'Heike' );
INSERT INTO W ( NAME ) VALUES ( 'Claudia' );
INSERT INTO W ( NAME ) VALUES ( 'Anita' );SELECT M.NAME AS WEISS, W.NAME AS SCHWARZ FROM M INNER JOIN W
UNION
SELECT W.NAME AS WEISS, M.NAME AS SCHWARZ FROM W INNER JOIN M
ORDER BY WEISS- Protokoll
+----------+----------+
| WEISS | SCHWARZ |
+----------+----------+
| Anita | Werner |
| Anita | Reinhard |
| Anita | Rudolf |
| Claudia | Werner |
| Claudia | Reinhard |
| Claudia | Rudolf |
| Heike | Werner |
| Heike | Reinhard |
| Heike | Rudolf |
| Reinhard | Heike |
| Reinhard | Claudia |
| Reinhard | Anita |
| Rudolf | Heike |
| Rudolf | Claudia |
| Rudolf | Anita |
| Werner | Heike |
| Werner | Claudia |
| Werner | Anita |
+----------+----------+
Im folgenden Beispiel wird die ORDER-BY-Klausel durch die Klammerung nur der inneren SELECT-Abfrage zugeordnet (was relativ sinnlos ist, da die Vereinigung eine eventuelle Sortierung nicht bewahren muß).
main.sql
WARNINGS; SET sql_mode = 'ANSI,TRADITIONAL';
DROP SCHEMA S; CREATE SCHEMA S; USE S;CREATE TABLE M ( NAME VARCHAR ( 255 ));
INSERT INTO M ( NAME ) VALUES ( 'Rudolf' );
INSERT INTO M ( NAME ) VALUES ( 'Werner' );
INSERT INTO M ( NAME ) VALUES ( 'Reinhard' );CREATE TABLE W ( NAME VARCHAR ( 255 ));
INSERT INTO W ( NAME ) VALUES ( 'Heike' );
INSERT INTO W ( NAME ) VALUES ( 'Claudia' );
INSERT INTO W ( NAME ) VALUES ( 'Anita' );SELECT M.NAME AS WEISS, W.NAME AS SCHWARZ FROM M INNER JOIN W
UNION
( SELECT W.NAME AS WEISS, M.NAME AS SCHWARZ FROM W INNER JOIN M
ORDER BY WEISS )- Protokoll
+----------+----------+
| WEISS | SCHWARZ |
+----------+----------+
| Rudolf | Heike |
| Werner | Heike |
| Reinhard | Heike |
| Rudolf | Claudia |
| Werner | Claudia |
| Reinhard | Claudia |
| Rudolf | Anita |
| Werner | Anita |
| Reinhard | Anita |
| Heike | Rudolf |
| Claudia | Rudolf |
| Anita | Rudolf |
| Heike | Werner |
| Claudia | Werner |
| Anita | Werner |
| Heike | Reinhard |
| Claudia | Reinhard |
| Anita | Reinhard |
+----------+----------+