MySQL---查询(下篇)

目录

1:distinct的用法

2:表的连接查询

3:子查询

4:union的用法

5:limit的用法


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

emp:

dept;

 

salgrade:

 

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

1:distinct的用法

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

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

 

 

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

 

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

2:表的连接查询

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

(1)内连接

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

格式:
select
 字段...
from
 表格1
join
 表格2
on
 两个表格连接的条件
where
 可以加一些其它的筛选条件

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

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

 继续:

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

select
e.ename,e.sal,s.grade
from
emp e
join
salgrade s
on
e.sal between s.losal and s.hisal;

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

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

select
 e.ename as '员工',s.ename as '领导'
from
 emp e
join
 emp s
on
 e.mgr=s.empno;

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

(2)外连接

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

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

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

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

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

select 
 e.ename as '员工',s.ename as '领导'
from
 emp e
left join
 emp s
on
 e.mgr=s.empno;

 (3)多张表的连接

//多张表连接的代码格式
select
  字段...
from
  表格1
join
  表格2
on
  表格1和表格2的连接条件
join
  表格3
on
  表格1和表格3的连接条件
join
  表格4
on
  表格1和表格4的连接条件
.....

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

select
 e.ename as '员工名',d.dname as '部门名',s.grade as '薪资等级',e.sal as '薪资'
from
 emp e
join
 dept d
on
 e.deptno=d.deptno
join
 salgrade s
on
 e.sal between s.losal and s.hisal;

 

 

 3:子查询

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

格式:
select
 (select ...)
from
 (select ...)
where
 (select ...)

(1)where中的子查询

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

select
 e.ename,e.sal
from
 emp e
where
e.sal>(select min(sal) from emp);

 (2)from中的子查询

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

select
 t.*,s.grade
from
 (select job,avg(sal) as avs from emp group by job) t
join
 salgrade s
on 
 t.avs between s.losal and hisal;

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

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

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

 4:union的用法

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

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

select
 e.ename,e.deptno
from
 emp e
where
 e.deptno = 10 or e.deptno =20;
//这是正常的写法,下面是用union的写法


select
 e.ename,e.deptno
from
 emp e
where
 e.deptno = 10 
union
select
 e.ename,e.deptno
from
 emp e
where
  e.deptno =20;

 5:limit的用法

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

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

limit的格式

limit  起始位置,  长度
(注意起始位置是以0开始的)

还是看看实例更好理解 

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

select 
e.ename,e.sal
from
emp e
order by
sal desc
limit 5;

//下面是limit的完整写法


select 
e.ename,e.sal
from
emp e
order by
sal desc
limit 0,5;

 

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

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

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

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜到极致就是渣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值