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.可以查询表和数据
 

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号