概念:
子查询又叫做嵌套查询,一个语句中包含了查询语句,简单来说,就是你想要的数据,不是直接可以查询出来的,查询的思路要拐个弯。
子查询一般都是用在查询条件中,(查询条件: 列名 运算符 搜索值) 用来代替的是搜索值。
语法:
SELECT * FROM 表名 WHERE 列名 运算符 (子查询语句);
DELETE FROM 表名 WHERE 列名 运算符 (子查询语句);
注意:
所有的子查询语句都可以分步骤完成
子查询实现的分析步骤:
1、子查询一定要放在小括号中,优先执行
2、子查询语句放在查询条件的右边,充当的是搜索值
3、子查询语句可以分为单行子查询,多行子查询
单行子查询:子查询语句返回的结果就一个,一个值(一个列)
多行子查询:子查询语句返回的结果就是多个行,多个值(一个列)
单行子查询的运算符: = ,!=,>,<,>=,<=
多行子查询的运算符: IN
例如:
查询王五这个学生的课程的名称,课时,和讲课老师
SELECT sid,did FROM student WHERE sname='王五'; --sid did
SELECT cid FROM score WHERE sid=(SELECT sid FROM student WHERE sname='王五'); -- cid
SELECT * FROM course WHERE cid IN (SELECT cid FROM score WHERE sid=(SELECT sid FROM student WHERE sname='王五'));
SELECT cname,chour,tname FROM course WHERE cid IN (
SELECT cid FROM score WHERE sid=(
SELECT sid FROM student WHERE sname='王五')) ---子查询写法
SELECT cname,chour,tname FROM student,course,score WHERE student.`SID`=score.`SID` AND course.`CID`=score.`CID` AND sname="王五"; ---多表联合查询写法
limit嵌套查询
在Mysql中使用嵌套查询,就是在子查询中的select语句带有limit。
比如这样的语句是不能正确查询的:
select * from tableA where id in(select id from tableB limit 0,1);
会报错:
This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
解决办法:
在后面的子查询中再嵌套一层(把子查询当成一张表再查):
select * from tableA where id in(select t.id from (select id from tableB limit 0,1) as t );