Kapitel 2: Vorb emerkungen zum deutschen Handbuch 39
• -- ist nur dann ein Kommentar, wenn darauf Whitespace folgt. Siehe Abschnitt 2.7.4.8
[ANSI diff comments], Seite 44.
• Bei VARCHAR-Spalten werden Leerzeichen am Ende entfernt, wenn der Wert gespeichert
wird. Siehe Abschnitt 2.7.5 [Bugs], Seite 45.
• In einigen F¨allen ¨andern sich CHAR-Spalten automatisch (silent) in VARCHAR-Spalten.
Siehe Abschnitt 7.5.3.1 [Silent column changes], Seite 463.
• Zugriffsrechte f¨ur eine Tabelle werden nicht automatisch widerrufen, wenn Sie eine
Tabelle l¨oschen. Sie m¨ussen explizit ein REVOKE-Statement absetzen, um die Zugriffs-
rechte f¨ur eine Tabelle zu widerrufen. Siehe Abschnitt 5.3.1 [GRANT], Seite 203.
• NULL AND FALSE werden zu NULL ausgewertet und nicht zu FALSE. Der Grund hierf¨ur
liegt darin, dass wir meinen, dass es keine gute Idee ist, eine Menge von Sonderkondi-
tionen f¨ur diesen Fall auswerten zu m¨ussen.
2.7.4.1 Sub-Selects
MySQL unterst¨utzt momentan nur Sub-Selects der Form INSERT ... SELECT ... und
REPLACE ... SELECT .... In anderen Zusammenh¨angen k¨onnen Sie allerdings die
Funktion IN() benutzen.
In vielen F¨allen k¨onnen Sie Ihre Anfragen ohne Sub-Selects schreiben:
SELECT * FROM tabelle1 WHERE id IN (SELECT id FROM tabelle2);
Das kann wie folgt umgeschrieben werden:
SELECT tabelle1.* FROM tabelle1,tabelle2 WHERE tabelle1.id=tabelle2.id;
Die Anfragen:
SELECT * FROM tabelle1 WHERE id NOT IN (SELECT id FROM tabelle2);
SELECT * FROM tabelle1 WHERE NOT EXISTS (SELECT id FROM tabelle2 where tabelle1.id=tabelle2.id);
K¨onnen wie folgt umgeschrieben werden:
SELECT tabelle1.* FROM tabelle1 LEFT JOIN tabelle2 ON tabelle1.id=tabelle2.id where tabelle2.id IS NULL
F¨ur kompliziertere Unteranfragen (Subqueries) k¨onnen Sie oft tempor¨are Tabelle anlegen,
die die Unteranfrage enthalten. In einigen F¨allen wird diese Option allerdings nicht funk-
tionieren. Am h¨aufigsten treten diese F¨alle mit DELETE-Statements auf, wof¨ur Standard-
SQL keine Verkn¨upfungen (Joins) unterst¨utzt. F¨ur solche Situationen sind zwei Optionen
verf¨ugbar, solange MySQL noch keine Unteranfragen unterst¨utzt.
Die erste Option besteht darin, eine prozedurale Programmiersprache (wie PHP oder Perl)
zu benutzen, um eine SELECT-Anfrage zu erhalten, die die Prim¨arschl¨ussel enth¨alt, die
ben¨otigt werden, um die entsprechenden Datens¨atze zu l¨oschen, und dann diese Werte
zu benutzen, um das DELETE-Statement zu formulieren (DELETE FROM ... WHERE ... IN
(key1, key2, ...)).
Die zweite Option besteht darin, interaktives SQL zu benutzen, um automatisch eine Reihe
von DELETE-Statements zu formulieren, indem die MySQL-Erweiterung CONCAT() benutzt
wird (anstelle des Standard-Operators ||). Beispiel:
SELECT CONCAT(’DELETE FROM tabelle1 WHERE pkid = ’, tabelle1.pkid, ’;’)
FROM tabelle1, tabelle2
WHERE tabelle1.spalte1 = tabelle2.spalte2;
Comentarios a estos manuales