MySQL多表之子查询
子查询是指一个查询语句嵌套在另一个查询语句内部的查询。
它可以嵌套在一个SELECT || SELECT......INTO || INSERT.......INTO等语句中。
在执行查询语句时,首先会执行子查询中的语句,然后将返回的结果做为外层查询的过滤条件,在子查询中通常可以使用 IN EXISTS ANY ALL操作符。
1、带IN关键字的子查询
使用IN关键字进行子查询时,内层查询语句仅返回一个数据列,这个数据列中的值将供外层查询语句进行比较操作。
我们要在原来的基础上添加一列,这样才能够更好的体现出我们的子查询的效果
ALTER TABLE student ADD age int;
添加一个字段,是我们同学们的年龄,然后我们向我们的student表中补充一些数据
update student set age= 22 where id =2;
update student set age= 20 where id =3;
update student set age= 20 where id =4;
update student set age= 22 where id =5;
补充一些数据以后,我们就可以使用我们的带IN关键字的子查询了,那我们查什么呢?
SELECT * FROM class WHERE id IN (SELECT classid FROM student WHERE age <=20);
大家思考一下我们的这个命令是在查询什么
然后我们来查一下移应161班有哪几个同学:
2、带EXISTS关键字的子查询
EXISTS关键字后面的参数可以是任意一个子查询,这个子查询的作用相当于测试,它不产生任何数据,只返回TRUE或FALSE,当返回值为TRUE时,外层查询才会执行。
查询student表中是否存在年龄大于21岁的员工,如果存在,则查询class表中的所有记录
SELECT * FROM class WHERE EXISTS (select * from student where age > 21);
由于student表中有年龄大于21岁的员工,因此,子查询的返回结果为TRUE,所以外层的查询语句才会执行,即查询出所有部门信息。需要注意的是,EXISTS关键字比IN关键字的运行效率要高,所以在实际开发过程中,特别是数据量较大时,推荐使用EXISTS关键字,大体判断一下数据,再行查询功能。
3、带ANY关键字的子查询
ANY关键字表示满足其中任意一个条件,它允许创建一个表达式对子查询的返回值列表进行比较,只要满足内层子查询中的任意一个比较条件,就返回一个结果作为查询条件。
SELECT * FROM class WHERE id > any(select classid from student);
上述语句在执行过程中,首先子查询会将student表中的所有classid查询出来,然后将结果和class表中的id值进行比较,只要能够大于id中的任意的一个值,就是符合条件的查询结果,所以有如下结果。
4、带ALL关键字的子查询
ALL关键字和ANY关键字类似,不过ALL关键字的子查询返回的结果需同时满足所有内层查询条件。
SELECT * FROM class WHERE id > all(select classid from student);
那最后的结果是什么?教给大家联系
5、带比较运算符的子查询
在前面讲解的ANY和ALL关键字的子查询中,使用了">"比较运算符,子查询中还可以使用其他的比较运算符。
练习:查询钱同学是哪个班级的。
查询钱同学班级以外的其他班的同学有哪几位?