Почему добавление «*» в запрос MySQL вызывает синтаксическую ошибку? - PullRequest
4 голосов
/ 28 октября 2011

Почему это вызывает синтаксическую ошибку (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

Я просмотрел руководство, но ничего не нашел. Почему select <field>, * ... терпит неудачу, когда select <field>, <table>.* ... и select * ... и select *, <field> ... успешны?

Ответы [ 3 ]

7 голосов
/ 28 октября 2011

В руководстве по MySQL все это довольно четко изложено в разделе SELECT синтаксис :

  • Список выбора, состоящий только из одногонеквалифицированный * может использоваться как сокращение для выбора всех столбцов из всех таблиц:

    SELECT * FROM t1 INNER JOIN t2 ...
    
  • tbl_name.* может использоваться как квалифицированное сокращение для выбора всех столбцов из именованной таблицы:

    SELECT t1.*, t2.* FROM t1 INNER JOIN t2 ...
    
  • Использование неквалифицированного * с другими элементами в списке выбора может привести к ошибке разбора.Чтобы избежать этой проблемы, используйте квалифицированную tbl_name.* ссылку

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

Документация, по-видимому, указывает на то, что * само по себе действительно только в особом случае, когдаединственная вещь в списке выбора.Однако в нем говорится только, что использование неквалифицированного * с другими элементами может привести к ошибке разбора.

Помимо MySQL, стандарт SQL-92 (старый, носвязывается) говорит так:

7.9  <query specification>

         Format

         <query specification> ::=
              SELECT [ <set quantifier> ] <select list> <table expression>

         <select list> ::=
                <asterisk>
              | <select sublist> [ { <comma> <select sublist> }... ]

         <select sublist> ::=
                <derived column>
              | <qualifier> <period> <asterisk>

         <derived column> ::= <value expression> [ <as clause> ]

         <as clause> ::= [ AS ] <column name>

<select list> может быть либо <asterisk> само по себе или"обычным" списком выбора.

1 голос
/ 28 октября 2011

, но

select *, f from blegg 

будет работать нормально.

Возможно, неквалифицированное * должно появиться в качестве первого выражения в выборе?

0 голосов
/ 28 октября 2011

Возможно, потому что вы выбираете одно и то же поле дважды.В следующем запросе

select name, * from <...>

* будет включать name, поэтому вы явно указываете name во второй раз.

Это не убедительный аргумент, посколькудопустимо следующее:

select name, name from <...>

, как и следующее

select name, users.* from users

, которые оба будут выбирать одно и то же поле несколько раз.ограничение синтаксиса MySQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...