MySQL基础笔记(6)-多表查询练习(1)

目录

一、需求

二、解题思路

三、小结


本篇文章作为前面四篇基础文章的回顾,从某公司的Java面试题入手,讲解三表查询的常见需求以及常见查询方法,夯实MySql的连接查询、子查询基础。


一、需求

有三张表,学生表student,课程course,学生课程表sc,学生可以选修多门课程,一门课程可以被多个学生选修,通过sc 表关联。

1)写出建表语句;

2)写出SQL 语句,查询选修了所有选修课程的学生;

3)写出SQL 语句,查询选修了5 门以上的课程的学生。

 

二、解题思路

1、这是一种典型的三表查询,学生表中必须包含有学生id和姓名,课程表必须有课程id和姓名,学生可以选多门课,每门课都能被多个学生选择,所以两者是多对多关系,从而衍生出了第三张关系表,这张关系表必须包含学生id和课程id。

CREATE TABLE s(
	idINT PRIMARY KEY ,
	name VARCHAR(32),
	sex CHAR,
	age INT

)

CREATE TABLE c(
	id INT PRIMARY KEY,
	name VARCHAR(32)
	
)

CREATE TABLE sc(
	sid INT REFERENCES s(id),
	cid INT REFERENCES c(id),
	PRIMARY KEY(sid,cid)
)

2、要查出选修所有课的学生,我们先要知道课程的总数量是什么,并且要在选课表中查询该生id对应的课程数量是否和总课程数相等

Select s.name from s s 
where 
(select count(*) from c) = 
(select count(*) from sc1 sc1 
where sc1.sid = s.id)

3、选修了五门课以上,那么说明该学生的id在选课表中出现的次数是5次以上

SELECT s.name FROM s s 
WHERE (SELECT COUNT(*) FROM sc sc WHERE
s.id = sc.sid )
> 5

三、小结

 形如“XX选的xx数、XX的出现xx数”这样的问题,几乎都要用到COUNT函数,来统计其出现的次数,通常需要使用子查询

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BoringRong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值