-- 连接:内连接,外连接,自连接,交叉连接
select * from emp,dept; -- 笛卡尔积
select * from emp cross join dept; -- 交叉连接,结果就是笛卡尔积
select * from emp inner join dept on emp.deptno=dept.deptno; -- 等值连接
select * from emp,dept where emp.deptno=dept.deptno -- 等值连接,省略写
select * from emp natural join dept; -- 自然连接,无需条件,有相同列名才能自然连接,否则就是笛卡尔积
select * from emp,salgrade where emp.sal between salgrade.losal and salgrade.hisal -- 不等值连接
select * from emp left join dept on emp.deptno=dept.deptno -- 左外链接
select * from emp right join dept on emp.deptno=dept.deptno -- 右外连接
select * from emp full join dept on emp.deptno=dept.deptno -- 全连接,full ‘左外+右外’
-- oracle特有外连接
select * from emp,dept where emp.deptno(+)=dept.deptno -- 右外连接
-- 子查询:三种,单列单值 where = ,单列多值 where in ,多列多行 做虚拟小表,注意给此小表起个别名
select * from emp where sal =(select max(sal) from emp); -- 单列单值
select * from emp where sal in(select sal from emp where sal>=3000); -- 单列多值
-- 查询工资大于等于3000的员工信息和部门信息
select * from emp,dept where emp.deptno=dept.deptno and emp.sal>=3000; -- 用内连接,多条件查询
select * from (select * from emp where sal in(select sal from emp where sal>=3000)) e,dept
where e.deptno=dept.deptno; -- 子查询 多列多行
-- 查询出员工编号,姓名,以及所在部门名称
select emp.empno,emp.ename,dept.dname from emp,dept where emp.deptno=dept.deptno; -- 条件查询
select emp.empno,emp.ename,(select dept.dname from dept where emp.deptno=dept.deptno) 部门名称
from emp; -- 采用子查询,这种子查询自身无结果,它借助了其他表,这种子查询不能查所有字段(太多)
select emp.empno,emp.ename,(select * from dept where emp.deptno=dept.deptno) 部门名称
from emp; -- xx 值过多
-- 联合查询,将两个查询结果组成一个结果
select * from student
union all -- 并集所有,不去重
select * from student2
select * from student
union -- 并集,去重
select * from student2
select * from student
intersect -- 交集
select * from student2
select * from student
minus -- 补集,student2的补集,全集为student与student2的并集
select * from student2
-- 分析函数
select * from emp
-- rank()over() 数值相同排名相同,后续排名跳跃
select emp.ename,emp.sal,rank()over(order by emp.sal desc) rank from emp; -- 所有排名
-- partition by 字段名,根据 字段名 分组排名
select emp.ename,emp.sal,emp.deptno,rank()over(partition by emp.deptno order by emp.sal desc) rank from emp; -- 每个部门各自内部排名
-- 查询部分排名,将整个排名表当做虚拟小表对他进行查询0
select * from (select emp.ename,emp.sal,rank()over(order by emp.sal desc) rank from emp) where rank<=3;
-- dense_rank()over() 数值相同排名相同,后续排名不跳跃
select emp.ename,emp.sal,dense_rank()over(order by emp.sal desc) rank from emp;
-- row_number()over() 行数排名,没有并列情况
select emp.ename,emp.sal,row_number()over(order by emp.sal desc) rw from emp;
select emp.ename,emp.sal,rownum rn from emp; -- 仅仅行数‘排名’,rownum伪列,不是函数,是属性
-- row_number()over()用于分页
select * from(select emp.*,row_number()over(order by emp.sal desc) rw from emp) where rw between 1 and 3
select rowid from emp -- 查找每一行存储地址id
select rownum from emp -- 查找每一行‘排名’,根据储存地址id
select emp.*,rownum from emp
select * from(select emp.*,rownum rw from emp) e where e.rw between 1 and 3 -- 不排名,只分页
select * from(select em.*,rownum rw from (select * from emp order by sal desc) em) e where e.rw between 1 and 3 -- 排名,分页