一、多表查询

1.1 笛卡尔集

select deptno,avg(sal) from emp group by deptno;

712ef113abff3d09c7c664cb8a366843.png

1.2 内连接

隐式内连接

隐式内连接如下:

--查询员工编号、员工姓名、部门编号、经理编号、经理的姓名

select e1.empno, e1.ename, e1.deptno, m1.empno, m1.ename from emp e1,emp m1 where e1.mgr = m1.empno;

779a797e68307c71acd76d2969db7ed0.png

--查询员工编号、员工姓名、部门编号、部门名称、经理编号、经理的姓名

select e1.empno, e1.ename, e1.deptno,d1.dname, m1.empno, m1.ename

from emp e1,emp m1,dept d1 where e1.mgr = m1.empno and e1.deptno = d1.deptno;

c0060eeaf9642e7747ab2a43bec777b3.png

显示内连接

显示内连接如下,inner关键字, on连接条件

select e1.ename, d1.loc from emp e1 inner join dept d1 on e1.deptno = d1.deptno;

4fd9f1a041edefcdfd2fba81a8d7b141.png

1.3 外连接

左外连接

使用 left outer join关键字,显示所有的左表纪录,右表无数据则为空

select * from emp e1 left outer join dept d1 on e1.deptno = d1.deptno;

d1be87b091ba190b0cdba24d9dbf2ef7.png

右外连接

使用right outer join关键字,右表所有的数据都显示,左边如果没有关联数据则显示为空

select * from emp e1 right outer join dept d1 on e1.deptno = d1.deptno;

07760b3ad4d5b3eecca6ee106ad96a84.png

二、子查询

子查询主要用于解决复杂的查询语句,形式为查询语句中嵌套查询语句

如查询最高工资的员工信息

select * from emp where sal = (select max(sal) from emp);

f0fd293a7cff43a4ffa76bbf80034e42.png

2.1 单行子查询

使用关系运算符做连接: > / >= / < / <= / != / <> / =

上例即为单行子查询

– 查询每个部门的最低工资和他所在部门的信息

select * from emp e1, (select deptno, min(sal) minisal from emp group by deptno) t1, dept d1

where e1.deptno = t1.deptno and e1.sal = t1.minisal and d1.deptno = e1.deptno;

62f0b431c24c09ad8ee8d29647c663d3.png

2.2 多行子查询

使用逻辑运算符

–查询是不领导的信息

select * from emp where empno not in(select mgr from emp where mgr is not null);

88c557ceb3390e50263f0f2f27e98ad3.png

exists查询

数据量较大时,查询十分高效。存在则返回true,不存在则返回false

--查询有员工的部门信息

select * from dept d1 where exists(select * from emp e1 where e1.deptno = d1.deptno);

3c73b5bd6ac9eca3d4a52d7ab822f934.png

三、其他

3.1 rownum

伪列:rownum,系统自动生成的一列,表示行号,建议不做大于判断

--工资最高的前三名

select rownum, t1.* from (select e1.* from emp e1 order by sal desc) t1 where rownum < 4;

26b71bef60d972e07968477045725cf2.png

因为数据库的执行顺序select 在 order by前,因此需使用子查询来达到目的

3.2 查询员工表中薪水大于本部门平均薪水的员工信息

select * from emp e1, (select deptno, avg(sal) avgsal from emp group by deptno) t1

where e1.deptno = t1.deptno and e1.sal > t1.avgsal;

1ae665ad19684188f1d9ce57ac9ed65b.png

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐