COUNT()是否需要GROUP BY?

时间:2016-05-06 12:53:37

标签: mysql sql

以下查询旨在返回学生姓名,学校名称,学区名称以及所在学区的学校数量。 GROUP BY d.id做了什么吗?似乎SELECT语句中的COUNT()神奇地做了同样的事情。如果没有必要,这是好的做法吗?

SELECT s.name student_name, sc.name school_name, d.name district_name,
COUNT(sc.id) school_count_at_students_district
FROM students s
INNER JOIN schools sc ON sc.id=s.schools_id
LEFT OUTER JOIN schools sc2 ON sc2.districts_id=sc.districts_id
INNER JOIN districts d ON d.id=sc.districts_id
WHERE s.id=123;

2 个答案:

答案 0 :(得分:1)

MySQL对GROUP BY子句很宽容。

但根据ANSI SQL定义,这种做法是错误的。 如果您考虑迁移到其他DBMS,如Oracle,PostgresQL ... put GROUP BY子句及其列。

此外,它更容易理解什么时候把它。

答案 1 :(得分:1)

说你有下表:

+----+-----+-----------+
| f1 | f2  |    f3     |
+----+-----+-----------+
|  1 | 4.3 | apple     |
|  2 | 1.4 | orange    |
|  2 | 3   | pear      |
|  3 | 1.2 | kiwi      |
|  3 | 2.2 | pineapple |
|  3 | 1   | pineapple |
+----+-----+-----------+

你执行:

SELECT f1, sum(f2), f3 FROM table GROUP BY f1, f3;

我们在GROUP BY中包含f1f3列,告诉mysql如何聚合。你会回来的:

+----+-----+-----------+
| f1 | f2  |    f3     |
+----+-----+-----------+
|  1 | 4.3 | apple     |
|  2 | 1.4 | orange    |
|  2 | 3   | pear      |
|  3 | 1.2 | kiwi      |
|  3 | 3.3 | pineapple |
+----+-----+-----------+

在这里,我们得到了f1f3记录的不同分组,就像我们期望的那样。

如果在GROUP BY中省略f1f3,则除了MySQL之外,星球上的每个RDBMS都会抛出错误。非MySQL数据库要求您明确说明如何汇总字段,并且必须将它们分组到GROUP BY中,或者使用SELECT中的公式进行汇总。

如果在MySQL中省略了GROUP BY

SELECT f1, sum(f2), f3 FROM table;

你将获得如下记录:

+----+-----+-----------+
| f1 | f2  |    f3     |
+----+-----+-----------+
|  1 | 4.3 | apple     |
|  2 | 4.4 | orange    |    
|  3 | 4.5 | kiwi      |    
+----+-----+-----------+

这可能是胡说八道。您的记录的参照完整性已受到损害。 Oranges不是4.4Kiwi不是4.5。 MySQL所做的是抓住它在表中遇到的第一个值并吐出来。在以下情况下,此行为可能有意义:

  1. 您并不关心MySQL从f3或......
  2. 中选择哪个值
  3. 您依靠MySQL的存储引擎来维护记录的顺序,因此会让您变得愚蠢。不要那样做。
  4. 如果您要与GROUP BY中的某个功能进行汇总,那么代码可移植性和意外结果的最佳选择是包含SELECT。否则你会得到你应得的。