sql从班级表、学生表、课程表查询一班年纪12岁并且选了中文和英语两门课的学生

首先,有这三张表表分别是:
班级表banji表结构和数据如下:在这里插入图片描述
在这里插入图片描述
学生表student表结构和数据如下
在这里插入图片描述在这里插入图片描述

课程选择表course表结构和数据:
在这里插入图片描述
在这里插入图片描述

下面,我要写的sql语句是查询一班年级12岁且选择了中文和英语两门课学生的id和姓名思路如下:
1.首先从班级表和学生表里查询一班年纪为12岁的学生如下:

select * from student s inner join banji ba 
on s.clid = ba.clid where s.age='12' and ba.clname='一班'

结果如下:
在这里插入图片描述
2.接着在课程表里查询同时选择了china和eng的学生如下:

select sid from course c where c.cname ='china' and exists(select 1 from course c2 where c2.cname ='eng' and c2.sid=c.sid )

结果如下:
在这里插入图片描述
这里是重点要注意的,从一张表里的多条记录里总结查询结果要用到嵌套查询,并且,如果嵌套里只看是否存在最好用exists而不用in,因为exists效率要高。
3.接下来是两个查询语句的拼接了,我刚开始的语句是这样的:

SELECT *
FROM ((
SELECT *
FROM student s
INNER JOIN banji ba ON s.clid = ba.clid
WHERE s.age='12' AND ba.clname='一班') a
INNER JOIN (
SELECT sid
FROM course c
WHERE c.cname ='china' AND EXISTS(
SELECT sid
FROM course c2
WHERE c2.cname ='eng' AND c2.sid=c.sid)) d ON a.id = d.sid)

结果报这个错误,cid重复
在这里插入图片描述
于是我修改了下,不用*如下:

SELECT id,name,clid,clname,sid
FROM (
	(
SELECT s.id,s.name,ba.clid,ba.clname
FROM student s
INNER JOIN banji ba ON s.clid = ba.clid
WHERE s.age='12' AND ba.clname='一班') a
INNER JOIN (
SELECT sid
FROM course c
WHERE c.cname ='china' AND EXISTS (
SELECT sid
FROM course c2
WHERE c2.cname ='eng' AND c2.sid=c.sid)) d ON a.id = d.sid)

结果如下:

在这里插入图片描述
总结如下:1.多行记录中总结到结果的查询语句要使用嵌套语句,并且尽量使用exists;
2.复杂语句中不要使用*以防重复字段错误

发布了12 篇原创文章 · 获赞 1 · 访问量 138

猜你喜欢

转载自blog.csdn.net/u010574271/article/details/104059184
今日推荐