• 数据查询语句(DQL)1


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

  • 相关阅读:
    ssh工具推荐MobaXterm 可能是你遇到过的比较出色的一款
    IDEA不能读取配置文件,springboot配置文件无效、IDEA resources文件夹指定
    修改设置notepad++默认保存文件格式
    java jdk 8反编译工具JD-GUI、procyon-decompiler、luyten、crf下载使用简介
    Synchronized锁性能优化偏向锁轻量级锁升级 多线程中篇(五)
    java并发多线程显式锁Condition条件简介分析与监视器 多线程下篇(四)
    java多线程Lock接口简介使用与synchronized对比 多线程下篇(三)
    java 并发多线程 锁的分类概念介绍 多线程下篇(二)
    java 并发多线程显式锁概念简介 什么是显式锁 多线程下篇(一)
    sql修改二进制加密密码
  • 原文地址:https://www.cnblogs.com/homle/p/14956578.html
Copyright © 2020-2023  润新知