在SQL中,为什么"select*,count(*)来自sentGifts组bytimeSent;" 好的,但是当"*"和"count(*)"切换位置时,​​它会出错?

nop*_*ole 1 mysql sql select group-by count

在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)
Run Code Online (Sandbox Code Playgroud)

以下是好的:

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)
Run Code Online (Sandbox Code Playgroud)

但是假设我们希望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
Run Code Online (Sandbox Code Playgroud)

它给出了一个错误.为什么会如此,以及解决这个问题的方法是什么?

我意识到这没关系:

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)
Run Code Online (Sandbox Code Playgroud)

但是上面那个错误呢?谢谢.

Mar*_*ers 5

我不确定它为什么会出错,但是如果你写的话:

 SELECT COUNT(*), sentGifts.* FROM sentGifts GROUP BY whenSent
Run Code Online (Sandbox Code Playgroud)

它不会给出错误.

即使没有该组,它也会失败并出现相同的错误:

 SELECT whenSent, * FROM sentGifts 
Run Code Online (Sandbox Code Playgroud)

根据文件:

在选择列表中使用不合格的*与其他项可能会产生解析错误.要避免此问题,请使用限定的tbl_name.*引用

所以我的猜测是,*如果出现不合格,必须紧跟在SELECT关键字之后.一般来说,你不应该这样做.它可能会停止在MySQL的更高版本中工作.

我还建议您在使用GROUP BY时阅读有关选择非聚合列的文档:

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

使用此功能时,每个组中的所有行应具有与GROUP BY部分中省略的列相同的值.服务器可以自由地从组中返回任何值,因此除非所有值都相同,否则结果是不确定的.

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

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