-- 取出一年级的学生 select * from user where class in (select id from class_table where level=1);
交集运算
1 2 3 4 5 6
select * from user1 union select * from user2; -- union自动去除重复记录 -- 两表的字段类型需相同 -- order by子句只能使用一次 select * from user1 union select * from user2 order by add_time; -- all关键字保留重复行 select * from user1 union all select * from user2;
内连接,on条件对左右两侧表都生效
1 2 3
select u.name,c.name from user as u inner join class as c on u.class=c.id; -- 和where结合 select u.name,c.name from user as u inner join class as c on u.class=c.id where u.name like "xxh%";
外连接的on条件只对一侧的表有效,主表有多少条记录就返回多少条
1
select u.name,c.name from user as u right join class as c on u.class=c.id;
三张表的连接
1
select u.name, c.name, t.name from user as u left join class as c on u.class=c.id left join teacher as t on c.teacher=t.id;
交叉连接(笛卡尔积), 生成user表的行数 * class表的行数
1
select * from user cross join class;
处理null值为不确定
1
select u.name, c.name, coalesce(t.name, '不确定') from user as u left join class as c on u.class=c.id left join teacher as t on c.teacher=t.id;
窗口函数,mysql8支持,只能写在select子句中
1 2 3 4 5 6 7 8
-- 按班级计算学生成绩排名 select name, class, score, rank() over(partition by class order by score desc) as ranking FROM `user`; -- 按全校成绩排名,取出排名前三 select id,`name`,class,score,rank() over(order by score desc) as ranking FROM `user` limit 3; -- dense_rank, row_number也计算排名,若有两个第一名,返回1、1、2,row_number返回1、2、3,rank返回1、1、3 -- 也可以把聚合函数作为窗口函数使用 -- 取出每个班级排名前3 select * from (select id,`name`,class,score,rank() over(partition by class order by score desc) as ranking FROM `user`) as u where u.ranking <= 3;