【MySQL】查询(进阶)

news2024/11/13 12:11:33

文章目录

  • 前言
  • 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: 0

mysql> 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: 0

mysql> 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.coloradmin.cn/o/1612784.html

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

相关文章

基于SpringBoot + Vue实现的学生心理咨询评估管理系统设计与实现+毕业论文+开题报告+答辩PPT

介绍 系统有管理员和用户。 管理员可以管理个人中心&#xff0c;用户管理&#xff0c;试题管理&#xff0c;试卷管理&#xff0c;考试管理等。用户参加考试。 学生心理咨询评估系统的登录流程&#xff0c;针对的角色就是操作员的操作角色。在登录界面需要的必填信息就是账号信…

创新案例|Amazon.com 2023 年营销策略:电子商务零售巨头商业案例研究

2022 年最后一个季度&#xff0c;亚马逊报告净销售额超过 1,492 亿美元。这种季节性峰值是亚马逊季度报告的典型特征&#xff0c;但增长是不可否认的&#xff0c;因为这是该公司有史以来最高的季度。毫无疑问&#xff0c;这家电商零售巨头继续引领电商增长。本文将介绍我们今天…

Flink学习(七)-单词统计

前言 Flink是流批一体的框架。因此既可以处理以流的方式处理&#xff0c;也可以按批次处理。 一、代码基础格式 //1st 设置执行环境 xxxEnvironment env xxxEnvironment.getEnvironment;//2nd 设置流 DataSource xxxDSenv.xxxx();//3rd 设置转换 Xxx transformation xxxDS.…

【春秋云镜】CVE-2023-43291 emlog SQL注入

靶场介绍 emlog是一款轻量级博客及CMS建站系统&#xff0c;在emlog pro v.2.1.15及更早版本中的不受信任数据反序列化允许远程攻击者通过cache.php组件执行SQL语句。 不感兴趣的可以直接拉到最后面&#xff0c;直接获取flag 备注&#xff1a;没有通过sql注入获取到flag&…

python多线程技术(Threading)

文章目录 前言一、多线程(Threading)是什么?二、threading库1.初识多线程2.增加新线程2.1 多线程的基本使用2.2 对多线程是同时进行的进行一个直观上的演示(非重点--理解是实时就行)2.3 thread.join()功能2.4 使用queue(队列)功能获取多线程的返回值(重要,这就是前面那…

MySql对于时间段交集的处理和通用实现方式(MyBatis-Plus)

问题&#xff1a;一般传统时间筛选是在[ 开始时间 → 结束时间 ]这个区间内的子集&#xff0c;也就是全包含查询方式&#xff0c;这种只会筛选一种情况。如果场景需要是开展一个活动&#xff0c;需要活动时间检索应该但凡包含就返回&#xff0c;也就是需要查询这个时间段有涉及…

Java的Hash算法及相应的Hmac算法

【相关知识】 加密算法知识相关博文&#xff1a;浅述.Net中的Hash算法&#xff08;顺带对称、非对称算法&#xff09;-CSDN博客 【出处与参考】 MessageDigest 类介绍、分多次调用update方法与一次性调用一致的说明引自&#xff1a; https://blog.csdn.net/cherry_chenr…

2024 IDM最新破解版及软件介绍

*IDM&#xff1a;信息时代的高效管理工具** 在快节奏的现代社会中&#xff0c;随着信息的爆炸式增长&#xff0c;如何高效、有序地管理信息成为每个人都需要面对的挑战。IDM&#xff0c;作为一种信息管理工具&#xff0c;正在逐渐受到人们的青睐。 IDM&#xff0c;全称Inform…

HAL STM32 I2C方式读取MT6701磁编码器获取角度例程

HAL STM32 I2C方式读取MT6701磁编码器获取角度例程 &#x1f4cd;相关篇《Arduino通过I2C驱动MT6701磁编码器并读取角度数据》&#x1f388;《STM32 软件I2C方式读取MT6701磁编码器获取角度例程》&#x1f4cc;MT6701当前最新文档资料&#xff1a;https://www.magntek.com.cn/u…

Scanpy(1)数据结构和样本过滤

注&#xff1a;主要讲述scanpy处理数据的结构、数据过滤&#xff08;生信领域&#xff09;和数据预处理&#xff08;和机器学习类似&#xff0c;但是又有不同。&#xff09; 1. Scanpy简介与安装 Scanpy 是一个可扩展的工具包&#xff0c;用于分析与 AnnData&#xff08;一种…

git 小记

一、 github新建仓库 git clone 。。。。。。。。。。。 &#xff08;增删查补&#xff0c;修改&#xff09; git add . git commit -m "修改” git push (git push main) 二、branch 分支 branch并不难理解&#xff0c;你只要想像将代码拷贝到不同目录…

ruoyi-vue前端的一些自定义插件介绍

文章目录 自定义列表$tab对象打开页签关闭页签刷新页签 $modal对象提供成功、警告和错误等反馈信息&#xff08;无需点击确认&#xff09;提供成功、警告和错误等提示信息&#xff08;类似于alert&#xff0c;需要点确认&#xff09;提供成功、警告和错误等提示信息&#xff08…

restful请求风格的增删改查-----修改and删除

一、修改&#xff08;和添加类似&#xff09; 前端&#xff1a; <script type"text/javascript">function update(){//创建user对象var user {id:$("#id").val(),username:$("#username").val(),password:$("#password").val…

排序 “贰” 之选择排序

目录 ​编辑 1. 选择排序基本思想 2. 直接选择排序 2.1 实现步骤 2.2 代码示例 2.3 直接选择排序的特性总结 3. 堆排序 3.1 实现步骤 3.2 代码示例 3.3 堆排序的特性总结 1. 选择排序基本思想 每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个…

又来!黄金主题LOF(161116)溢价40%开放申购,拖拉机都开冒烟了!

查看基金公告&#xff0c;黄金主题LOF(161116)下周一(4月22号)开放申购&#xff0c;限额100元&#xff0c;目前溢价40%&#xff0c;可以一拖七套利。 这熟悉的配方&#xff0c;这熟悉的套路&#xff01;一个月前的今天&#xff0c;我好像在标普500LOF上见过。又是易方达这个狗基…

数据结构_时间复杂度

✨✨所属专栏&#xff1a;数据结构✨✨ ✨✨作者主页&#xff1a;嶔某✨✨ 什么是时间复杂度&#xff1f; 时间复杂度的定义&#xff1a;在计算机科学中&#xff0c;算法的时间复杂度是一个函数&#xff0c;它定量描述了该算法的运行时间。一个算法执行所耗费的时间&#xff0…

上位机图像处理和嵌入式模块部署(树莓派4b和类muduo网络编程)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 既然是linux编程&#xff0c;那么自然少不了网络编程。在linux平台上面&#xff0c;有很多的网络编程库可以选择&#xff0c;大的有boost、qt&…

python3如何提取汉字

采用正则表达式的方法对字符串进行处理。 str1 "&#xff5b;我%$是&#xff0c;《速$.度\发》中 /国、人"&#xff08;1&#xff09;提取汉字 汉字的范围为”\u4e00-\u9fa5“&#xff0c;这个是用Unicode表示的。 import re res1 .join(re.findall([\u4e00-\u9fa…

如何对图片进行压缩和缩放

在手机像素越来越高的时代&#xff0c;照片的体积也在不断地膨胀&#xff0c;大部分情况下我们是不需要这么大的图片的&#xff0c;这个时候我们就需要对图片进行压缩或者缩放了&#xff0c;今天教大家如何缩小图片体积 打开智游剪辑&#xff08;官网: zyjj.cc&#xff09;&…

MySQL慢查询怎么办?需要关注Explain的哪些关键字?

目录 1-引言&#xff1a;什么是慢查询1-1 慢查询定义1-2 为什么排查慢查询 2-核心&#xff1a;慢查询排查2-1 慢查询定位2-2 慢查询解决2-2-1 Explain 排查慢查询2-2-2 Explain 重点关键字 3-总结&#xff1a;慢查询知识点小结 1-引言&#xff1a;什么是慢查询 1-1 慢查询定义…