有时它很方便返回表中的所有数据以及您特别想要的数据,为什么`select *,column from table;`work but`select column,* from table;`不工作
SELECT *, name, age FROM users;
但是,首先得到你想要的数据,然后是剩下的数据会更方便。
SELECT name, age, * FROM users;
但是,第二个SQL语句失败,出现语法错误。
这是为什么?
有时它很方便返回表中的所有数据以及您特别想要的数据,为什么`select *,column from table;`work but`select column,* from table;`不工作
SELECT *, name, age FROM users;
但是,首先得到你想要的数据,然后是剩下的数据会更方便。
SELECT name, age, * FROM users;
但是,第二个SQL语句失败,出现语法错误。
这是为什么?
我已经搜索了一下,我发现共有3个关于SO的问题与这个问题有关或者提出了同样的问题。免责声明:我只发现他们从达明在评论中提供的链接在寻找的东西:"Use of an unqualified * with other items"
你得到这些所谓的问题:
在关于最后一个问题的answer的评论中,我找到了一个链接到bug report从2007年这是在2009年与下面的解释关闭:
我已经更新http://dev.mysql.com/doc/refman/5.1/en/select.html到 反映行为:
只由一个单一的不合格*可作为 简写选择列表所有表中选择所有列:
SELECT * FROM T1 INNER JOIN T2 ......
tbl_name *可以作为一个合格的速记选择所有列 从命名表:
SELECT t1。 ,t2。从T1 INNER JOIN T2 ......
在选择列表中使用非限定*与其他项目的可能 产生解析错误。要避免此问题,请使用合格的 tbl_name。*参考
SELECT AVG(分数),t1。* FROM t1 ...
突出显示/粗体由我提供。对于这种行为我找不到任何进一步的解释,或者会出现什么样的解析错误或者哪里会出现。
如果有人有一段时间可以通过挖掘MySQL或MariaDB(具有相同的行为)源代码来回答这个问题,但是我没有看到有人找到真正的答案。
感谢您对各种信息的总结。 +1 – Luke
因为MySQL是宽松的,以它的语法,但并不总是...
旁边,如果你想要写一个有效的SQL查询时,它应该是这样的:
select col1, col2, users.*
from users
或用别名上表和列:
select u.*, 'foobar' as col1, 1 as col2
from users u
[SELECT](https://dev.mysql.com/doc/refman/5.5/en/select.html):“与选择列表中的其他项目一起使用不合格的'*'可能会产生解析错误。要避免这个问题,请使用合格的'tbl_name。*'参考“。 –
我用@Damien_The_Unbeliever提供了什么搜索了一下。有趣的是,除了'这可能会产生一个分析错误',没有任何东西*。甚至没有解释这会导致什么样的解析错误,或者会发生什么样的解析错误。在2007年,一个[bug报告](https://bugs.mysql.com/bug.php?id=26066)被提交,并在两年后完全相同的解释结束。 –
根据ANSI/ISO SQL,如果使用不合格的'*',它必须在选择列表中单独存在。 – jarlh