【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.hqwc.cn/news/637252.html

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

相关文章

OpenHarmony鸿蒙南向开发案例:【智能猫眼(基于3518开发板)】

样例简介 本Demo是基于Hi3518开发板&#xff0c;使用开源OpenHarmony开发的RTSP协议流媒体应用。达到将Hi3518开发板中摄像头获取的数据通过RTSP协议传输到手机并显示 。 rtsp实现可参考文档&#xff1a;openharmony_1.0.1实现RTSPServer 运行效果 样例原理 如上图所示&…

Linux应用开发(8):Linux进程间通信(IPC):管道

Linux应用开发&#xff08;7&#xff09;&#xff1a;Linux进程间通信&#xff08;IPC&#xff09;&#xff1a;POSIX消息队列https://blog.csdn.net/tecsai/article/details/137879465 1. 简述 我们在前面已经介绍了进程间通信&#xff08;IPC&#xff09;常用的“消息队列”…

Latex篇之数学公式

数学公式 背景 科研小白在Latex中踩了不少坑&#xff0c;在此记录一下。 准备资料 以下两份文档可以说贯穿写作始终&#xff0c;务必下载&#xff08;快速过一遍即可&#xff0c;知道怎么用&#xff09; 一份&#xff08;不太&#xff09;简短的 LATEX 2ε 介绍&#xff1…

编写函数fun,它的功能是:根据以下公式求P的值,结果由函数值带回。m与n为两个正整数且要求m>n

本文收录于专栏:算法之翼 https://blog.csdn.net/weixin_52908342/category_10943144.html 订阅后本专栏全部文章可见。 本文含有题目的题干、解题思路、解题思路、解题代码、代码解析。本文分别包含C语言、C++、Java、Python四种语言的解法完整代码和详细的解析。 题干 编写…

Axure如何实现限制选择项数量的交互

大家经常会看到这样的功能设计&#xff1a;可以多选&#xff0c;但是限制多选。比如某招聘网站城市的选择只能选择5个。再选择第6个的时候会提示最多只能选择5项。 这个效果是我们经常会遇到的&#xff0c;在工作中也经常会遇到需要制作这样的效果。今天我们一起来看看&#xf…

光盘完成-qt-动画

QPropertyAnimation 是 Qt 中用于属性动画的类&#xff0c;它允许你动画化任何 QObject 的属性。当你使用 QPropertyAnimation&#xff0c;你应该注意以下几点&#xff1a; 1. **对象和属性的类型**&#xff1a; - QPropertyAnimation 仅支持继承自 QObject 的对象&#xf…

日期类的实现

目录 Date.h Test.cpp 测试代码Test.cpp 日期类的实现 代码分享 Date.h #pragma once #include<iostream> using namespace std; #include<assert.h>class Date {//友元函数声明friend ostream& operator<<(ostream& out, Date& d);friend…

书生·浦语大模型全链路开源体系-第5课

书生浦语大模型全链路开源体系-第5课 书生浦语大模型全链路开源体系-第5课相关资源LMDeploy基础配置LMDeploy运行环境下载internlm2-chat-1_8b模型使用Transformer来直接运行InternLM2-Chat-1.8B模型使用LMDeploy以命令行方式与InternLM2-Chat-1.8B模型对话设置KV Cache最大占用…

2024 Guitar Pro如何加音乐符号及功能介绍

一、新版本特性概览 Guitar Pro v8.1.1 Build 17在保留了前版本强大功能的基础上&#xff0c;进一步优化了用户体验和功能性能。新版本主要更新包括以下几个方面&#xff1a; 界面优化&#xff1a;新版界面更加简洁美观&#xff0c;操作更加便捷&#xff0c;即使是初学者也能快…

mapreduce中的ReduceTask工作机制(Hadoop)

ReduceTask 是 Hadoop 中的一个重要组件&#xff0c;负责对 MapTask 的输出进行合并、排序和归并&#xff0c;最终生成最终的输出结果。 ReduceTask 的工作机制 1. 分组&#xff08;Shuffle&#xff09;阶段&#xff1a; 在分组阶段&#xff0c;ReduceTask 会从多个 Mapper …

【搞钱必看】计算机视觉入门,普通人也能学会的高科技!

目录 1. 计算机视觉&#xff0c;未来科技的金矿 2. 计算机视觉入门&#xff0c;真的那么难吗&#xff1f; 3. 入门步骤&#xff0c;轻松上手 4. 学习资源&#xff0c;助力你的成长 5. 实践是关键&#xff0c;动手操作吧&#xff01; 6. 挑战与机遇并存 啊啊啊啊啊啊啊…

前端开发攻略---Vue项目(Vue2和Vue3)引入高德地图,超详细,超简单,保姆级教程。

1、图片演示 2、引入前的准备 1、前往 高德开放平台 进行账号注册。如果手机上有高德地图App并且已经登录过&#xff0c;则可以直接选择登录 2、注册/登录完成后来到应用管理-->我的应用 3、点击创建新应用 4、填写好应用名称和选择应用类型 5、填写好后点击添加Key 6、填写…