一、连接查询
--1. 内连接: inner join 2张表建立连接,必须要返回满足条件的数据,数据不能有null值
--2. 外连接: outer join 2张表建立连接,必须要返回满足条件的数据,数据可以有null值
1) 左外连接 : 表名1 left outer join 表名2 ...on :列出的数据以表1中的数据为主,不会出空值,只会出现在表2
2)右外连接 : right outer join ...on :列出的数据以表2中的数据为主,不会出空值,只会出现在表1
3) 完全外连接 full join
--3. 自连接: 自己连自己,本质上是内连接,返回满足条件数据。
二、子查询及分类
--概念: 嵌入到另一个select语句中的一个select语句,简称select语句嵌套 ,通过子查询,可以使简单的语句,组成强大的语句 。层次?
--语法: select ... (select * ... (select ...)
--子查询分类: 1.单行子查询(一行结果) 2.多行(多行) 3. 多列 4.关联 5.嵌套子查询
1.--单行子查询
--概念: 内部的select语句给外部的select语句返回0行或1行
--单行子查询写在何处? ( 可以加在select,where,having,from 这些位置都可以放置)
--举例: 查询员工薪水高于smith薪水的员工
select sal
from emp
where sal>(select sal from emp
where ename=upper('smith'));
2.子查询还可以包含多列
例如,通过多列子查询查询出每个部门员工的最低工资,然后再查询出满足这些条件的商品信息
SELECT deptno, sal FROM EMP
WHERE (deptno, sal)
IN (SELECT deptno, MIN(sal) FROM emp GROUP BY deptno);
3.--关联子查询(父查询需要子查询的结果,子查询也需要父查询的结果 )
--举例: 查询每个部门中,高出本部门平均工资的员工的编号和姓名
select empno,ename
from emp outer1
where sal>(select avg(sal) from emp inner1 where outer1.deptno=inner1.deptno )
--查询emp表中是否存在可以管理别的员工的员工 (上级) --exists
select empno,ename
from emp e1 --上级表
where empno in
(select mgr
from emp e2
where e2.mgr=e1.empno ) --员工表
三、rowid 和rownum
--在Oracle数据库中的每一行都有一个唯一的行标识符,它用于Oracle数据库内部存储行的物理位置。
例如,查看EMP表的信息
SELECT ROWID, empno FROM EMP;
--ROWNUM可以返回结果集的行号,查询返回的第一行编号为1,第二行编号为2,依此类推
例如,查询EMP表的相关信息
SELECT ROWNUM, empno, ename, deptno FROM EMP;
--ROWNUM行号并不是永久固定的,是每次动态重新生成的。此时如果想查找第6-10条记录,用between…and…的方式是没有数据的。这个时候要想真正的实现这种查询思路:先查询前10条记录,之后再显示5条记录,要依靠子查询完成。
SELECT * FROM (
SELECT ROWNUM M,EMPNO,ENAME,JOB,HIREDATE,SAL FROM EMP
WHERE ROWNUM<=10
) TEMP WHERE TEMP.M>5;
按照这种方式,只需要替换掉最大最小值就可以实现分页的思想