【WEEK6】 【DAY2】DQL查询数据-第二部分【中文版】

2024.4.2 Tuesday
接上文【WEEK6】 【DAY1】DQL查询数据-第一部分【中文版】

目录

  • 4.4.连接查询
    • 4.4.1.JOIN 对比
    • 4.4.2.七种JOIN
    • 4.4.3.例
      • 4.4.3.1.本例中INNER JOIN和RIGHT JOIN结果相同
      • 4.4.3.2.LEFT JOIN
      • 4.4.3.3.查询缺考的同学
      • 4.4.3.4.思考题:查询参加了考试的同学信息(学号、学生姓名、科目名称、分数)
      • 4.4.3.5.自连接(了解)
        • 表自己和自己连接,核心是一张表拆成两张一样的表
        • 查询学员所属的年级(学号、姓名、年级名称)
        • 查询科目所属的年级(科目名称,年级名称)
        • 查询参加了'高等数学-1'考试的同学信息(学号、学生姓名、科目名称、分数)
  • 4.5.排序和分页
    • 4.5.1.排序
      • 4.5.1.1.ORDER BY 通过哪个字段排序、怎么排
    • 4.5.2.分页
      • 4.5.2.1.显示降序排列的跳过了最高成绩的五条数据
      • 4.5.2.2.查询 高等数学-3 课程成绩排名前10的学生,而且分数不低于80 的学生信息(学号、姓名、课程名称、分数)
  • 4.6.子查询
    • 4.6.1.查询 高等数学-3 所有考试结果(学号、课程编号、成绩)降序排列
      • 4.6.2.1.方式1:使用连接查询+子查询
      • 4.6.1.2.方式2:使用子查询(方式:由里及外)
    • 4.6.2.查询课程‘高等数学-4’分数大于80的同学的学号、姓名
      • 4.6.2.1.方式1:使用连接查询+子查询
      • 4.6.2.2.方式2:使用连接查询
      • 4.6.2.3.方式3:使用子查询
    • 4.6.3.练习题
      • 4.6.3.1.查 C语言-1 的前5名学生的成绩信息(学号,姓名,分数)
      • 4.6.3.2.使用子查询,查询刘福同学所在的年级名称
  • 4.7.分组和过滤

4.4.连接查询

4.4.1.JOIN 对比

操作符名称描述
INNER JOIN如果表中至少一个匹配,则返回行
LEFT JOIN即使右表中没有匹配,也从左表中返回所有的行
RIGHT JOIN即使左表中没有匹配,也从右表中返回所有的行

4.4.2.七种JOIN

在这里插入图片描述

4.4.3.例

/*
连接查询
   如需要多张数据表的数据进行查询,则可通过连接运算符实现多个查询
内连接 inner join
   查询两个表中的结果集中的交集
外连接 outer join
   左外连接 left join
       (以左表作为基准,右边表来一一匹配,匹配不上的,返回左表的记录,右表以NULL填充)
   右外连接 right join
       (以右表作为基准,左边表来一一匹配,匹配不上的,返回右表的记录,左表以NULL填充)
       
等值连接和非等值连接

自连接
*/
-- 联表查询join --
-- 查询参加了考试的同学的学号、姓名、分数,科目编号
/*思路
1. 分析思路,分析每个需要查询的字段分别来自哪些表,
2. 确定使用哪种连接查询(单独查询某个表后的结果要能连成完整的需求的表):7种
-> 确定交叉点(这两个表中哪个数据是相同的)
判断的条件:根据两张表中相同的字段名联立,如:student表中的studentNo = result表中的studentNo
*/
-- JOIN +连接的表 + ON +判断的条件	连接查询(一个具体的语法)
-- WHERE		等值查询

4.4.3.1.本例中INNER JOIN和RIGHT JOIN结果相同

-- INNER JOIN
SELECT s.studentNo, studentName, SubjectNo, StudentResult	-- 交叉点的字段名要声明使用哪一张表里的
FROM student AS s
INNER JOIN result AS r
WHERE s.studentNo = r.studentNo	-- on是连表前的条件,where是连表后的过滤
-- RIGHT JOIN,以右表的字段为准
SELECT s.studentNo, studentName, SubjectNo, StudentResult
FROM student AS s	-- 左表
RIGHT JOIN result AS r	-- 右表
ON s.studentNo = r.studentNo

在这里插入图片描述

4.4.3.2.LEFT JOIN

-- LEFT JOIN,以左表的字段为准 
-- 和右连接的区别:显示了没有考试成绩的人员的相关信息
SELECT s.studentNo, studentName, SubjectNo, StudentResult
FROM student AS s	-- 右表
LEFT JOIN result AS r	-- 左表
ON s.studentNo = r.studentNo

在这里插入图片描述

4.4.3.3.查询缺考的同学

-- 查询缺考的同学
SELECT s.studentNo, studentName, SubjectNo, StudentResult
FROM student s	-- 右表
LEFT JOIN result r	-- 左表
ON s.studentNo = r.studentNo
WHERE StudentResult IS NULL

在这里插入图片描述

4.4.3.4.思考题:查询参加了考试的同学信息(学号、学生姓名、科目名称、分数)

-- 思考题:查询参加了考试的同学信息(学号、学生姓名、科目名称、分数)
/*思路
1. 分析思路,分析每个需要查询的字段分别来自哪些表,student、result、subject连接查询
2. 确定使用哪种连接查询(单独查询某个表后的结果要能连成完整的需求的表):7种
-> 确定交叉点(这两个表中哪个数据是相同的)
判断的条件:student表中的studentNo = result表中的studentNo
*/
-- 10~11两行(第一个连接处)from这里是左表 join这里是右表 选择以哪张表作为基准 决定用left还是right
SELECT s.studentNo, studentName, subjectName, `StudentResult`
FROM student s
RIGHT JOIN result r
ON r.studentNo = s.studentNo
INNER JOIN `subject` sub
ON r.subjectNo = sub.subjectNo

在这里插入图片描述

#标准思考步骤
-- 我要查询哪些数据 -> SELECT ...
-- 从哪几个表中查 -> FROM 某表 JOIN 要连接的某表 ON 这俩表的交叉条件
-- 假设存在多张表查询,则反复上一步,先从连接两张表开始

4.4.3.5.自连接(了解)

表自己和自己连接,核心是一张表拆成两张一样的表
  1. 父类
    在这里插入图片描述

  2. 子类
    在这里插入图片描述

  3. 最终希望的查询结果
    在这里插入图片描述

#自连接
-- 编写SQL语句,将栏目的父子关系呈现出来 (父栏目名称,子栏目名称)
-- 查询父子信息:把一张表拆成两张一模一样的表
SELECT a.`categoryName` AS '父栏目', b.`categoryName` AS '子栏目'
FROM `category` AS a, `category` AS b
WHERE a.`categoryid` = b.`pid`

在这里插入图片描述

查询学员所属的年级(学号、姓名、年级名称)
-- 查询学员所属的年级(学号、姓名、年级名称)
SELECT studentNo, studentName, `GradeName`
FROM student s
INNER JOIN `grade` g
ON s.`GradeID` = g.`GradeID`

在这里插入图片描述

查询科目所属的年级(科目名称,年级名称)
-- 查询科目所属的年级(科目名称,年级名称)
SELECT `SubjectName`,`GradeName`
FROM `subject` sub
INNER JOIN `grade` g
ON sub.`GradeID` = g.`GradeID`

在这里插入图片描述

查询参加了’高等数学-1’考试的同学信息(学号、学生姓名、科目名称、分数)
-- 查询参加了'高等数学-1'考试的同学信息(学号、学生姓名、科目名称、分数)
SELECT s.`StudentNo`, `StudentName`, `SubjectName`, `StudentResult`
FROM student s
INNER JOIN `result` r
ON s.StudentNo = r.StudentNo
INNER JOIN `subject` sub
ON r.`SubjectNo` = sub.`SubjectNo`
WHERE subjectName = '高等数学-1'

在这里插入图片描述

4.5.排序和分页

4.5.1.排序

4.5.1.1.ORDER BY 通过哪个字段排序、怎么排

语法 : ORDER BY
   ORDER BY 语句用于根据指定的列对结果集进行排序。
   ORDER BY 语句默认按照ASC升序对记录进行排序。
   如果您希望按照降序对记录进行排序,可以使用 DESC 关键字。
-- 分页limit 和排序order by --
#排序:升序是ASC,降序是DESC
#语法:ORDER BY 通过哪个字段排序、怎么排
SELECT s.`StudentNo`, `StudentName`, `SubjectName`, `StudentResult`
FROM student s
INNER JOIN `result` r
ON s.StudentNo = r.StudentNo
INNER JOIN `subject` sub
ON r.`SubjectNo` = sub.`SubjectNo`
WHERE subjectName = '高等数学-1'
ORDER BY StudentResult DESC	-- 查询的结果根据成绩‘降序’排序
-- 只需把DESC修改成ASC即可将查询的结果根据成绩‘升序’排序

在这里插入图片描述
在这里插入图片描述

4.5.2.分页

语法 : SELECT * FROM table LIMIT [offset偏移量(跳过offset的页数),] rows(每一页有多少数据) | rows OFFSET offset
好处 : (用户体验,网络传输,查询压力)

4.5.2.1.显示降序排列的跳过了最高成绩的五条数据

#分页
/*
第一页:LIMIT 0,5(跳过0条数据,这页5条数据)
第二页:LIMIT 5,5(跳过5条数据,这页5条数据)
第三页:LIMIT 10,5(跳过10条数据,这页5条数据)
......
第N页:LIMIT (pageNo - 1)*pageSize, pageSize
				其中,pageNo指页码,pageSize指单个页面显示的条数,总页数=|_总条数/每页条数_|
*/
-- 显示降序排列的跳过了最高成绩的五条数据
SELECT s.`StudentNo`, `StudentName`, `SubjectName`, `StudentResult`
FROM student s
INNER JOIN `result` r
ON s.StudentNo = r.StudentNo
INNER JOIN `subject` sub
ON r.`SubjectNo` = sub.`SubjectNo`
WHERE subjectName = '高等数学-1'
ORDER BY StudentResult DESC, StudentNo
LIMIT 1,5

在这里插入图片描述

4.5.2.2.查询 高等数学-3 课程成绩排名前10的学生,而且分数不低于80 的学生信息(学号、姓名、课程名称、分数)

-- 查询 高等数学-3 课程成绩排名前10的学生,而且分数不低于80 的学生信息(学号、姓名、课程名称、分数)
SELECT s.`StudentNo`, `StudentName`, `SubjectName`, `StudentResult`
FROM `student` s
INNER JOIN `result` r
ON s.StudentNo = r.StudentNo
INNER JOIN `subject` sub
ON r.`SubjectNo` = sub.`SubjectNo`
WHERE subjectName = '高等数学-3' AND StudentResult >= 80
ORDER BY StudentResult DESC, StudentNo
LIMIT 0,10

在这里插入图片描述

4.6.子查询

4.6.1.查询 高等数学-3 所有考试结果(学号、课程编号、成绩)降序排列

4.6.2.1.方式1:使用连接查询+子查询

-- 子查询 --
-- 1.查询 高等数学-3 所有考试结果(学号、课程编号、成绩)降序排列
#方式1:使用连接查询
SELECT `StudentNo`, sub.`SubjectNo`, `StudentResult`	-- 或者r.SubjectNo亦可
FROM `result` r
INNER JOIN `subject` sub
ON r.SubjectNo = sub.SubjectNo
WHERE SubjectName = '高等数学-3'
ORDER BY StudentResult DESC

4.6.1.2.方式2:使用子查询(方式:由里及外)

#方式二:使用子查询(方式:由里及外)
SELECT `StudentNo`, `SubjectNo`, `StudentResult`
FROM `result`
WHERE SubjectNo = (
	SELECT SubjectNo 
	FROM `subject`
	WHERE SubjectName = '高等数学-3'
)
ORDER BY StudentResult DESC

在这里插入图片描述

4.6.2.查询课程‘高等数学-4’分数大于80的同学的学号、姓名

4.6.2.1.方式1:使用连接查询+子查询

-- 2.查询课程‘高等数学-4’分数大于80的同学的学号、姓名
#方式1:使用连接查询+子查询
-- 第一部分:有获得(任意一科)分数大于80分的学生学号、姓名
SELECT DISTINCT s.`StudentNo`, `StudentName`	-- 不加DISTINCT则每个符合条件的查询结果都会出现(同一个人名和学号可能出现多次)
FROM student s
INNER JOIN result r
ON r.StudentNo = s.StudentNo	-- 到这里是(任意一门)有成绩的学生
WHERE `StudentResult` > 80
-- 第二部分:在此基础上再增加科目‘高等数学-4’,不想再连表查询->改为查询该课的编号
SELECT DISTINCT s.`StudentNo`, `StudentName`
FROM student s
INNER JOIN result r
ON r.StudentNo = s.StudentNo
WHERE `StudentResult` > 80 AND `SubjectNo` = (
	SELECT SubjectNo
	FROM `subject`
	WHERE `SubjectName` = '高等数学-4'
)

4.6.2.2.方式2:使用连接查询

#方式2:使用连接查询
SELECT DISTINCT s.`StudentNo`, `StudentName`
FROM student s
INNER JOIN result r
ON r.StudentNo = s.StudentNo
INNER JOIN `subject` sub
ON r.SubjectNo = sub.SubjectNo
WHERE `StudentResult` > 80 AND SubjectName = '高等数学-4'

4.6.2.3.方式3:使用子查询

#方式3:使用子查询
SELECT StudentNo, StudentName FROM student WHERE StudentNo IN (		-- IN最好用等号替换,因为只有一个条件时=的查询效率更高
	SELECT StudentNo FROM result WHERE StudentResult > 80 AND SubjectNo = (
		SELECT SubjectNo FROM `subject` WHERE `SubjectName` = '高等数学-4'
	)
)

在这里插入图片描述

4.6.3.练习题

4.6.3.1.查 C语言-1 的前5名学生的成绩信息(学号,姓名,分数)

/*
练习题目:
   查 C语言-1 的前5名学生的成绩信息(学号,姓名,分数)
   使用子查询,查询刘福同学所在的年级名称
*/
-- 1
SELECT s.StudentNo, StudentName, StudentResult 
FROM student s
INNER JOIN result r
ON s.StudentNo = r.StudentNo
WHERE SubjectNo = (
	SELECT SubjectNo FROM `subject` WHERE SubjectName = 'C语言-1'
)
ORDER BY StudentResult DESC
LIMIT 0,5

在这里插入图片描述

4.6.3.2.使用子查询,查询刘福同学所在的年级名称

-- 2
SELECT GradeName FROM grade WHERE GradeID = (
	SELECT GradeID FROM student WHERE StudentName = '刘福'
)

在这里插入图片描述

4.7.分组和过滤

详情见:5.2.5.题目
【WEEK6】 【DAY3】MySQL函数【中文版】

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

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

相关文章

Visual Studio安装下载进度为零已解决

因为在安装pytorch3d0.3.0时遇到问题,提示没有cl.exe,VS的C编译组件,可以添加组件也可以重装VS。查了下2019版比2022问题少,选择了安装2019版,下面是下载安装时遇到的问题记录,关于下载进度为零网上有三类解…

redis的哈希Hash

哈希是一个字符类型的字段和值的映射表,简单来说就是一个键值对的集合。 查看里面的name或者age在不在里面,0说明已经删了的 用来获取person里的键

[C#]使用OpencvSharp去除面积较小的连通域

【C介绍】 关于opencv实现有比较好的算法,可以参考这个博客OpenCV去除面积较小的连通域_c#opencv 筛选小面积区域-CSDN博客 但是没有对应opencvsharp实现同类算法,为了照顾懂C#编程同学们,因此将 去除面积较小的连通域算法转成C#代码。 方…

Java获取IP地址以及MAC地址(附Demo)

目录 前言1. IP及MAC2. 特定适配器 前言 需要获取客户端的IP地址以及MAC地址 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;public class test {public static void main(String[] args) {try {// 执行命令Process process…

Nginx在Kubernetes集群中的进阶应用

简介 在现代DevOps环境中,Nginx作为负载均衡器与Kubernetes的Ingress资源的结合,为应用程序提供了强大的路由和安全解决方案。本文将深入探讨如何利用Nginx的灵活性和功能,实现高效、安全的外部访问控制,以及如何配置Ingress以优…

智能小车测速(3.26)

模块介绍: 接线: VCC -- 3.3V 不能接5V,否则遮挡一次会触发3次中断 OUT -- PB14 测速原理: cubeMX设置: PB14设置为gpio中断 打开定时器2,时钟来源设置为内部时钟,设置溢出时间1s&#xff0c…

上位机图像处理和嵌入式模块部署(qmacvisual图像清晰度)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 做过isp的同学都知道,图像处理里面有一个3a,即自动曝光、自动白平衡和自动对焦。其中自动对焦这个,就需要用输入…

qt通过setProperty设置样式表笔记

在一个pushbutton里面嵌套两个label即可,左侧放置图片label,右侧放置文字label,就如上图所示; 但是这时的hover,press的伪状态是没有办法“传递”给里面的控件的,对btn的伪状态样式表的设置,是不…

IP SSL的应用与安装

IP SSL,即互联网协议安全套接字层,它是一种为网络通信提供安全及数据完整性的安全协议。在网络传输过程中,IP SSL可以对数据进行加密,这样即便数据在传输途中被截取,没有相应的解密密钥也无法解读内容。这一过程如同将…

防抖节流面试

1、防抖 1.1、条件 1、高频 2、耗时(比如console不算) 3、以最后一次调用为准 刷到个神评论,回城是防抖,技能cd是节流 1.2、手写 传参版本 function debounce(fn,delay){let timerreturn function(...args){//返回函数必须是普…

动态规划详解(Dynamic Programming)

目录 引入什么是动态规划?动态规划的特点解题办法解题套路框架举例说明斐波那契数列题目描述解题思路方式一:暴力求解思考 方式二:带备忘录的递归解法方式三:动态规划 推荐练手题目 引入 动态规划问题(Dynamic Progra…

QT子窗口关闭时自动释放及注意事项

先说方法,很简单,有如下API函数可用: testDialog->setAttribute( Qt::WA_DeleteOnClose, true ); 他的官方解释如下: 最后,说一个注意事项: 最近写python程序比较多,回过头来&a…

OPPO VPC 实践探索

01 概述 一年前(20年6月),OPPO云网络技术底座开始支持VPC方案,解决了用户担心的云上安全和虚拟实例的性能问题。我们称这个版本为VPC1.0,其采用了先进的智能网卡加速和VXLAN隧道隔离技术,实现了VPC从无到有的突破。 然而由于业务快…

爬虫部署平台crawlab使用说明

Crawlab 是一个基于 Go 语言的分布式网络爬虫管理平台,它支持 Python、Node.js、Jar、EXE 等多种类型的爬虫。 Crawlab 提供了一个可视化的界面,并且可以通过简单的配置来管理和监控爬虫程序。 以下是 Crawlab 的一些主要优点: 集中管理&am…

绿联 安装Mysql数据库

绿联 安装Mysql数据库 1、镜像 mysql:5.7 数据库5.7.x系列。 mysql:8 数据库8.x.x系列,安装方式相同。 2、安装 2.1、拉取镜像 拉取5.7.x版本的镜像。 2.2、基础设置 重启策略:第三或第四项均可。 2.3、网络 桥接即可。 2.4、命令 在原有的“mys…

概率论基础——拉格朗日乘数法

概率论基础——拉格朗日乘数法 概率论是机器学习和优化领域的重要基础之一,而拉格朗日乘数法与KKT条件是解决优化问题中约束条件的重要工具。本文将简单介绍拉格朗日乘数法的基本概念、应用以及如何用Python实现算法。 1. 基本概念 拉格朗日乘数法是一种用来求解…

EPSON机器人仿真实战攻略:从设置通信到运行调试一网打尽!

EPSON机器人 仿真测试深度教程 机器人还没到,怎么提前验证写好得机器人程序? 强大的仿真功能来了!本文详细深入的介绍了仿真的功能,一步步教会你如何仿真! 请先关注公众号收藏,防止走丢! 需要先设置电脑与控制器通信的虚拟连接,设置-电脑与控制器通信-增加-选择连接…

第27篇:T触发器实现4位计数器

Q:本篇我们用T触发器实现时序逻辑电路--计数器。 A:T触发器(Toggle Flip-Flop)只有一个信号输入端,在时钟有效边沿到来时,输入有效信号则触发器翻转,否则触发器保持不变,因此T触发器…

C++之结构体初始化10种写法总结(二百六十六)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

大数据毕业设计hadoop+spark旅游推荐系统 旅游可视化系统 地方旅游网站 旅游爬虫 旅游管理系统 计算机毕业设计 机器学习 深度学习 知识图谱

基于hive数据仓库的贵州旅游景点数据分析系统的设计与实现 摘 要 随着旅游业的快速发展和数字化转型,旅游数据的收集和分析变得越来越重要。贵州省作为一个拥有丰富旅游资源的地区,旅游数据的分析对于促进旅游业的发展和提升旅游体验具有重要意义。基…