1.连接查询.
/*-- 传统连接方式 --*/
select e.ename,d.dname
from dept d , emp e
where d.deptno = e.deptno
/*--natural join 两张表中只有一个同名栏位时行连接 --*/
select e.ename,d.dname
from dept d
natural join emp e
/*--using 两个表中有多个同名栏位时 --*/
select e.ename,d.dname
from dept d join emp e
using(deptno)
/*--左外连结左表的全部记录(部门表中的所有记录:demp)-- */
/*--方式1--*/
select e.ename,d.dname from dept d left outer join emp e
on d.deptno = e.deptno
/*--方式2--*/
select e.ename,d.dname
from dept d , emp e
where d.deptno = e.deptno(+)
/*--右外连结-- (员工表中的所有记录:emp)*/
/*-- 方式1 --*/
select e.ename,d.dname from dept d right outer join emp e
on d.deptno = e.deptno
/*-- 方式2 --*/
select e.ename,d.dname
from dept d , emp e
where d.deptno(+) = e.deptno
/*--完全外连结(匹配与不匹配)-- (包括部门表及员工表中的所有记录)*/ select e.ename,d.dname from dept d full outer join emp e
on d.deptno = e.deptno
2.子查询.
/*--子查询(单行,多行)--*/
select * from emp
where sal > (select avg(sal) from emp)
/*--单行子查询可以引用(=,>,>=,<,<=,<>)操作符 --*/ select * from emp e
where e.deptno=(select d.deptno from dept d where d.deptno=1 )
/*--多行子查询可以引用(in,any,all)操作符--*/
select * from emp e
where e.deptno in(select d.deptno from dept d)
/*-- any 比较返回值中的任何一个,其中一个满足,则返回true --*/ select * from emp e
where e.sal < any(select sal from emp where deptno=2)
/*-- all 比较返回值中的所有,全部满足,则返回true --*/
select * from emp e
where e.sal < all(select sal from emp where deptno=2)
3.聚合查询.
/*--求和,平均 --*/
select sum(sal),avg(sal) from emp
select avg(nvl(sal,0)) from emp
/*--记录总数 --*/
select count(*) from emp
select count(memo) from emp /*--统计该栏非空记录 --*/
select count(distinct(sex)) from emp /*--去掉重复记录 --*/
/*-- group by --*/
select e.deptno,sum(e.sal)
from emp e
group by e.deptno
/*-- group by having --*/
select e.deptno,avg(e.sal)
from emp e
group by e.deptno
having avg(e.sal) > 4500
例子:
有两个表
pur_pra,pur_seller
pur_pra里面有一条数据,pur_seller里面没有数据。
我想从pur_pra里面取出一条记录,然后根据记录的s_No字段,从pur_seller 表内提出相应资料,请问这条查询语句不是这样写吗?
SELECT a.*,b.linker,b.linker_tels,b.faxs,b.s_name from pur_pra
a,pur_seller b Where a.FID=1 and a.s_no=b.s_no
但我这样查不到任何记录,
而用
SELECT a.*,b.linker,b.linker_tels,b.faxs,b.s_name from pur_pra
a,pur_seller b Where a.FID=1
则会得到两条记录。
如果从a表内取出记录s_No字段的值在b表内存在,前一条语句就会返回正确结果。
请问在从a表内取出记录s_No字段的值在b表里面没有的时候,怎样可以使得返回结果还是有从a表里面按条件“a.FID=1”查出的数据?其他要从b表里面的取出的数据留空。
是否可以用一条查询语句做到?程序要求返回结果同在一个Recordset里面
解决:
表内的联结方式有四种:内联结,左外联结,右外联结,全连接
定义如下:
INNER
指定返回每对匹配的行。
废弃两个表中不匹配的行。
如果未指定联接类型,则这是默认设置。
FULL [OUTER]
指定在结果集中包含左表或右表中不满足联接条件的行,并将对应于另一个表的输出列设为 NULL。
这是对通常由 INNER JOIN 返回的所有行的补充。
LEFT [OUTER]
指定在结果集中包含左表中所有不满足联接条件的行,且在由内联接返回所有的行之外,将另外一个表的输出列设为 NULL。
RIGHT [OUTER]
指定在结果集中包含右表中所有不满足联接条件的行,且在由内联接返回的所有行之外,将与另外一个表对应的输出列设为 NULL。
你上面用的是默认的内联结,这时当B表为空时,则不能返回记录。
你可以用左外连接,这样:
SELECT a.*,b.linker,b.linker_tels,b.faxs,b.s_name
from pur_pra a left join pur_seller b on a.s_no=b.s_no Where a.FID=1。