MySQL学习记录DAY4

distinct 把查询结果去除重复记录

⚠:distinct只能出现在所有字段的最前方

出现在两个字段之前,表示两个字段联合起来去重

四、连接查询

从一张表中单独查询称为单表查询。跨表查询,多张表联合起来查询数据被称为连接查询。

1、内连接之等值连接

内连接的两张表没有主次关系

--?查询每个员工所在部门名称,显示员工名和部门名

select e.name,d.dname from emp e,dept d where e.deptno=d.deptno;(sql92语法

select e.name,d.dname from emp e (inner)join dept d on e.deptno=d.deptno;(sql99语法

带着inner的可读性更好

等值连接是因为on后面接的是等式

2、内连接之非等值连接

--?查询员工的工资等级

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

3、内连接之自连接

--?查询员工的上级领导,要求显示员工名和对应的领导名

select a.ename as '员工名',b.ename as '领导名' from emp.a join emp.b on a.mgr = b.empno;

自连接技巧:一张表看成两张表

4、外连接(右外连接)

select e.name,d.dname from emp e right (outer)join dept d on e.deptno=d.deptno;

right代表什么:表示将join关键字右边的这张表看成主表,主要是为了将这张表的数据全部查询出来,捎带着关联查询左边的表

5、外连接(左外连接)

select e.name,d.dname from dept d left (outer) join emp e on e.deptno=d.deptno;

左右连接的写法是可以互换的

--?查询每个员工的上级领导,要求显示所有员工的名字和领导名

select a.ename as '员工名',b.ename as '领导名' from emp a left join emp b on a.mgr=b.empno;

6、三张表、四张表的连接

select...from a join b on a和b的连接条件

join c on a和c的连接条件

join d on a和d的连接条件

一条sql语句中内外连接可以混用

--?找出每个员工的部门名称以及工资等级,要求显示员工名、部门名、薪资、薪资等级

select e.ename as '员工名',d.dname as ‘部门名',e.sal,s.grade from emp e join dept d on e.deptno = d.deptno join salgrade s on e.sal between s.lowsal and s.highsal;

--?找出每个员工的部门名称以及工资等级,要求显示员工名、领导名、部门名、薪资、薪资等级

select e.ename as '员工名',e1.ename as '领导名',d.dname as ‘部门名',e.sal,s.grade from emp e join dept d on e.deptno = d.deptno left join emp e1 on e.mgr=e1.empno join salgrade s on e.sal between s.lowsal and s.highsal;

五、子查询

select语句中嵌套select语句,被嵌套的select语句称为子查询

1、where中的子查询

--?找出比最低工资高的员工姓名和工资

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

2、from中的子查询

from后面的子查询,可以将子查询的查询结果当做一张临时表

--?找出每个岗位的平均工资的薪资等级

 select a.*,s.grade from (select job,avg(salary) as avgsal from emp group by job) as a join salgrade s on a.avgsal between s.lowsal and highsal;

3、select后面出现的子查询

--?找出每个员工的部门名称,要求显示员工名,部门名

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

六、union合并查询结果集

--?查询工作岗位是manager和salesman的员工

①select ename,job from emp where job='manager' or job='salesman';

②select ename,job from emp where job in ('manager','salesman');

③select ename.job from emp where job='manager'

union

select ename.job from emp where job='salesman';

⚠union的效率要高一些,对于表连接来说,每连接一次新表,则匹配的次数满足笛卡尔积现象,成倍增长,但是union可以减少匹配的次数,在减少匹配次数的情况下,还可以完成两个结果集的拼接。

⚠union使用中的注意事项

union在进行结果集 合并的时候,要求两个结果集的列数相同

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值