Waarom veroorzaakt het toevoegen van '*' aan een MySQL-query een syntaxisfout?

Waarom veroorzaakt dit een syntaxisfout (MySQL 5)?

mysql> select f, blegg.* from blegg limit 1;
+------+------+------+------+
| f    | f    | g    | h    |
+------+------+------+------+
|   17 |   17 |    2 |   17 |
+------+------+------+------+
1 row in set (0.00 sec)

mysql> 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

I've looked through the manual but didn't really find anything. Why does select , * ... fail where select , <table>.* ... and select * ... and select *, ... succeed?

4
Ik kan niet uitleggen waarom. Maar ik weet dat Oracle hetzelfde doet.
toegevoegd de auteur John Weber, de bron

3 antwoord

De MySQL-handleiding legt dit vrij duidelijk uit in het gedeelte over SELECT syntaxis :

  • A select list consisting only of a single unqualified * can be used as shorthand to select all columns from all tables:

    SELECT * FROM t1 INNER JOIN t2 ...
    
  • tbl_name.* can be used as a qualified shorthand to select all columns from the named table:

    SELECT t1.*, t2.* FROM t1 INNER JOIN t2 ...
    
  • Use of an unqualified * with other items in the select list may produce a parse error. To avoid this problem, use a qualified tbl_name.* reference

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

De documentatie lijkt erop te wijzen dat * alleen geldig is in het speciale geval waarin dit het enige is in de selectielijst. Er staat echter alleen dat het gebruik van een niet-gekwalificeerde * met andere items may een ontleedfout oplevert.

Beyond MySQL, de SQL-92 standaard (oud, maar koppelbaar) zegt zoveel als:

7.9  

         Format

          ::=
              SELECT [  ]  ::=
                
              |  }... ]

          can either be  by itself or a "normal" select list.

7
toegevoegd
selecteer *, count (*) ... is geslaagd.
toegevoegd de auteur Matt Fenwick, de bron
@Matt niet waar als select *, f van blegg werkt
toegevoegd de auteur Steve Claridge, de bron

Mogelijk omdat u tweemaal hetzelfde veld selecteert. In de volgende query

select name, * from <...>

de * bevat naam , dus u geeft naam een tweede keer expliciet op.

Dit is geen overtuigend argument, omdat het volgende geldig is:

select name, name from <...>

en zo is het volgende

select name, users.* from users

beide zullen hetzelfde veld meerdere keren selecteren.

Waarschijnlijker is het gewoon een syntaxisbeperking van MySQL.

2
toegevoegd
nee, dat is het niet: select count (*), * from blegg mislukt ook
toegevoegd de auteur Matt Fenwick, de bron
Dit is geen geweldig antwoord, maar het was te lang/complex voor een opmerking. Zal graag verwijderen als/wanneer iemand een meer concrete uitleg geeft.
toegevoegd de auteur meagar, de bron
Maar zijn eerste, werkende voorbeeld doet hetzelfde (en bevat in de uitvoer twee keer f ).
toegevoegd de auteur John Flatness, de bron

maar

select *, f from blegg 

werkt prima.

Mogelijk moet een ongekwalificeerd * verschijnen als de eerste uitdrukking in de selectie?

1
toegevoegd