--查询数据表
--一、简单查询
--1、查询表数据 不多作介绍
select id,empname from emp;
--having
select sum(salary),deptno,job from emp where deptno in ('20','30') group by deptno having sum(salary)>2000;
--2、复杂查询
--等值连接 内连接 简单连接;
select a.deptname,b.c_name from dept a, emp e where a.id=e.deptid;
select a.deptname,b.c_name from dept a inner join emp e on a.id=e.deptid;
--外连接
--右外连接,+在=号左边时,返回的是右边的数据;
select a.deptname,b.c_name from dept a,emp e where a.id(+)=e.deptid;
select a.deptname,b.c_name from dept a left join emp e on a.id = e.deptid;
--左外连接,+在=号右边时,返回的是左边的数据;
select a.deptname,b.c_name from dept a,emp e where a.id = e.deptid(+);
select a.deptname,b.c_name from dept a right join emp e on a.id = e.deptid;
--全连接
select a.deptname,b.c_name from dept a full outer join on emp b where a.id=b.deptid;
--交叉连接
select a.deptname,b.c_name from dept a cross join emp b on a.id=b.deptid;
--自然连接 只适用于两表中相同名字和数据类型的列上,如果列有相同的名字,但数据类型不同,会报错;
select a.deptname,b.c_name from dept a natural emp b;
--3、子查询
--非相关子查询
--非职员的人员中比所有职员薪资高的人员结果
select * from emp where emp.empno>any(select empno from emp where emp.job='clerk');
--非职员的人员中比所有最高职员薪资高的人员结果
select * from emp where emp.empno>all(select empno from emp where emp.job='clerk');
--表集合操作
--联合运算 去掉重复的列
select * from emp union select * from emp_history;
--全联合运算 不去掉重复的列
select * from emp union all select * from emp_history;
--相交运算 查询前者表和后者表中的部门编号为20的相同的员工记录 这一块没太明白有啥用
select empno from emp where deptno=20 intersect select empno from emp_history where deptno=20;
--相减运算 用于去掉重复的结果值,查询在前者表中而不是后者表中的值,与上面使用完全相同;
select empno from emp where deptno=20 minus select empno from emp_history where deptno=20;
-- 层次化查询 后续需单独巩固
select level,a.id,a.c_mmroomname,a.c_parentid from s_mmroom a
start with a.c_parentid='00000000000000000000000000000000' connect by prior a.c_parentid=a.id;
--一、简单查询
--1、查询表数据 不多作介绍
select id,empname from emp;
--having
select sum(salary),deptno,job from emp where deptno in ('20','30') group by deptno having sum(salary)>2000;
--2、复杂查询
--等值连接 内连接 简单连接;
select a.deptname,b.c_name from dept a, emp e where a.id=e.deptid;
select a.deptname,b.c_name from dept a inner join emp e on a.id=e.deptid;
--外连接
--右外连接,+在=号左边时,返回的是右边的数据;
select a.deptname,b.c_name from dept a,emp e where a.id(+)=e.deptid;
select a.deptname,b.c_name from dept a left join emp e on a.id = e.deptid;
--左外连接,+在=号右边时,返回的是左边的数据;
select a.deptname,b.c_name from dept a,emp e where a.id = e.deptid(+);
select a.deptname,b.c_name from dept a right join emp e on a.id = e.deptid;
--全连接
select a.deptname,b.c_name from dept a full outer join on emp b where a.id=b.deptid;
--交叉连接
select a.deptname,b.c_name from dept a cross join emp b on a.id=b.deptid;
--自然连接 只适用于两表中相同名字和数据类型的列上,如果列有相同的名字,但数据类型不同,会报错;
select a.deptname,b.c_name from dept a natural emp b;
--3、子查询
--非相关子查询
--非职员的人员中比所有职员薪资高的人员结果
select * from emp where emp.empno>any(select empno from emp where emp.job='clerk');
--非职员的人员中比所有最高职员薪资高的人员结果
select * from emp where emp.empno>all(select empno from emp where emp.job='clerk');
--表集合操作
--联合运算 去掉重复的列
select * from emp union select * from emp_history;
--全联合运算 不去掉重复的列
select * from emp union all select * from emp_history;
--相交运算 查询前者表和后者表中的部门编号为20的相同的员工记录 这一块没太明白有啥用
select empno from emp where deptno=20 intersect select empno from emp_history where deptno=20;
--相减运算 用于去掉重复的结果值,查询在前者表中而不是后者表中的值,与上面使用完全相同;
select empno from emp where deptno=20 minus select empno from emp_history where deptno=20;
-- 层次化查询 后续需单独巩固
select level,a.id,a.c_mmroomname,a.c_parentid from s_mmroom a
start with a.c_parentid='00000000000000000000000000000000' connect by prior a.c_parentid=a.id;