select sno, sname, ssex, sdept from student st where st.sno in (select sno from sc where cno in (select cno from course where cname = 'Maths'))
逻辑就是先获取数学课的课程编号,然后通过课程编号获取选修了课程的学生编号,然后通过学生编号再去获取学生信息
不知道你这个问题是否已经解决, 如果还没有解决的话:概念:
1.第一次查询的结果当做表或者条件进行第二次查询。
2,一般而言子查询的效率较差。至少需要两次查询。
3.子查询中包含:IN、NOT IN、ANY、ALL、EXISTS和NOT EXISTS 等关键字。
4.还可以包含比较运算符:=、!=、>、<等。
注意:
1.子查询要包含在括号内。
2.将子查询放在比较条件的右侧
3.单行操作符对应单行子查询,多行操作对应多行子查询
案例:
查询工资高于猪八戒的员工信息,
第一步:先查询出来猪八戒的工资
select salary from emp where name = '猪八戒'
第二步:将第一步查询出来的猪八戒工资作为条件 查询工资高于猪八戒的员工信息。
select * from emp where salary > (select salary from emp where name = '猪八戒');
执行结果:
子查询根据查询结果不同,作用不同
- 子查询语句结果是单行单列,子查询语句作为条件值,使用 = != > < 等进行条件判断
- 子查询语句结果是多行单列,子查询语句作为条件值,使用 in 等关键字进行条件判断
- 子查询语句结果是多行多列,子查询语句作为虚拟表
案例
查询‘财务部’和‘市场部’所有的员工信息
-- 查询 '财务部' 或者 '市场部' 所有的员工的部门did
select did from dept where dname = '财务部' or dname = '市场部';
select * from emp where dep_id in (select did from dept where dname = '财务部' or dname =
'市场部');
查询入职日期是‘2011-11-11’之后的员工信息和部门信息
-- 查询入职日期是 '2011-11-11' 之后的员工信息
select * from emp where join_date > '2011-11-11' ;
-- 将上面语句的结果作为虚拟表和dept表进行内连接查询
select * from (select * from emp where join_date > '2011-11-11' ) t1, dept where
t1.dep_id = dept.did;