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;
该查询语句的执行顺序如下:
-
执行
FROM
子句,从employees
表中获取所有员工记录。 -
执行
WHERE
子句,筛选出满足条件salary > 4000
的记录。 -
执行
GROUP BY
子句,将筛选后的结果按照department_id
列进行分组。 -
执行
COUNT(employee_id)
聚合函数,对每个分组计算employee_id
列的非空值数量(即每个部门的员工数量)。 -
执行
SELECT
子句,选择department_id
和COUNT(employee_id)
两列作为输出结果。 -
将聚合后的结果按照
department_id
列排序,并返回给客户端。
总之,在执行这条查询语句时,SQL 引擎会按照以上步骤逐步处理,最终返回符合条件的部门编号和该部门的员工数量。
having
having 筛选分组的结果,跟 select 的聚合函数配合使用
distinct
DISTINCT 是 SQL 查询语言中用于去除重复行的关键字。它通常与 SELECT 语句一起使用,用于返回唯一的、不重复的结果集。
在 SELECT 语句中使用 DISTINCT 关键字时,它会应用到指定的列或表达式上,以消除重复的值。
以下是一些示例,展示了 DISTINCT
在不同条件下的使用:
-
返回唯一的城市列表:
SELECT DISTINCT city FROM customers;
这个查询将从 customers 表中选择唯一的城市列表。如果有多个顾客位于同一个城市,只会返回该城市一次。
-
返回唯一的产品类别和数量:
SELECT DISTINCT category, COUNT(*) AS count FROM products GROUP BY category;
这个查询将从 products 表中选择唯一的产品类别,并对每个类别计算数量。DISTINCT 关键字确保每个产品类别只出现一次。
该语句将返回指定列组合中的唯一组合以及每个组合对应的聚合函数结果。
SELECT DISTINCT column1, COUNT(column2) FROM table_name GROUP BY column1;
-
返回具有唯一组合的多个列:
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
的唯一值。其他列 column1
和 column3
不会受到 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;
-
首先,我们选择了两个列:
student.Name
和course.Name
。使用点号语法来指定列所属的表,即student
表和course
表。 -
接下来,我们指定了三个表进行连接操作:
sc
、student
和course
。通过使用多个 JOIN 语句,将这些表按照指定的连接条件连接起来。 -
第一个 JOIN 语句中,我们通过
ON
关键字指定了连接条件student.ID = sc.SID
,即student
表的ID
列与sc
表的SID
列相等。 -
第二个 JOIN 语句中,我们通过
ON
关键字指定了连接条件sc.CID = course.ID
,即sc
表的CID
列与course
表的ID
列相等。 -
在
SELECT
子句中,我们使用了别名考试科目
来表示course.Name
列。 -
最后,在
WHERE
子句中,我们使用条件MidsemesterScore > FinalScore
对连接后的结果进行筛选,只返回满足条件的行。
通过这个查询,我们可以获取到在某门考试中,期中成绩高于期末成绩的学生姓名和考试科目。请注意,这只是一个示例查询,你需要根据实际的表结构和数据来进行相应的调整。
特征
JOIN
是 MySQL 中常用的连接表的方式,通常不需要对 JOIN
进行细分。
在 MySQL 中,JOIN
子句用于将两个或多个表连接在一起,以便在这些表之间共享数据。JOIN
子句包括 INNER JOIN
、LEFT JOIN
、RIGHT JOIN
、FULL OUTER JOIN
等关键字,这些关键字用于指定不同类型的连接。
以下是一些常见的连接类型:
-
INNER JOIN
:也称为等值连接,它只返回两个表中匹配的行。 -
LEFT JOIN
:返回左侧表中的所有行,以及右侧表中与左侧表匹配的行。如果右侧表中没有匹配的行,则返回NULL
值。 -
RIGHT JOIN
:返回右侧表中的所有行,以及左侧表中与右侧表匹配的行。如果左侧表中没有匹配的行,则返回NULL
值。 -
FULL OUTER JOIN
:返回左侧表和右侧表中的所有行,并将它们合并在一起。如果某个表中没有匹配的行,则返回NULL
值。
在实践中,INNER JOIN
和 LEFT JOIN
最常用,因为它们已经能够满足大多数查询需求了。但是,当你需要特定的连接类型时,MySQL 提供了各种 JOIN
子句来满足你的需求。
请注意,无论使用哪种连接类型,都需要指定连接条件,以便将两个表之间的行进行匹配。连接条件通常是两个表之间的关联键。
标签:GROUP,JOIN,DISTINCT,MySQL,子句,Group,id,SELECT From: https://blog.csdn.net/yumiao0220/article/details/137011844