当前位置: 首页 > news >正文

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

文章目录
  • SQL 中的分组查询与联合查询详解
    • 1. GROUP BY分组查询
      • 1.1 语句格式
      • 1.2 示例说明
        • 1.2.1 分别查询哥哥组和弟弟组的英语成绩总和
        • 1.2.2 查询哥哥组的所有成绩总和
    • 2. 联合查询
      • 2.1 内连接
        • 2.1.1 语法格式
        • 2.1.2 执行过程
      • 2.2 外连接
        • 2.2.1 左外连接
        • 2.2.2 右外连接
      • 2.3 自连接
      • 2.4 子查询
        • 2.4.1 单行子查询
        • 2.4.2 多行子查询
      • 2.5 合并查询
        • 2.5.1 显示去重
        • 2.5.2 不显示去重
      • 2.6 一条SQL语句的执行顺序

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

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

1. GROUP BY分组查询

1.1 语句格式

GROUP BY语句的基本格式如下:

SELECT分组列的列名,除分组列的列名之外只能使用聚合函数
FROM查询表的表名
GROUP BY分组列的列名
HAVINGHAVING子句:对GROUP BY的结果进行过滤(只能和GROUP BY一起使用)

在这个语句中,SELECT关键字用于指定要查询的列,其中除了分组列之外,其他列必须使用聚合函数(如SUMAVGCOUNT等)。FROM关键字指定要查询的表。GROUP BY关键字用于指定按照哪一列进行分组。HAVING子句则用于对分组后的结果进行进一步的筛选。

1.2 示例说明

假设有如下所示的exam表:

1.2.1 分别查询哥哥组和弟弟组的英语成绩总和
SELECTexam.`group`, SUM(exam.english)
FROMexam AS exam
GROUP BYexam.`group`

在这个查询中,我们使用GROUP BY将数据按照group列进行分组,然后使用SUM聚合函数计算每个组的英语成绩总和。执行结果如下:
在这里插入图片描述

1.2.2 查询哥哥组的所有成绩总和
SELECTexam.`group`,SUM( exam.english +exam.chinese+exam.math) 
FROMexam AS exam 
GROUP BYexam.`group` 
HAVINGexam.`group` ='哥哥组'

这里同样使用GROUP BY进行分组,不过在SUM函数中计算了每个学生的所有科目成绩总和。HAVING子句用于筛选出group哥哥组的记录。执行结果如下:
在这里插入图片描述

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

2. 联合查询

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

2.1 内连接

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

2.1.1 语法格式
select * from table1,table2 where table1.xx=table2.xx;

这是一种基于逗号分隔的表名和WHERE子句指定连接条件的写法。更标准的写法是使用JOIN关键字:

SELECT *
FROM table1
JOIN table2 ON table1.xx = table2.xx;
2.1.2 执行过程

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

  1. 计算笛卡尔积:首先计算参加表连接的两个表的笛卡尔积。例如,假设有qintianpeople表和qintiancommodity表,执行以下查询:

    SELECT
    *
    FROM
    qintianpeople,
    qintiancommodity

结果会得到两个表的笛卡尔积,即qintianpeople表中的每一行与qintiancommodity表中的每一行进行组合,结果集的行数为两个表行数的乘积。执行结果如下:

  1. 通过连接条件过滤无效数据:在笛卡尔积的基础上,通过连接条件过滤掉不满足条件的数据。例如:

    SELECT
    *
    FROM
    qintianpeople,
    qintiancommodity
    WHERE
    qintianpeople.people_id = qintiancommodity.people_id

这里使用WHERE子句指定了连接条件,只有people_id相等的行才会被保留。执行结果如下:

  1. 加入查询条件得到想要的结果行:可以进一步添加查询条件来筛选出符合特定要求的行。例如:

    SELECT
    *
    FROM
    qintianpeople,
    qintiancommodity
    WHERE
    qintianpeople.people_id = qintiancommodity.people_id AND
    qintianpeople.people_id>5

这里在连接条件的基础上,添加了qintianpeople.people_id>5的条件,进一步筛选出符合条件的行。执行结果如下:

  1. 精简列名得到最终想要查询的列:最后,可以根据需求选择需要显示的列,精简结果集。例如:

    SELECT
    qintianpeople.people_id,
    people_name,
    commodity_name
    FROM
    qintianpeople,
    qintiancommodity
    WHERE
    qintianpeople.people_id = qintiancommodity.people_id AND
    qintianpeople.people_id>5

这个查询只选择了people_idpeople_namecommodity_name这几列,得到了更精简的结果。执行结果如下:

2.2 外连接

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

2.2.1 左外连接

语法格式

Select * from table1 left join table2 on table1.xx=table2.xx;

左外连接以左表为基准,左边的数据全部显示,右边的数据没有对应记录的显示为NULL。例如:

SELECTqintianpeople.people_id,people_name,commodity_name
FROMqintiancommodityLEFT JOINqintianpeopleON qintiancommodity.people_id = qintianpeople.people_id

执行结果如下:

2.2.2 右外连接

语法格式

Select * from table1 right join table2 on table1.xx=table2.xx;

右外连接以右表为基准,右边的数据全部显示,左边的数据没有对应记录的显示为NULL。例如:

SELECTqintianpeople.people_id,people_name,commodity_name
FROMqintiancommodityRIGHT JOINqintianpeopleON qintiancommodity.people_id = qintianpeople.people_id

执行结果如下:

2.3 自连接

自连接是指在同一个表上进行连接操作,它可以把行比较转化为列比较,在查询时可以使用WHERE进行过滤。

语法格式

select * from table1 t1,table1 t2 where t1.xx=t2.xx;
2.4 子查询

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

2.4.1 单行子查询

语法格式

Select * from table1 where id=(select id from table2 where...);

例如,假设有customers表和orders表,我们想要查询下了订单的客户信息,可以使用如下子查询:

SELECT *
FROM customers
WHERE customer_id IN (SELECT DISTINCT customer_id FROM orders);

这个子查询先从orders表中获取所有下过订单的customer_id,然后外层查询从customers表中查询这些customer_id对应的客户信息。

2.4.2 多行子查询

语法格式

Select * from table1 where id in (select id from table2 where...);

多行子查询与单行子查询类似,不过它返回的是多个值,使用IN关键字来匹配这些值。例如:

SELECT *
FROM products
WHERE product_id IN (SELECT product_id FROM order_items WHERE quantity > 10);

这个查询会返回在order_items表中被订购数量大于10的所有产品信息。

子查询可以多次嵌套,以实现更复杂的查询逻辑。例如:

SELECT *
FROM customers
WHERE customer_id IN (SELECT customer_idFROM ordersWHERE order_date > '2023-01-01' AND customer_id IN (SELECT customer_idFROM customersWHERE region = 'Asia')
);

这个嵌套子查询首先筛选出亚洲地区的客户customer_id,然后在这些客户中筛选出在2023年1月1日之后下过订单的客户customer_id,最后查询出这些客户的详细信息。

2.5 合并查询

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

2.5.1 显示去重

语法格式

select * from table1 union select * from table2;

UNION关键字会将两个查询结果合并,并去除重复的行。

2.5.2 不显示去重

语法格式

select * from table1 union all select * from table2;

UNION ALL关键字会将两个查询结果直接合并,保留所有的行,包括重复的行。

2.6 一条SQL语句的执行顺序

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

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

相关文章:

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

文章目录 SQL 中的分组查询与联合查询详解 1. GROUP BY分组查询 1.1 语句格式1.2 示例说明 1.2.1 分别查询哥哥组和弟弟组的英语成绩总和1.2.2 查询哥哥组的所有成绩总和 2. 联合查询 2.1 内连接 2.1.1 语法格式2.1.2 执行过程 2.2 外连接 2.2.1 左外连接2.2.2 右外连接 2.3 …...

【实战篇】用 Cursor 独立开发并上线电商类 Android APP 全攻略

一、为啥要用 Cursor 开发电商类 Android APP 家人们,如今电商类 APP 随处可见,不管是买衣服、食品,还是电子产品,都能通过这些 APP 轻松搞定。要是能自己开发一款电商类 Android APP,那可太酷啦!但开发 APP 可不是一件容易的事,涉及到很多技术,像写代码、设计界面、处…...

quartus24.1版本子模块因时钟问题无法综合通过,FPGA过OOC问题复盘

因为只负责一个子模块,所以需要单独对该子模块进行综合和过OOC,这时候已经有一些加虚拟pin文件,敲命令让子模块能过OOC的方法。但这个方法的前提是先过综合,然后再敲命令让虚拟管脚命令成功,最终可以过OOC。 今天负责…...

零基础Vue入门6——Vue router

本节重点: 路由定义路由跳转 前面几节学习的都是单页面的功能(都在专栏里面https://blog.csdn.net/zhanggongzichu/category_12883540.html),涉及到项目研发都是有很多页面的,这里就需要用到路由(vue route…...

使用 Let‘s Encrypt 和 OpenResty 实现域名转发与 SSL 配置

在搭建网站或服务时,确保域名的安全性和正确的流量转发是非常重要的。本文将介绍如何使用 Let’s Encrypt 获取免费的 SSL 证书,并将其配置到 OpenResty 中,同时实现特定的域名转发规则。这不仅可以提升网站的安全性,还能优化流量…...

Lambda 表达式

一、Lambda 表达式简介 Lambda 表达式是一种简洁的函数式编程方式,用于实现只有一个方法的接口(例如函数式接口)。 基本语法 (parameters) -> expression (parameters) -> { statements; } 参数:可以有零个或多个参数。…...

TCN时间卷积神经网络多变量多步光伏功率预测(Matlab)

代码下载:TCN时间卷积神经网络多变量多步光伏功率预测(Matlab) TCN时间卷积神经网络多变量多步光伏功率预测 一、引言 1.1、研究背景和意义 随着全球能源危机的加剧和环保意识的提升,可再生能源,尤其是太阳能&…...

【Elasticsearch】 Composite Aggregation 详解

1.什么是 Composite Aggregation? Composite Aggregation 是 Elasticsearch 中的一种特殊聚合方式,适用于需要分页展示的聚合结果。它与传统的聚合方式不同,采用了基于游标的分页模型。这种聚合方式可以高效地处理多级聚合中的所有桶&#x…...

如何通过 Logstash 将数据采集到 Elasticsearch

作者:来自 Elastic Andre Luiz 将 Logstash 与 Elasticsearch 集成以实现高效的数据提取、索引和搜索的分步指南。 什么是 Logstash? Logstash 是一种广泛使用的 Elastic Stack 工具,用于实时处理大量日志数据。它充当高效的数据管道&#x…...

mysql的cpu使用率100%问题排查

背景 线上mysql服务器经常性出现cpu使用率100%的告警, 因此整理一下排查该问题的常规流程。 1. 确认CPU占用来源 检查系统进程 使用 top 或 htop 命令,确认是否是 mysqld 进程导致CPU满载:top -c -p $(pgrep mysqld)2. 实时分析MySQL活动 …...

centos虚拟机迁移没有ip的问题

故事背景,我们的centos虚拟机本来是好好的,但是拷贝到其他电脑上就不能分配ip,我个人觉得这个vmware他们软件应该搞定这个啊,因为这个问题是每次都会出现的。 网络选桥接 网络启动失败 service network restart Restarting netw…...

接入 deepseek 实现AI智能问诊

1. 准备工作 注册 DeepSeek 账号 前往 DeepSeek 官网 注册账号并获取 API Key。 创建 UniApp 项目 使用 HBuilderX 创建一个新的 UniApp 项目(选择 Vue3 或 Vue2 模板)。 安装依赖 如果需要在 UniApp 中使用 HTTP 请求,推荐使用 uni.requ…...

用AVFrame + AVPacket 完成accede编码和直接用ffmpeg命令行实现acc编码的对比

在使用 FFmpeg 进行 AAC 音频编码时,可以选择两种方式:通过编程接口(如 AVFrame 和 AVPacket)实现 AAC 编码,或者直接使用 FFmpeg 命令行工具。这两种方式各有特点,适用于不同的场景。以下是对两种方法的详细分析,包括它们的区别、优缺点以及适用场景。 一、通过 AVFram…...

计算机网络笔记再战——理解几个经典的协议6——TCP与UDP

目录 先说端口号 TCP 使用序号保证顺序性和应答来保证有效性 超时重传机制 TCP窗口机制 UDP 路由协议 协议分类:IGP和EGP 几个经典的路由算法 RIP OSPF 链路状态数据库(LSDB) LSA(Link State Advertisement&#xff0…...

【AI】在Ubuntu中使用docker对DeepSeek的部署与使用

这篇文章前言是我基于部署好的deepseek-r1:8b模型跑出来的 关于部署DeepSeek的前言与介绍 在当今快速发展的技术环境中,有效地利用机器学习工具来解决问题变得越来越重要。今天,我将引入一个名为DeepSeek 的工具,它作为一种强大的搜索引擎&a…...

openssl使用

openssl使用 提取密钥对 数字证书pfx包含公钥和私钥,而cer证书只包含公钥。提取需输入证书保护密码 openssl pkcs12 -in xxx.pfx -nocerts -nodes -out pare.key提取私钥 openssl rsa -in pare.key -out pri.key提取公钥 openssl rsa -in pare.key -pubout -ou…...

《语义捕捉全解析:从“我爱自然语言处理”到嵌入向量的全过程》

首先讲在前面,介绍一些背景 RAG(Retrieval-Augmented Generation,检索增强生成) 是一种结合了信息检索与语言生成模型的技术,通过从外部知识库中检索相关信息,并将其作为提示输入给大型语言模型&#xff…...

HIVE如何注册UDF函数

如果注册UDF函数的时候报了上面的错误,说明hdfs上传的路径不正确, 一定要用下面的命令 hadoop fs -put /tmp/hive/111.jar /user/hive/warehouse 一定要上传到上面路径,这样在创建函数时,引用下面的地址就可以创建成功...

VsCode创建VUE项目

1. 首先安装Node.js和npm 通过网盘分享的文件:vsCode和Node(本人电脑Win11安装) 链接: https://pan.baidu.com/s/151gBWTFZh9qIDS9XWMJVUA 提取码: 1234 它们是运行和构建Vue.js应用程序所必需的。 1.1 Node安装,点击下一步即可 …...

x64、aarch64、arm与RISC-V64:详解四种处理器架构

x64、aarch64、arm与RISC-V64:详解四种处理器架构 x64架构aarch64架构ARM架构RISC-V64架构总结与展望在计算机科学领域,处理器架构是构建计算机系统的基石,它决定了计算机如何执行指令、管理内存和处理数据。x64、aarch64、arm与RISC-V64是当前主流的四种处理器架构,它们在…...

解决ROS的‘Done checking log file disk usage’卡顿:你的~/.bashrc里ROS_IP设对了吗?

解决ROS日志检查卡顿:环境变量配置的深层解析与实战指南 当你在终端启动roscore时,是否遇到过长时间卡在"Done checking log file disk usage"提示的尴尬?这个问题看似简单,背后却隐藏着ROS环境配置的关键细节。本文将带…...

从A*到平滑:拉绳算法如何为游戏角色“剪裁”最优路径

1. 游戏寻路为什么需要平滑处理? 想象一下你在玩一款开放世界游戏,控制角色从城堡出发前往远处的森林。如果直接使用A*算法生成的路径,角色可能会像喝醉酒一样左右摇摆,贴着导航网格的边缘移动。这种"锯齿状路径"不仅看…...

FPGA阵列信号处理矩阵算子高性能实现【附代码】

✨ 长期致力于自动驾驶、阵列信号处理、矩阵特征值分解、Jacobi旋转、三角矩阵求逆、序列排序、序列部分排序研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1&…...

南京数字化申报实战开启:提交材料后,如何确保您的技术底座不被“合规性审计”一票否决?

【行动指南:从填报到过审】截至 2026年5月12日,南京市中小企业数字化转型城市试点的线上申报通道已正式运行。在首批提交材料的企业反馈中,一个核心细节引起了市场的高度关注:申报系统不仅要求填写投入金额,更强化了对…...

在线教程丨单卡即可爆改,面壁智能等开源MiniCPM-V-4.6,1.3B端侧模型支持图像理解/视频理解/OCR/多轮多模态对话

过去几年,整个 AI 行业几乎都笼罩在 Scaling Law 的叙事之下。参数越大、训练数据越多,模型似乎就越接近「通用智能」。从千亿到万亿参数,大模型不断刷新人们对推理能力与世界知识的想象,也让「堆算力、卷规模」成为行业默认的发展…...

OnmyojiAutoScript:阴阳师全自动脚本终极指南,30+日常任务智能托管解放双手

OnmyojiAutoScript:阴阳师全自动脚本终极指南,30日常任务智能托管解放双手 【免费下载链接】OnmyojiAutoScript Onmyoji Auto Script | 阴阳师脚本 项目地址: https://gitcode.com/gh_mirrors/on/OnmyojiAutoScript 阴阳师作为一款深受玩家喜爱的…...

别盲目学AI!先搞懂人工智能的3大核心分支,选对方向少走3年弯路

文章目录前言第一大分支:大模型与生成式AI——AI行业的"水电煤"什么是大模型与生成式AI?大模型技术在2026年的发展现状大模型方向的主要岗位和薪资大模型方向的学习路线第二大分支:智能体与多智能体系统——2026年AI行业最大的风口…...

Coze平台智能物资匹配系统——完整设计与实现指南

Coze平台智能物资匹配系统——完整设计与实现指南 文档概述 本文档提供一套完整的技术解决方案,用于在Coze(扣子)平台上搭建智能物资匹配系统。该系统以“残值+运费最小化”为核心优化目标,支持用户输入地点和物资需求或上传表格文件,自动匹配最佳物资并输出等多组备选方…...

JY901陀螺仪数据解析实战:从原始字节到工程可用的姿态角(附完整代码)

JY901陀螺仪数据解析实战:从原始字节到工程可用的姿态角(附完整代码) 在嵌入式开发中,姿态感知是实现自动平衡、导航定位等功能的基石。JY901作为一款高性价比的9轴运动传感器,其输出的原始数据需要经过精确解析才能转…...

从零解构:BUUCTF“吹着贝斯扫二维码”中的隐写与编码链

1. 题目背景与核心挑战 第一次看到BUUCTF这道"吹着贝斯扫二维码"的题目时,我盯着那堆杂乱的文件陷入了沉思。这道题完美展现了CTF比赛中典型的"隐写多层编码"组合拳——就像侦探破案需要同时处理物证和密码本。题目给出的初始材料是一个加密的f…...