首页 > 数据库 >MySQL的Group by

MySQL的Group by

时间:2024-03-25 14:02:32浏览次数:41  
标签:GROUP JOIN DISTINCT MySQL 子句 Group id SELECT

Group by

在 SQL 中,使用 GROUP BY 子句对查询结果进行分组,并将结果按照指定的列进行聚合。在使用 GROUP BY 时,查询语句中必须包含 GROUP BY 子句,并且 SELECT 子句中只能包含被分组的列和聚合函数

在使用 GROUP BY 子句进行分组时,SELECT 语句中的每个列都必须是分组键或聚合函数。

换句话说,如果你使用了 GROUP BY 子句,那么 SELECT 子句中必须要包含被分组的列以及至少一个聚合函数。这是因为 GROUP BY 的主要作用是将多条记录合并为一条记录,并对分组后的每个组应用一个聚合函数,计算出每个组的统计值。

例如,以下查询语句使用 GROUP BY 对 orders 表中的订单按照客户 ID 进行分组,并计算每个客户的订单总金额:

SELECT customer_id, SUM(amount) 
FROM orders 
GROUP BY customer_id;

以上查询语句中,SELECT 子句中包含了被分组的列 customer_id 和聚合函数 SUM(amount),同时 GROUP BY 子句指定了按照 customer_id 列进行分组,因此可以正确地计算每个客户的订单总金额。

总之,如果你使用了 GROUP BY 子句,则 SELECT 子句中必须包含被分组的列和至少一个聚合函数,否则查询语句会抛出语法错误。

默认排序

在 MySQL 中,如果你使用 GROUP BY 子句对查询结果进行分组聚合,MySQL 会自动按照 GROUP BY 子句中指定的列排序。这是因为在分组操作完成后,MySQL 需要将结果集按照分组的顺序返回,以保证结果的正确性。因此,即使没有显式使用 ORDER BY 子句,MySQL 也会默认对分组后的结果进行排序。

以下是一个例子,假设你有一个名为 employees 的表,其中包含 employee_id、department_id 和 salary 三列数据,你想按照部门对薪资进行求和,并且只返回部门薪资总和大于10000的记录:

SELECT department_id, SUM(salary) AS total_salary
FROM employees
GROUP BY department_id
HAVING total_salary > 10000;

在这个查询语句中,使用了 GROUP BY 子句对 department_id 进行分组,并使用了 SUM 函数计算每个部门的总薪资。此外,还使用了 HAVING 子句来筛选出部门薪资总和大于10000的记录。

尽管没有显式使用 ORDER BY 子句,但是 MySQL 会默认按照 GROUP BY 子句中指定的 department_id 列进行排序,以确保结果集按照部门 ID 的升序排列。

需要注意的是,默认的排序方式可能会导致结果不符合你的预期。如果你需要更加精确的排序方式,建议使用 ORDER BY 子句显式指定排序规则。

语句执行顺序

以下是你提供的 SQL 查询语句:

SELECT department_id, COUNT(employee_id) 
FROM employees 
WHERE salary > 4000 
GROUP BY department_id;

该查询语句的执行顺序如下:

  1. 执行 FROM 子句,从 employees 表中获取所有员工记录。

  2. 执行 WHERE 子句,筛选出满足条件 salary > 4000 的记录。

  3. 执行 GROUP BY 子句,将筛选后的结果按照 department_id 列进行分组。

  4. 执行 COUNT(employee_id) 聚合函数,对每个分组计算 employee_id 列的非空值数量(即每个部门的员工数量)。

  5. 执行 SELECT 子句,选择 department_idCOUNT(employee_id) 两列作为输出结果。

  6. 将聚合后的结果按照 department_id 列排序,并返回给客户端。

总之,在执行这条查询语句时,SQL 引擎会按照以上步骤逐步处理,最终返回符合条件的部门编号和该部门的员工数量。

having

having 筛选分组的结果,跟 select 的聚合函数配合使用

distinct

DISTINCT 是 SQL 查询语言中用于去除重复行的关键字。它通常与 SELECT 语句一起使用,用于返回唯一的、不重复的结果集。

在 SELECT 语句中使用 DISTINCT 关键字时,它会应用到指定的列或表达式上,以消除重复的值。

以下是一些示例,展示了 DISTINCT 在不同条件下的使用:

  1. 返回唯一的城市列表:

SELECT DISTINCT city FROM customers;

这个查询将从 customers 表中选择唯一的城市列表。如果有多个顾客位于同一个城市,只会返回该城市一次。

  1. 返回唯一的产品类别和数量:

SELECT DISTINCT category, COUNT(*) AS count FROM products GROUP BY category;

这个查询将从 products 表中选择唯一的产品类别,并对每个类别计算数量。DISTINCT 关键字确保每个产品类别只出现一次。

该语句将返回指定列组合中的唯一组合以及每个组合对应的聚合函数结果。

SELECT DISTINCT column1, COUNT(column2)
FROM table_name
GROUP BY column1;
  1. 返回具有唯一组合的多个列:

SELECT DISTINCT column1, column2 FROM table;

这个查询将从表中选择具有唯一组合的 column1 和 column2。只有当 column1 和 column2 的组合在表中是唯一的时候,才会返回该行。

需要注意的是,

  • DISTINCT 关键字只对出现在 SELECT 关键字之后的列起作用,并且它是应用于整个结果集的。

  • DISTINCT 关键字应用于所有列,而不仅仅是指定的列。它将考虑所有 SELECT 语句中列的组合,以确定唯一性。如果需要特定列的唯一值,应该将 DISTINCT 关键字应用于这些列。

  • 在使用 DISTINCT 进行去重时,要考虑所选择的列及其组合是否符合预期,以确保查询结果满足需求。

另外,使用 DISTINCT 可能会增加查询的执行时间,因为数据库系统需要进行额外的去重操作。在处理大量数据或复杂查询时,要谨慎使用 DISTINCT,以避免性能问题。

特殊(不确定有效)

在 SQL 查询中,DISTINCT 关键字通常是作为查询语句的开头使用,用于消除查询结果中的重复行。然而,在某些情况下,你也可以在 SELECT 关键字之后的列中间使用 DISTINCT 关键字。

以下是一个示例,展示了在 SELECT 语句的列中间使用 DISTINCT 关键字的情况:

SELECT column1, DISTINCT(column2), column3
FROM table_name;

在上述查询中,DISTINCT 关键字被应用于 column2 这一列,用于确保返回结果集中 column2 的唯一值。其他列 column1column3 不会受到 DISTINCT 关键字的影响,它们将返回所有匹配的行。

需要注意的是,这种在列中间使用 DISTINCT 关键字的语法在大多数常见的 SQL 数据库中并不支持。DISTINCT 关键字通常只能用于整个 SELECT 语句的开头部分,用于对整个结果集进行去重操作。如果在其他位置使用 DISTINCT 关键字,则可能会导致语法错误或不符合预期的结果。因此,我建议在编写查询时始终将 DISTINCT 关键字放置在 SELECT 语句的开头。

join

这是一个使用 JOIN 进行表连接操作的示例查询。让我们逐步分析这个查询的语法和功能:

SELECT student.`Name`, course.`Name` AS '考试科目'
FROM sc
JOIN student ON student.ID = sc.SID
JOIN course ON sc.CID = course.ID
WHERE MidsemesterScore > FinalScore;
  1. 首先,我们选择了两个列:student.Namecourse.Name。使用点号语法来指定列所属的表,即 student 表和 course 表。

  2. 接下来,我们指定了三个表进行连接操作:scstudentcourse。通过使用多个 JOIN 语句,将这些表按照指定的连接条件连接起来。

  3. 第一个 JOIN 语句中,我们通过 ON 关键字指定了连接条件 student.ID = sc.SID,即 student 表的 ID 列与 sc 表的 SID 列相等。

  4. 第二个 JOIN 语句中,我们通过 ON 关键字指定了连接条件 sc.CID = course.ID,即 sc 表的 CID 列与 course 表的 ID 列相等。

  5. SELECT 子句中,我们使用了别名 考试科目 来表示 course.Name 列。

  6. 最后,在 WHERE 子句中,我们使用条件 MidsemesterScore > FinalScore 对连接后的结果进行筛选,只返回满足条件的行。

通过这个查询,我们可以获取到在某门考试中,期中成绩高于期末成绩的学生姓名和考试科目。请注意,这只是一个示例查询,你需要根据实际的表结构和数据来进行相应的调整。

特征

JOIN 是 MySQL 中常用的连接表的方式,通常不需要对 JOIN 进行细分。

在 MySQL 中,JOIN 子句用于将两个或多个表连接在一起,以便在这些表之间共享数据。JOIN 子句包括 INNER JOINLEFT JOINRIGHT JOINFULL OUTER JOIN 等关键字,这些关键字用于指定不同类型的连接。

以下是一些常见的连接类型:

  • INNER JOIN:也称为等值连接,它只返回两个表中匹配的行。

  • LEFT JOIN:返回左侧表中的所有行,以及右侧表中与左侧表匹配的行。如果右侧表中没有匹配的行,则返回 NULL 值。

  • RIGHT JOIN:返回右侧表中的所有行,以及左侧表中与右侧表匹配的行。如果左侧表中没有匹配的行,则返回 NULL 值。

  • FULL OUTER JOIN:返回左侧表和右侧表中的所有行,并将它们合并在一起。如果某个表中没有匹配的行,则返回 NULL 值。

在实践中,INNER JOINLEFT JOIN 最常用,因为它们已经能够满足大多数查询需求了。但是,当你需要特定的连接类型时,MySQL 提供了各种 JOIN 子句来满足你的需求。

请注意,无论使用哪种连接类型,都需要指定连接条件,以便将两个表之间的行进行匹配。连接条件通常是两个表之间的关联键。

标签:GROUP,JOIN,DISTINCT,MySQL,子句,Group,id,SELECT
From: https://blog.csdn.net/yumiao0220/article/details/137011844

相关文章

  • MySQL的多表查询
    多表查询给表起别名后,只能用别名表示表,不能用原名连接JOIN是MySQL中常用的连接表的方式,通常不需要对JOIN进行细分。"JOIN"关键字在SQL查询中通常用来表示内连接(InnerJoin)。在MySQL中,JOIN子句用于将两个或多个表连接在一起,以便在这些表之间共享数据。JOIN......
  • MySQL学习必备SQL_DDL_DQL
    1.学生表CREATETABLE`student`(`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'学号',`createDate`datetimeDEFAULTNULL,`userName`varchar(20)DEFAULTNULL,`pwd`varchar(36)DEFAULTNULL,`phone`varchar(11)DEFAULTNULL,`age`tinyin......
  • Java项目:小程序公交信息在线查询系统(java+SSM+Vue+ElementUI+mysql)
    源码获取:俺的博客首页"资源"里下载! 项目介绍基于SSM+Vue的小程序公交信息在线查询系统小程序角色:管理员、用户两种角色,分为小程序端和后台管理两部分;用户:用户通过小程序登录页面可以填写用户名和密码等信息进行登录操作,登录成功后,进入首页可以查看首页、线路信息、站......
  • MySQL 学习必备SQL_DDL_DML_DQL
    mySQL创建数据库需要自行创建,数据库名称可以为【schoolDB】,字符集【utf8】,排列规则【utf8_general_ci】,21、学生表DDLCREATETABLE`student`(`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'学号',`creatDate`datetimeDEFAULTNULL,`userName`varchar(20)D......
  • Java项目:小程序公交信息在线查询系统(java+SSM+Vue+ElementUI+mysql)
    源码获取:俺的博客首页"资源"里下载! 项目介绍基于SSM+Vue的小程序公交信息在线查询系统小程序角色:管理员、用户两种角色,分为小程序端和后台管理两部分;用户:用户通过小程序登录页面可以填写用户名和密码等信息进行登录操作,登录成功后,进入首页可以查看首页、线路信息、站......
  • Java项目:汽车租赁管理系统(java+SpringBoot+Vue+ElementUI+Mybaits+mysql)
    源码获取:俺的博客首页"资源"里下载! 项目介绍基于SpringbootVue汽车租赁管理系统角色:管理员、用户、普通管理员三种角色,分为前后台;用户:用户通过用户登录页面可以填写用户名和密码等信息进行登录操作,登录成功后,进入首页可以查看首页、汽车信息、汽车资讯、汽车论坛、公......
  • MySQL学习必备SQL_DDL_DML_DQL
    MySQL创建数据库需要自行创建,数据库名称可以为【schoolDB】,字符集【utf-8】,排序规则【utf8_general_ci】。1、学习表DDLCREATETABLE`student`(`id`int(11)NOTNULLAUTO_INCREMENT,`createDate`datetimeDEFAULTNULL,`userName`varchar(20)DEFAULTNULL,......
  • MySQL学习必备
    1.学生表DDLCREATETABLE`student`(`id`int(11)NOTNULLAUTO_INCREMENT,`createDate`datetimeDEFAULTNULL,`userName`varchar(20)DEFAULTNULL,`pwd`varchar(36)DEFAULTNULL,`phone`varchar(11)DEFAULTNULL,`age`tinyint(3)DEFAULTNULL,......
  • MySQL学习必备SQL_DDL_DML_DQL
    MySQL创建数据库需要自行创建,数据库名称可以为【schoolDB】,字符集【utf8】,排序规则【utf8_general_ci】1、学生表DDLCREATETABLE`student`(`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'学号',`createDate`datetimeDEFAULTNULL,`userName`varchar(20)DEF......
  • MySQL学习必备SQL_DDL_DML+DQL
    MySQL创建数据库需要自行创建,数据库名称可以为【schoolDb】,字符集【utf8】,【utf8_general_ci】1.学生表CREATETABLE`student`(`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'学号',`createDate`datetimeDEFAULTNULL,`userName`varchar(20)DEFAULTNULL,......