Mysql COUNT()是否需要分组依据?
以下查询旨在返回学生姓名、她的学校名称、她的学区名称以及她所在学区的学校数量。Mysql COUNT()是否需要分组依据?,mysql,sql,Mysql,Sql,以下查询旨在返回学生姓名、她的学校名称、她的学区名称以及她所在学区的学校数量。按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 school
按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;
MySQL对GROUPBY子句很宽容 但根据ANSI SQL的定义,这种做法是错误的。 如果您考虑迁移到其他DBMS,如Oracle、PostgresQL。。。put GROUP BY子句及其列
此外,当tou使用它时,更容易理解。MySQL对GROUPBY子句很宽容 但根据ANSI SQL的定义,这种做法是错误的。 如果您考虑迁移到其他DBMS,如Oracle、PostgresQL。。。put GROUP BY子句及其列
此外,当您使用时,更容易理解。假设您有下表:
+----+-----+-----------+
| 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;
我们在groupby中包含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
记录的不同分组,正如我们所期望的那样
如果地球上的每个RDBMS都在组中省略了f1
或f3
,那么除了MySQL之外,将抛出一个错误。非MySQL数据库要求您明确说明如何汇总字段,并且必须将字段分组到GROUP BY
中,或者使用SELECT
中的公式进行聚合
如果在MySQL中,您省略了分组依据
:
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
或如果要使用
选择中的函数进行聚合,那么代码可移植性和意外结果的最佳选择就是包含分组依据。否则你会得到你应得的。假设你有下表:
+----+-----+-----------+
| 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;
我们在groupby中包含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
记录的不同分组,正如我们所期望的那样
如果地球上的每个RDBMS都在组中省略了f1
或f3
,那么除了MySQL之外,将抛出一个错误。非MySQL数据库要求您明确说明如何汇总字段,并且必须将字段分组到GROUP BY
中,或者使用SELECT
中的公式进行聚合
如果在MySQL中,您省略了分组依据
:
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所做的就是抓住它在表中遇到的第一个值并将其吐出来。如果满足以下条件,此行为可能有意义:
您不太关心MySQL从f3
或
您依赖MySQL的存储引擎来维护记录的顺序,这使您成为一个傻瓜。不要那样做李>
如果要使用选择中的函数进行聚合,那么代码可移植性和意外结果的最佳选择就是包含分组依据。否则,您将得到应得的。常规GROUP BY规则:“如果指定了GROUP BY子句,则SELECT列表中的每个列引用必须标识一个分组列或是一个集合函数的参数。”如果您违反此规则,较旧的MySQL版本会以某种不可预测的方式以不同的方式进行操作。但是,较新的MySQL版本会出现错误。用所有虚假的列名回答这个问题非常困难,而且不知道您试图用查询实现什么。@jarlh啊,所以用我的数据,它“可能”只要每个记录都包含组列,就生成结果?@user2278120我正在尝试返回没有左连接的记录,并且返回次数t2
也链接到t3
@user1032531,我不知道,我从来没有违反过这个规则!常规GROUP BY规则:“如果指定了GROUP BY子句,则SELECT列表中的每个列引用必须标识一个分组列或是一个set函数的参数。”如果您违反此规则,则较旧的MySQL版本会以某种不可预测的方式以不同的方式进行操作。但是,较新的MySQL版本会出现错误。用所有虚假的列名回答这个问题非常困难,而且不知道您试图用查询实现什么。@jarlh啊,所以用我的数据,它“可能”只要每个记录都包含组列,就生成结果?@user2278120我正在尝试返回没有左连接的记录,并且返回次数t2
也链接到t3
@user1032531,我不知道,我从来没有违反过这个规则!谢谢牧师。如果我理解您的意思,MySQL可能不一定需要它,但它应该用于其他数据库,以提高可读性。@user1032531和较新的MySQL版本需要GROUP BY子句。(也许有向后兼容模式?)谢谢牧师。如果我理解您的意思,MySQL可能不一定需要它,但它应该用于其他数据库,以提高可读性。@user1032531和较新的MySQL版本需要组B