【MySQL】查询(进阶)

文章目录

  • 前言
  • 1、新增
  • 2、聚合查询
    • 2.1聚合函数
      • 2.1.1count
      • 2.1.2sum
      • 2.1.3avg
      • 2.1.4max和min
    • 2.2、GROUP BY子句
    • 2.3HAVING
  • 3、联合查询/多表查询
    • 3.1内连接和外连接
    • 3.2自连接
    • 3.3子查询
    • 3.4合并查询


前言

在前面的内容中我们已经把查询的基本操作介绍的差不多了,接下来我们就要介绍一些更加复杂的查询操作


1、新增

这里的新增是插入和查询的结合,可以把一个表查询的结果,插入到另一个表中
创建一个学生表:

mysql> insert into student values (1, '张三', '男'),(2, '李四', '男'),(3, '王五', '女');
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0mysql> select * from student;
+------+--------+--------+
| id   | name   | gender |
+------+--------+--------+
|    1 | 张三   ||
|    2 | 李四   ||
|    3 | 王五   ||
+------+--------+--------+
3 rows in set (0.00 sec)

创建一个学生表2:

mysql> create table student2(id int, name varchar(20));
Query OK, 0 rows affected (0.02 sec)

把学生表的id和name插入到学生表2中:

mysql> insert into student2 select id, name from student;
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0mysql> select * from student2;
+------+--------+
| id   | name   |
+------+--------+
|    1 | 张三   |
|    2 | 李四   |
|    3 | 王五   |
+------+--------+
3 rows in set (0.00 sec)

把数据从student中查询出来,然后插入到student2中
这里需要确保,查询到的结果集合的列/类型,要和待插入表的列数类型匹配

2、聚合查询

2.1聚合函数

函数说明
COUNT([DISTINCT] expr)返回查询到的数据的数量
SUM([DISTINCT] expr)返回查询到的数据的总和,不是数字没有意义
AVG([DISTINCT] expr)返回查询到的数据的平均值,不是数字没有意义
MAX([DISTINCT] expr)返回查询到的数据的最小值,不是数字没有意义
MIN([DISTINCT] expr)返回查询到的数据的最小值,不是数字没有意义

上述的聚合函数只能针对数字,接下来我们针对下面这张表演示上述的聚合函数

mysql> select * from exam_result;
+------+-----------+---------+------+---------+
| id   | name      | chinese | math | english |
+------+-----------+---------+------+---------+
|    1 | 唐三藏    |    87.0 | 98.0 |    56.0 |
|    2 | 孙悟空    |    87.0 | 80.0 |    77.0 |
|    3 | 猪悟能    |    88.0 | 98.0 |    90.0 |
|    4 | 曹孟德    |    82.0 | 84.0 |    67.0 |
|    5 | 刘玄德    |    55.0 | 85.0 |    45.0 |
|    6 | 孙权      |    60.0 | 70.0 |    80.0 |
|    7 | 宋公明    |    75.0 | 65.0 |    30.0 |
|    8 | 诸葛亮    |    90.0 | 85.0 |    66.0 |
+------+-----------+---------+------+---------+
8 rows in set (0.01 sec)

2.1.1count

mysql> select count(*) from exam_result;
+----------+
| count(*) |
+----------+
|        8 |
+----------+
1 row in set (0.02 sec)

此处查询的结果表示在这张表中有多少行
当前这个写法,就想当于先执行select * from exam_result,再对结果进行count聚合
这里的 * 也可以写具体的列,如果写具体的列/表达式,就是针对这一列查询,在进行聚合

mysql> select count(chinese) from exam_result;
+----------------+
| count(chinese) |
+----------------+
|              8 |
+----------------+
1 row in set (0.00 sec)

针对某一列进行查询的时候,就要看这一列有多少个非NULL的结果,而select * 则不关注NULL
注意:使用聚合函数的函数名和括号之间,不能有空格

2.1.2sum

mysql> select sum(chinese+math+english) from exam_result;
+---------------------------+
| sum(chinese+math+english) |
+---------------------------+
|                    1800.0 |
+---------------------------+
1 row in set (0.00 sec)

先把每一行的语文数学英语累加再把所有的行进行累加
如果针对非数值的列进行相加,虽然没有报错但是结果是不正确的
在这里插入图片描述

2.1.3avg

mysql> select avg(chinese) from exam_result;
+--------------+
| avg(chinese) |
+--------------+
|     78.00000 |
+--------------+
1 row in set (0.00 sec)

2.1.4max和min

mysql> select max(chinese) from exam_result;
+--------------+
| max(chinese) |
+--------------+
|         90.0 |
+--------------+
1 row in set (0.01 sec)mysql> select min(chinese) from exam_result;
+--------------+
| min(chinese) |
+--------------+
|         55.0 |
+--------------+
1 row in set (0.00 sec)

上述的聚合函数也可以搭配一些条件来进行查询

2.2、GROUP BY子句

指定某个列,针对这个列把值相同的行,分到同一组中,可以针对每个组,分别进行聚合查询
这里我们创建一张工资表emp:

create table emp(id int, name varchar(20), role varchar(20), salary int);
insert into emp values(1, '张三', '开发', 13000), (2, '李四', '开发', 12000), (3, '王五', '开发', 11000), (4, '赵六', '测试', 12000), (5, '田七', '测试', 13000), (6, '周八', '产品', 10000), (7, '雷军', '老板', 10000000);

查询每个岗位有多少人:

mysql> select role, count(id) from emp group by role;
+--------+-----------+
| role   | count(id) |
+--------+-----------+
| 产品   |         1 |
| 开发   |         3 |
| 测试   |         2 |
| 老板   |         1 |
+--------+-----------+
4 rows in set (0.00 sec)

执行过程:
1.先执行select role, id from emp
2.再根据group by role 设定,按照role这一列的值,针对上述查询结果,进行分组
3.针对上述的每个组,分别执行count聚合操作,再把结果整理成临时表,返回给客户端

2.3HAVING

我们还可以给聚合查询指定条件
1.聚合之前的条件
查询每个岗位的平均工资,但是要刨出张三:

mysql> select role, avg(salary) from emp where name != '张三' group by role;
+--------+---------------+
| role   | avg(salary)   |
+--------+---------------+
| 产品   |    10000.0000 |
| 开发   |    11500.0000 |
| 测试   |    12500.0000 |
| 老板   | 10000000.0000 |
+--------+---------------+
4 rows in set (0.00 sec)

先筛选,再分组计算出每个组的平均工资
2.聚合之后的条件:
查询每个岗位的平均工资,但是刨出平均工资超过 2w的数据:

mysql> select role, avg(salary) from emp group by role having avg(salary) < 20000;
+--------+-------------+
| role   | avg(salary) |
+--------+-------------+
| 产品   |  10000.0000 |
| 开发   |  12000.0000 |
| 测试   |  12500.0000 |
+--------+-------------+
3 rows in set (0.00 sec)

先分组计算出每个组的工资之后,再进行上述条件筛选
3.分组前分组后都指定条件筛选(where和having结合使用)
计算出每个岗位的平均工资,刨出张三,也刨出平均工资超过2w的:

mysql> select role, avg(salary) from emp where name != '张三' group by role having avg(salary) < 20000;
+--------+-------------+
| role   | avg(salary) |
+--------+-------------+
| 产品   |  10000.0000 |
| 开发   |  11500.0000 |
| 测试   |  12500.0000 |
+--------+-------------+
3 rows in set (0.00 sec)

这种就是前面两种条件都存在

3、联合查询/多表查询

笛卡尔积是多表查询的基础,这是一种排列组合
多表联合查询的一般步骤:
1.确定要查的信息来自于哪几个表
2.把这些表进行笛卡尔积
3.指定连接条件
4.指定其他补充条件/聚合操作
5.针对列进行精简

这里我们用四张表来进行举例说明:
第一张班级表:
在这里插入图片描述
第二张学生表:
在这里插入图片描述
第三张课程表:
在这里插入图片描述
第四张成绩表:
在这里插入图片描述
查询许仙同学的成绩:
1.这里要查询的来自学生表和成绩表
2.对这两个表进行笛卡尔积
在这里插入图片描述
3.指定连接条件
在这里插入图片描述
4.指定其他补充条件/聚合操作
在这里插入图片描述
5.针对列进行精简
在这里插入图片描述
多表查询还可以使用join on的方式来写

3.1内连接和外连接

上述的都是内连接,内连接的语法:

select * from 表一,表二 where 连接条件
select * from 表一 join 表二 on 连接条件

外连接和内连接一样,都是基于笛卡尔积的方式进行计算的,但是对于空值/不存在的值,处理方式是存在区别的
数据一一对应的情况下,使用内连接和外连接是一样的
外连接只能使用join on的方式写,可以在join的前面加上left(“左外连接”/right(“右外连接”)关键字
左外连接,以左侧的表为基准,保证左侧表中的每个数据一定会存在,左侧表数据在右侧表中不存在的部分(列),使用null填充
右外连接,以右侧的表为基准,保证右侧表中的每个数据一定会存在,右侧表数据在左侧表中不存在的部分(列),使用null填充

3.2自连接

同一个表中,自己和自己进行笛卡尔计算
自连接能够把行之间的关系转换成列之间的关系

3.3子查询

把多个sql语句嵌套成一个sql语句
单行子查询:返回一行记录的子查询
多行子查询:返回多行查询记录的子查询通过in

3.4合并查询

把多个查询到的结果集合,合并到一起
union:允许你从不同的多个表分别查询,只要每个表查询的结果集合列的类型和个数匹配都能合并,会去掉重复的行
union all:不会去掉重复的行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/1452.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Llama 3 实测效果炸裂,一秒写数百字(附镜像站)

这几天大火的llama 3刚刚在https://askmanyai.cn上线了&#xff01; 玩了一会儿&#xff0c;这个生成速度是真的亚麻呆住。文案写作和代码生成直接爽到起飞&#xff0c;以往gpt要写一两分钟的千字文&#xff0c;llama 3几秒钟就写完了。而且效果甚至感觉更好&#xff1f; 效果惊…

el-menu 有一级二级三级菜单

效果如下 菜单代码如下 <el-menu:default-active"menuDefaultActive"class"el-menu-box":text-color"menuTextColor":active-text-color"menuActiveTextColor":unique-opened"true"><!-- 一级菜单 --><tem…

二、python+前端 实现MinIO分片上传

python前端 实现MinIO分片上传 一、背景二、流程图三、代码 一、背景 问题一&#xff1a;前端 -> 后端 ->对象存储 的上传流程&#xff0c;耗费带宽。 解决方案&#xff1a;上传流程需要转化为 前端 -> 对象存储&#xff0c;节省上传带宽 问题二&#xff1a;如果使用…

Crypto量化高频体验总结

Crypto量化高频体验总结 人工智能与量化交易算法知识库 2024-04-21 21:02 美国 以下文章来源于Quant搬砖工 &#xff0c;作者quant搬砖队工头 Quant搬砖工. 稳健的收益要一点一点赚&#xff0c;量化的板砖要一块一块搬&#xff01; 前言 前两天在翻历史文章的时候&#xf…

【高阶数据结构】并查集 -- 详解

一、并查集的原理 1、并查集的本质和概念 &#xff08;1&#xff09;本质 并查集的本质&#xff1a;森林。 &#xff08;2&#xff09;概念 在一些应用问题中&#xff0c;需要将 n 个不同的元素划分成一些不相交的集合。 开始时&#xff0c;每个元素自成一个单元素集合&…

SpringBoot 集成Nacos注册中心和配置中心-支持自动刷新配置

SpringBoot 集成Nacos注册中心和配置中心-支持自动刷新配置 本文介绍SpringBoot项目集成Nacos注册中心和配置中心的步骤&#xff0c;供各位参考使用 1、配置pom.xml 文件 在pom.xml文件中定义如下配置和引用依赖&#xff0c;如下所示&#xff1a; <properties><pr…

buuctf之ciscn_2019_c_1

ciscn_2019_c_1 一、查看属性二、静态分析三、动态分析四、思路五、exp 一、查看属性 首先还是必要的查看属性环节&#xff1a; 可以知道该文件是一个x86架构下的64位小端ELF文件&#xff0c;开启了栈不可执行&#xff08;NX&#xff09; 执行一下&#xff0c;先有一个选择&…

ROS2 王牌升级:Fast-DDS 性能直接碾压 zeroMQ 「下」

以下内容为本人的学习笔记&#xff0c;如需要转载&#xff0c;请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/aU1l3HV3a9YnwNtC1mTiOA 性能比较 下面就以官网的测试数据为准&#xff0c;让我们一起来看看它们的性能差别到底怎样。 本次比较仅针对 Fast RT…

60道计算机二级模拟试题选择题(含答案和解析)

点击下载《60道计算机二级模拟试题选择题&#xff08;含答案和解析&#xff09;》 1. 前言 本文设计了一份针对计算机二级考试的选择题&#xff0c;旨在考察考生对计算机基础知识和应用技能的掌握情况。试题涵盖了计算机基础知识、操作系统、办公软件、计算机网络等多个方面&…

【CVPR2023】《A2J-Transformer:用于从单个RGB图像估计3D交互手部姿态的锚点到关节变换网络

这篇论文的标题是《A2J-Transformer: Anchor-to-Joint Transformer Network for 3D Interacting Hand Pose Estimation from a Single RGB Image》&#xff0c;作者是Changlong Jiang, Yang Xiao, Cunlin Wu, Mingyang Zhang, Jinghong Zheng, Zhiguo Cao, 和 Joey Tianyi Zhou…

polkit服务启动失败

使用systemctl 命令报错 Authorization not available. Check if polkit service is running or see debug message for more information. 查看polkit状态是失败的状态&#xff0c;报缺少libstdc.so.6 systemctl status polkit 需要安装libstdc.so.6库 先加载所有安装包 …

Java学习Go(入门)

下载Go 《官网下载golang》 直接点Download&#xff0c;然后根据你自己的操作系统进行下载&#xff0c;我这里以win10为例 安装go 默认安装到C:\Program Files\Go&#xff0c;这里我们可以选择安装到其他盘&#xff0c;也可以选择默认安装。初学者建议直接一路next。 安装完…

IMUGNSS的误差状态卡尔曼滤波器(ESKF)---更新过程

IMU&GNSS的误差状态卡尔曼滤波器&#xff08;ESKF&#xff09;---更新过程 ESKF的更新过程 ESKF的更新过程 前面介绍的是ESKF的运动过程&#xff0c;现在考虑更新过程。假设一个抽象的传感器能够对状态变量产生观测&#xff0c;其观测方程为抽象的h,那么可以写为 其中z为…

python爬虫笔记1

1 爬虫介绍 爬虫概述&#xff1a; 获取网页并提取和保存信息的自动化程序 1.获取网页 2.提取信息 css选择器 xpath 3.保存数据&#xff08;大数据时代&#xff09; 4.自动化 爬虫&#xff08;资产收集&#xff0c;信息收集&#xff09; 漏扫&#xff08;帮我发现漏洞&#xff…

使用Python比较两张人脸图像并获得准确度

使用 Python、OpenCV 和人脸识别模块比较两张图像并获得这些图像之间的准确度水平。 一、原理 使用Face Recognition python 模块来获取两张图像的128 个面部编码&#xff0c;并比较这些编码。比较结果返回 True 或 False。如果结果为True &#xff0c;那么两个图像将是相同的…

Python程序设计 字典

教学案例十 字典 1. 判断出生地 sfz.txt文件中存储了地区编码和地区名称 身份证的前6位为地区编码&#xff0c;可以在sfz.txt文件中查询到地区编号对应的地区名称 编写程序&#xff0c;输入身份证号&#xff0c;查询并显示对应的地区名称 若该地区编码不在文件中&#xff0c;…

SQVI创建以及生成程序

SAP数据快速查询工具&#xff1a;Sqvi-QuickView 项目实施&运维阶段&#xff0c;为了快速获取一些透明表数据&#xff0c;一开始接触项目肯定会通过大量的数据表查找&#xff0c;然后线下通过EXCEL通过VLOOKUP进行数据关联&#xff0c;这种方式在关联数据较少的情况比较适应…

齐超:思颜肌密从单科特长生向全科学霸进化

“从单科特长生向全科学霸进化”。 中国化妆品行业发展至今&#xff0c;走过了线下渠道蓬勃发展的时代&#xff0c;也经历了电商渠道的黄金时代&#xff0c;继而迈入当下的直播时代。而在每一个时代的转折点上&#xff0c;思颜肌密始终在行业前列&#xff0c;跨越一个个生命周…

书生·浦语大模型实战营Day04OpenXLab 部署

书生浦语大模型实战营Day04OpenXLab 部署 如何在 OpenXLab 部署一个 InternLM2-7B chat 的应用。 OpenXLab浦源平台介绍 OpenXLab 浦源平台以开源为核心&#xff0c;旨在构建开源开放的人工智能生态&#xff0c;促进学术成果的开放共享。OpenXLab面向 AI 研究员和开发者提供…

FPGA - ZYNQ Cache一致性问题

什么是Cache&#xff1f; Cache是一种用来提高计算机运行速度的一种技术。它是一种小而快的存储设备&#xff0c;位于CPU与内存之间&#xff0c;用于平衡高速设备与低速设备之间的速度差异。Cache可以存储常用的数据或指令&#xff0c;以便CPU更快地获取&#xff0c;从而减少对…