《mysql篇》--查询(进阶)

news2024/12/24 3:13:52

目录

将查询结果作为插入数据

聚合查询

聚合函数

count

sum

group by子句

having

联合查询

笛卡尔积

多表查询

join..on实现多表查询

内连接

外连接

自连接

子查询

合并查询


将查询结果作为插入数据

Insert into 表2  select * from 表1//将表1的查询数据插入到表2

查询出来的结果集合,要和插入的这个表的类型一致

举例:insert into student2 (select * from student1);

//student1也可以选择部分数据插入只要类型对应就行

聚合查询

聚合函数

mysql在查找时给我们提供了一些基础的处理数据的函数

表达式查询是针对列和列之间进行运算

聚合查询是行和行之间进行运算

count

举例:select count(math) from score;

还可以使用别名

这里是先执行select math from score在针对结果集合进行统计

//count用来表示查询到的数据的个数

不过这时你可能会有疑问 

这个已经可以看到行数了,为啥还要count呢?

7 rows in set是mysql客户端内置的功能,如果你是通过代码来操作mysql服务器,可就没这个功能了,另外count()得到的结果还可以参与各种算术运算,还可以搭配其他sql使用

如果当前查询的列里有null,count(*)和count(具体列)是不同的,如下:

//count(具体列)不会把null算在内

指定具体列时是可以去重的

sum

 //用来计算查询的结果集合的总和

举例:

//如果有null也会自动去除

也可以进行表达式查询:

//查询的逻辑是,select Chinese + English + math把对应的列相加,得到一个临时表,再把这个临时表的行与行相加

//当加和的类型是字符串时也是可以加和的,如果字符串是数字字符串则直接转为对应的dobule类型数字,如果不能转则为0;

group by子句

Select 聚合函数(列名) from 表名 group by 列名(根据这个列分组)

举例:

//如果不用聚合函数每一个组对应的数据默认为,在原表中第一次出现的那个;

//如果针对分组后不使用聚合函数,此时的结果就是查询出每一组中的某个代表数据

//往往还是要搭配聚合函数使用,否则这里查询结果就没有意义

having

还可以配条件进行使用

分组之前的条件

这样就把张三排除在外了

分组之后的条件(having  一般写在  group by 后面)

//把平均值大于10000的岗位排除在外

//就是针对select role,avg(salary) from emp group by role;的查询结果进行条件筛选

同时使用两种条件

//即把张三排除在外,又把大与10000的排除在外

联合查询

笛卡尔积

实际开发中往往数据来自不同的表,所以需要多表联合查询。多表查询是对多张表的数据取笛卡尔积

笛卡尔积:笛卡尔积的计算很简单,就类似于排列组合。笛卡尔积是针对任意两张表之间的运算。

可以看作两个表相乘,在数学符号中,如果A = {a, b} 且 B = {1, 2},那么A × B的笛卡儿积为{(a, 1), (a, 2), (b, 1), (b, 2)}。

注意:关联查询可以对关联表使用别名。

使用方法:

select * from 表1,表2.....;

创建两张表

计算笛卡尔积:select * from student,course;

可以看见生成了一个很大的表,这个表就是两张表的笛卡尔积

//计算笛卡尔积时要注意如果两张表数据量都比较大时,就要考虑能不能使用笛卡尔积,因为笛卡尔积的表的数据量是,两张表的乘积如果数据量过大,可能会卡死服务器;

多表查询

我们再创建四张表

insert into classes(name, `desc`) values

('计算机系2019级1班', '学习了计算机原理、C和Java语言、数据结构和算法'),
('中文系2019级3班','学习了中国传统文学'),
('自动化2019级5班','学习了机械自动化');

insert into student(sn, name, qq_mail, classes_id) values
('09982','张三','xuanfeng@qq.com',1),
('00835','李四',null,1),
('00391','王五',null,1),
('00031','田六','xuxian@qq.com',1),
('00054','赵七',null,1),
('51234','胡八','say@qq.com',2),
('83223','刘九',null,2),
('09527','唐十','foreigner@qq.com',2);

insert into course(name) values
('Java'),
('中国传统文化'),
('计算机原理'),
('语文'),
('高阶数学'),
('英文');

insert into score2(score, student_id, course_id) values(70.5, 1, 1),
(98.5, 1, 3),(33, 1, 5),(98, 1, 6),
(60, 2, 1),(59.5, 2, 5),(33, 3, 1),
(68, 3, 3),(99, 3, 5),(67, 4, 1),
(23, 4, 3),(56, 4, 5),(72, 4, 6),
(81, 5, 1),(37, 5, 5),(56, 6, 2),
(43, 6, 4),(79, 6, 6),(80, 7, 2),(92, 7, 6);

我们再计算两张表的笛卡尔积时会有很多无效的数据,可以使用where条件进行筛选,筛选出那些有效数据,那么我们基于这个条件就可以进行两张表的查询

比如,我们来查询一下王五的成绩

1.先计算笛卡尔积

select * from student,score2 where student.id = score2.student_id;

//因为可能两张表会有名字一样的列,所以要使用‘.’来明确具体的列

查询结果:

//以上现实的是所有人的成绩

2.筛选出王五

select * from student,score2 where student.id = score2.student_id and name = '王五';

3.筛选出需要的列

上面的表看着还是不太方标,我们可以进一步进行筛选,只要我们想看到的

select student.name,score2.score,score2.course_id from student,score2 where student.id = score2.student_id and name = '王五';

这样就完成了在两个表之间查询

join..on实现多表查询

我们还可以直接使用join..on关键字进行查询

select student.name,score2.score,score2.course_id from student join score2 on student.id = score2.student_id and name = '王五';

//查询结果是一样的

//不过还是更推荐使用第一种

join on还可以一次查询多个只需要在前一个join on后面再加上一个join on就行

比如:

select student.name, course.name, score.score from student
 join score on student.id = score.student_id 
join course on score.course_id = course.id;

内连接

内连接就是要求查询的两个表中都要有数据,如果有一个没有就不会查询

不管使用where,还是join on都默认是内连接

举例:查询所有同学成绩,以及QQ邮箱

 select name,qq_mail,score from student,score2 where student.id = score2.student_id;

可以看见,因为唐十没有成绩,所以这里并不会显示他的QQ邮箱

//select 列 from 表1 inner join 表2 on 条件

//这里的inner只有在join on中才能添加,意思是表示内连接(可以省略,因为默认就是内连接)

外连接

外连接和内连接正好相反,外连接是尽可能显示较多的数据,即使表1没有数据为了显示表2数据,也会以null的形式显示表1;

//where不能表示外连接,只有join on可以

外连接分为左外连接和右外连接

左外连接

使用left join on,会以左边表的记录为主,尽可能的把左表记录都列出来,对于没有的右边数据,就改成 null

举例:select name,qq_mail,score from student left join score2 on student.id = score2.student_id;

可以看见即使唐十没有成绩,也会显示他的QQ邮箱

//如果是左表没有数据,那么查询结果回合内连接一样

右外连接

和左外连接相反,右外连接是以右表为基准,尽可能多的显示数据,如果左表没有数据则会显示null;(这里就不多做赘述了)

select 列 from 表1 right/left join 表2 on 条件

//这里的felt和right不可省略

自连接

自连接就是,自己和自己笛卡尔积,也就是左表和右表都是同一个表,用来解决一些特殊问题,可以将行转化成列;

//要将表指定别名,不然自连接就会重名,导致报错。

//在自连接的时候,使用多个条件来完成筛选。

举例:查询即选了1号课程又选了五号课程的同学

select * from score2 as s1,score2 as s2 
where s1.student_id = s2.student_id and
 s1.course_id = 1 and s2.course_id= 5;

子查询

子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询

单行子查询:返回一行记录的子查询

举例:查找张三的同学

//一般我们要先查找张三的班级id

现在将两个sql结合在一起也就是子查询

 select name from student where classes_id = 
(select classes_id from student where name = '张三');

多行子查询:返回多行记录的子查询

//要把‘=’换成in/not in或者exists/not exists

举例:查询java课程成绩,高阶数学课程成绩

select * from score2 where course_id in 
(select id from course where name = 'Java' or name = '高阶数学');

合并查询

在实际应用中,为了合并多个select的执行结果,可以使用集合操作符 union,union all。

//就是将查询到的两个结果集合并到一起

//使用union 和union all时,前后查询的结果集中,字段需要一致。

union

union会自动对查询到的两个结果集进行去重

举例:查询Chinese大于90 并且 English 大于 80的学生

    select * from score where Chinese > 90
    union
    select * from score where English > 80;

//相当于 select * from score where Chinese > 90 or English > 80;

union all

union all会显示全部数据不去重

举例:查询Chinese大于90 并且 English 大于 80的学生

select * from score where Chinese > 90
    union all
    select * from score where English > 80;

以上就是博主对mysql查询(进阶)的分享如果有不懂的或者有其他见解的欢迎在下方评论或者私信博主,也希望多多支持博主之后和博客!!🥰🥰

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

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

相关文章

【UE 网络】专用服务器和多个客户端加入游戏会话的过程,以及GameMode、PlayerController、Pawn的创建流程

目录 0 引言1 多人游戏会话1.1 Why?为什么要有这个1.2 How?怎么使用? 2 加入游戏会话的流程总结 🙋‍♂️ 作者:海码007📜 专栏:UE虚幻引擎专栏💥 标题:【UE 网络】在网络…

爬坑之 [‘NODE_ENV‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。]

在package.json中配置如下: 执行npm run dev启动 报错: 实际上, NODE_ENVdevelopment webpack-dev-server 这条脚本会合并为两条命令执行, 分别为: NODE_EVNdevelopment webpack-dev-server 这种写法在cmd中是不被支持的 解决…

Bootstrap更改默认的“请在电子邮件地址中包含@”

摘要: 今天开发一个外贸系统,必须全部英文的,但是使用到bootatrp 4的input标签的type"email"输入没有含“”符号时会提示:“请在电子邮件地址中包含”中文提示!一开始以为是中国下载的谷歌是浏览器自带的提示…

计算机网络知识整理笔记

目录 1.对网络协议的分层? 2.TCP/IP和UDP之间的区别? 3.建立TCP连接的三次握手? 4.断开TCP连接的四次挥手? 5.TCP协议如何保证可靠性传输? 6.什么是TCP的拥塞控制? 7.什么是HTTP协议? 8…

停车场智能化管理:车位引导系统实现车位资源优化与数据分析

随着城市汽车保有量的不断增长,停车难问题日益凸显。尤其是在高峰时段,寻找停车位和取车成为了许多车主的头疼问题。为了解决这一难题,维小帮智能车位引导系统应运而生,它利用先进的技术手段,帮助车主快速找到停车位&a…

【计算机图形学】期末考试知识点汇总

文章目录 第一章计算机图形学概述计算机图形学的定义计算机图形学的应用计算机图形学 vs 图像处理 vs模式识别图形显示器的发展及工作原理理解三维渲染管线 第二章 基本图元的扫描转换扫描转换直线的扫描转换DDA算法Bresenham算法中点画线算法圆的扫描转换中点画圆算法反走样 第…

2024steam夏促商店打不开、steam活动加载不了解决方法一览

今年的夏促终于开始了!目前可以看到很多精品小游戏在促销列表内,活动正式开启后还不知道又会是怎样的一幅场景。因为每年夏促都会有不少刚高考完的新手加入,遇到常见的steam商店打不开、活动页面不加载等问题不知道怎么解决。所以这里给大家准备了几种常…

从零创建深度学习张量库,支持gpu并行与自动微分

多年来,我一直在使用 PyTorch 构建和训练深度学习模型。尽管我已经学会了它的语法和规则,但总有一些东西激起了我的好奇心:这些操作内部发生了什么?这一切是如何运作的? 如果你已经到这里,你可能也有同样的…

mybatis的高级映射

mybatis的高级映射(重点) 表与表之间的关系: 一对一关系: 栗子:一个人对应一个身份证号 一对多关系: 栗子:一个用户可以有多个订单 1. 分析需求&…

权限维持-域环境单机版---粘滞键屏保登录

免责声明;本文仅做技术交流与学习,,, 目录 粘滞键: 粘滞键位置: 屏保&登录: 1、WinLogon配合无文件落地上线 结合ps命令: 2、屏幕保护生效后执行后门 粘滞键: Windows维权之粘滞键项维权-腾讯云开发者社区-腾讯云 (tencent.com) 系统自带的辅助功能进行替…

LNBxx21的功能

LNBxx21功能: LNBxx21 家族是为卫星LNB模块供电/连接LNB块与接收机的集成化解决方案。LNBxx21的很多功能可以让LNB电源/接口符合国际标准,此外,模块内还包括一个I2C总线接口,因为集成了一个升压直流-直流控制器,所以可…

MySQL InnoDB支持几种行格式

数据库表的行格式决定了一行数据是如何进行物理存储的,进而影响查询和DML操作的性能。 在InnoDB中,常见的行格式有4种: 1、COMPACT:是MySQL 5.0之前的默认格式,除了保存字段值外,还会利用空值列表保存null…

zabbix-agent2启动失败报错Unit zabbix-agent2.service entered failed state.

文章目录 1,用systemctl status zabbix-agent2查看报错状态2,用journalctl -xe查看一下报错日志3,再看一下zabbix的日志。4,错误修改5, 再次重启zabbix-agent2 1,用systemctl status zabbix-agent2查看报错…

【漏洞复现】Atlassian Confluence RCE(CVE-2023-22527)

产品简介 Atlassian Confluence 是一款由Atlassian开发的企业团队协作和知识管理软件,提供了一个集中化的平台,用于创建、组织和共享团队的文档、知识库、项目计划和协作内容。是面向大型企业和组织的高可用性、可扩展性和高性能版本。 0x02 漏洞概述 …

综合布线实训室建设可行性报告

1、 建设综合布线实训室的目的和意义 1.1 响应国家职业教育政策 在国家对职业教育的高度重视和政策支持下,综合布线实训室的建设不仅是对国家教育方针的积极响应,也是对技术教育改革的有力推动。通过这一平台,我们旨在培育出一批具有强烈实…

全面体验ONLYOFFICE 8.1版本桌面编辑器

ONLYOFFICE官网 在当今的数字化办公环境中,选择合适的文档处理工具对于提升工作效率和团队协作至关重要。ONLYOFFICE 8.1版本桌面编辑器,作为一款集成了多项先进功能的办公软件,为用户提供了全新的办公体验。今天,我们将深入探索…

[linux]sed命令基础入门详解

sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这…

imx6ull/linux应用编程学习(5)FrameBuffer的应用编程

什么是FrameBuffer? Frame 是帧的意思, buffer 是缓冲的意思,所以 Framebuffer 就是帧缓冲, 这意味着 Framebuffer 就是一块内存,里面保存着一帧图像。帧缓冲(framebuffer)是 Linux 系统中的一种…

泰迪智能科技携手广州番禺职业技术学院共建上进双创工作室

为充分发挥校企双方的优势,促进产教融合,发挥职业教育为社会、行业、企业服务的作用,为企业培养更多高素质、高技能的应用型人才的同时也为学生实习、就业提供更大空间。6月26日,“泰迪广州番禺职业技术学院上进双创工作室签约授牌…

【C++ | 类型转换】转换构造函数、类型转换运算符 详解及例子源码

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 ⏰发布时间⏰: 本文未经允许…