Volker Englisch wrote:
> Am 14.03.13 schrieb Axel Schwenke:
>> Volker Englisch <
23C5...@rsli.de> wrote:
>>> ORDER BY 'Tag','Person'" "$DB"
>>
>>> Heraus kommt das:
>> ...
>>> Von dem "ORDER BY" ist irgendwie nicht sehr viel zu erkennen.
>>> Vielleicht sieht ja jemand von Euch auf Anhieb, was ich falsch mache?
>>
>> Ja. Du sortierst nach den konstanten Strings 'Tag' und 'Person'.
>
> Ist mir inzwischen auch aufgefallen, aber warum meckert MySQL da nicht?
> Ist doch eigentlich unlogisch, nach einer Konstanten zu sortieren,
Nein.
> oder gibts dafür tatsächlich eine sinnvolle Verwendung?
Ja. Wenn der Parameter *kein* Name ist, dann kann er auch noch ein Ausdruck
oder eine Positionsangabe sein (siehe [1]):
SELECT
…
[ORDER BY {col_name | expr | position} [ASC | DESC], ...]
…
Ein Parser hat also hier nur die Möglichkeit, zwischen Spaltenname, Ausdruck
und Position zu unterscheiden. Spaltennamen beginnen nicht mit „'“,
Positionen sind numerische Werte. Also wird 'Tag' usw. als Ausdruck
ausgewertet, d. h. als String-Literal. Dass das eine Konstante ist, darf
den Parser nicht interessieren: es ist syntaktisch korrekt. (Allenfalls
könnte er warnen. Das könnte man für eine zukünftige MySQL-Version
vorschlagen; wäre IMHO sinnvoll, da auch Funktionen *sinnlose* statische
Rückgabewerte liefern können.)
Zum Beispiel unterstützt MySQL folgende Syntax:
SELECT …
FROM …
GROUP BY 1
ORDER BY NULL
Damit wird dem Umstand Rechnung getragen, dass GROUP BY in MySQL
normalerweise gleichzeitig nach den Gruppierungsfelder sortiert.
Mit ORDER BY NULL kann man das verhindern (ibid.).
>> Und selbst wenn das Quoting korrekt wäre,
>
> Was am Quoting ist denn verkehrt? Außer den Hochkommas vor und nach dem
> Sortierwert?
„'x'“ ist das *String-Literal* mit Wert „x“. „`x`“ ist hingegen der
(Datenbank-, Tabellen-, View- oder Spalten-)*Name* „x“, wobei „x“ dann nicht
als Schlüsselwort interpretiert wird. „`x`“ wäre also gleichbedeutend mit
„x“; hingegen wäre „select“ u. U. ein Syntaxfehler, „`select`“ aber nie.
Alle Klarheiten restlos beseitigt? ;-)
>> wäre es die Semantik nicht. ORDER BY für eine UNION kann nur
>> Spalten/Aliase aus dem ersten SELECT oder (hier IMHO besser)
>> Spalten-Nummern (... ORDER BY 1, 2)
>>
>> Handbuch lesen!
http://dev.mysql.com/doc/refman/5.6/en/union.html
>
> Hab ich gemacht, mehrfach sogar, aber offensichtlich nicht ganz
> verstanden. Bezüglich der Spaltennummern stand da IIRC, daß man selbige
> möglichst nicht verwenden soll, da obsolet.
Nicht ganz:
,-[1]-<
http://dev.mysql.com/doc/refman/5.6/en/select.html>
|
| Use of column positions is deprecated because the syntax has been removed
^^^^^^^^^^
| from the SQL standard.
Da steht aber auch schon seit MySQL 4.1 im Handbuch, daher würde ich das
nicht allzu ernst nehmen. Auch wenn die Möglichkeit vorgesehen ist: Ich
kenne genau niemanden, der MySQL *produktiv* im standardkonformen Modus
betreibt. Dass MySQL per default _nicht_ streng standardkonform arbytet,
ist IMHO eine der Stärken von MySQL gegenüber anderen DBMS. YMMV.