3.子查询
3.1什么是子查询?
select语句中嵌套select语句,被潜逃的select语句是子查询。
子查询可以出现在哪里?
select
..(select)
from
..(select)
where
..(select)
3.2wher子句中使用子查询
案例:找出高于平均薪资的员工信息
第一步:找出平均薪资
select avg(sal) from emp;
第二步:where过滤
select * from emp where sal >27000;
第三步:合并第一步第二步
select * from emp where sal >(select avg(sal) from emp);
3.3 from后面嵌套子查询
案例:找出每个部门平均薪水的薪资等级。
第一步:找出每个部门平均薪水(按照部门编号分组)
select deptno,avg(sal) as avgsal from emp group by deptno;
第二步:将以上的查询结果当作临时表t,将t表和salgrade表连接,条件是:t.avgsal between s.losal and s.hisal
select
t.*,s.grade
from
(select deptno,avg(sal) as avgsal from emp group by deptno) t
join
salgrade s
on
t.avgsal between s.losal and s.hisal ;
注意:将查询的子句设置一个别名作为一张临时表
案例:找出每个部门平均的薪水等级
第一步:找出每个员工的薪水等级
select e.sal,e.name,e.deptno,s.grade from emp e join salgrade s on e.sal between s.losal and s.hisal;
第二步:基于以上结果,继续按照deptno分组,求grade平均值。
select
e.deptno,avg(s.grade)
from
emp e
join
salgrade s
on
e.sal between s.losal and s.hisal
group by
e.deptno;
3.4在select后面嵌套子查询
案例:找出每个员工所在的部门名称,要求显示员工名和部门名。
select
e.name,
(select d.name from dept d where e.deptno=d.deptno) as dname
from
emp e;
4.union(可以将查询结果集相加)
案例:找出工作岗位是SALEMAN和MANAGER的员工?
第一种:or
select name,job from emp where job='SALEMAN' or job='MANAGER';
第二种:in
select name,job from emp where job in('SALEMAN','MANAGER');
第三种:union
select name,job from emp where job='SALEMAN'
union
select name,job from emp where job='MANAGER';
注意:union可以将不相干的表中的数据拼接在一起显示,union查询合并的查询列的个数应该一致。
select name from emp where job='SALEMAN'
union
select name,job from emp where job='MANAGER';
上面这个查询的个数不一致会报错。
5.limit(重点,分页查询全靠它)
5.1 limit是mysql特有的,其他数据库中没有,不通用。(oracle中有一个相同的机制,叫做rownum)
5.2 limit取结果集中的部分数据,这是他的作用。
5.3 语法机制:
limit startIndex,length
startIndex表示起始位置,从0开始,0表示第一条数据
length 表示去几个
案例:取出工资前5名的员工(思路:降序取前5)
select name ,sal from emp order by sal desc;
取前5个:
select name ,sal from emp order by sal desc limit(0,5);
select name ,sal from emp order by sal desc limit(5);
5.4 语法:
select 5
...
from 1
...
where 2
...
group by 3
...
having 4
...
order by 6
...
limit 7
...
5.5 案例:找出工资排名在第4名到第9名的员工
select name ,sal from emp order by sal desc limit(3,6);
5.6 通用标准分页sql
每页显示3条记录:
第1页:0,3
第2页:3,3
第3页:6,3
第4页:9,3
第5页:12,3
每页显示pagesize条记录:
第pageNo页:(pageNo-1)*pageSize,pageSize
java代码{
int pageNo=2;//页码
int pageSize=10;//每页显示条数
limit:(pageNo-1)* pageSize,pageSize
}
关于Mysql当中字段的数据类型?
int 整数型
bigint 长整型(java中long)
float 浮点型
char 定长字符串
varchar 可变长字符串
date 日期类型
BLOB 二进制大对象(存储图片、视频等流媒体信息)
CLOB 字符大对象(存储较大文本)