在 SQL 中,连接(JOIN)、分组(GROUP BY) 和 聚合函数(Aggregate Functions) 是处理复杂查询的核心功能。以下是对这些功能的详细说明和示例:
1. 连接(JOIN)连接用于从多个表中组合数据。常见的连接类型包括:
【INNER JOIN】返回两个表中匹配的记录。 示例:sqlSELECT users.name, orders.amount FROM users INNER JOIN orders ON users.id = orders.user_id;
【LEFT JOIN】返回左表中的所有记录,即使右表中没有匹配的记录。 示例:sqlSELECT users.name, orders.amount FROM users LEFT JOIN orders ON users.id = orders.user_id;
【RIGHT JOIN】返回右表中的所有记录,即使左表中没有匹配的记录。 示例:sqlSELECT users.name, orders.amount FROM users RIGHT JOIN orders ON users.id = orders.user_id;
【FULL OUTER JOIN】返回两个表中的所有记录(MySQL 不支持,可用 `UNION` 替代)。 示例:sqlSELECT users.name, orders.amount FROM users FULL OUTER JOIN orders ON users.id = orders.user_id;
【CROSS JOIN】返回两个表的笛卡尔积(所有可能的组合)。 示例:sqlSELECT users.name, orders.amount FROM users CROSS JOIN orders;
2. 分组(GROUP BY)分组用于将数据按某列或某些列的值进行分组,通常与聚合函数一起使用。
基本语法sqlSELECT column1, column2, aggregate_function(column3)FROM tableGROUP BY column1, column2;
示例sqlSELECT department, COUNT(*) AS employee_count FROM employees GROUP BY department;
3. 聚合函数(Aggregate Functions)聚合函数用于对一组值进行计算并返回单个值。常见的聚合函数包括:
【COUNT】统计行数。 示例:sqlSELECT COUNT(*) FROM users;
【SUM】计算某列的总和。 示例:sqlSELECT SUM(amount) FROM orders;
【AVG】计算某列的平均值。 示例:sqlSELECT AVG(age) FROM users;
【MIN】查找某列的最小值。 示例:sqlSELECT MIN(age) FROM users;
【MAX】查找某列的最大值。 示例:sqlSELECT MAX(age) FROM users;
4. 分组与聚合函数的结合使用分组和聚合函数通常一起使用,以对分组后的数据进行统计。
示例 1:按部门统计员工数量sqlSELECT department, COUNT(*) AS employee_count FROM employees GROUP BY department;
示例 2:按部门统计平均工资sqlSELECT department, AVG(salary) AS avg_salary FROM employees GROUP BY department;
示例 3:按部门统计最高和最低工资sqlSELECT department, MAX(salary) AS max_salary, MIN(salary) AS min_salary FROM employees GROUP BY department;
5. 分组后的过滤(HAVING)`HAVING` 用于对分组后的结果进行过滤,类似于 `WHERE`,但用于分组后的数据。
示例:筛选出员工数量大于 10 的部门sqlSELECT department, COUNT(*) AS employee_count FROM employees GROUP BY department HAVING COUNT(*) > 10;
6. 连接、分组和聚合函数的综合应用在实际查询中,连接、分组和聚合函数可以结合使用,以处理复杂的业务逻辑。
示例:统计每个用户的订单总金额sqlSELECT users.name, SUM(orders.amount) AS total_amount FROM users INNER JOIN orders ON users.id = orders.user_id GROUP BY users.name;
示例:统计每个部门的平均工资,并筛选出平均工资大于 5000 的部门sqlSELECT department, AVG(salary) AS avg_salary FROM employees GROUP BY department HAVING AVG(salary) > 5000;
总结- 连接(JOIN):用于从多个表中组合数据。- 分组(GROUP BY):用于将数据按某列或某些列的值进行分组。- 聚合函数:用于对一组值进行计算并返回单个值。- HAVING:用于对分组后的结果进行过滤。
掌握这些功能可以帮助你编写复杂的 SQL 查询,从而更好地完成数据分析和验证任务。