news 2026/1/1 12:34:29

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 是筛子。”

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/25 5:27:07

n8n与Coze对比分析,自动化工具选择攻略,建议收藏!

简介 本文详细对比了n8n和Coze两款自动化工具,n8n适合技术开发者处理复杂逻辑和系统集成,开源免费但技术门槛较高;Coze面向业务人员,无代码可视化但扩展性有限。企业可根据用户群体、流程复杂度、部署需求等选择合适工具&#xff…

作者头像 李华
网站建设 2025/12/25 2:41:35

AI美化PPT工具“内卷”升级:这款凭什么在2025脱颖而出?

制作PPT时,83%的用户曾因“排版耗时”“格式混乱”“专业度不足”等问题,最终放弃优化视觉呈现。进入2025年,AI美化工具已从“单一功能”向“全链路服务”升级。本次测评围绕技术架构、实用效率、场景适配三大核心维度,结合商务汇…

作者头像 李华
网站建设 2025/12/25 2:02:51

通过偏振光干涉生成空间变化的偏振

摘要 干涉测量是光学计量的重要技术。 例如,在VirtualLab Fusion中构建具有相干激光光源的马赫泽德干涉仪。 特别是在此示例中插入两个偏振片以控制两个干涉光束的偏振态。 通过旋转其中一个偏振器,可以达到干涉图案变化的可视化,最终产…

作者头像 李华
网站建设 2025/12/25 13:00:55

科学训练提升孩子学习能力

您是否也曾经历过这样的场景?孩子坐在书桌前,眼睛盯着课本,却一个字也看不进去。您在一旁焦急地催促,却换来孩子更加抵触的情绪。作业本上的错题越来越多,孩子的自信心一点点被消磨,而您内心的焦虑也在不断…

作者头像 李华
网站建设 2025/12/26 4:56:42

应用启动时间测试优化指南

1 启动时间测试指标体系构建 1.1 核心性能指标定义 应用启动时间测试需建立多层次测量体系: 冷启动:进程完全不存在时的启动过程,涵盖从用户点击图标到首帧完全绘制的完整周期 热启动:应用进程仍在后台时的启动过程&#xff0…

作者头像 李华
网站建设 2025/12/25 12:59:19

AI时代的“军火库”:深度解析智能编码、数据标注与模型训练平台

在人工智能浪潮席卷全球的今天,AI不再是少数顶尖科学家的专属领域,它正以前所未有的速度渗透到各行各业,成为推动社会进步的核心引擎。而在这场变革的背后,一个强大而精密的“AI工具军火库”正在悄然形成,它极大地降低…

作者头像 李华