MySQL多表之子查询

2017-11-12  本文已影响651人  三斤耳朵

子查询是指一个查询语句嵌套在另一个查询语句内部的查询。

它可以嵌套在一个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关键字的子查询中,使用了">"比较运算符,子查询中还可以使用其他的比较运算符。

练习:查询钱同学是哪个班级的。

           查询钱同学班级以外的其他班的同学有哪几位?

上一篇下一篇

猜你喜欢

热点阅读