1.含义
当一个查询时另一个查询的条件时,称为子查询
CREATE TABLE user1 (
id int(4) not null auto_increment,
name varchar(20) not null default '' comment '名称',
primary key(id)
)engine=INNODB auto_increment=1 DEFAULT charset=utf8 comment '用户表';
CREATE TABLE user_kill (
id int(4) not null auto_increment,
userId int(4) not null default 0 comment '用户id',
date date not null comment '日期',
num int(4) not null default 0 comment '打怪数',
primary key(id)
)engine=INNODB auto_increment=1 DEFAULT charset=utf8 comment '打怪表';
2.子查询的特点
语义明确
可以避免如join查询导致的数据重复问题
3.子查询示例
子查询示例:
SELECT a.* from user1 a where a.id in (SELECT userId from user_kill );使用join查询示例:
SELECT a.* from user1 a join user_kill b on a.id=b.userId ;
4.子查询的多列过滤使用-mysql独有的
需求:取出每个用户打怪最多的记录数据
1.获取每个用户打怪最多的记录数据
SELECT c.userId , max(c.num) from user_kill c GROUP BY c.userId
2.获取每个用户的打怪记录
SELECT a.name,b.date,b.num from user1 a join user_kill b on a.id=b.userId
3.关联上述两个查询
SELECT a.name,b.date,b.num from user1 a join user_kill b on a.id=b.userId
where (b.userId,b.num) in (
SELECT c.userId , max(c.num) from user_kill c GROUP BY c.userId
);
5.数据