Oracle-07
数据查询语言--DDL
1、表间关联查询
内连接:
语法:表1 [inner] join 表2 on 条件 (涉及到两张表)
eg:查询员工的姓名和他领导的名字
select e1.ename 员工,e2.ename 领导 from emp_xu e1 join emp_xu e2 on e1.leader=e2.empno; select e1.ename 员工,e2.ename 领导 from emp_xu e2 join emp_xu e1 on e1.leader=e2.empno;//表1和表2可以互换,没影响
注意:内连接操作得到的结果集中的数据一定是在两张表中都能找到匹配数据的记录,找不到数据就丢掉
说明:
a.表1为驱动表,表2为匹配表
b.执行过程:不断遍历驱动表,在匹配表中找匹配记录(匹配表中每条记录都要进行匹配)
c.等值连接(=)方式,驱动表和匹配表是可以进行互换的,不影响结果
d.内连接操作:结果集保留是遍历驱动表,在匹配表中匹配上的记录数据,将匹配不上的记录数据去掉,只显示匹配上的记录,匹配不上的不显示出来
外链接:
1、左外连接(表示以左边的表为驱动表)
语法:表1 left [outer] join 表2 on 条件
2、右外连接(表示以右边的表为驱动表)
语法:表1 right [outer] join 表2 on 条件
3、全外连接(表示以左、右边的表既可以作为驱动表也可以作为匹配表)
语法:表1 full [outer] join 表2 on 条件
外连接特征:若驱动表在匹配表中找不到匹配记录,则匹配一行空行。驱动表中数据全部出现在结果集中
eg:查询员工的姓名和其部门的名字,要求没有部门的员工也要查询出来(用外连接)
select e.ename,nvl(d.dname,'No Dept'),deptno from emp_xu e left outer join dept_xu d on e.deptno=d.deptno;//报错,未明确定义字段deptno select ename,nvl(dname,'No Dept'),d.deptno from emp_xu e left outer join dept_xu d on e.deptno=d.deptno;//左外连接,d.dept需要加上表名 select e.ename,nvl(d.dname,'No Dept') from dept_xu d right outer join emp_xu e on e.deptno=d.deptno;//右外连接
eg:查询哪些部门没有员工
select d.dname,d.deptno from dept_xu d left outer join emp_xu e on d.deptno=e.deptno where e.empno is null;
总结:
a. 外连接的结果集=内连接的结果集+驱动表在匹配表中匹配不上的记录和空值
b. 外连接的本质:将驱动表中数据全部出现在结果集中,一条都不能少
eg:查询员工姓名及其部门的名字,要求没有部门的员工和没有员工的部门全部查询出来(全外连接)
select nvl(e.ename,'No'),nvl(d.dname,'No') from emp_xu e full join dept_xu d on e.deptno=d.deptno;
注意:
a.全外连接,可以将两个表中的数据全部显示出来
b.全外连接=内连接的结果集+驱动表在匹配表中匹配不上的记录和空值+匹配表在驱动表中匹配不上的记录和空值
2、oracle数据库中排名分页
关键字:rownum(oracle)/limit(mysql)
rownum表示一个伪列,对查询返回数据的行进行行编即行号,行号由‘1’开始
eg:查询员工表中前五条记录 select * from emp_xu where rownum<=5; select empno,ename,rownum from emp_xu where rownum<=5; eg:查询员工表中第4、5、6条记录 select empno,ename,rownum from emp_xu where rownum>3 and rownum<7;//错误的,未选定 注意:rownum不能用大于号(>)判断 ,用集合中的差集 minus select empno,ename,rownum from emp_xu where rownum<7 minus select empno,ename,rownum from emp_xu where rownum<4;
换一种方式: //先查询出前六条记录,再从前六条rn中找想要的字段 select empno,ename,rownum from emp_xu where rownum<7; select empno,ename,rn,rownum from (select empno,ename,rownum rn from emp_xu where rownum<7) where rn>3;