子查询
子查询在逻辑上通常是两个查询,子查询就是提高了代码的简洁性,原本需要使用多个select语句完成的查询工作在一个查询中完成。
按照子句分类可以分为三种,第一种就是where子句,第二种就是from子句,第三种就是exists子句。子查询根据结果集可以分为标量子查询、列子查询、行子查询、表子查询。
where 子句 >>group by 子句>>having 子句>>order by 子句>>limit 子句。
select * from 表1 where id>=(select max(id) from 表2);
select * from 表1 where id in (select id from 表2);
#from型子查询,会产生一个临时表,因此我们必须为from表名的表指定一个别名,也就是下面语句的x。
select * from (select * from 表1 where id <= floor(rand()*5)) as x where name regexp ‘京东’;
select * from 表1 where exists (select * from 表2 where 表1.year = 表2.year);
分组 group by,默认group by显示的是每一组的找到的第一条记录。
select count(*) as 人数,class as 班级 from school group by class;
select max(score) as 分数,class as 班级 from school group by class;
#group by 多字段排序,首先会对第一个字段进行排序,然后对第二个字段排序。
select count(*),level,dept from staff group by level,dept;
拥有 having,having必须引用group子句中的列或者聚合函数处理过的列。
select count(name),dept from staff group by dept having count(name)>1;
select count(*),dept from staff group by dept having dept!=’开发部’;
#同样也可以用where实现
select count(*),dept from staff where dept !=’开发部’group by dept;
limit子句,它的作用就是截取结果集的一部分
limit n,m;返回第n行开始的第m条数据
mysql为了和postgreSQL兼容,它还支持了如下语法:limit m offset n。
select * from 表 limit 0,3;//查询的是先三条数据
select * from 表 limit 3;
select * from 表 limit 3 offset 0;
order by 子句 asc 升序 desc 降序
order by 字段名1 [desc|asc] ,字段名2 [desc|asc].....;
#先根据字段1进行排序,然后按照字段2进行排序.....
select * from表 order by year desc;
select * from表 order by year desc,id desc;
select * from表 order by name;
union子句 -> 要求两个表的列数应该相同
select 语句 union [all] select 语句;
#all表示结果集中保留所有数据,否则删除重复数据
select * from 表1 union select * from 表2 order by id;