分类: Oracle
2012-07-05 17:22:51
Oracle 10g数据库基础之基本查询语句-下-连接&子查询
当多张表在一起查询时,没有给定正确的连接条件,结果是第一张表的所有行和第二张表的所有行进行矩阵相乘,得到n*m行的结果集。
SQL> select ename,dname from emp,dept;
---------- --------------
结果为每个员工在每个部门上了一次班,4*14=56,这并不是我们想得到的结果。
SQL> select ename,dname from emp e,dept d where e.deptno=d.deptno;
select ename,dname from emp e join dept d on (e.deptno=d.deptno);
效率是相同的,SQL99是国标
from emp e,dept d
where e.deptno=d.deptno;
上述显示有两个列名称都叫deptno,我们无法区分。
SQL> select ename,dname,e.deptno "员工表",d.deptno "部门表"
SQL> select ename,sal,grade
SQL> select ename,dname,emp.deptno from emp,dept
这句话不会显示40号部门,因为40部门没有员工。
SQL> select ename,dname,dept.deptno from emp,dept where emp.deptno(+)=dept.deptno;
+号的意思为将没有员工的部门,用NULL来匹配
+号不能同时放在等号的两边,只能出现在一边。
SQL> select w.ename "下级" ,m.ename "上级"
其中“下级”和“上级”为列的别名。区分相同的列。
W和m 为表的别名。区分相同的表。别名的本质。
(+)为了将没有上级的人也显示。
想在结果中过滤去一些内容请用and运算。
SQL> select w.ename "下级" ,m.ename "上级"
该实验的目的是掌握新的ORACLE表之间的联合查询语法.
. Nature(自然)连接
这是SQL99规则。
SQL> select ename,deptno,dname from emp natural join dept;
select ename,dname,dept.deptno
from dept left outer join emp
select ename,dname from emp,dept
where emp.deptno(+)=dept.deptno;
6。SQL99的书写格式
SQL> --查询工资总和高于10号部门工资总和的部门。
SQL> select deptno,sum(sal)
having sum(sal)>(select sum(sal) from emp where deptno=10);
SQL> select deptno,ename,sal from emp
(select deptno,max(sal) from emp group by deptno);
子查询返回多行,用=不可以,得用in。
SQL> select ename,sal from emp where sal
小于2000就可以
SQL> select ename,sal from emp where sal
小于all小于最小,大于all大于最大
SQL> select ename,sal,deptno from emp
where sal
小于any小于最大,大于any大于最小
select ename,sal,deptno from emp
where sal>any(select avg(sal) from emp group by deptno)
select ename,e.deptno,sal,asal
(select deptno ,avg(sal) asal from emp group by deptno) a
where e.deptno=a.deptno and sal>asal;
A为视图,为什么要使用别名asal,因为表达式不能当列的名称,别名的本质使用方法是使非法的合法化。
select ename,sal ,deptno
where sal>(select avg(sal) from emp where deptno=o.deptno) ;
先运行主查询,得到第一行,将DEPTNO传入到子查询,由子查询求出AVG(SAL),在判定主查询的行是否符合查询的条件。
执行计划是将子查询看作视图的关联。这叫做SQL的自动改写。
找领导,其中3是常量,你写什么都可以。
当子查询有行时,Exists返回true
当子查询没有行时为假,Exists返回false
select ename,empno,mgr from emp o
where exists(select 3 from emp where mgr=o.empno);
《完》
--xjzhujunjie
--2012/05/17