2017-04-21 247 views
1

有时它很方便返回表中的所有数据以及您特别想要的数据,为什么`select *,column from table;`work but`select column,* from table;`不工作

SELECT *, name, age FROM users; 

但是,首先得到你想要的数据,然后是剩下的数据会更方便。

SELECT name, age, * FROM users; 

但是,第二个SQL语句失败,出现语法错误。

这是为什么?

+1

[SELECT](https://dev.mysql.com/doc/refman/5.5/en/select.html):“与选择列表中的其他项目一起使用不合格的'*'可能会产生解析错误。要避免这个问题,请使用合格的'tbl_name。*'参考“。 –

+1

我用@Damien_The_Unbeliever提供了什么搜索了一下。有趣的是,除了'这可能会产生一个分析错误',没有任何东西*。甚至没有解释这会导致什么样的解析错误,或者会发生什么样的解析错误。在2007年,一个[bug报告](https://bugs.mysql.com/bug.php?id=26066)被提交,并在两年后完全相同的解释结束。 –

+0

根据ANSI/ISO SQL,如果使用不合格的'*',它必须在选择列表中单独存在。 – jarlh

回答

2

我已经搜索了一下,我发现共有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(具有相同的行为)源代码来回答这个问题,但是我没有看到有人找到真正的答案。

+0

感谢您对各种信息的总结。 +1 – Luke

0

因为MySQL是宽松的,以它的语法,但并不总是...

旁边,如果你想要写一个有效的SQL查询时,它应该是这样的:

select col1, col2, users.* 
from users 

或用别名上表和列:

select u.*, 'foobar' as col1, 1 as col2 
from users u 
相关问题