Oracle-day02 中
二、连接查询
(一)多表内连接查询 (1)需求:查询显示业主编号,业主名称,业主类型名称,如下图: 查询语句: select o.id 业主编号,o.name 业主名称,ot.name 业主类型 from T_OWNERS o,T_OWNERTYPE ot where o.ownertypeid=ot.id (2)需求:查询显示业主编号,业主名称、地址和业主类型,如下图 分析:此查询需要三表关联查询。分别是业主表,业主分类表和地址表 select o.id 业主编号,ad.name 地址,T_OWNERTYPE ot,T_ADDRESS ad where o.ownertypeid=ot.id and o.addressid=ad.id (3)需求:查询显示业主编号、业主名称、地址、所属区域、业主分类,如下图: 分析:这里需要四个表关联查询,比上边多了一个区域表(T_AREA) 查询语句: select o.id 业主编号,ar.name 区域,ad.name 地 址,ot.name 业主类型 from T_OWNERS o,T_ADDRESS ad,T_AREA ar where o.ownertypeid=ot.id and o.addressid=ad.id ad.areaid=ar.id and (4)需求:查询显示业主编号、业主名称、地址、所属区域、收费员、业主分类,如下图: 分析:此查询比上边又多了一个表 T_OPERATOR 语句: select ow.id 业主编号,ow.name 业主名称,ar.name 所属区域,op.name 收费员,ot.name 业主类型 from T_OWNERS ow,T_AREA ar,T_OPERATOR op where ow.ownertypeid=ot.id and ow.addressid=ad.id and ad.areaid=ar.id and ad.operatorid=op.id (二)左外连接查询 分析:我们要查询这个结果,需要用到 T_OWNERS(业主表) ,T_ACCOUNT SELECT ow.id,ow.name,ac.year,ac.month,ac.money FROM T_OWNERS ow left join T_ACCOUNT ac on ow.id=ac.owneruuid 按照 ORACLE 提供的语法,就很简单了: SELECT ow.id,ac.money FROM T_OWNERS ow,T_ACCOUNT ac WHERE ow.id=ac.owneruuid(+) 如果是左外连接,就在右表所在的条件一端填上(+) SQL1999 标准的语句 select ow.id,ac.money from T_OWNERS ow right join T_ACCOUNT ac on ow.id=ac.owneruuid ORACLE 的语法 select ow.id,ac.money from T_OWNERS ow,T_ACCOUNT ac where ow.id(+) =ac.owneruuid 三、子查询
select * from T_ACCOUNT where year=‘2012‘ and month=‘01‘ and usenum> ( select avg(usenum) from T_ACCOUNT where year=‘2012‘ and
查询结果: 平均值为:
select * from T_OWNERS where addressid in ( 1,3,4 ) 查询结果如下: (2)需求:查询地址含有“花园”的业主的信息 语句: select * from T_OWNERS where addressid in ( select id from t_address where name like ‘%花园%‘ ) 查询结果: (3)需求:查询地址不含有“花园”的业主的信息语句: select * from T_OWNERS where addressid not in ( select id from t_address where name like ‘%花园%‘ ) 查询结果: (二)from 子句中的子查询 from 子句的子查询为多行子查询 需求:查询显示业主编号,业主名称,业主类型名称,条件为业主类型为”居民”, 使用子查询实现。 语句: select * from (select o.id 业主编号,T_OWNERTYPE ot where o.ownertypeid=ot.id) where 业主类型=‘居民‘ 查询结果如下: (三)select 子句中的子查询 select 子句的子查询必须为单行子查询 (1)需求:列出业主信息,包括 ID,名称,所属地址。 语句: select id,name,(select name from t_address where id=addressid) addressname from t_owners 查询结果如下: (2)需求:列出业主信息,包括 ID,名称,所属地址,所属区域。 select id,( select name from t_address where id=addressid ) addressname,( select (select name from t_area where id=areaid ) from t_address where id=addressid ) adrename from t_owners; 查询结果如下: 四、分页查询 (一)简单分页 需求:分页查询台账表 T_ACCOUNT,每页 10 条记录 分析:我们在 ORACLE 进行分页查询,需要用到伪列 ROWNUM 和嵌套查询 我们首先显示前 10 条记录,语句如下: select rownum,t.* from T_ACCOUNT t where rownum<=10 显示结果如下: 那么我们显示第 11 条到第 20 条的记录呢?编写语句: select rownum,t.* from T_ACCOUNT t where rownum>10 and rownum<=20 查询结果: select * from (select rownum r,t.* from T_ACCOUNT t where rownum<=20) where r>10 查询结果如下: (二)基于排序的分页 需求:分页查询台账表 T_ACCOUNT,每页 10 条记录,按使用字数降序排序。 我们查询第 2 页数据,如果基于上边的语句添加排序,语句如下: select * from (select rownum r,t.* from T_ACCOUNT t where rownum<=20 order by usenum desc) where r>10 查询结果如下: 经过验证,我们看到第 2 页的结果应该是下列记录 所以推断刚才的语句是错误的!那为什么是错误的呢? 我们可以先单独执行嵌套查询里面的那句话 select rownum r,t.* from T_ACCOUNT t where rownum<=20 order by usenum desc 你会看到查询结果如下: 你会发现排序后的 R 是乱的。这是因为 ROWNUM 伪列的产生是在表记录扫描 是产生的,而排序是后进行的,排序时 R 已经产生了,所以排序后 R 是乱的。 那该如何写呢? 很简单,我们只要再嵌套一层循环(一共三层),让结果先排序,然后对排序后 的结果再产生 R,这样就不会乱了。 语句如下: select * from (select rownum r,t.* from (select * from T_ACCOUNT order by usenum desc) t where rownum<=20 ) where r>10 结果如下: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |