MySQL_表_进阶(1/2)

news2024/12/25 9:05:23

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

照例给出四张表:

 学院表:(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.coloradmin.cn/o/2168665.html

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

相关文章

JS面试真题 part7

JS面试真题 part7 31、web常见的攻击方式有哪些?如何防御32、说说JavaScript中内存泄漏的几种情况33、JavaScript如何实现继承34、说说JavaScript数字精度丢失的问题,如何解决35、举例说明你对尾递归的理解,有哪些应用场景 31、web常见的攻击…

使用kaggle命令下载数据集和模型

点击用户头像,点击Settings: 找到API,点击create new token,将自动下载kaggle.json: 在用户目录下创建.kaggle文件夹,并将下载的kaggle.json文件移动到该文件夹: cd ~ mv Downloads/kaggle.j…

Universal Link配置不再困扰,Xinstall来帮忙

在移动互联网时代,App的推广和运营至关重要。而Universal Link作为一种能够实现网页与App间无缝跳转的技术,对于提升用户体验、引流至App具有显著效果。今天,我们就来科普一下Universal Link的配置方法,并介绍如何通过Xinstall这款…

2024-2025华为ICT大赛报名|赛前辅导|学习资料

华为ICT大赛是华为公司打造的面向全球高校的年度ICT赛事,大赛以“联接、荣耀、未来”为主题,协同政府、高等教育机构、培训机构和行业企业,促进高校ICT人才培养、成长和就业,助力ICT人才生态繁荣。2021年3月,大赛成功入…

Linux Centos7达梦8数据库安装说明(附安装包,超详细图文!)收藏这一篇就够了!

VMWare17&Linux Centos7&达梦数据库8.4 使用说明 1.导语 1.1说明文档编写思路 小伙伴们,在自己电脑上搞起来啊,随便安装Linux环境,也不用担心搞错配置搞坏环境,大不了重装Linux系统。hahahhhhhhhhhh 由于本地没有合适的Linux环境进行…

AIGAME平台的由来与未来展望 —— 蒙特加密基金推动区块链与AI融合创新

摘要: AIGAME平台凭借蒙特加密产业基金的战略投资,成为区块链与AI融合创新的先驱。该平台集成了链游、DeFi、加密聊天和跨境支付等多项功能,打造出一个多元化的Web3生态系统。未来,AIGAME将在技术创新和全球布局中持续引领潮流。 …

JavaScript 学习

一、输出 为方便调试可以输出内容&#xff0c;但是用户是看不到的。要在开发者模式中看。 console . log ( "Hello" )&#xff1b; 二、外部文件引用 可以直接在html中写JS <head> <meta charset"utf-8"> <script> console.log("he…

微服务——服务保护(Sentinel)(一)

1.雪崩问题 级联失败或雪崩问题指的是在微服务架构中&#xff0c;由于服务间的相互依赖和调用&#xff0c;当一个服务出现故障时&#xff0c;会引起调用它的服务也出现故障&#xff0c;进而引发整个调用链路的多个服务都出现故障&#xff0c;最终导致整个系统崩溃的现象。 产生…

Redis配置文件详解(上)

一、Redis的核心配置文件 redis.conf是redis的核心配置文件&#xff0c;位于redis解压后目录的根目录&#xff0c;配置文件的内容根据不同的功能划分为多个模块。redis的注释信息写得也是非常详细的&#xff0c;以下是对部分重要得配置做简单的分析 二、基础配置信息 这部分…

CTF ciscn_2019_web_northern_china_day1_web1复现

ciscn_2019_web_northern_china_day1_web1 复现&#xff0c;环境源于CTFTraining 分析 拿到题目扫描&#xff0c;发现没有什么有用资产 扫描过程中注册账号登录&#xff0c;发现上传入口 上传文件&#xff0c;发现下载删除行为&#xff0c;寻找功能点&#xff0c;发现不能访问…

【Redis入门到精通七】详解Redis持久化机制(AOF,RDB)

目录 Redis持久化机制 1.RDB持久化 &#xff08;1&#xff09;手动触发RDB持久化 &#xff08;2&#xff09;自动触发RDB持久化 &#xff08;3&#xff09;Redis文件相关处理 &#xff08;4&#xff09;RDB持久化的优缺点 2.AOF持久化 &#xff08;1&#xff09;AOF工作…

基于nodejs+vue的农产品销售管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

AIGAME的核心技术竞争力与未来生态规划

AIGAME凭借其领先的区块链和人工智能技术&#xff0c;打造了全球首个融合链游、DeFi和加密聊天的Web3娱乐平台。平台的核心技术创新和多元化生态规划&#xff0c;将推动全球虚拟资产管理和娱乐行业的变革。 AIGAME的核心技术竞争力源于其对区块链和人工智能&#xff08;AI&…

你知道吗?制造手机芯片的关键竟然是一台“打印机”?

在我们每天离不开的智能手机里&#xff0c;藏着一颗小小的“心脏”——芯片。它虽小&#xff0c;却拥有着强大的计算能力&#xff0c;能够让我们随时随地与世界保持连接。你可能想象不到&#xff0c;制造这些精密芯片的关键设备&#xff0c;竟然与我们日常使用的打印机有着惊人…

Jmeter实战——编写博客标签模块增删改查自动化脚本和压测

一、自动化脚本架构搭建 1、添加setUp线程组&#xff0c;测试标签新增功能&#xff1b;添加tearDown线程组&#xff0c;测试标签删除功能 这里可以将标签的增删改查写到一个线程组&#xff0c;但是为了实践setUp和tearDown线程组的使用&#xff0c;将它们写到不同线程组中了。…

C/C++—有关日期类的OJ题

✨✨ 欢迎大家来到小伞的大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C学习 小伞的主页&#xff1a;xiaosan_blog 1.计算日期到天数的转换(简单) 计算日期到天数转换__牛客网 (nowcoder.com)​​…

Qt-QTreeWidget多元素控件(38)

目录 描述 QTreeWidget 方法 QTreeWidget 信号 QTreeWidgetItem 属性 QTreeWidgetItem 方法 控制 使用 界面操作 代码操作 总结 描述 使⽤ QTreeWidget 表⽰⼀个树形控件.⾥⾯的每个元素,都是⼀个 QTreeWidgetItem ,每个 QTreeWidgetItem 可以包含多个⽂本和图标,每…

电脑系统重装系统盘文件还能恢复吗?

当我们的电脑出现中病毒、系统文件受损、系统变慢、无法启动或蓝屏等情况&#xff0c;大部分朋友都会选择重装系统。但重装系统后原来保存在系统盘的文件都会被删除。遇到这种情况&#xff0c;我们还有方法可以恢复之前保存在系统盘的文件吗&#xff1f; 一、从备份中恢复数据 …

智能优化算法-人工鱼群优化算法(ASFA)(附源码)

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1.内容介绍 人工鱼群优化算法 (Artificial Fish Swarm Algorithm, AFSA) 是一种基于群体智能的元启发式优化算法&#xff0c;它模拟了鱼群的觅食、聚群和避障行为&#xff0c;用于解决复杂的优化问题。 AFSA的工作机制主要…

Xilinx的JESD204B PHY层IP仿真及上板测试(JESD204B四)

本文配置JESD204B PHY的参数&#xff0c;分析其示例工程&#xff0c;并且对该IP进行仿真&#xff0c;由于该IP只是物理层&#xff0c;并没有上层协议&#xff0c;因此与GTX/H其实没有太大区别。 1、配置IP 如下图所示&#xff0c;在IP Catalog中搜索JESD204B的PHY&#xff0c;…