SQL——SQL语句总结(8)

连接查询

1.内连接查询

(1)查询员工姓名、员工工资以及员工所属部门名称。

select ename, sal, dname from emp e, dept d where e.deptno = d.deptno;

结果:

 

(2)使用 inner join 查询员工姓名、员工工资以及员工所属部门名称。

两个表之间的关系通过 inner join 指定。使用这种语法的时候,连接的条件使用 on 子句给出,而不是where。

select ename, sal, dname from emp e inner join dept d on e.deptno = d.deptno;

结果:

与(1)结果一样:

提示:使用where子句定义连接条件比较简明了,而 inner join 语法是 ANSI SQL 的标准规范,
使用 inner join 连接语法能够确保不会忘记两表连接条件,
而且 where 子句在某些时候会影响查询的性能。
ANSI SQL:“美国国家标准化组织(ANSI)”是一个核准多种行业标准的组织。SQL作为关系型数据库所使用的标准语言,
最初是基于IBM的实现在1986年被批准的。1987年,“国际标准化组织(ISO)”把ANSI SQL作为国际标准。
这个标准在1992年进行了修订(SQL-92),1999年再次修订(SQL-99)。目前最新的是SQL-2011

 

(3)查询emp表中的员工姓名以及直接上级的姓名。

select e1.ename '员工姓名', e2.ename '直接上级' from emp e1 inner join emp e2 on e1.mgr = e2.empno;
或
select e1.ename '员工姓名', e2.ename '直接上级' from emp e1, emp e2 where e1.mgr = e2.empno;

结果:

 

(4)查询 smith 的上级姓名。

select e1.ename '员工姓名', e2.ename '直接上级' from emp e1, emp e2 where e1.mgr = e2.empno and e1.ename = 'smith';
或  内连接 inner join
select e1.ename '员工姓名', e2.ename '直接上级' from emp e1 inner  join emp e2 on e1.mgr = e2.empno and e1.ename = 'smith';
或
select e1.ename '员工姓名', e2.ename '直接上级' from emp e1 inner join emp e2 on e1.mgr = e2.empno where e1.ename = 'smith';

结果:

 

(5)查询出雇员名,雇员工资,工资等级。

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

结果:

 

(6)查询出雇员名,雇员所在部门名称,工资等级。

select e.ename, d.dname, s.grade from emp e, dept d, salgrade s 
where e.sal between s.losal and s.hisal and d.deptno = e.deptno;

结果:

 

2.外连接查询

(1)使用外连接查询员工信息和部门信息

首先我们需要先在员工表里添加一条数据,如下:

insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) 
values (1234, 'fei', 'boss', null, null, null, null, null);
#左外连接 left outer join
select * from emp e left outer join dept d on e.deptno = d.deptno;

结果:

 

#右外连接 right outer join
select * from emp e right outer join dept d on e.deptno = d.deptno;

结果:

 

3.子查询

(1)有哪些人的薪水是在整个雇员的平均薪水之上的

#1.查处各部门的平均薪水
select avg(e.sal) from emp e;
#2.所有雇员的薪水与平均工资作对比
select e.ename, e.sal from emp e having e.sal > (select avg(e.sal) from emp e);

结果:

1)                           2) 

 

(2)查询在雇员中有哪些人是经理人(哪些人有下级)

#1.先查询说有经理人的编号
select distinct e.mgr from emp e;
#2.根据查询到的经理人编号查询经理人姓名
select e.empno, e.ename from emp e where e.empno in (select distinct e.mgr from emp e); 

结果:

1)                   2)

 

(3)求部门平均薪水的等级

#1.查询每个部门的平均薪水
select e.deptno, avg(e.sal) from emp e group by e.deptno;
#2.关联工资等级表,求出平均薪水的等级
select a.deptno, s.grade from salgrade s 
right join (select e.deptno, avg(e.sal) asal from emp e group by e.deptno) a
        on asal between s.losal and s.hisal;

结果:

1)           2)

 

(4)求部门平均的薪水等级

#先求出每个人的薪水等级
select e.ename, e.deptno, s.grade from emp e 
left join salgrade s 
on sal between losal and hisal order by deptno;
#按照部门求等级的平均等级
select a.deptno, avg(a.grade) '部门平均等级' from 
(select e.ename, e.deptno, s.grade from emp e 
left join salgrade s 
on sal between losal and hisal order by deptno) a 
group by a.deptno;

结果:

1)            2)

 

(5)求薪水最高的前五名员工信息

 #薪水从高到低排列
 select * from emp e group by e.sal desc;
 #分页
 select * from (select * from emp e group by e.sal desc) a limit 0,5;

    limit(m,n) n 为 最大显示数,m 为从第几行显示(表格行数从 0 开始)。

结果:

1)

 2)

 

(6)求薪水最高的6到10名雇员

 #薪水从高到低排列
 select * from emp e group by e.sal desc;
 #分页
 select * from (select * from emp e group by e.sal desc) a limit 5,5;

 结果:

 2)

 

posted @ 2020-12-14 16:12  nyfq  阅读(160)  评论(0编辑  收藏  举报