【SQL 中的分组查询与联合查询详解】

张裕  金牌会员 | 2025-2-13 03:51:53 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 670|帖子 670|积分 2010

SQL 中的分组查询与联合查询详解

在数据库操纵中,GROUP BY分组查询和联合查询黑白常强大且常用的功能,它们能够资助我们从大量数据中提取有价值的信息。本文将深入探讨这两种查询方式,并联合详细示例进行详细解说。
1. GROUP BY分组查询

1.1 语句格式

GROUP BY语句的根本格式如下:
  1. SELECT
  2.     分组列的列名,
  3.     除分组列的列名之外只能使用聚合函数
  4. FROM
  5.     查询表的表名
  6. GROUP BY
  7.     分组列的列名
  8. HAVING
  9.     HAVING子句:对GROUP BY的结果进行过滤(只能和GROUP BY一起使用)
复制代码
在这个语句中,SELECT关键字用于指定要查询的列,此中除了分组列之外,其他列必须使用聚合函数(如SUM、AVG、COUNT等)。FROM关键字指定要查询的表。GROUP BY关键字用于指定按照哪一列进行分组。HAVING子句则用于对分组后的结果进行进一步的筛选。
1.2 示例说明

假设有如下所示的exam表:

1.2.1 分别查询哥哥组和弟弟组的英语成绩总和

  1. SELECT
  2.     exam.`group`,
  3.     SUM(exam.english)
  4. FROM
  5.     exam AS exam
  6. GROUP BY
  7.     exam.`group`
复制代码
在这个查询中,我们使用GROUP BY将数据按照group列进行分组,然后使用SUM聚合函数计算每个组的英语成绩总和。实行结果如下:

1.2.2 查询哥哥组的所有成绩总和

  1. SELECT
  2.     exam.`group`,
  3.     SUM( exam.english +exam.chinese+exam.math)
  4. FROM
  5.     exam AS exam
  6. GROUP BY
  7.     exam.`group`
  8. HAVING
  9.     exam.`group` ='哥哥组'
复制代码
这里同样使用GROUP BY进行分组,不过在SUM函数中计算了每个学生的所有科目成绩总和。HAVING子句用于筛选出group为哥哥组的记录。实行结果如下:

通过这两个示例,我们可以看到GROUP BY分组查询在对数据进行分类统计时的强大功能。它能够根据指定的列将数据分组,并对每个组的数据进行聚合计算,从而得到我们须要的统计信息。
2. 联合查询

联合查询用于将多个查询结果合并在一起,常见的联合查询包括内连接、外连接、自连接、子查询和合并查询等。下面我们将逐一先容这些联合查询的用法。
2.1 内连接

内连接是一种最常用的连接方式,它返回两个表中满意连接条件的所有行。
2.1.1 语法格式

  1. select * from table1,table2 where table1.xx=table2.xx;
复制代码
这是一种基于逗号分隔的表名和WHERE子句指定连接条件的写法。更标准的写法是使用JOIN关键字:
  1. SELECT *
  2. FROM table1
  3. JOIN table2 ON table1.xx = table2.xx;
复制代码
2.1.2 实行过程

内连接的实行过程可以分为以下几个步调:

  • 计算笛卡尔积:首先计算参加表连接的两个表的笛卡尔积。比方,假设有qintianpeople表和qintiancommodity表,实行以下查询:
  1. SELECT
  2.     *
  3. FROM
  4.     qintianpeople,
  5.     qintiancommodity
复制代码
结果会得到两个表的笛卡尔积,即qintianpeople表中的每一行与qintiancommodity表中的每一行进行组合,结果集的行数为两个表行数的乘积。实行结果如下:


  • 通过连接条件过滤无效数据:在笛卡尔积的基础上,通过连接条件过滤掉不满意条件的数据。比方:
  1. SELECT
  2.     *
  3. FROM
  4.     qintianpeople,
  5.     qintiancommodity
  6. WHERE    qintianpeople.people_id = qintiancommodity.people_id
复制代码
这里使用WHERE子句指定了连接条件,只有people_id相称的行才会被保留。实行结果如下:


  • 加入查询条件得到想要的结果行:可以进一步添加查询条件来筛选出符合特定要求的行。比方:
  1. SELECT
  2.     *
  3. FROM
  4.     qintianpeople,
  5.     qintiancommodity
  6. WHERE    qintianpeople.people_id = qintiancommodity.people_id AND    qintianpeople.people_id>5
复制代码
这里在连接条件的基础上,添加了qintianpeople.people_id>5的条件,进一步筛选出符合条件的行。实行结果如下:


  • 精简列名得到终极想要查询的列:最后,可以根据需求选择须要显示的列,精简结果集。比方:
  1. SELECT
  2.     qintianpeople.people_id,
  3.     people_name,
  4.     commodity_name
  5. FROM
  6.     qintianpeople,
  7.     qintiancommodity
  8. WHERE
  9.     qintianpeople.people_id = qintiancommodity.people_id AND
  10.     qintianpeople.people_id>5
复制代码
这个查询只选择了people_id、people_name和commodity_name这几列,得到了更精简的结果。实行结果如下:

2.2 外连接

外连接分为左外连接和右外连接,它们的区别在于以哪个表为基准进行连接。
2.2.1 左外连接

语法格式
  1. Select * from table1 left join table2 on table1.xx=table2.xx;
复制代码
左外连接以左表为基准,左边的数据全部显示,右边的数据没有对应记录的显示为NULL。比方:
  1. SELECT
  2.     qintianpeople.people_id,
  3.     people_name,
  4.     commodity_name
  5. FROM
  6.     qintiancommodity
  7.     LEFT JOIN
  8.     qintianpeople
  9.     ON
  10.         qintiancommodity.people_id = qintianpeople.people_id
复制代码
实行结果如下:

2.2.2 右外连接

语法格式
  1. Select * from table1 right join table2 on table1.xx=table2.xx;
复制代码
右外连接以右表为基准,右边的数据全部显示,左边的数据没有对应记录的显示为NULL。比方:
  1. SELECT
  2.     qintianpeople.people_id,
  3.     people_name,
  4.     commodity_name
  5. FROM
  6.     qintiancommodity
  7.     RIGHT JOIN
  8.     qintianpeople
  9.     ON
  10.         qintiancommodity.people_id = qintianpeople.people_id
复制代码
实行结果如下:

2.3 自连接

自连接是指在同一个表上进行连接操纵,它可以把行比较转化为列比较,在查询时可以使用WHERE进行过滤。
语法格式
  1. select * from table1 t1,table1 t2 where t1.xx=t2.xx;
复制代码
2.4 子查询

子查询是指在一个查询中嵌套另一个查询,将内层查询的结果作为外层查询的条件。子查询可以分为单行子查询和多行子查询。
2.4.1 单行子查询

语法格式
  1. Select * from table1 where id=(select id from table2 where...);
复制代码
比方,假设有customers表和orders表,我们想要查询下了订单的客户信息,可以使用如下子查询:
  1. SELECT *
  2. FROM customers
  3. WHERE customer_id IN (SELECT DISTINCT customer_id FROM orders);
复制代码
这个子查询先从orders表中获取所有下过订单的customer_id,然后外层查询从customers表中查询这些customer_id对应的客户信息。
2.4.2 多行子查询

语法格式
  1. Select * from table1 where id in (select id from table2 where...);
复制代码
多行子查询与单行子查询类似,不过它返回的是多个值,使用IN关键字来匹配这些值。比方:
  1. SELECT *
  2. FROM products
  3. WHERE product_id IN (SELECT product_id FROM order_items WHERE quantity > 10);
复制代码
这个查询会返回在order_items表中被订购数量大于10的所有产品信息。
子查询可以多次嵌套,以实现更复杂的查询逻辑。比方:
  1. SELECT *
  2. FROM customers
  3. WHERE customer_id IN (
  4.     SELECT customer_id
  5.     FROM orders
  6.     WHERE order_date > '2023-01-01' AND customer_id IN (
  7.         SELECT customer_id
  8.         FROM customers
  9.         WHERE region = 'Asia'
  10.     )
  11. );
复制代码
这个嵌套子查询首先筛选出亚洲地区的客户customer_id,然后在这些客户中筛选出在2023年1月1日之后下过订单的客户customer_id,最后查询出这些客户的详细信息。
2.5 合并查询

合并查询用于将两个或多个查询的结果合并到一个结果会合,分为去重合并和不去重合并。
2.5.1 显示去重

语法格式
  1. select * from table1 union select * from table2;
复制代码
UNION关键字会将两个查询结果合并,并去除重复的行。
2.5.2 不显示去重

语法格式
  1. select * from table1 union all select * from table2;
复制代码
UNION ALL关键字会将两个查询结果直接合并,保留所有的行,包括重复的行。
2.6 一条SQL语句的实行顺序

了解一条SQL语句的实行顺序对于编写高效准确的查询非常紧张。SQL语句的实行顺序如下:

  • FROM:指定须要查询的表。
  • JOIN ON:取笛卡尔积并根据连接条件进行连接。
  • WHERE:使用限制条件过滤数据。
  • GROUP BY:对数据进行分组查询。
  • HAVING:对分组后的结果进行过滤。
  • SELECT:筛选须要显示的列。
  • DISTINCT:对结果进行去重(假如有该关键字)。
  • ORDER BY:对结果进行排序。
  • LIMIT:限制返回的行数。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张裕

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表