Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql COUNT()是否需要分组依据?_Mysql_Sql - Fatal编程技术网

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所做的就是抓住它在表中遇到的第一个值并将其吐出来。如果满足以下条件,此行为可能有意义:

  • 您不太关心MySQL从
    f3
  • 您依赖MySQL的存储引擎来维护记录的顺序,这使您成为一个傻瓜。不要那样做
    如果要使用
    选择中的函数进行聚合,那么代码可移植性和意外结果的最佳选择就是包含
    分组依据。否则你会得到你应得的。

    假设你有下表:

    +----+-----+-----------+
    | 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