• MySQL---查询(下篇)


    目录

    1:distinct的用法

    2:表的连接查询

    3:子查询

    4:union的用法

    5:limit的用法


    在这次查询前我们要用到三张表:

    emp:

    dept;

     

    salgrade:

     

     这三张表的分别是员工表,部门表和薪水表

    1:distinct的用法

    distinct是可以除其中的重复记录的。

    如下表的查询emp中的工作岗位,发现很多重复了,这时候就可以用distinc去除重复记录,找到岗位数了。

     

     

    1. select ename,distinct job from emp;
    2. //注意这样的写法是错误的
    3. //但可以换成下面的写法
    4. select distinct job,ename from emp;
    5. //这表示job和ename联合查找去重

     

    1. //distinct也是可以和函数连用的
    2. 如查找工作岗位的数量
    3. select count(distinct job) from emp;

    2:表的连接查询

    有时候,在一些案例中,一张表我们没法查询到我们需要的东西,这时候就需要,其它的表一起联合起来进行查询了。

    (1)内连接

    与下文外连接相反,没有主表次表之分,就是将完全匹配的数据查询出来。

    1. 格式:
    2. select
    3. 字段...
    4. from
    5. 表格1
    6. join
    7. 表格2
    8. on
    9. 两个表格连接的条件
    10. where
    11. 可以加一些其它的筛选条件

     如查询每个员工所在的部门名称,显示员工名,部门名

    1. select
    2. e.ename,d.dname
    3. from
    4. emp e//原来的表叫emp,为了方便给他起了个别名叫e,大家可以记住这种格式就行
    5. join
    6. dept d//原来的表叫dept,起了个别名叫的,跟上面一样的意思
    7. on
    8. e.deptno=d.deptno
    9. ;

     继续:

    想要查询员工的薪资,薪资等级和员工的名字

    1. select
    2. e.ename,e.sal,s.grade
    3. from
    4. emp e
    5. join
    6. salgrade s
    7. on
    8. e.sal between s.losal and s.hisal;

     接下来还有个内连接,叫内连接的自连接,顾名思义,还是联合多张表,只是这多张表是同一个表,说这么多,还不如实战感受下。

    如:查询员工的上级领导,要求显示员工名和对应的领导名(这都是在一张表emp中)

    1. select
    2. e.ename as '员工',s.ename as '领导'
    3. from
    4. emp e
    5. join
    6. emp s
    7. on
    8. e.mgr=s.empno;

     但是主要,这只查出了13条记录,没有大老板,因为,大老板没有领导,显示的是null,null不显示。

    (2)外连接

    外连接怎么说呢,它是分主表,以主表为主进行查询。

    举个例子:查询员工的部门以及员工的名字

    之前是用内连接查询的,但是没有员工的部门他就不显示了,因为是NULL嘛,但是外连接可以解决这个问题。

    1. select
    2. e.ename,d.dname
    3. from
    4. emp e
    5. right join//因为要将没有员工的部门也要显示出来,那么就是将dept这场表全部显示出来
    6. dept d //就是说要以dept这张表为主,那么就要right右连接,以右边为主;dept在from
    7. on //后面,自然就是left左连接了
    8. e.deptno=d.deptno;

     如:查询所有员工名以及领导名(注意是所有,分清楚主次,员工显示所有,员工是主)

    1. select
    2. e.ename as '员工',s.ename as '领导'
    3. from
    4. emp e
    5. left join
    6. emp s
    7. on
    8. e.mgr=s.empno;

     (3)多张表的连接

    1. //多张表连接的代码格式
    2. select
    3. 字段...
    4. from
    5. 表格1
    6. join
    7. 表格2
    8. on
    9. 表格1和表格2的连接条件
    10. join
    11. 表格3
    12. on
    13. 表格1和表格3的连接条件
    14. join
    15. 表格4
    16. on
    17. 表格1和表格4的连接条件
    18. .....

    如:找出每个员工的部门名称,薪资等级,员工名,薪资

    1. select
    2. e.ename as '员工名',d.dname as '部门名',s.grade as '薪资等级',e.sal as '薪资'
    3. from
    4. emp e
    5. join
    6. dept d
    7. on
    8. e.deptno=d.deptno
    9. join
    10. salgrade s
    11. on
    12. e.sal between s.losal and s.hisal;

     

     

     3:子查询

    子查询顾名思义就是查询了之后的查询,简单来说就是,先查询过的把它当做一张表,然后可以接着差这张表(就是你查询过的那个,当然了这是from中的子查询,我这样子说,只是为了让你更好理解而已)。所有也就有了select的子查询,from的子查询,where的子查询了。

    1. 格式:
    2. select
    3. select ...)
    4. from
    5. select ...)
    6. where
    7. select ...)

    (1)where中的子查询

    如:找出比最低工资高的员工名和薪资

    1. select
    2. e.ename,e.sal
    3. from
    4. emp e
    5. where
    6. e.sal>(select min(sal) from emp);

     (2)from中的子查询

    如:找出每个岗位的平均薪资的薪资等级

    1. select
    2. t.*,s.grade
    3. from
    4. (select job,avg(sal) as avs from emp group by job) t
    5. join
    6. salgrade s
    7. on
    8. t.avs between s.losal and hisal;

     (3)select中的子查询(这个不需要掌握,了解即可,我们老师说的,哈哈哈!!!)

    如:找出每个员工的部门名称和员工名

    1. select
    2. e.ename,(select d.dname from dept d where d.deptno=e.deptno) as dname
    3. from
    4. emp e;

     4:union的用法

    union就是合并两个结果查询集

    如:找出deptno=10和20的员工名

    1. select
    2. e.ename,e.deptno
    3. from
    4. emp e
    5. where
    6. e.deptno = 10 or e.deptno =20;
    7. //这是正常的写法,下面是用union的写法
    8. select
    9. e.ename,e.deptno
    10. from
    11. emp e
    12. where
    13. e.deptno = 10
    14. union
    15. select
    16. e.ename,e.deptno
    17. from
    18. emp e
    19. where
    20. e.deptno =20;

     5:limit的用法

    limit的作用:将查询结果取一部分出来,就相当于给查询做了几次的限制吧,通常用于分页查询。

    分页的作用就是为了提高用户的体验感。

    1. limit的格式
    2. limit 起始位置, 长度
    3. (注意起始位置是以0开始的)

    还是看看实例更好理解 

    如:按照薪资降序,取出排名前五的员工

    1. select
    2. e.ename,e.sal
    3. from
    4. emp e
    5. order by
    6. sal desc
    7. limit 5;
    8. //下面是limit的完整写法
    9. select
    10. e.ename,e.sal
    11. from
    12. emp e
    13. order by
    14. sal desc
    15. limit 0,5;

     

     要注意limit是在order   by的后面执行的!!!!!

    如:找出工资在第三道第五之间的员工(降序)

    1. select
    2. e.ename,e.sal
    3. from
    4. emp e
    5. order by
    6. sal desc
    7. limit 2,3;//注意其实位置是0哦!!!,所以第三个就是2

     OK!!!,本文到此结束,如有错误,还请大佬指正!!!!!

  • 相关阅读:
    【教3妹学编程-算法题】高访问员工
    数仓面经大框架
    记录如何用php做一个网站访问计数器的方法
    rust结构体
    百度 | 文心一言也开始收费了
    Linux常用命令——cksum命令
    Qt5开发及实例V2.0-第二章Qt模板库工具类及控件
    spring之bean的生命周期
    【从零开始游戏开发】Lua热更新概念与基础知识讲解 | 全面总结 |建议收藏
    ZYNQ_project:test_fifo_255X8
  • 原文地址:https://blog.csdn.net/gaoqiandr/article/details/126962480