-- 查询台账记录中用水字数大于等于`10000`,并且小于等于`20000`的记录select*from T_ACCOUNT where usenum >=10000and usenum <=20000;select*from T_ACCOUNT where usenum between10000and20000;
5. 空值查询
-- 查询`T_PRICETABLE`表中`MAXNUM`为空的记录select*from T_PRICETABLE t where maxnum isnull;-- 查询`T_PRICETABLE`表中`MAXNUM`不为空的记录select*from T_PRICETABLE t where maxnum isnotnull;
6. 去掉重复记录
-- 查询业主表中的地址ID,不重复显示selectdistinct addressid from T_OWNERS;-- 查询业主表中的地址ID和业主类型,不重复显示(两列只要一边不重复)selectdistinct addressid, ownertypeid from T_OWNERS;
select*from T_OWNERS
where addressid in(select id from t_address where name like'%花园%');
需求:查询地址不含有 花园 的业主的信息。
select*from T_OWNERS
where addressid notin(select id from t_address where name like'%花园%');
-- 使用量必须大于子查询所有值SELECT USENUM FROM T_ACCOUNT
WHERE USENUM >ALL(10000,20000);-- 使用量大于子查询任意值SELECT USENUM FROM T_ACCOUNT
WHERE USENUM >ANY(10000,20000);-- `SOME`和`ANY`大致相同SELECT USENUM FROM T_ACCOUNT
WHERE USENUM >SOME(10000,20000);
3. from 子句中的子查询
from 子句的子查询为 多行子查询。
需求:查询显示业主编号,业主名称,业主类型名称,条件为业主类型为 居民。
select*from(select o.id '业主编号', o.name '业主名称', ot.name '业主类型'from T_OWNERS o, T_OWNERTYPE ot
where o.ownertypeid = ot.id
)where 业主类型 ='居民';
4. select 子句中的子查询
select 子句的子查询必须为 单行子查询。
需求:列出业主信息,包括 ID,名称,所属地址。
select id, name,(select name from t_address where id=addressid ) addressname
from t_owners;
需求:列出业主信息,包括 ID,名称,所属地址,所属区域。
select id, name,(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;
四、分页查询
1. 简单分页
需求:分页查询 T_ACCOUNT(台账表),每页 10 条记录。
分析:我们在 Oracle 进行分页查询,需要用到伪列 ROWNUM 和 嵌套查询。
-- 1. 首先显示前`10`条记录select rownum, t.*from T_ACCOUNT t where rownum <=10;-- 再显示第`11`条到第`20`条的记录select rownum, t.*from T_ACCOUNT t where rownum >10and rownum <=20;
上面第2页查询没有结果?
这是因为 rownum 是在查询语句扫描每条记录时产生的。
所以不能使用 大于 符号,只能使用 小于 或 小于等于,只用 等于 也不行。
子查询 实现分页。
select*from(select rownum r, t.*from T_ACCOUNT t where rownum <=20)where r >10;
2. 基于排序的分页
需求:分页查询 T_ACCOUNT(台账表),每页 10 条记录,按使用字数降序排序。
-- 如果基于排序的分页select*from(select rownum r, t.*from T_ACCOUNT t where rownum <=20orderby usenum desc)where r >10;-- 先单独执行嵌套查询里面的查询语句select rownum r, t.*from T_ACCOUNT t where rownum <=20orderby usenum desc;
发现排序后的 rownum 是乱的。
这是因为 rownum 伪列的产生是在表记录扫描是产生的,而排序是后进行的。
排序时 rownum 已经产生了,所以排序后 rownum 是乱的。
如何改写呢?
只要再嵌套一层循环(一共三层)。
让结果先排序,然后对排序后的结果再产生 rownum,这样就不会乱了。
select*from(select rownum r, t.*from(select*from T_ACCOUNT orderby usenum desc) t where rownum <=20)where r >10;