MySQL—连接查询,用户权限

一、连接查询,多张表连接起来查询

内连接(等值连接、非等值连接、自连接)inner
外连接(左外连接、右外连接)
全连接(很少用)
笛卡尔积

1.内连接

- 案例:查询每个员工的部门名称,要求显示员工名和部门名,等值连接
-- 老版本:
select e.empname,d.dname from emp e,dept d where e.deptno=d.deptno;
-- 新版本; join on语法:某某某 a表 join 某某某 b表 on 后面跟的连接条件
select e.empname,d.dname from emp e join dept d on e.deptno=d.deptno;
select e.empname,d.dname from emp e inner join dept d on e.deptno=d.deptno;
-- 查询结果如下图所示内连接注意:内连接inner可以省略,外连接outer也可以省略,以上两个新版本的查询方法都可以

-- 工资等级在losal和htsal之间,非等值连接
select e.empname,e.sal,s.grade from emp e join salgrade s on e.sal between s.losal and s.htsal;

2.外连接—左连接 left join

-- 外连接1(外连接居多) 左右连接:查询emp表deptno和部门表deptno相对应的员工,如果没有对应的显示为null
select e.empname,d.dname from emp e left  join dept d on e.deptno=d.deptno;
此时将dept表中的deptno为20的设为空(null)
那上面查询为如下图所示,左连接,left join以左边表为主进行查询

3.外连接—右连接 right join

select e.empname,d.dname from emp e right join dept d on e.deptno=d.deptno;
此时将dept表中的deptno为20的设为空(null)
 
那上面查询为如下图所示,right join以右边表为主进行查询
-- 外连接2:和上面一样,outer是可以省略的
select e.empname,d.dname from emp e right outer join dept d on e.deptno=d.deptno;

案例如下
-- 三张表连接查询 案例:找出每一个员工的部门名称以及工资等级
select e.empname,d.dname,s.grade from emp e join dept d on e.deptno=d.deptno join salgrade s on e.sal between s.losal and s.htsal;
-- 案例:找出每一个员工的部门名称以及工资等级,以及上级领导
select e.empname '员工',e1.empname '领导',s.grade,d.dname from emp e join dept d on e.deptno=d.deptno join salgrade s on e.sal between s.losal and s.htsal left join emp e1 on e.mgr=e1.empno;

二、子查询

子查询可以出现在哪些地方,可以出现的位置
select
...(select)
from
...(select)
where
...(select)

1.select后面嵌套子查询

-- 案例:找出每个员工所在的部门名称,要求显示员工名和部门名
select e.empname,d.dname from emp e join dept d on e.deptno=d.deptno;

2.form后面使用子查询 案例:找出每个部门平 均薪资的薪资的等级

(1).每个部门的薪水的平均值的等级
-- 第一步 按部门分,每个部门的的薪水的平均值
select deptno,avg(sal) 'avgsal' from emp group by deptno; 
-- 第二步根据上面结果,然后求出每个部门平均薪水的等级
select t.*,s.grade from (select deptno,avg(sal) 'avgsal' from emp group by deptno) t join salgrade s on t.avgsal between s.losal and s.htsal; 
如下图两个查询对应的结果

(2.)薪水等级的平均值
员工薪水等级(注意:平均薪水的等级就是薪水算平均值求等级,平均的薪水等级是求出等级来,算等级的平均值)
--     第一步:按部门分组,查询出薪水的等级
select e.empname,e.sal,e.deptno,s.grade from emp e join salgrade s on e.sal between s.losal and s.htsal;
--     第二步:基于以上结果,继续按照deptno分组,求出薪水等级的平均值
select e.deptno,avg(s.grade) from emp e join salgrade s on e.sal between s.losal and s.htsal group by deptno;
上面两个查询如下图所示

3.where子句中使用子查询,where条件后面不能跟avg,max等函数,所以把查询出来的平均值当做一个条件嵌入到where后面就可以

select * from emp where sal>(select avg(sal) from emp);

三、修改用户权限

1.创建用户

create user D@'127.0.0.1' identified by '123456';
如下图创建成功
如下图,新创建的用户和root用户查询数据库差别
新创建的用户:
root用户:

2.给予D用户select查询权限

grant select on djm.emp to 'D'@'127.0.0.1';

查看数据库就多了djm数据库

3.可以查询表和数据

 

 

posted @ 2022-11-07 16:55  花海~  阅读(133)  评论(0)    收藏  举报