【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: 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:不会去掉重复的行

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【ThinkPHP框架教程·Part-05】控制器定义和渲染输出

文章目录 一、控制器定义1、控制器目录设置2、控制器访问格式3、设置控制器后缀&#xff08;选择性开启&#xff09; 二、渲染输出1、return返回字符串2、返回json格式3、扩展&#xff1a;助手函数 halt() 本章节我们来了解一下控制器定义的方式&#xff0c;包括 URL 访问和渲染…

C# Solidworks二次开发:程序工具界面和选项相关API详解

大家好&#xff0c;今天要讲的是关于程序工具相关的API介绍。 下面是要介绍的API: (1)第一个为GetAutoPartSimplification&#xff0c;这个API的含义为获取简化配置的指针&#xff0c;下面是官方具体解释&#xff1a; 其输入参数的类型在上一篇文章中已经介绍过了gtError_e&a…

前端跨域问题

vue项目&#xff0c;开发环境下&#xff0c;axios造成跨域问题&#xff1a; Access to XMLHttpRequest at http://....:8888/login from origin http://localhost:8080 has been blocked by CORS policy: Cannot parse Access-Control-Allow-Headers response header field in…

遇到you-get下载报错问题解决

pip3 install you-get安装这里就不赘述了&#xff0c;如果你还不会安装&#xff0c;说明这篇文章不适合你&#xff0c;这篇文章主要解决当执行you-get的报错&#xff1a; 当然你可以加选项–debug具体看一下到底报什么错。 第一步 替换文件 首先&#xff0c;我们下载仓库最新…

独立样本t检验——python完整代码(直接运行就行)

#!/usr/bin/env python # -*- coding: utf-8 -*- # Author : 三十二画生JH # Contact : fjhstudent163.com # Software: PyCharm # Time : 2024/4/21 21:49 # Site : 网址 # File : t_test.py # Version : # ---功能描述 """ 对实验数据做独立样本&am…

【数值计算方法】 4.2 / Newton-Cotes公式

本质&#xff1a;具有等距节点的插值求积公式就是NC公式

记录数据截断误差

数据的4位之后 数据的小数点后4位之后有些不同&#xff0c;跟save函数有关 save ga_mat1.txt ga -ascii; save sins_mat.txt sins -ascii;

微服务之SpringCloud AlibabaNacos服务注册和配置中心

一、概述 1.1注册中心原理 在微服务远程调用的过程中&#xff0c;包括两个角色&#xff1a; 服务提供者&#xff1a;提供接口供其它微服务访问&#xff0c;比如item-service 服务消费者&#xff1a;调用其它微服务提供的接口&#xff0c;比如cart-service 在大型微服务项目…

每日算法4/21

LCR 073. 爱吃香蕉的狒狒 题目 狒狒喜欢吃香蕉。这里有 N 堆香蕉&#xff0c;第 i 堆中有 piles[i] 根香蕉。警卫已经离开了&#xff0c;将在 H 小时后回来。 狒狒可以决定她吃香蕉的速度 K &#xff08;单位&#xff1a;根/小时&#xff09;。每个小时&#xff0c;她将会选…

LeetCode-电话号码的字母组合(回溯)

每日一题 今天刷到的是一道利用回溯来解决的题&#xff0c;不过稍微有点复杂&#xff0c;并且我也有一段时间没有做回溯了&#xff0c;所有在解题时也是思考了一段时间。 题目要求 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意…

大数据Spark--运行环境和架构

文章目录 Spark运行环境Local模式解压缩文件启动 Local 环境命令行工具退出本地模式提交应用 Standalone 模式解压缩文件修改配置文件启动集群提交应用提交参数说明配置历史服务配置高可用&#xff08;HA Yarn模式解压缩文件修改配置文件启动HDFS 以及YARN集群配置历史服务器 K…

【深度学习实战(11)】搭建自己的dataset和dataloader

一、dataset和dataloader要点说明 在我们搭建自己的网络时&#xff0c;往往需要定义自己的dataset和dataloader&#xff0c;将图像和标签数据送入模型。 &#xff08;1&#xff09;在我们定义dataset时&#xff0c;需要继承torch.utils.data.dataset&#xff0c;再重写三个方法…

计算机体系结构

体系结构 CPU&#xff1a;运算器和控制器 运算器&#xff1a;进行算术和逻辑运算控制器&#xff1a; 输入设备&#xff1a;鼠标、键盘、显示器、磁盘、网卡等输出设备&#xff1a;显卡&#xff0c;磁盘、网卡、打印机等存储器&#xff1a;内存&#xff0c;掉电易失总线&#xf…

刷题DAY59 | LeetCode 503-下一个更大元素II 42-接雨水

503 下一个更大元素II&#xff08;medium&#xff09; 给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一个更大的元素 是按数组遍历顺序&#xff0c;这个…

基于SpringBoot + Vue实现的奖学金管理系统设计与实现+毕业论文+答辩PPT

介绍 角色:管理员、学院负责人、学校负责人、学生 管理员:管理员登录进入高校奖助学金系统的实现可以查看系统首页、个人中心、学生管理、学院负责人管理、学校负责人管理、奖学金类型管理、奖学金申请管理、申请提交管理、系统管理等信息 学院负责人:学院负责人登录系统后&am…

14年电赛题--风洞实验--基于STM32与串口屏

前言&#xff1a; 经过三天两夜的比赛&#xff0c;最终我们还是取得了不错的成绩&#xff0c;只有第4问出了一点点问题&#xff0c;球没吹到最顶端。当时我们以为这个是最简单的问题&#xff0c;只要目标值给大点就没问题。但最终还是败在了这一问上&#xff0c;电压不够没吹到…

[已解决]react打包部署

react打包部署 问题 npm install 命令无反应 思路 换成 yarn install 安装完hadoop的环境后&#xff0c;使用node的yarn会报错&#xff1a; 我们在cmd使用where yarn&#xff0c;如下&#xff1a; 看你想保留哪一个&#xff0c;我平时node用的多&#xff0c;就把hadoop的y…

JavaEE 初阶篇-深入了解 I/O 流(FileInputStream 与 FileOutputStream 、Reader 与 Writer)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 I/O 流概述 2.0 文件字节输入流(FileInputStream) 2.1 创建 FileInputStream 对象 2.2 读取数据 2.3 关闭流 3.0 文件字节输出流(FileOutputStream) 3.1 创建 Fi…

代码随想录第42天|416. 分割等和子集

416. 分割等和子集 416. 分割等和子集 - 力扣&#xff08;LeetCode&#xff09; 代码随想录 (programmercarl.com) 动态规划之背包问题&#xff0c;这个包能装满吗&#xff1f;| LeetCode&#xff1a;416.分割等和子集_哔哩哔哩_bilibili 给你一个 只包含正整数 的 非空 数组…

知识加油站:数字阅览室全天候满足师生阅读需求

在知识经济时代&#xff0c;阅读已成为获取信息、提升素养、拓宽视野的重要途径。但在传统知识的海洋里&#xff0c;每一本书都是一座孤岛&#xff0c;每一个思想是一股潮流。传统的纸质阅读已经无法完全满足现代人快速、便捷、多样化的学习和阅读需求。因此&#xff0c;数字阅…