普通多表查询
//查询两张表的所有数据
select * from 表名1,表名2 where 表名1.字段名 = 表名2.字段名;
//查询指定字段的数据
select 表名1.字段名,表名2.字段名 from 表名1,表名2 where 表名1.字段名 = 表名2.字段名;
嵌套多表查询
select * from 表名 where 字段名 in(select 字段或者函数 from 表名);
//例如
select name from user where id in(select max(id) from user);
链接多表查询
- 左链接(会将左表的内容全部输出,没有需要补NULL)
select * from 表名1 left join 表名2 on 表名1.字段名 = 表名2.字段名;
select * from 表名1 as a left join 表名2 as b on a.字段名 = a.字段名;
//例如
select class.name if(count(user.id),count(user.id),'无') from class left join user on class.id=user.class_id group by class.id;
- 右链接(会将右表的内容全部输出,没有需要补NULL)
select * from 表名1 right join 表名2 on 表名1.字段名 = 表名2.字段名;
select * from 表名1 as a right join 表名2 as b on a.字段名 = a.字段名;
//例如
select class.name if(count(user.id),count(user.id),'无') from user left join class on class.id=user.class_id group by class.id;
- 内链接(完全等价于普通多表查询,必须符合条件的多个表的数据才会显示)
select class.name count(user.id) from class left join user on class.id=user.class_id group by class.id;
having的使用方法
//使用class_id为分组聚合条件之后,使用having再class_id作为条件筛选一次
select class_id from user group by class_id having class_id<2;
问题:将所有班的总人数统计出来,前提是有些班没有人
select class.name if(count(user.id),count(user.id),'无') from class inner join user on class.id=user.class_id group by class.id;
问题:用户表,里面有很多用户,有一列是成绩,请统计这张表中及格人数和不及格人数
select sum(if(score>=60,1,0)) jige ,sum(if(score<60,1,0)) bujige from user;