首页 > 其他分享 >【WEEK6】 【DAY2】DQL查询数据-第二部分【中文版】

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

时间:2024-04-06 21:04:37浏览次数:18  
标签:JOIN -- DAY2 查询 StudentNo SubjectNo DQL SELECT WEEK6

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

目录

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函数【中文版】

标签:JOIN,--,DAY2,查询,StudentNo,SubjectNo,DQL,SELECT,WEEK6
From: https://blog.csdn.net/2401_83329143/article/details/137275191

相关文章

  • Day2 链表
    排序算法,手撕快排,二分查找要整理刷一遍206.反转链表双指针法自己的写的,用tmp保存下一个开始的节点;先移动慢指针,再移动快指针。 /** *Definitionforsingly-linkedlist. *structListNode{ *  intval; *  ListNode*next; *  ListNode():va......
  • Day2 第一章 数组part02
    1.977.有序数组的平方为什么‘非递减‘就是递增?暴力解法就是遍历数组挨个元素平方,之后再给数组排序,这里有时间复习一下各种排序的时间复杂度以及空间复杂度!在移除数组元素那道题里,涉及到位置变更以及要求时间复杂度为O(n),从这可以看到一点用双指针的规律,就是:指针设定为......
  • 深入理解Java异常处理机制(day20)
    异常处理异常处理是程序运行过程产生的异常情况进行恰当的处理技术在计算机编程里面,异常的情况比所我们所想的异常情况还要多。Java里面有两种异常处理方式;1.利用try···catch···finaly语句处理异常,优点是分开了处理异常代码和程序正常代码,增强了程序的可读性,减少......
  • 书生·浦语大模型全链路开源体系——学习笔记day2&day3--纯纯新手入门
    学习链接:tutorial/helloworld/hello_world.mdatmain·InternLM/tutorial(github.com) 【精彩,照着做就能体验很多本来遥不可及的东西】笔记分享链接:https://github.com/InternLM/tutorial/discussions/37 本笔记定位是对学习链接的补充和小白发牢骚,希望大佬能愿意点评一......
  • 轻松玩转书生·浦语大模型趣味 Demo——day2笔记
    本节课有四个任务:学习部署、玩角色扮演的agent项目,玩数学运算agent、玩写作agent 主要学习过程就是跟着视频,复制学习文档里的资料,完成demo的使用。主要目的是熟悉开发平台。视频:轻松玩转书生·浦语大模型趣味Demo_哔哩哔哩_bilibili资料:Tutorial/helloworld/hello_world.......
  • JAVA语言学习-Day2
    参考教学视频:秦疆Java流程控制Scanner工具包(java5新特性)Scanners=newScanner(System.in);//创建对象,接收接盘数据if(s.hasNext()){  Stringa=s.next();}if(s.hasNextLine()){  Stringa=s.nextLine();}s.close();if选择结构if(boolean){  }elseif(bool......
  • 代码随想录 Day29 回溯算法 491.递增子序列 46.全排列 47.全排列 II
    491.递增子序列classSolution{private:vector<vector<int>>result;vector<int>path;voidbacktracking(vector<int>&nums,intstartIndex){if(path.size()>1){result.push_back(path);......
  • Python学习从0到1 day20 第二阶段 面向对象 ② 封装
    缘分朝生暮死犹如露水          ——24.4.1学习目标:1.理解封装的概念2.掌握私有成员的使用一、面向对象三大特性:面向对象编程,是许多编程语言都支持的一种编程思想简单理解是:基于模板(类)去创建实体(对象),使用对象完成功能开发面向对象包含三大主......
  • SQL语句中 DDL 、DML 、DQL 、DCL学习、看板
    DDL语句(数据定义语言)DDL(DataDefinitionLanguage)语句:数据定义语言,主要是进行定义/改变表的结构,数据类型,表之间的连接操作.常用的语句关键字有CREATE,DROP,ALTER等.CREATETABLE表名(列名1数据类型,列名2数据类型,列名3数据类型,...)​ALTERTABLE表名;......
  • Day28 异常
    Day28异常一、概念异常是程序在运行期发生的不正常的事件,它会打断指令的正常执行流程。设计良好的程序应该在异常发生时提供处理这些不正常事件的方法,使程序不会因为异常的发生而阻断或产生不可预见的结果。注意:Java语言使用异常处理机制为程序提供了异常处理的能力。......