首先,有这三张表表分别是:
班级表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.复杂语句中不要使用*以防重复字段错误