1. 三张表介绍
员工表 emp:
部门表 dept:
薪资等级表 salgrade:
2. 简单查询
(1)查看员工表结构:
desc emp;
(2)查询emp表中的一个字段:
select empno from emp;
(3)查询表中多个字段,使用,(逗号)分割:
select empno,ename from emp;
(4)查询所有字段 ,一般不推荐使用,效率较低:
select * from emp;
(5)查询年薪以yearsal显示,月薪*12 as 重命名,as可以省略,也可以使用中文字段,必须使用单引号;
select empno,ename,sal * 12 as yearsal from emp;
select empno,ename,sal * 12 yearsal from emp;
select empno,ename,sal * 12 '年薪' from emp;
3. 条件查询(where)
(1)查询工资5000的员工姓名:
select ename,sal from emp where sal = 5000;
(2)查询史密斯的工资:
select ename,sal from emp where ename = 'smith';
(3)查询工资高于3000的员工:
select ename,sal from emp where sal > 3000;
(4)不等于3000:
select ename,sal from emp where sal <> 3000;
select ename,sal from emp where sal != 3000;
(5)介于两者之间:
select ename,sal from emp where sal >= 1100 and sal < 5000;
select ename,sal from emp where sal between 1100 and 3000; (包含1100和3000)
(6)还可以使用字符,判断字符的首字母在A到D之间,左闭右开:
select ename from emp where ename between 'A' and 'D';
(7)判断为空,不为空:
select ename,sal,comm from emp where comm is null;
select ename,sal,comm from emp where comm is not null;
select ename,sal,comm from emp where comm is null or comm = 0; 为空或等于0
(8)条件或:
select ename,job from emp where job = 'salesman' or job = 'manager';
(9)大于1000,等于20或30,使用括号:
select ename,sal,deptno from emp where sal > 1000 and (deptno = 20 or deptno = 30);
(10)in等同于or,不是在两者之间
select ename,sal from emp where sal = 800 or sal = 5000;
select ename,sal from emp where sal in (800,5000);
select ename,sal from emp where sal not in (800,5000); (not in 不等于)
4. 模糊查询(like)
在模糊查询中,有两个特殊的符号,一个是%,一个是_;%代表任意多个字符,_代表一个字符;
(1)ename中包含“o”:
select ename from emp where ename like '%o%';
(2)ename中第二个字母是“A”:
select ename from emp where ename like '_A%';
(3)name中包含下划线:
select ename from emp where ename like '%\_%'; (下划线本身代表一个字符,所以使用\取消转义,把_转化为普通下划线)
5. 数据排序(order by)
(1)对sal排序:
select ename,sal from emp order by sal; (默认升序)
select ename,sal from emp order by sal asc; (asc升序)
select ename,sal from emp order by sal desc; (desc降序)
(2)对第二个字段升序,不推荐使用,当字段发生变化时,程序不能使用:
select * from emp order by 2;
(3)job是salesman,sal降序:
select ename,sal,job from emp where job = 'salesman' order by sal desc;
(4)对工资降序排序,当工资相同时对名字升序排序:
select ename,sal from emp order by sal desc,ename asc;
6. 分组函数
分组函数有5个,count(计数)、sum(求和)、avg(求平均值)、max(求最大数)、min(求最小数)都是对一组数据操作;
(1)分组函数使用:
select sum(sal) from emp; (求和)
select min(sal) from emp;
select max(sal) from emp;
select avg(sal) from emp;
select count(*) from emp; (总数)
(2)count(*)和count(具体字段)区别:
count(*) 统计总记录条数(和某个字段无关);
count(具体字段) 统计某个具体字段中不包含NULL的数量;
(3)分组函数自动忽略NULL:
select count(comm) from emp;
(4)where后不能直接使用分组函数
select ename,sal from emp where sal > avg(sal); ERROR 1111 (HY000): Invalid use of group function
可以使用子查询:
select ename,sal from emp where sal > (select avg(sal) from emp);
为什么where后不能直接使用分组函数呢?
分组函数一般都是和group by联合使用,先分组然后进行计算,当直接select max(sal) from emp时,虽然没有group by语句,但是此时会把表默认是一个分组,再表中取最大值,所以是先进行分组然后再调用分组函数计算。
例:从学生表t_student中选出3年纪年龄最大的女孩,按照学号id升序
select max(age) from t_student where grade=3 group by sex having sex=girl order by id asc;
一个完成的DQL语句执行顺序:
第一步:from 选择表
第二部:where 刷选条件,刷选对象是行
第三步: group by 刷选出来的数据进行分组
第四步:having 进一步过滤,刷选对象是组
第五步:select 选择最后的结果
第六步:order by 将结果按照顺序排序
由上可知需要先执行where语句,后执行group by语句,分组完成后才能执行分组函数,所以where之后直接使用分组函数就会报错,还没有进行分组,不能直接使用分组函数,在这种情况下,可以使用子查询,where之后跟一个子查询就可以了。
7. 单行处理函数
输入一行,输出一行。
(1)计算年薪,年薪应该是(sal+comm)*12的结果:
select ename,(sal + comm)*12 from emp; 但是这样计算就会出现当comm为空时,年薪就是空
(2)可以使用ifnull函数,ifnull(可能为null的数据,被当作什么处理):
select ename,(sal + ifnull(comm,0))*12 yearsal from emp; comm如果为空,被当作0处理
8. 分组group by和having
group by :按照某个字段或某些字段进行分组;
having :对分组之后的数据再进行过滤;
当一条语句中由group by的话,那么select 之后只能跟分组函数和参与分组的字段;
(1)岗位的最高工资
select ename,max(sal),job from emp group by job; 执行没有意义,因为ename没有参与分组
(2)岗位的最高工资
select max(sal),job from emp group by job; 先对岗位分组,然后对分组之后数据中找到最高工资
(3)不能部门,不能工作岗位最高工资,按照部门升序
select deptno,job,max(sal) from emp group by deptno,job order by deptno;
(4)每个部门中最高工资高于2900
select deptno,max(sal) from emp group by deptno having max(sal) > 2900;
select deptno,max(sal) from emp where sal > 2900 group by deptno; 效率较高,先进行条件查询,然后分组
(5)每个部门平均工资高于2900
select deptno,avg(sal) from emp group by deptno having avg(sal) > 2900; 不能使用where,where不能直接使用分组函数