5 Stimmen

Warum führt das Hinzufügen von '*' zu einer MySQL-Abfrage zu einem Syntaxfehler?

In MySQL funktioniert dieser Code einwandfrei:

select f, blegg.* from blegg limit 1;

+------+------+------+------+
| f    | f    | g    | h    |
+------+------+------+------+
|   17 |   17 |    2 |   17 |
+------+------+------+------+
1 row in set (0.00 sec)

Warum führt dieser Code dann zu einem Syntaxfehler?

select f, * from blegg limit 1;

-- * is unqualified
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near '* 
from blegg limit 1' at line 1

Ich habe im Handbuch nachgeschaut, aber nichts wirklich gefunden. Warum scheitert select , * ... während `select , .* ... und `select * ...select *, ...`

und erfolgreich sind?```

0 Stimmen

Ich kann nicht erklären, warum. Aber ich weiß, dass Oracle das Gleiche tut.

8voto

John Flatness Punkte 30799

Das MySQL-Handbuch legt dies alles ziemlich klar im Abschnitt zur SELECT-Syntax dar:

  • Eine Auswahl, die nur aus einem einzelnen unqualifizierten * besteht, kann als Abkürzung verwendet werden, um alle Spalten aus allen Tabellen auszuwählen:

    SELECT * FROM t1 INNER JOIN t2 ...
  • tbl_name.* kann als qualifizierte Abkürzung verwendet werden, um alle Spalten aus der benannten Tabelle auszuwählen:

    SELECT t1.*, t2.* FROM t1 INNER JOIN t2 ...
  • Die Verwendung eines unqualifizierten * mit anderen Elementen in der Select-Liste kann einen Syntaxfehler verursachen. Um dieses Problem zu vermeiden, verwenden Sie einen qualifizierten tbl_name.*-Verweis

    SELECT AVG(score), t1.* FROM t1 ...

Die Dokumentation scheint darauf hinzuweisen, dass * allein nur im Sonderfall gültig ist, wo es das einzige Element in der Select-Liste ist. Es heißt jedoch nur, dass die Verwendung eines unqualifizierten * mit anderen Elementen möglicherweise einen Syntaxfehler verursachen kann.

Jenseits von MySQL sagt der SQL-92-Standard (alt, aber verlinkbar) ähnliches:

7.9  

         Format

          ::=
              SELECT [  ]  

          ::=

              |  [ {   }... ]

          ::=

              |   

          ::=  [  ]

          ::= [ AS ] 

0 Stimmen

select *, count(*) ... gelingt.

2voto

Steve Claridge Punkte 9852

Aber

Wähle *, f aus blegg 

wird gut funktionieren.

Möglicherweise muss ein nicht qualifiziertes * als erster Ausdruck im select erscheinen?

-2voto

user229044 Punkte 220593

Möglicherweise wählen Sie dasselbe Feld zweimal aus. In der folgenden Abfrage

select name, * from <...>

wird das * auch name enthalten, sodass Sie name explizit ein zweites Mal angeben.

Dies ist kein überzeugendes Argument, da Folgendes gültig ist:

select name, name from <...>

und auch Folgendes

select name, users.* from users

beides wird dasselbe Feld mehrmals auswählen.

Wahrscheinlicher ist es einfach eine Syntaxbeschränkung von MySQL.

1 Stimmen

Nein, das ist es nicht: select count(*), * from blegg scheitert auch

0 Stimmen

Aber sein erstes, funktionierendes Beispiel macht dasselbe (und enthält f zweimal im Output).

0 Stimmen

Dies ist keine gute Antwort, aber sie war zu lang/komplex für einen Kommentar. Ich werde sie gerne löschen, wenn/wenn jemand eine konkretere Erklärung liefert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X