以下查询旨在返回学生姓名,学校名称,学区名称以及所在学区的学校数量。 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;
答案 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中包含f1
和f3
列,告诉mysql如何聚合。你会回来的:
+----+-----+-----------+
| f1 | f2 | f3 |
+----+-----+-----------+
| 1 | 4.3 | apple |
| 2 | 1.4 | orange |
| 2 | 3 | pear |
| 3 | 1.2 | kiwi |
| 3 | 3.3 | pineapple |
+----+-----+-----------+
在这里,我们得到了f1
和f3
记录的不同分组,就像我们期望的那样。
如果在GROUP BY中省略f1
或f3
,则除了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.4
而Kiwi
不是4.5
。 MySQL所做的是抓住它在表中遇到的第一个值并吐出来。在以下情况下,此行为可能有意义:
f3
或...... 如果您要与GROUP BY
中的某个功能进行汇总,那么代码可移植性和意外结果的最佳选择是包含SELECT
。否则你会得到你应得的。