MySQL查询全解

news2024/11/13 14:47:47
接下来我们就要进入重中之重-----MySQL查询的学习中了.激动激动!!!!!!


1 聚合查询

常见的统计总数、计算平局值等操作,可以使用聚合函数来实现,常见的聚合函数有:

COUNT

案例:
-- 统计班级共有多少同学
SELECT COUNT (*) FROM student;
SELECT COUNT ( 0 ) FROM student;

如果使用count等聚合函数的时候

count和()之间加上空格,此时就会使函数执行失败.

1)先执行 select* from exam result

2)根据上述的结果,执行 count

SUM

-- 统计班级收集的 qq_mail 有多少个, qq_mail NULL 的数据不会计入结果
SELECT COUNT (qq_mail) FROM student;
-- 统计数学成绩总分
SELECT SUM (math) FROM exam_result;
-- 不及格 < 60 的总分,没有结果,返回 NULL
SELECT SUM (math) FROM exam_result WHERE math < 60 ;

要确保求和的列是数字,如果是字符串,就会出现问题

原则上不应该针对字符串进行上述的求和操作.

即使你的字符串带有数字,也不一定可以进行算术运算.

手机号码/身份证号码 .....

null,null 和其他数值进行各种运算,结果都是 null

但是在sum比较特殊,遇到null会直接跳过,不参与运算 ~~

要求列是数字

AVG

-- 统计平均总分
SELECT AVG (chinese + math + english) 平均总分 FROM exam_result;

MAX

-- 返回英语最高分
SELECT MAX (english) FROM exam_result;

MIN

-- 返回 > 70 分以上的数学最低分
SELECT MIN (math) FROM exam_result WHERE math > 70 ;

1.2 GROUP BY子句

SELECT 中使用 GROUP BY 子句可以对指定列进行分组查询。需要满足:使用 GROUP BY 进行分组查 询时,SELECT 指定的字段必须是 分组依据字段 ,其他字段若想出现在 SELECT 中则必须包含在聚合函 数中。
select........from ...group by ...
案例:
准备测试表及数据:职员表,有 id (主键)、 name (姓名)、 role (角色)、 salary (薪水)
create table emp(
id int primary key auto_increment,
name varchar ( 20 ) not null ,
role varchar ( 20 ) not null ,
salary numeric ( 11 , 2 )
);
insert into emp(name, role, salary) values
( ' 马云 ' , ' 服务员 ' , 1000.20 ),
( ' 马化腾 ' , ' 游戏陪玩 ' , 2000.99 ),
( ' 孙悟空 ' , ' 游戏角色 ' , 999.11 ),
( ' 猪无能 ' , ' 游戏角色 ' , 333.5 ),
( ' 沙和尚 ' , ' 游戏角色 ' , 700.33 ),
( ' 隔壁老王 ' , ' 董事长 ' , 12000.66 );
查询每个角色的最高工资、最低工资和平均工资
select role,max(salary),min(salary),avg(salary) from emp group by role;

1.3 HAVING

 GROUP BY 子句进行分组以后,需要对分组结果 进行条件过滤时,不能使用 WHERE 语句,而需要用 HAVING

1)分组之后的条件

每个岗位查询平均薪资,排除平均薪资超过5w的记录~

显示平均工资低于 1500 的角色和它的平均工资
select role,max(salary),min(salary),avg(salary) from emp group by role having avg(salary)< 1500 ;

2)一个查询,可以同时包含,分组前的条件,和分组后的条件.

统计每个岗位平均薪资,排除张三,也排除平均值超过5w的结果

当前这里的情况,就是能够把两种条件结合到一起.

后续做类似的场景的时候,需要区分好,条件是分组之前的,还是分组之后的.

2 联合查询

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


先明确要查询的数据,都在哪几个表中.
a)笛卡尔积.
b)指定连接条件,把一些无意义的数据干掉.
c)进一步添加筛选条件.
d)把查询的列进行精简.

进行计算笛卡尔积的表,要能够包含列进行关联.

注意 :关联查询可以对关联表使用别名。
初始化测试数据:
指定连接条件
查询操作后列表
把列经行精简

内连接

语法:
select 字段 from 表1 别名1 [inner] join 表2 别名2 on 连接条件 and 其他条件;
select 字段 from 表1 别名1 ,表2 别名2 where 连接条件 and 其他条件;
案例:
1 )查询 许仙 同学的 成绩
select sco .score from student stu inner join score sco on stu .id =sco .student_id
and stu .name = ' 许仙 ' ;
-- 或者
select sco .score from student stu, score sco where stu .id =sco .student_id and
stu .name = ' 许仙 ' ;
2 )查询所有同学的总成绩,及同学的个人信息:
-- 成绩表对学生表是多对 1 关系,查询总成绩是根据成绩表的同学 id 来进行分组的
SELECT
stu .sn ,
stu .NAME ,
stu .qq_mail ,
sum( sco .score )
FROM
student stu
JOIN score sco ON stu .id = sco .student_id
GROUP BY
sco .student_id ;
3 )查询所有同学的成绩,及同学的个人信息:
-- 查询出来的都是有成绩的同学, 老外学中文 同学 没有显示
select * from student stu join score sco on stu .id =sco .student_id ;

外连接

外连接分为左外连接和右外连接。如果联合查询,左侧的表完全显示我们就说是左外连接;右侧的表完 全显示我们就说是右外连接。
语法
-- 左外连接,表 1 完全显示
select 字段名   from 表名 1 left join 表名 2 on 连接条件 ;
-- 右外连接,表 2 完全显示
select 字段 from 表名 1 right join 表名 2 on 连接条件 ;

外连接,也是join on这样的写法(不支持from多个表 .... )

给join前面加上left/right就是表示外连接.

-- “ 老外学中文 同学 没有考试成绩,也显示出来了
select * from student stu left join score sco on stu .id =sco .student_id ;
左外连接就是以左表为基准
能够确保左表中的每个记录都出现在最终结果里.
如果左表中的记录,在右表中没有对应的记录,此时就会把右表中的相关字段,填成 NULL
-- 对应的右外连接为:
select * from score sco right join student stu on stu .id =sco .student_id ;
右外连接,是以右表为基准
然后确保右表中的每个记录都出现在最终结果里
如果右表中的某个记录在左表里没有对应的相关字段,填成 NULL
-- 学生表、成绩表、课程表 3 张表关联查询
SELECT
stu .id ,
stu .sn ,
stu .NAME ,
stu .qq_mail ,
sco .score ,
sco .course_id ,
cou .NAME
FROM
student stu
LEFT JOIN score sco ON stu .id = sco .student_id
LEFT JOIN course cou ON sco .course_id = cou .id
ORDER BY
stu .id ;
总结:
全外连接

5 自连接

自连接是指在同一张表连接自身进行查询
案例:
显示所有 计算机原理 成绩比 “Java” 成绩高的成绩信息
-- 先查询 计算机原理 “Java” 课程的 id
select id,name from course where name= 'Java' or name= ' 计算机原理 ' ;
-- 再查询成绩表中, 计算机原理 成绩比 “Java” 成绩 好的信息
SELECT
s1.*
FROM
score s1,
score s2
WHERE
s1 .student_id = s2 .student_id
AND s1 .score < s2 .score
AND s1 .course_id = 1
AND s2 .course_id = 3 ;

针对这一行来说,左侧的score列就是计算机原理的分数,右侧的score 列就是java的分数

这里原来的行之间的关系变成了列之间的关系了.

按照 学生id 做为连接条件的时候,此时 分数 和 课程id 就相当于是在进行排列组合

这些排列组合里就包括了两个神奇的数据 !!!

-- 也可以使用 join on 语句来进行自连接查询
SELECT
s1.*
FROM
score s1
JOIN score s2 ON s1 .student_id = s2 .student_id
AND s1 .score < s2 .score
AND s1 .course_id = 1
AND s2 .course_id = 3 ;

sql 中进行的条件查询,是针对两个列进行比较的 !!不能比较两个行 !!

注解:

自连接,本质上就能把 行关系,转换成 列关系.

如果当前发现,要查询的条件,是针对两行,而不是两列就可以考虑使用自连接,进行转换.

自连接的时候,表非常大,此时的连接开销,也会非常庞大.容易就把数据库搞死了.

以上查询只显示了成绩信息,并且是分布执行的。要显示学生及成绩信息,并在一条语句显示:
SELECT
stu.*,
s1 .score Java,
s2 .score 计算机原理
FROM
score s1
JOIN score s2 ON s1 .student_id = s2 .student_id
JOIN student stu ON s1 .student_id = stu .id
JOIN course c1 ON s1 .course_id = c1 .id
JOIN course c2 ON s2 .course_id = c2 .id
AND s1 .score < s2 .score
AND c1 .NAME = 'Java'
AND c2 .NAME = ' 计算机原理 ' ;
案例:查询所有同学的成绩,及同学的个人信息,如果该同学没有成绩,也需要显示

子查询(不推荐)

子查询是指嵌入在其他 sql 语句中的 select 语句,也叫嵌套查询
单行子查询:返回一行记录的子查询
查询与 不想毕业 同学的同班同学:
select * from student where classes_id=(select classes_id from student where name='不想毕业');
多行子查询:返回多行记录的子查询
案例:查询 语文 英文 课程的成绩信息
1. [NOT] IN 关键字:
可以使用多列包含:
-- 使用 IN
select * from score where course_id in ( select id from course where
name= ' 语文 ' or name= ' 英文 ' );
-- 使用 NOT IN
select * from score where course_id not in ( select id from course where
name!= ' 语文 ' and name!= ' 英文 ' );
-- 插入重复的分数: score, student_id, course_id 列重复
insert into score(score, student_id, course_id) values
-- 黑旋风李逵
( 70.5 , 1 , 1 ),( 98.5 , 1 , 3 ),
-- 菩提老祖
( 60 , 2 , 1 );
-- 查询重复的分数
SELECT
*
FROM
score
WHERE
( score, student_id, course_id ) IN ( SELECT score, student_id,
course_id FROM score GROUP BY score, student_id, course_id HAVING
count ( 0 ) > 1 );
2. [NOT] EXISTS 关键字:

子查询本身就不推荐使用了.

exists 非常消耗时间,背后会触发大量的硬盘IO操作.并且代码理解起来也比较复杂 ....

-- 使用 EXISTS
select * from score sco where exists ( select sco .id from course cou
where (name= ' 语文 ' or name= ' 英文 ' ) and cou .id = sco .course_id );
-- 使用 NOT EXISTS
select * from score sco where not exists ( select sco .id from course cou
where (name!= ' 语文 ' and name!= ' 英文 ' ) and cou .id = sco .course_id );
from 子句中使用子查询:子查询语句出现在 from 子句中。这里要用到数据查询的技巧,把一个
子查询当做一个临时表使用。
查询所有比 中文系 2019 3 平均分高的成绩信息:
-- 获取 中文系 2019 3 的平均分,将其看作临时表
SELECT
avg( sco .score ) score
FROM
score sco
JOIN student stu ON sco .student_id = stu .id
JOIN classes cls ON stu .classes_id = cls .id
WHERE
cls .NAME = ' 中文系 2019 3 ' ;
查询成绩表中,比以上临时表平均分高的成绩:
SELECT
*
FROM
score sco,
(
SELECT
avg( sco .score ) score
FROM
score sco
JOIN student stu ON sco .student_id = stu .id
JOIN classes cls ON stu .classes_id = cls .id
WHERE

cls .NAME = ' 中文系 2019 3 '
) tmp
WHERE
sco .score > tmp .score ;

合并查询

在实际应用中,为了合并多个 select 的执行结果,可以使用集合操作符 union union all 。使用 UNION 和UNION ALL 时,前后查询的结果集中,字段需要一致。

union

该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行
案例:查询 id 小于 3 ,或者名字为 英文 的课程:
select * from course where id< 3
union
select * from course where name= ' 英文 ' ;

-- 或者使用 or 来实现
select * from course where id< 3 or name= ' 英文 ' ;

union all

该操作符用于取得两个结果集的并集。当使用该操作符时,不会去掉结果集中的重复行。
案例:查询 id 小于 3 ,或者名字为 “Java” 的课程
-- 可以看到结果集中出现重复数据 Java
select * from course where id< 3
union all
select * from course where name='英文';

 

如果您觉得有失偏颇请您在评论区指正,如果您觉得不错的话留个好评再走吧!!

您的鼓励就是对我最大的支持!  ! !

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

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

相关文章

打字侠又发布更新啦,新增小学生课文打字

历经一个月的时间&#xff0c;打字侠又发布了新的功能需求啦&#x1f389;&#x1f389;&#x1f389; 新功能1&#xff1a;提供面向小学生的课文打字练习 具体包括&#xff1a;从小学二年级到小学六年级的中文和英文词汇&#xff0c;总共约2000个中文词组和1600个英文单词。这…

不容错过!最简单的Cursor无限注册攻略!

文章目录 前言具体用法下载程序登陆授权查看支持的模型 如何使用引用 前言 Cursor 是一个编程软件,就像Vscode一样,可以让你轻松地编写、调试和运行代码。不一样的是它内置了8个热门AI模型,什么GPT4、Claude3最新模型,都能免费试用14天,我们只需要任意邮箱注册账号,然后下载程序…

多目标应用:基于多目标雾凇算法(MORIME)的移动机器人路径规划研究(提供MATLAB代码)

一、机器人路径规划介绍 移动机器人&#xff08;Mobile robot&#xff0c;MR&#xff09;的路径规划是 移动机器人研究的重要分支之&#xff0c;是对其进行控制的基础。根据环境信息的已知程度不同&#xff0c;路径规划分为基于环境信息已知的全局路径规划和基于环境信息未知或…

Leetcode3243. 新增道路查询后的最短距离 I

Every day a Leetcode 题目来源&#xff1a;3243. 新增道路查询后的最短距离 I 解法1&#xff1a;广度优先搜索 暴力。 每次加边后重新跑一遍 BFS&#xff0c;求出从 0 到 n−1 的最短路。 代码&#xff1a; /** lc appleetcode.cn id3243 langcpp** [3243] 新增道路查询…

一款免费开源功能强大的截图工具

Ksnip是一款功能强大的跨平台开源截图工具&#xff0c;基于Qt开发&#xff0c;支持Linux、Windows和macOS操作系统。Ksnip的主要特点包括多种截图模式和丰富的标注功能。 核心功能 截图模式&#xff1a;自定义矩形区域截图全屏截图当前显示器截图活动窗口截图鼠标下的窗口截图…

Eureka原理大起底:从菜鸟到高手,轻松玩转服务注册与发现的艺术!Eureka不只是个名字,它是微服务世界的‘万能钥匙’,解锁无限可能!

第一章 引言 Eureka原理&#xff0c;作为服务发现领域的一个重要理论&#xff0c;对于构建高可用的分布式系统具有指导意义。随着微服务架构的兴起&#xff0c;服务之间的发现和通信变得尤为关键&#xff0c;Eureka原理为解决这一问题提供了有效的方案。本文旨在深入探讨Eurek…

【精选】基于Hadoop的用户网站浏览分析的设计与实现(全网最新定制,独一无二)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

联盟 | ITNIO TECH颂量 X PartnerShare,助力跨境企业高效出海

*本文章转载自ITNIO TECH颂量 在全球化浪潮中&#xff0c;高效是出海企业在全球市场竞争中获胜的重要秘诀之一。因此&#xff0c;跨境企业除了需要单一的技术或服务&#xff0c;还需要能够整合多种资源、提供一站式解决方案的合作伙伴。ITNIO TECH颂量宣布与SaaS推广分销联盟系…

前端面试题-手撕代码题

1. 实现 Promise.all&#xff0c;或者 实现 Promise.allSettled &#xff08;1&#xff09;promise.all: 传入一个promise数组&#xff0c;其中所有promise都变为成功状态&#xff0c;返回一个数组&#xff0c;数组内是各个promise的返回&#xff1b;若任意传入的promise变为…

16:螺丝孔和MARK点布局

正版mark布局 ①正面3个。背面3个 ②离板边5mm 螺丝孔 板边

Mako 试玩|编译速度6到飞起!

嗨&#xff01;我是小谷&#xff0c;大家好久不见&#xff5e; 今天想和大家分享的技术是 Mako , 一款编译构建速度比 webpack 快 10 倍&#xff5e;100 倍的前端构建工具。 网上有传言将 Mako 比作前端脚手架里的 鲨鱼心脏 &#xff0c;有了它&#xff0c;前端工程师工作的幸…

重塑未来:碳捕集与存储(CCS)的革命性突破与可持续发展路径

随着全球气候变化的加剧&#xff0c;减少二氧化碳&#xff08;CO₂&#xff09;排放已成为应对气候变化的关键任务之一。碳捕集与存储&#xff08;CCS&#xff09;技术因其能够直接从源头捕捉CO₂并将其安全存储&#xff0c;避免其进入大气层&#xff0c;而受到广泛关注。CCS被…

QT做一个USB HID设备识别软件

1.下载 HidApi库&#xff1a;GitHub - yigityuce/HidApi: Human Interface Device Api (HidApi) with C 2.pro文件添加 DEFINES - UNICODE LIBS -lsetupapi 3.建立三个对象 HidApi hidApi;HidDevice hidDev;//HID设备HidDeviceList devList;//HID设备列表 4.对 HID 设备进…

大连网站建设手机网页页面设计

在现代社会&#xff0c;随着智能手机的普及&#xff0c;越来越多的用户选择通过手机访问网站&#xff0c;这使得移动端网页设计的重要性日益凸显。大连作为一个经济和文化中心&#xff0c;网站建设行业也在不断发展。针对大连的网站建设&#xff0c;手机网页页面设计需要特别注…

在街子古镇游的台湾自媒体人

刚刚看到《网易首页 > 网易号》于昨&#xff08;8月31日逾23时&#xff09;天深夜发布《崇州看点》的新闻报道《台湾自媒体人天府游记&#xff0c;被崇州的这个地方深深吸引……》&#xff0c;虽觉得新鲜但并不感到惊奇。因为在去年12月5日&#xff0c;《人民日报海外版》和…

CAS单点登录说明文档

CAS单点登录说明文档 目录 1. 下载CAS 2. 下载xmlsectool 3. 安装xmlsectool 4. 打包CAS 5. 连接服务器 6. 安装Tomcat服务器 7. 创建CAS程序 8. 修改CAS界面 9. 修改CAS服务端口 10. 修改CAS服务名称 11. 修改CAS日志路径 12. 创建数据库 13. 启动CA…

PD快充协议

表格中电压电流档位的电流都是在该电压下输出的最大电流。在充电的过程当中&#xff0c;充电器输出的电流会根据充电设备的需求进行动态调整&#xff0c;不是说握手了20V 5A档位充电器输出的电流就一直都是5A。 这个屏幕显示了几种常见的快充协议及其支持的电压、电流和功率。这…

kubeadm部署 Kubernetes(k8s) 高可用集群【V1.28 】

kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。 calico.yaml kubernertes-dashboard.yaml 1. 安装要求 在开始之前&#xff0c;部署Kubernetes集群机器需要满足以下几个条件&#xff1a; 10台机器&#xff0c;操作系统Openeuler22.03 LTS SP4硬件配置&…

2024年【制冷与空调设备运行操作】找解析及制冷与空调设备运行操作实操考试视频

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 制冷与空调设备运行操作找解析参考答案及制冷与空调设备运行操作考试试题解析是安全生产模拟考试一点通题库老师及制冷与空调设备运行操作操作证已考过的学员汇总&#xff0c;相对有效帮助制冷与空调设备运行操作实操…

【大模型】Agent基础知识

目录 1. 基本框架2. 常见推理模式2.1 ReAct: Synergizing Reasoning and Acting in Language Models2.2 Reflection2.3 LATS: Language Agents Tree Search 3. 微调3.1 全模型微调&#xff08;Full Model Fine-Tuning&#xff09;3.2 冻结部分层微调&#xff08;Layer-wise Fin…