一多表查询
1.什么是多表查询
查询的数据在多个表中,例如查询学生的成绩和班级等,如要同时查询n个表,则必须要有n-1个连接条件
按照其连接的不同,可以分为等值连接和非等值连接,自连接,外连接
2.等值连接和非等值连接
将两个表中又表示相同内容的列作为等值连接或者非等值连接的比较的值
例:查询职员的工作和部门名称
select emp.ename ,emp.job , dept.dname from emp,dept where emp.deptno=dept.deptno;
3.自连接
操作同一张表进行连接
例:查询员工的姓名及其领导名
select a.ename 员工, b.ename 领导 from emp a,emp b where a.mgr=b.empno;
4.外连接
外连接的特点:外连接在连接过程中除了返回满足的行,不满足的行也会返回,外连接分为左外连接和右外连接
左外连接:列出左边关系的所有元组
右外连接:列出左边关系的所有元组
例:查询员工姓名,工资,部门名称,没有人员的部门名称也要显示出来
例:select emp.ename,emp.sal,dept.ename from emp,dept where emp.deptno(+)=dept.deptno;
二子查询
1.为什么要有子查询
假如我们要查询比某人工资高的问题,怎么解决了
第一步:查到这个人的工资
第二步:找出比这个人工资高的员工
第一步:查到这个人的工资我们就使用了select -from -where 语句,
第二步:把第一步查询到的结果作为条件再次查询,相当于把第一个select语句嵌套在第二个中了,这就是子查询
2.子查询语法
select column....from table ..where column operator (select column.. from where condition)
3.使用子查询注意的问题
(1)子查询在主查询之前一次执行完成
(2):子查询要包含在括号内
(3)子查询放在比较条件的右侧
(4)单行子查询对应单行操作符,多行子查询对应多行操作符
(5)可以在from,select(后面跟的必须是单行子查询),where,having后面放置子查询,不能再group by后面放置子查询
(6)一般不在子查询中排序,但在top-N分析中,必须对子查询排序
(7)一般先执行子查询,在执行主查询,但相关查询例外
(9)子查询中的null
4.多行子查询
(1)多行子查询
In --------------等于列表中的任何一个
any------------和子查询返回的任意一个值比较
all-------------和子查询返回的所有值比较
例:查询工资比30号部门任意一个员工高的员工
select ename,sal from emp where sal>any(select sal from emp where deptno=30);
例:查询工资比30号部门所有员工高的员工
select ename,sal from emp where sal>all(select sal from emp where deptno=30);
5.子查询中的空值问题
查询中的结果集中含有空值,则不能使用not in ,可以使用 in
原因:任何值和null做等于(<>)比较都为空值
三集合运算
集合运算包括三类:并集,交集,差集
1.并集
union:使用此操作符作用于两个结果集时,取得两个结果集的并集,并且会自动去掉重复的行
union all:和union类似,但不会去掉重复行
2.交集
intersect:
3.差集
minus:
使用该操作符用于取得两个结果集的差集,它只会显示存在第一个集合中,而不存在第二个集合中的数据。
集合运算要注意的问题:
1.两个集合中select语句的参数类型和个数要一致
2.可以使用括号改变集合执行的顺序
3.如果有order by子句,必须放到最后一句查询语句后
4.集合运算采用第一个语句的表头最为最终结果集的表头
四.分页查询
分页查询需要用到rownum函数,此函数返回当前行号。
rownum 只能选定小于一个行数的数据,不能应用于大于一个行数的数据
例:查询第四行到第9行的数据
select * from (select rownum num,emp.* from emp where rownum <10 ) rowemp where rowemp.num >3;
查询结果如下:
NUM EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
4 7566 JONES MANAGER 7839 02-4月 -81 2975 20
5 7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
6 7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
7 7782 CLARK MANAGER 7839 09-6月 -81 2450 10
8 7788 SCOTT ANALYST 7566 19-4月 -87 3000 20
9 7839 KING PRESIDENT 17-11月-81 5000 10
注意。先把行数小于10的数据作为一个表,在这个表中在用别名在查询行数大于3的数据