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不能直接使用分组函数

 

posted on 2021-07-04 18:37  homle  阅读(210)  评论(0编辑  收藏  举报