在SQL中,为什么是;按whenSent从sentGifts组中选择*,计数(*)&引用;好的,但是什么时候*&引用;及;计数(*)";是切换位置,那么它给出了一个错误?

在SQL中,为什么是;按whenSent从sentGifts组中选择*,计数(*)&引用;好的,但是什么时候*&引用;及;计数(*)";是切换位置,那么它给出了一个错误?,sql,mysql,select,count,group-by,Sql,Mysql,Select,Count,Group By,在SQL中,使用表: mysql> select * from sentGifts; +--------+------------+--------+------+---------------------+--------+ | sentID | whenSent | fromID | toID | trytryWhen | giftID | +--------+------------+--------+------+---------------------+

在SQL中,使用表:

mysql>  select * from sentGifts;
+--------+------------+--------+------+---------------------+--------+
| sentID | whenSent   | fromID | toID | trytryWhen          | giftID |
+--------+------------+--------+------+---------------------+--------+
|      1 | 2010-04-24 |    123 |  456 | 2010-04-24 01:52:20 |    100 |
|      2 | 2010-04-24 |    123 | 4568 | 2010-04-24 01:56:04 |    100 |
|      3 | 2010-04-24 |    123 | NULL | NULL                |      1 |
|      4 | 2010-04-24 |   NULL |  111 | 2010-04-24 03:10:42 |      2 |
|      5 | 2010-03-03 |     11 |   22 | 2010-03-03 00:00:00 |      6 |
|      6 | 2010-04-24 |     11 |  222 | 2010-04-24 03:54:49 |      6 |
|      7 | 2010-04-24 |      1 |    2 | 2010-04-24 03:58:45 |      6 |
+--------+------------+--------+------+---------------------+--------+
7 rows in set (0.00 sec)
以下是确定的:

mysql>  select *, count(*) from sentGifts group by whenSent;
+--------+------------+--------+------+---------------------+--------+----------+
| sentID | whenSent   | fromID | toID | trytryWhen          | giftID | count(*) |
+--------+------------+--------+------+---------------------+--------+----------+
|      5 | 2010-03-03 |     11 |   22 | 2010-03-03 00:00:00 |      6 |        1 |
|      1 | 2010-04-24 |    123 |  456 | 2010-04-24 01:52:20 |    100 |        6 |
+--------+------------+--------+------+---------------------+--------+----------+
2 rows in set (0.00 sec)
但假设我们希望count(*)显示为第一列:

mysql>  select count(*), * from sentGifts group by whenSent;
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 sentGifts group by whenSent' at line 1
它给出了一个错误。为什么会这样?有什么办法可以解决

我意识到这没关系:

mysql>  select count(*), whenSent from sentGifts group by whenSent;
+----------+------------+
| count(*) | whenSent   |
+----------+------------+
|        1 | 2010-03-03 |
|        6 | 2010-04-24 |
+----------+------------+
2 rows in set (0.00 sec)

但是上面那个错误的呢?谢谢。

我不知道为什么会出现错误,但如果您写:

 SELECT COUNT(*), sentGifts.* FROM sentGifts GROUP BY whenSent
它没有给出那个错误

此外,即使没有组,它也会因相同的错误而失败:

 SELECT whenSent, * FROM sentGifts 
根据报告:

将非限定*与选择列表中的其他项一起使用可能会产生分析错误。为避免此问题,请使用限定的tbl_名称。*引用

因此,我的猜测是,如果出现非限定的
*
,则它必须紧跟在SELECT关键字之后。一般来说,你不应该这样做。它可能会在MySQL的更高版本中停止工作

我还建议您阅读关于在使用GROUP BY时选择非聚集列的说明:

MySQL扩展了GROUP BY的使用,因此您可以在SELECT列表中使用GROUP BY子句中未出现的非聚集列或计算

使用此功能时,每个组中的所有行对于按部分从组中写入的列应具有相同的值。服务器可以从组中自由返回任何值,因此结果是不确定的,除非所有值都相同

所以你的结果是不确定的。不要这样做


选择
*
也是一种不好的做法。您应该明确列出所需的列,即使它是所有列。

我不知道为什么会出现错误,但如果您写:

 SELECT COUNT(*), sentGifts.* FROM sentGifts GROUP BY whenSent
它没有给出那个错误

此外,即使没有组,它也会因相同的错误而失败:

 SELECT whenSent, * FROM sentGifts 
根据报告:

将非限定*与选择列表中的其他项一起使用可能会产生分析错误。为避免此问题,请使用限定的tbl_名称。*引用

因此,我的猜测是,如果出现非限定的
*
,则它必须紧跟在SELECT关键字之后。一般来说,你不应该这样做。它可能会在MySQL的更高版本中停止工作

我还建议您阅读关于在使用GROUP BY时选择非聚集列的说明:

MySQL扩展了GROUP BY的使用,因此您可以在SELECT列表中使用GROUP BY子句中未出现的非聚集列或计算

使用此功能时,每个组中的所有行对于按部分从组中写入的列应具有相同的值。服务器可以从组中自由返回任何值,因此结果是不确定的,除非所有值都相同

所以你的结果是不确定的。不要这样做


选择
*
也是一种不好的做法。您应该明确列出所需的列,即使它是所有列。

来自MySQL参考手册:

将不合格*与其他 选择列表中的项目可能会产生 分析错误。为了避免这个问题,, 使用限定的tbl_名称。*引用

因此,不是:

SELECT count(*), * FROM sentGifts GROUP BY whenSent
使用


从MySQL参考手册:

将不合格*与其他 选择列表中的项目可能会产生 分析错误。为了避免这个问题,, 使用限定的tbl_名称。*引用

因此,不是:

SELECT count(*), * FROM sentGifts GROUP BY whenSent
使用


+是的,我认为这是对他的问题最直接的回答。