• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

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

    发布者: 怀卉 | 发布时间: 2025-6-17 14:14| 查看数: 28| 评论数: 0|帖子模式

    前言

    在数据库操作中,
    1. GROUP BY
    复制代码
    分组查询和联合查询是非常强大且常用的功能,它们能够帮助我们从大量数据中提取有价值的信息。本文将深入探讨这两种查询方式,并结合具体示例进行详细讲解。

    1. GROUP BY分组查询


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

    1.2 示例说明

    假设有如下所示的
    1. 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`
    复制代码
    在这个查询中,我们使用
    1. GROUP BY
    复制代码
    将数据按照
    1. group
    复制代码
    列进行分组,然后使用
    1. 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` ='哥哥组'
    复制代码
    这里同样使用
    1. GROUP BY
    复制代码
    进行分组,不过在
    1. SUM
    复制代码
    函数中计算了每个学生的所有科目成绩总和。
    1. HAVING
    复制代码
    子句用于筛选出
    1. group
    复制代码
    1. 哥哥组
    复制代码
    的记录。执行结果如下:

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

    2. 联合查询

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

    2.1 内连接

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

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

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

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


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


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


    • 精简列名得到最终想要查询的列:最后,可以根据需求选择需要显示的列,精简结果集。例如:
    1. SELECT    qintianpeople.people_id,    people_name,    commodity_nameFROM    qintianpeople,    qintiancommodityWHERE    qintianpeople.people_id = qintiancommodity.people_id AND    qintianpeople.people_id>5
    复制代码
    这个查询只选择了
    1. people_id
    复制代码
    1. people_name
    复制代码
    1. commodity_name
    复制代码
    这几列,得到了更精简的结果。执行结果如下:


    2.2 外连接

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

    2.2.1 左外连接

    语法格式
    1. Select * from table1 left join table2 on table1.xx=table2.xx;
    复制代码
    左外连接以左表为基准,左边的数据全部显示,右边的数据没有对应记录的显示为
    1. 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;
    复制代码
    右外连接以右表为基准,右边的数据全部显示,左边的数据没有对应记录的显示为
    1. 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 自连接

    自连接是指在同一个表上进行连接操作,它可以把行比较转化为列比较,在查询时可以使用
    1. 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...);
    复制代码
    例如,假设有
    1. customers
    复制代码
    表和
    1. orders
    复制代码
    表,我们想要查询下了订单的客户信息,可以使用如下子查询:
    1. SELECT *
    2. FROM customers
    3. WHERE customer_id IN (SELECT DISTINCT customer_id FROM orders);
    复制代码
    这个子查询先从
    1. orders
    复制代码
    表中获取所有下过订单的
    1. customer_id
    复制代码
    ,然后外层查询从
    1. customers
    复制代码
    表中查询这些
    1. customer_id
    复制代码
    对应的客户信息。

    2.4.2 多行子查询

    语法格式
    1. Select * from table1 where id in (select id from table2 where...);
    复制代码
    多行子查询与单行子查询类似,不过它返回的是多个值,使用
    1. IN
    复制代码
    关键字来匹配这些值。例如:
    1. SELECT *
    2. FROM products
    3. WHERE product_id IN (SELECT product_id FROM order_items WHERE quantity > 10);
    复制代码
    这个查询会返回在
    1. 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. );
    复制代码
    这个嵌套子查询首先筛选出亚洲地区的客户
    1. customer_id
    复制代码
    ,然后在这些客户中筛选出在2023年1月1日之后下过订单的客户
    1. customer_id
    复制代码
    ,最后查询出这些客户的详细信息。

    2.5 合并查询

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

    2.5.1 显示去重

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

    2.5.2 不显示去重

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

    2.6 一条SQL语句的执行顺序

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

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

    总结

    到此这篇关于SQL中的分组查询与联合查询举例详解的文章就介绍到这了,更多相关SQL分组查询与联合查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    来源:https://www.jb51.net/database/335130p4x.htm
    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

    本帖子中包含更多资源

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

    ×

    最新评论

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表