当前位置: 首页 > news >正文

MySQL期末测试题解析:通过期末测试例题,彻底掌握 MySQL 的 JOIN、AS、ON 和 LEFT JOIN

MySQL期末测试题解析

在本篇博客中,我们将通过几个具体的查询示例来复习MySQL数据库的基本操作。这些例子将帮助你更好地理解如何使用SQL语句进行数据检索。

示例1:从course表中查询特定条件的课程信息

我们想要找到标准课时(chour)大于48且课程名称(cname)中包含“数据”二字的所有课程信息。

SELECT*FROMcourseWHEREchour>48ANDcnameLIKE'%数据%';

示例2:从tc表中查询开课次数超过3次且平均开课课时超过40的课程编号

该查询涉及到分组和聚合函数的使用。

SELECTcnoFROMtcGROUPBYcnoHAVINGCOUNT(*)>3ANDAVG(tchour)>40;

示例3:在course表中查询特定条件的课程信息(不使用IN)

查找标准课时大于60且课程名称为"数据库原理"或"信息技术概论"的课程信息。

SELECT*FROMcourseWHEREchour>60AND(cname='数据库原理'ORcname='信息技术概论');

示例4:查询开课课时等于32学时且开课次数超过4次的课程编号及开课次数

利用GROUP BYHAVING子句进行筛选。

SELECTcno,COUNT(*)ASopen_timesFROMtcWHEREtchour=32GROUPBYcnoHAVINGCOUNT(*)>4;

示例5:查询特定学期成功开课的课程名称、教师名及开课课时

涉及多表连接以获取所需信息。

SELECTc.cname,t.tname,tc.tchourFROMtcJOINcourse cONtc.cno=c.cnoJOINteacher tONtc.tno=t.tnoWHEREtc.term='2025-2026-1'ANDtc.status='成功开课';

示例6:查询每门课程的课程号及开课数量(包括未开课的情况)

利用左外连接确保所有课程都包含在结果集中。

SELECTc.cno,COUNT(tc.cno)ASopen_countFROMcourse cLEFTJOINtcONc.cno=tc.cnoGROUPBYc.cno;

示例7:查询与特定学生同班上课的学生学号

使用子查询来过滤出符合条件的学生。

SELECTDISTINCTsc.snoFROMscWHEREsc.class_idIN(SELECTclass_idFROMscWHEREsno='251531106')ANDsc.sno!='251531106';

示例8:查询成绩高于某课程平均分的学生学号

此查询展示了如何结合子查询计算平均值并进行比较。

SELECTsnoFROMscWHEREtcno='2521530101'ANDscore>(SELECTAVG(score)FROMscWHEREtcno='2521530101');

示例9:查询开课学时大于标准课时的课程详情

最后,我们来看一个简单的对比查询。

SELECTtc.tcno,tc.tno,tc.tchourFROMtcJOINcourse cONtc.cno=c.cnoWHEREtc.tchour>c.chour;

希望以上实例能帮助你在MySQL的学习过程中加深对SQL查询的理解!


一文彻底搞懂 MySQL 中的 JOIN、AS、ON 和 LEFT JOIN

在使用 MySQL 进行多表查询时,JOIN是最核心、最常用的操作之一。很多初学者对JOINASON以及LEFT JOIN的用法和区别感到困惑。本文将通过通俗易懂的语言 + 实战示例,带你彻底掌握这些关键语法。


一、基础概念速览

关键字作用
JOIN用于连接两个或多个表
AS为表或字段设置别名(Alias)
ON指定连接条件(类似于 WHERE,但专用于 JOIN)
LEFT JOIN左外连接:保留左表所有记录,右表无匹配则为 NULL

二、AS:给表或字段起“小名”

AS不是必须的,但它能让你的 SQL 更简洁、可读性更强。

示例1:字段别名

SELECTcnameAS课程名称,chourAS标准课时FROMcourse;

查询结果中的列名将显示为“课程名称”和“标准课时”。

示例2:表别名(常用于多表连接)

SELECTc.cname,t.tnameFROMcourseAScJOINteacherAStONc.tno=t.tno;

这里ccourse的别名,tteacher的别名,后续引用更方便。

💡 小技巧:AS关键字可以省略,直接写course c也是合法的。


三、JOIN + ON:内连接(Inner Join)

JOIN默认是内连接(INNER JOIN),只返回两个表中都存在匹配记录的数据。

语法结构:

SELECT字段列表FROM1[AS别名1]JOIN2[AS别名2]ON连接条件;

实战示例:

假设我们有两张表:

  • course(cno, cname, chour)
  • tc(tcno, cno, tno, tchour, term, status)

我们要查询所有已开课的课程名称和开课学期:

SELECTc.cname,tc.termFROMcourse cJOINtcONc.cno=tc.cno;

只有那些在tc表中有开课记录的课程才会被查出。


四、LEFT JOIN:左外连接(Left Outer Join)

LEFT JOIN左外连接,它会保留左表的所有记录,即使右表没有匹配项,也会用NULL填充右表字段。

为什么需要 LEFT JOIN?

比如:你想列出所有课程,包括那些从未开过课的课程,并显示它们的开课次数。

示例:

SELECTc.cno,c.cname,COUNT(tc.cno)AS开课次数FROMcourse cLEFTJOINtcONc.cno=tc.cnoGROUPBYc.cno,c.cname;

即使某门课程在tc表中没有记录,它依然会出现在结果中,开课次数为 0(因为COUNT(NULL)= 0)。

对比 INNER JOIN vs LEFT JOIN

场景INNER JOINLEFT JOIN
左表有记录,右表无匹配❌ 不返回✅ 返回,右表字段为 NULL
两表都有匹配✅ 返回✅ 返回
只关心“有关系”的数据推荐不推荐
需要“完整左表”信息不适用必须用

五、常见误区与最佳实践

✅ 误区1:把连接条件写在 WHERE 里

-- 错误写法(逻辑上可能等价,但性能差且语义不清)SELECT*FROMcourse c,tc tWHEREc.cno=t.cno;-- 正确写法SELECT*FROMcourse cJOINtc tONc.cno=t.cno;

使用JOIN ... ON是现代 SQL 的标准写法,清晰、高效、可维护。

✅ 误区2:LEFT JOIN 后用 WHERE 过滤右表字段,导致变成 INNER JOIN

-- 危险!这会让 LEFT JOIN 失效SELECTc.cname,tc.termFROMcourse cLEFTJOINtcONc.cno=tc.cnoWHEREtc.status='成功开课';-- 如果 tc.status 为 NULL,会被过滤掉!

✅ 正确做法:把右表的过滤条件放到ON子句中:

SELECTc.cname,tc.termFROMcourse cLEFTJOINtcONc.cno=tc.cnoANDtc.status='成功开课';

六、总结

语法用途是否保留无匹配记录
JOIN/INNER JOIN内连接
LEFT JOIN左外连接✅(保留左表)
AS起别名
ON指定连接条件

📌记住一句话
“LEFT JOIN 保左表,ON 写条件,AS 起别名,WHERE 慎用右表字段!”


七、扩展阅读

  • RIGHT JOIN:保留右表(较少用,可用 LEFT JOIN 调换表顺序替代)
  • FULL OUTER JOIN:MySQL 不支持,需用UNION模拟
  • 多表连接:A JOIN B ON ... JOIN C ON ...

希望本文能帮你彻底理清JOINASONLEFT JOIN的用法!如果你觉得有用,欢迎点赞、收藏、转发~
有任何疑问,欢迎在评论区留言讨论!


通过期末测试例题,彻底掌握 MySQL 的 JOIN、AS、ON 和 LEFT JOIN

在数据库开发和考试中,多表查询是核心技能之一。很多同学对JOINASONLEFT JOIN等关键字的使用仍感模糊。本文将结合你提供的期末测试真题,逐题拆解,带你从实战角度深入理解这些关键语法。


📌 背景说明

我们假设有以下几张表(根据题目推断):

  • course(cno, cname, chour):课程表
  • tc(tcno, cno, tno, tchour, term, status):开课记录表
  • teacher(tno, tname, prof, comm):教师表
  • sc(sno, tcno, class_id, score):学生选课表

接下来,我们将围绕这些表,用真实例题讲解JOINASONLEFT JOIN的用法。


✅ 例题1:多表连接 + 别名 + ON 条件

题目:查询'2025-2026-1'学期成功开课的课程名称、开课教师名称及开课课时。

SELECTc.cname,t.tname,tc.tchourFROMtcJOINcourse cONtc.cno=c.cnoJOINteacher tONtc.tno=t.tnoWHEREtc.term='2025-2026-1'ANDtc.status='成功开课';

🔍 讲解:

  • JOIN ... ON:这里用了两次内连接(INNER JOIN),分别连接courseteacher
  • AS的省略写法course c实际等价于course AS cccourse别名,后续用c.cname更简洁。
  • ON的作用:指定连接条件(如tc.cno = c.cno),这是表之间关联的“桥梁”。

💡关键点:多表连接时,每张表都要通过ON明确如何关联。


✅ 例题2:LEFT JOIN 的典型应用

题目:查询每一门课程的课程号及开课数量,没有开课的开课数量为 0。(使用左外连接)

SELECTc.cno,COUNT(tc.cno)ASopen_countFROMcourse cLEFTJOINtcONc.cno=tc.cnoGROUPBYc.cno;

🔍 讲解:

  • 为什么用LEFT JOIN
    因为题目要求“所有课程”,包括从未开课的。如果用JOIN(内连接),未开课的课程会被过滤掉。
  • COUNT(tc.cno)而不是COUNT(*)
    COUNT(*)会把 NULL 行也计为 1,而COUNT(字段)只统计非 NULL 值。所以未开课的课程open_count = 0
  • AS open_count:给聚合结果起别名,提升可读性。

LEFT JOIN 的核心思想“以左表为主,右表可缺”


✅ 例题3:JOIN + 比较字段(跨表条件)

题目:查询开课学时tchour大于该课程标准课时chour的开课课号、教师号及开课课时。

SELECTtc.tcno,tc.tno,tc.tchourFROMtcJOINcourse cONtc.cno=c.cnoWHEREtc.tchour>c.chour;

🔍 讲解:

  • 这里通过JOINtccourse关联起来,才能比较tchourchour
  • ON只负责“怎么连”,WHERE负责“筛选结果”
  • 没有使用AS,但建议加上别名提高可读性:
    FROMtc tJOINcourse cONt.cno=c.cnoWHEREt.tchour>c.chour

✅ 例题4:子查询 vs JOIN —— 教师津贴高于同职称平均值

题目:查询津贴comm高于同类职称平均津贴的教师姓名、职称及其津贴。

SELECTt.tname,t.prof,t.commFROMteacher tJOIN(SELECTprof,AVG(comm)ASavg_commFROMteacherGROUPBYprof)t_avgONt.prof=t_avg.profWHEREt.comm>t_avg.avg_comm;

🔍 讲解:

  • 这是一个自连接的变体:主表teacher和一个派生表(子查询结果)进行JOIN
  • 子查询计算每个职称的平均津贴,命名为t_avg(使用AS)。
  • 通过ON t.prof = t_avg.prof将每位教师与其职称的平均值关联。
  • 最后用WHERE筛选出高于平均值的记录。

💡 这展示了JOIN不仅能连物理表,还能连子查询结果(虚拟表)。


❗ 常见错误避坑指南

错误1:LEFT JOIN 后用 WHERE 过滤右表 → 变成 INNER JOIN

比如想查“所有课程及其成功开课的记录”:

-- ❌ 错误!未开课的课程会被 WHERE 过滤掉SELECTc.cname,tc.termFROMcourse cLEFTJOINtcONc.cno=tc.cnoWHEREtc.status='成功开课';-- tc.status 为 NULL 时被排除!

✅ 正确写法:把右表条件放到ON中:

-- ✅ 正确!保留所有课程SELECTc.cname,tc.termFROMcourse cLEFTJOINtcONc.cno=tc.cnoANDtc.status='成功开课';

错误2:忘记 GROUP BY 导致聚合错误

在使用COUNT()AVG()等函数时,非聚合字段必须出现在GROUP BY中(MySQL 严格模式下会报错)。


📚 总结:一张表看懂核心语法

语法作用示例
AS起别名course AS ccourse c
JOIN ... ON内连接,只保留匹配行JOIN teacher t ON tc.tno = t.tno
LEFT JOIN ... ON左外连接,保留左表全部LEFT JOIN tc ON c.cno = tc.cno
ON定义表如何关联必须写在JOIN
WHERE对最终结果过滤不要用于过滤LEFT JOIN的右表

💬 结语

通过这组期末测试题,我们不仅复习了 SQL 查询,更深入理解了JOIN系列操作的本质。记住:

“内连接看交集,左连接保左边;ON 是桥梁,AS 是昵称,WHERE 是筛子。”

希望这篇文章能帮你轻松应对数据库考试或实际开发中的多表查询问题!

http://www.jsqmd.com/news/92509/

相关文章:

  • 2025年热门的反应釜加热器/氢气加热器高评价厂家推荐榜 - 行业平台推荐
  • 硅橡胶密封胶703/704/705/706怎么选
  • 18、Linux网络管理与故障排查全解析
  • 2025年比较好的U型加热管TOP品牌厂家排行榜 - 品牌宣传支持者
  • 全行业AI智能体方案!500+实战案例,从医疗到金融,一站式解锁应用思路
  • 3款视频去水印去字幕AI软件工具免费,手机电脑都有!!
  • 喜报!荣获国家级科技奖一等奖,产学研协同创新获权威认可
  • docker 启动后 如何通过对应的进程 找docker-compose.yaml 编排文件
  • 云网融合市场发展及未来前景分析
  • 宠物临时寄养双向匹配系统,核心功能,寄养人发布空间与收费,宠物主人发需求,系统匹配靠谱寄养人,支持实时监控与押金担保,应用场景,解决宠物主人出差,旅游无人照顾的痛点。
  • Easyswoole 自定义捕获异常之对比。
  • Airflow - @task(multiple_outputs=True)
  • 9、常见Web攻击技术实战指南
  • 深入解析ESC5 ADCS配置漏洞利用——活动目录渗透测试实战
  • 儿童屏幕时间管控学习引导系统,核心功能,绑定设备,设时长与时段,识别娱乐,APP超时锁屏,推荐益智内容,生成使用报告,学习达标解锁娱乐
  • python 之 文件管理
  • AI 驱动的软件测试全栈解决方案:自动化框架、智能缺陷检测与 A/B 测试优化
  • 空间变化偏振的产生
  • 26、调试 Shell 程序的实用方法
  • 10、网络安全漏洞利用与攻击技术详解
  • 科学训练提升孩子学习能力
  • 智能制造的分布式认知系统要素分析
  • LLM应用实践: NoteBookLM初次使用
  • 《51测试天地》电子杂志 第八十七期发布文章:命令行参数的 3 种实战用法
  • 在线招生宣传视频制作:内容优化与转化提升技巧
  • 11、网络渗透测试中的常见攻击技术解析
  • C++ 对象 核心介绍
  • 2025年12月高压细水雾泵组,档案室高压细水雾,高压细水雾设备厂商推荐:聚焦消防装备企业综合实力与核心竞争力 - 品牌鉴赏师
  • 2025年评价高的拖拉机旋耕机/施肥旋耕机一体机厂家最新权威实力榜 - 行业平台推荐
  • 2025年12月干雾抑尘,双流体干雾抑尘,干雾抑尘主机厂商推荐:聚焦企业综合实力与核心竞争力 - 品牌鉴赏师