上节课我们给大家介绍了MySQL分组查询与聚合函数的使用方法,具体可回顾MySQL分组查询与聚合函数的使用方法(三)。本节课我们将介绍where条件查询中的IN关键字子查询的使用方法。
在MySQL中,子查询我们也称为嵌套查询。并且子查询语句一般放在条件查询关键词where之后,其基本语法结构如下。
代码语言:javascript复制SELECT <列名> FROM 表名
WHERE <条件查询列名> IN (子查询语句);
假设现在我们新增了一个表phone,其中记录了部分乘客目前在用的手机品牌,如下所示。
【任务1】查找使用华为手机的乘客编号,姓名、性别以及年龄信息。需要结合使用titanic以及phone两个表的信息,通过IN子查询实现。
代码语言:javascript复制select PassengerId,name,sex,age from titanic
where PassengerId IN
(SELECT PassengerId from phone
where phonebrand="HUAWEI");
查询结果如下所示
语法解析:
首先通过IN子查询从phone表中找出使用华为手机的乘客编号(SELECT PassengerId from phone where phonebrand='HUAWEI'),
然后在主查询中通过where条件查询限制乘客编号必须为子查询的乘客编号( where PassengerId in ( SELECT PassengerId from phone where phonebrand='HUAWEI'),
最后将符合查询条件的乘客编号,姓名、性别以及年龄信息展示出来(select PassengerId,name,sex,age from titanic)。
【任务2】查找使用苹果手机并且年龄大于30岁的男性乘客,展示乘客编号,姓名,性别,年龄信息。可以通过以下查询语句实现。
代码语言:javascript复制select PassengerId,name,sex,age from titanic
where PassengerId in
(SELECT PassengerId from phone
where phonebrand="iPhone")
and age>30
and sex='male';
查询结果如下所示
语法解析:
首先通过IN子查询从phone表中找出使用苹果手机的乘客编号(SELECT PassengerId from phone where phonebrand='iPhone'),
并且限制主查询的乘客编号为子查询的乘客编号,同时限制年龄大于30,性别为male( where PassengerId in (SELECT PassengerId from phone where phonebrand='iPhone') and age>30 and sex='male' ),
最后将符合查询条件的乘客编号,姓名、性别以及年龄信息展示出来(select PassengerId,name,sex,age from titanic)。
【任务3】查找船舱等级为3且存活的乘客姓名以及手机品牌,可以通过以下子查询语句进行。
代码语言:javascript复制select name,phonebrand from phone
where PassengerId IN
(SELECT PassengerId from titanic
where pclass=3
and survived=1);
以下是查询结果
语法解析:
首先通过IN子查询从titanic表中找出船舱等级为3且幸存的乘客编号(SELECT PassengerId from titanic where pclass=3 and survived=1 ),
并且限制主查询的乘客编号为子查询的乘客编号( where PassengerId in (SELECT PassengerId from titanic where pclass=3 and survived=1),
最后将符合查询条件的乘客姓名,手机品牌列展示出来(SELECT name,phonebrand FROM phone)。
结合以上三个案例,聪明的同学应该看出来了,能将titanic、phone两个表联系起来的关键在于主键PassengerId,如果两个表中没有PassengerId这个主键字段,我们就无法实现以上的子查询。
好了,今天的内容介绍到这里。下节课开始,我们将给大家介绍MySQL中非常常用的多表联合查询以及子查询与多表联合查询的区别,敬请期待!
想学习更多数据分析、数据挖掘干货知识,请关注公众号