有关联的多表查询

本文介绍了数据库中的多表查询,特别是内连接查询,结合学生表、课程表和成绩表的实例,阐述了如何进行简单的多表查询以及内连接查询的使用方法。内容包括查询语句的编写、where条件的设定,以及join和on子句的正确使用,帮助读者理解和掌握多表查询技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

数据库最多的操作应该就是查询了,尤其是有关联的多表之间的查询了。下面会介绍几种多表查询的操作的语句和实例演示,一方面是作为自己的总结,一方面希望可以帮助到需要使用的同学。

对于下面的代码示例都是基于学生表,课程表,成绩表三张表。
这里写图片描述

  • 学号是学生表中的主键
  • 课程号是课程表中的主键
  • 成绩表中的学号和课程号分别为外键,和学生表,课程表建立联系
  • -

简单多表查询

首先要指定查询中都用到了那些表,然后在where条件中,将查询的条件以及各表之间的关系都给出来

格式:
select [要查询的项1][项2] from [表1][表2] where 查询的条件,以及将多表之间联系起来

如下,cname来自于course表,grade来自于sc表,要查询的所有信息基于刘晨这个人,所以要涉及student表。

查找刘晨所选的课程名以及成绩
select cname ,grade from student,course,sc
where sname='刘晨' and sc.cno=course.cno and sc.sno=student.sno;

where条件中,姓名为刘晨,sc.cno=course.cno,意思为将course表中的cno对应到sc表中的cno,sno.sno=sc.sno类似。
这里写图片描述

再来看一个例子

--查询选修了数学课程的学生的平均_
select AVG(sage) as 平均年龄 from student,course,sc
where cname='数学' and course.cno=sc.cno and sc.sno=student.sno;

AVG(sage)用的是函数,意思为求所以sage的平均值,as 平均年龄意思为将查询结果的列名显示为平均年龄,注意,这里的as关键字可以省略,但是为了可读性,一般还是加上吧

这里写图片描述

最后在给出两个例题可以看一下,熟能生巧

--查询刘晨锁选修的课程的总学分
select SUM(ccredit) 总学分 from course,student,sc
where sname='刘晨' and course.cno=sc.cno and sc.sno=student.sno;
--查询选修数学课程的学生所在院系个数
select COUNT(distinct sdept) 院系个数 from student,course,sc
where cname='数学' and course.cno=sc.cno and sc.sno=student.sno;

这里写图片描述

内连接查询

  • 将相关表之间的关系用过join和on来表示
  • 要注意一个join两边的表之间是有联系的,不能乱序
  • on和join的个数是匹配的,并且on的顺序和join的顺序是相反的

下面通过例题来更加直观的解释:

--查询刘晨所选的课程编号
select cno 课程编号 from student join sc
on student.sno=sc.sno
where sname='刘晨';


注:刘晨位于student表,所选的课程编号在sc表,两表之间通过sno这个外键联系。

采用join on关键字

这里写图片描述
这里只是牵扯到两个表,所以join on时不需要注意什么,但是如果是两个以上的表建立联系就是注意次序,看下一个例题:

--查询在CS的学生所选的课程名称
--三表之间的顺序,on的个数与join个数相匹配,
--on的顺序和join的顺序是相反的
select distinct cname 课程名称 from course join sc join student
on student.sno=sc.sno
on course.cno=sc.cno
where sdept='CS';


注:这里的CS是隶属学院,在student表中,所选的课程名称在course表中,但是course和stusent表没有直接联系,所以要使用sc表作为中间桥梁,所以涉及到三表。
需要注意的是,
1、在join on的时候,不能写成
student join course join sc因为student和course之间没有直接关系,这样写是错误的。
2on的顺序和join的顺序必须是相反的,如上上面的代码示例,先course join sc join student,那么on的条件先写sc.sno=student.sno,只要记住on的顺序和join的顺序是相反就好了

这里写图片描述

照旧,多给几个例子。

--查询选修数学课程的学生学号
select sno 学生学号 from course join sc on sc.cno=course.cno
where cname='数学'

--查询选修学分为4分的课程的学生姓名
select distinct sname 学生姓名 from course join sc join student
on student.sno=sc.sno
on sc.cno=course.cno
where ccredit=4;

这里写图片描述


由于我最近期末考试周,对于多表查询就先写到这,一周后考完试会继续更新,左联接查询,右连接查询以及嵌套查询等多表查询。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值