MySQL_表_进阶(1/2)

我们的进阶篇中,还是借四张表,来学习接下来最后关于表的需求,以此完成对表的基本学习。

照例给出四张表:

 学院表:(testdb.dept)

课程表:(testdb.course)

选课表:(testdb.sc)

学生表 :(testdb.stu)

需求如下:

  1. 查询课程编号为“1001”的课程的学生成绩单,显示学号、姓名、成绩,按成绩降序排列。
  2. 查询没有人选课的课程信息,显示课程编号、课程名称。

走起:

 需求一——降序/升序排列

看到需求一:查询课程编号为“1001”的课程的学生成绩单,显示学号、姓名、成绩,按成绩降序排列。

看第一眼,诶,指定查询:要么嵌套查询,要么单连接... 但最后这句“按成绩降序排列” ,我们是没提到过的。

降序/升序排列

ORDER BY 字段名 DESC/ASC;#DESC 表示 降序
#ASC 表示 升序

为了使记忆具有完整性: DESC 是descending(下降)的缩写,根据词根词缀法,“de”往往表示“否定、向下”的含义,“cend”表示“行走”,desc就是向下走——降序

ASC是ascending(上升)的缩写。记住了de表示“否定、向下”也就记住了ASC是升序。

那么,这里按成绩排序,这句排序代码应该这样写:

ORDER BY score DESC;

 需求分析:

查询课程编号为“1001”的课程的学生成绩单,显示学号、姓名、成绩...

SELECT stuid,stuname,score
#显示学号、姓名、成绩...

显示什么字段,针对同名但不同表字段,我们还需要加前缀,否则会因指向不明确而报错。像stuname这种字段,只有stu(学生表)才有的,不用加前缀

SELECT sc.stuid,stuname,score

继续: 

SELECT sc.stuid,stuname,score
FROM testdb.sc

因为还涉及显示stu(学生表)的stuname字段信息,所以,我们还需要联一张表。 —— 使用JOIN...ON...语句

SELECT sc.stuid,stuname,score
FROM testdb.sc
#连接stu表
JOIN testdb.stu
#两张表都有同一字段,使用 = 连接
ON stu.stuid = sc.stuid 

对于stuid应该还有条件:查询课程编号为“1001”的课程的学生成绩单。没错,就是要求筛选出来的stuid对应在同表的cid = ‘1001’。 这条cid = '1001'与两表连接条件是需要同时满足的。前者,是对同表的stuid进行限制,后者,是为了查询到对应stuid的stuname。

所以:这条需求的参考代码如下

#查询课程编号为“1001”的课程的学生成绩单,显示学号、姓名、成绩,按成绩降序排列。
SELECT sc.stuid,stuname,score
FROM testdb.sc
JOIN testdb.stu
ON stu.stuid = sc.stuid AND sc.cid = '1001'
ORDER BY score ASC;

需求二——左右连接

需求二:查询没有人选课的课程信息,显示课程编号、课程名称。

需求分析:

这次,我们先来写个整体,细节不会的再根据实际情况去补充、完善。

#显示课程编号、课程名称。
SELECT sc.cid,course.cname
FROM testdb.sc
JOIN testdb.course
ON 
#显示的字段因为来自不同的表,所以需要连接表:因为sc,c表都有cid这个字段,所以显示的字段需要前缀
#其他字段,也可写前缀,提醒自己使用了哪些表的字段
#重点就落在ON 后面了

ON后面连接 查询条件,因为要显示的没有人选课的课程信息,注意是课程信息。语义上理解:其实最好选择的,是c表,其次从代码上:显示的cid,cname 字段c表都拥有。

SELECT sc.cid,course.cname
FROM testdb.course
JOIN testdb.sc
ON 

但是,这样写,我们的查询条件该怎么表达:“没有人选课”。

其实,默认的JOIN连接,只会返回两个表中有匹配的行。故而,为了查询没有人选课的课程信息,即需要找出在testdb.sc(选课表)中没有对应记录的testdb.course(课程表)中的课程。

默认的JOIN连接是做不到的,我们需要左/右连接。(前面说着写整体的代码,其实只是虚晃一枪哈,别被我带进沟里了哈哈哈哈哈哈)

左/右连接

关键语句:

LEFT JOIN 表名
ON 查询条件
#其实就只是在JOIN前加上LEFT/RIGHT

我们前面的显示字段的代码并没有发生改变:

SELECT course.cid,course.cname
FROM testdb.course
LEFT JOIN testdb.sc
ON
#不是有左/右连接两种连接嘛,那到底是用LEFT 还是 RIGHT呢?

 LEFT JOIN表示testdb.sc ON c.cid = sc.cid 表示将 testdb.c 表(左表)与 testdb.sc 表(右表)进行左连接。

左表、右表跟是否左连接,还是右连接并无关系,出现在显示语句后的FROM 的表(先出现的表)我们称为左表,而后面连接的表,我们则称为右表。

那左右连接中的“左右”指的是什么?左连接,意思是以左表为主,右表是作为查询条件存在;同样的道理,右连接,是将右表作为主表,左表自然成为查询条件。

怎么理解主表与作为查询条件的表的关系,同样两个表,左右连接的结果区别在哪呢?

咱们举个例子:比如这里course表(课程表)是左表,sc(选课表)是右表,此时代码是LEFT JOIN (左连接),揭示出左表(course表)是主表。

SELECT course.cid,course.cname
FROM testdb.course
LEFT JOIN testdb.sc
ON

对于 testdb.course 表中的每一行(主表),查询都会尝试在 testdb.sc 表中找到一个 cid 值与之匹配的行。

如果在 testdb.sc 表中找到了匹配的行,那么这两行就会被组合成一个结果行,包括来自两个表的所有列(但在这个查询中,我们只选择了 course.cid 和 course.cname)。

如果在 testdb.sc 表中没有找到匹配的行,那么结果行仍然会包括 testdb.c 表中的那行数据,但来自 testdb.sc 表的列将以 NULL 值填充。

我自己理解这个主表:左表(在这个例子中是testdb.course)的所有行都会被包含在结果集中,无论它们在右表(testdb.sc)中是否有匹配的行。

若右表记录行数比左表多,结果集的行数与左表的行数相同,主表为主的原则是不变的。

所以,这里,我们把课程表作为左连接:查询条件有两句:连接(两表)语句 和 筛选出 sc.cid 没有的值。

SELECT course.cid,course.cname
FROM testdb.course
LEFT JOIN testdb.sc
ON course.cid = sc.cid
# 按以前的习惯我们会用and再写个并列条件,这里该怎么表示course.cid有的cid但是sc.cid没有

如果,代码到这儿,LEFT JOIN会生成一个结果集,它含了左表的所有行以及右表中匹配的行(或NULL值,如果右表中没有匹配的行)

而接下来,我们再针对这个特点进行筛选,从左连接生成的结果集可知,如果 左表cid为 CS0017,CS1038 ... 对应的,在右表里并没有相关的选课记录,其字段cid,stuid,score全应为NULL(如果要求显示的话,就可观察到这个结果)

 选课表:(testdb.sc)

 课程表:(testdb.course)

WHERE子句——过滤结果集

这时候,我们再对这个临时的结果集,进行筛选,减少结果集的行数:(使用WHERE子句) 

WHERE sc.cid IS NULL;
#这句WHERE实际上是对前面LEFT JOIN产生的结果集进行筛选
#LEFT JOIN确保了testdb.course表中的所有行都出现在结果集中,而WHERE sc.cid IS NULL则进一步过滤掉了那些在testdb.sc表中有匹配项的课程,留下了没有被选的课程信息

由此,得到我们的需求二:

#查询没有人选课的课程信息,显示课程编号、课程名称。
SELECT course.cid,course.cname
FROM testdb.course
LEFT JOIN testdb.sc
ON course.cid = sc.cid
WHERE sc.cid IS NULL;

 运行一下:

关于右连接:其实就是把右表作为主表,结果集里面包含了右表的所有行,无论左表是否匹配。无法匹配就NULL;(主表有点霸总那味儿了) 

 小总结:参考代码

  1. 查询课程编号为“1001”的课程的学生成绩单,显示学号、姓名、成绩,按成绩降序排列。
  2. 查询没有人选课的课程信息,显示课程编号、课程名称。

参考代码:

#查询课程编号为“1001”的课程的学生成绩单,显示学号、姓名、成绩,按成绩降序排列。
SELECT sc.stuid,stuname,score
FROM testdb.sc
JOIN testdb.stu
ON stu.stuid = sc.stuid AND sc.cid = '1001'
ORDER BY score ASC;
#查询没有人选课的课程信息,显示课程编号、课程名称。
SELECT course.cid,course.cname
FROM testdb.course
LEFT JOIN testdb.sc
ON course.cid = sc.cid
WHERE sc.cid IS NULL;

 今天就到这里吧,明天就只还有俩了(高兴) 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python调用c++动态链接库,环境是VS2022和vscode2023

目录 前言:配置环境:基础夯实(对于ctypes的介绍):1. 加载共享库2. 定义函数原型3. 调用函数4. 处理数据结构5. 处理指针6. 错误处理7. 使用 ctypes.util总结 效果展示:操作步骤(保姆级教学)一在VS中创建dll…

YOLOv8——测量高速公路上汽车的速度

引言 在人工神经网络和计算机视觉领域,目标识别和跟踪是非常重要的技术,它们可以应用于无数的项目中,其中许多可能不是很明显,比如使用这些算法来测量距离或对象的速度。 测量汽车速度基本步骤如下: 视频采集&#x…

(done) 声音信号处理基础知识(4) (Understanding Audio Signals for ML)

来源:https://www.youtube.com/watch?vdaB9naGBVv4 模拟信号特点如下 时域连续(x轴) 振幅连续(y轴) 如下是模拟信号的一个例子: 数字信号特点如下: 一个离散值序列 数据点的值域是一系列有限的值 ADC:模拟信号到数字信号的…

python全栈学习记录(十八)re、os和sys、subprocess

re、os和sys、subprocess 文章目录 re、os和sys、subprocess一、re1.正则字符2.正则表达式的使用3.group的使用4.贪婪匹配与惰性匹配5.其他注意事项 二、os和sys1.os2.sys 三、subprocess四、打印进度条 一、re python中的re模块用来使用正则表达式,正则就是用一系…

【Python机器学习】NLP信息提取——提取人物/事物关系

目录 词性标注 实体名称标准化 实体关系标准化和提取 单词模式 文本分割 断句 断句的方式 使用正则表达式进行断句 词性标注 词性(POS)标注可以使用语言模型来完成,这个语言模型包含词及其所有可能词性组成的字典。然后,该…

http增删改查四种请求方式操纵数据库

注意:在manage.py项目入口文件中的路由配置里,返回响应的 return语句后面的代码不会执行,所以路由配置中每个模块代码要想都执行,不能出现return 激活虚拟环境:venv(我的虚拟环境名称)\Scripts\activate …

java项目发布后到Tomcat时,总是带一层路径解决方案

java项目发布后到Tomcat时,总是带一层路径 参考文章:java 线上项目访问项目 会多一层项目根路径 根据参考文章写的这篇文章,部分文章细节有完善和改动 在Java Web应用中,当你把应用发布到Tomcat时,如果应用的web.xml配置文件中的&…

Karmada新版本发布,支持联邦应用跨集群滚动升级

摘要:本次升级支持联邦应用跨集群滚动升级,使用户版本发布流程更加灵活可控;透明同事karmadactl 新增了多项运维能力,提供独特的多集群运维体验。 本文分享自华为云社区 《Karmada v1.11 版本发布!新增应用跨集群滚动升…

柔性数组 初学版

1.定义 结构中的最后⼀个元素允许是未知⼤⼩的数组,这就叫做『柔性数组』成员 有些编译器会报错⽆法编译可以改成: typedef struct st_type { int i; int a[]; // 柔性数组成员 }type_a; 2.柔性数组的特点: • 结构中的柔性数组成员前…

ReadWriteLock读写锁

读写锁基本概念 ReadWriteLock是Java并发包中的一个接口,它定义了两种锁:读锁(Read Lock)和写锁(Write Lock),真正的实现类是ReentrantReadWriteLock。读锁允许多个线程同时读取共享资源&#…

JAVA开源项目 体育馆管理系统 计算机毕业设计

本文项目编号 T 048 ,文末自助获取源码 \color{red}{T048,文末自助获取源码} T048,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析5.4 用例设计 六、核…

记一次Mac 匪夷所思终端常用网络命令恢复记录

一天莫名奇妙发现ping dig 等基础命令都无法正常使用。还好能浏览器能正常访问&#xff0c;&#xff0c;&#xff0c;&#xff0c; 赶紧拿baidu试试^-^ ; <<>> DiG 9.10.6 <<>> baidu.com ;; global options: cmd ;; connection timed out; no serve…

美业门店怎么提升业绩?连锁美业门店管理系统收银系统拓客系统源码

美业门店想要提升业绩&#xff0c;需要考虑多方面的因素&#xff0c;并采取综合性的方法。以下是一些可以考虑的因素和建议&#xff1a; 产品与服务优化&#xff1a; 提供高质量的美容产品和服务&#xff0c;确保顾客满意度。不断更新产品线&#xff0c;引入新的时尚趋势&#…

pycharm 使用 translation 插件通过openai进行翻译

pycharm 使用 translation 插件通过openai进行翻译 1. 安装插件2. 配置插件3. 翻译 1. 安装插件 2. 配置插件 3. 翻译 调用 openai 时使用的提示词如下&#xff1a; <|im_start|>system\nYou are a translation engine that can only translate text and cannot interpr…

【大模型实战篇】一种关于大模型高质量数据的处理方法-无标注数据类别快速识别及重复数据检测(加权向量-卷积神经网络-聚类算法结合)

1. 背景介绍 大模型的能力很大程度上依赖于高质量的数据&#xff0c;在之前的一篇文章《高质量数据过滤及一种BoostedBaggingFilter处理方法的介绍》中&#xff0c;我们介绍了大模型的数据处理链路&#xff0c;本文继续关注在高质量数据的模块。 本文所要介绍的处理方法&…

第18届全国热管会议举办,积鼎科技分享「环路热管相变传热仿真」前沿实践

第18届全国热管会议于9月20日至22日在海滨城市日照举行&#xff0c;该会议由中国工程热物理学会热管专业组主办&#xff0c;山东大学和日照市科学技术协会联合承办&#xff0c;汇聚了全国热管技术领域的专家学者及企业代表。在该会议上&#xff0c;积鼎科技在热管仿真方面的成果…

移动剧院:流动艺术空间的声学革命—轻空间

在当今多元化的文化环境中&#xff0c;移动剧院作为一种新兴的演出形式&#xff0c;正在迅速崛起。它不仅提供了灵活多变的演出场地&#xff0c;更以其卓越的声学性能&#xff0c;为观众带来了沉浸式的视听体验。移动剧院的声学优势&#xff0c;使其成为各种艺术活动的理想选择…

TomCat乱码问题

TomCat控制台乱码问题 乱码问题解决&#xff1a; 响应乱码问题 向客户端响应数据&#xff1a; package Servlet;import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servl…

C++中的IO流

1. C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 scanf(): 从标准输入设备(键盘)读取数据&#xff0c;并将值存放在变量中。printf(): 将指定的文字/字符串输出到标准输出设备(屏幕)。注意宽度输出和精度输出控制。C语言借助了相应的缓冲…

DELPHI编译软件时带上当前IDE的版本号

如果通过 CompilerVersion 得到的也只是编译器的版本号。 比如&#xff1a;delphi XE12 是 36 &#xff0c;也仅此而己。 我想得到的是IDE的版本号&#xff0c;比如当前最新版本的DELPHI是&#xff1a;Embarcadero RAD Studio 12 Version 29.0.53571.9782 我想得到 29.0.53…