(一)简单条件查询
a)精确查询
select*from T_OWNERS where watermeter='30408'
b)模糊查询
查询业主名称包含“刘”的业主记录
select*from t_owners where name like'%刘%'
c)and运算符
查询业主名称包含“刘”的并且门牌号包含5的业主记录
select*from t_owners where name like'%刘%'and housenumber like'%5%'
d)or运算符
查询业主名称包含“刘”的或者门牌号包含5的业主记录
select*from t_owners where name like'%刘%'or housenumber like'%5%'
e)and 与or运算符混合使用
查询业主名称包含“刘”的或者门牌号包含5的业主记录,并且地址编号为3的记录。
select*from t_owners where(name like'%刘%'or housenumber like'%5%')and addressid=3*因为and的优先级比or大,所以我们需要用 () 来改变优先级。
f) 范围查询
查询台账记录中用水字数大于等于10000,并且小于等于20000的记录
(1)我们可以用>= 和<=来实现,语句
select*from T_ACCOUNT where usenum>=10000and usenum<=20000(2)我们也可以用between..and..来实现
select*from T_ACCOUNT where usenum between10000and20000
g) 空值查询
(1)查询T_PRICETABLE表中MAXNUM 为空的记录
select*from T_PRICETABLE t where maxnum isnull(2)查询T_PRICETABLE表中MAXNUM 不为空的记录
select*from T_PRICETABLE t where maxnum isnotnull(二)去掉重复记录
查询业主表中的地址ID,不重复显示
selectdistinct addressid from T_OWNERS
如果显示两条以上记录时,横向的一行为一组,与其他行对比是否重复
(三)排序查询
a)升序排序(默认升序)asc
对T_ACCOUNT表按使用量进行升序排序
select*from T_ACCOUNT orderby usenum
b)降序排序
对T_ACCOUNT表按使用量进行降序排序
select*from T_ACCOUNT orderby usenum desc(四)基于伪列的查询
在Oracle 的表的使用过程中,实际表中还有一些附加的列,称为伪列。伪列就像表中的列一样,
但是在表中并不存储.伪列只能查询,不能进行增删改操作。
(a)ROWID
表中的每一行在数据文件中都有一个物理地址,ROWID 伪列返回的就是该行的物理地址。
使用ROWID 可以快速的定位表中的某一行。ROWID 值可以唯一的标识表中的一行。
由于ROWID返回的是该行的物理地址,因此使用ROWID可以显示行是如何存储的。
查询语句:
select rowID,t.*from T_AREA t;
我们可以通过指定ROWID来查询记录
select rowID,t.*from T_AREA t where ROWID='AAAM1uAAGAAAAD8AAC';(b)ROWNUM
在查询的结果集中,ROWNUM为结果集中每一行标识一个行号,第一行返回1,第二行返回2,以此类推。
通过ROWNUM伪列可以限制查询结果集中返回的行数。
查询语句:
select rownum,t.*from T_OWNERTYPE t
(五)聚合统计:
ORACLE的聚合统计是通过分组函数来实现的,与MYSQL一致。
注意:
select areaid,sum(money)from t_account groupby areaid
1.显示的列必须在聚合函数中,或者在groupby后面有分组,否则会出错(非聚合函数的列都要参与groupby的分组)2.where 在返回结果前起作用,不能和聚合函数一起使用
3.having在返回结果后过滤数据,和聚合函数搭配使用
(1)聚合函数
a)求和 sum
统计2012年所有用户的用水量总和
selectsum(usenum)from t_account whereyear='2012'
b)求平均 avg
统计2012年所有用水量(字数)的平均值
selectavg(usenum)from T_ACCOUNT whereyear='2012'
c)求最大值 max
统计2012年最高用水量(字数)
selectmax(usenum)from T_ACCOUNT whereyear='2012'
d)求最小值min
统计2012年最低用水量(字数)
selectmin(usenum)from T_ACCOUNT whereyear='2012'
e)统计记录个数 count
统计业主类型ID为1的业主数量
selectcount(*)from T_OWNERS t where ownertypeid=1(2)分组聚合Groupby
按区域分组统计水费合计数
select areaid,sum(money)from t_account groupby areaid
(3) 分组后条件查询 having
查询水费合计大于16900的区域及水费合计
select areaid,sum(money)from t_account groupby areaid havingsum(money)>169000
六. 连接查询
(一)多表内连接查询
select*from 表1,表2 这样查询的结果是笛卡尔积,(列相加,行相乘)sql书写顺序:
第一步:确定需要那些表
第二步:确定链接条件
第三步:确定字段
第四步:整合前三步
eg:需求:查询显示业主编号、业主名称、地址、所属区域、收费员、业主分类
第一步:确定需要那些表
from t_ownertype ot,t_owners os,t_address ad,t_area ar,t_operator op
第二步:确定链接条件
where ot.id=os.ownertypeid and ad.id=os.addressid and ar.id=ad.areaid and ad.operatorid=op.id;
第三步:确定字段
select os.id 业主编号,os.name 业主名称,ad.name 地址,ar.name 所属区域,op.name 收费员,ot.name 业主分类
第四步:整合前三步
select os.id 业主编号,os.name 业主名称,ad.name 地址,ar.name 所属区域,op.name 收费员,ot.name 业主分类
from t_ownertype ot,t_owners os,t_address ad,t_area ar,t_operator op
where ot.id=os.ownertypeid and ad.id=os.addressid and ar.id=ad.areaid and ad.operatorid=op.id;(二)左外连接查询
注意:
(+)补空(null)
oracle单引号表示字符串
没加引号或者双引号代表列名
一般先执行子查询,除非子查询中需要外面的字段或结果
eg:查询业主的账务记录,显示业主编号、名称、年、月、金额。如果此业主没有账务记录也要列出姓名。
1.按照SQL1999标准的语法,查询语句如下:
SELECT ow.id,ow.name,ac.year,ac.month,ac.money FROM T_OWNERS ow leftjoin T_ACCOUNT ac on ow.id=ac.owneruuid
2.按照ORACLE提供的语法,就很简单了:
SELECT ow.id,ow.name,ac.year,ac.month,ac.money FROM T_OWNERS ow,T_ACCOUNT ac WHERE ow.id=ac.owneruuid(+)
如果是左外连接,就在右表所在的条件一端填上(+)
(三)右外连接
eg:查询业主的账务记录,显示业主编号、名称、年、月、金额。如果账务记录没有对应的业主信息,也要列出记录
1.SQL1999标准的语句
select ow.id,ow.name,ac.year,ac.month,ac.money from T_OWNERS ow rightjoin T_ACCOUNT ac on ow.id=ac.owneruuid
2.ORACLE的语法
select ow.id,ow.name,ac.year,ac.month,ac.money from T_OWNERS ow , T_ACCOUNT ac where ow.id(+)=ac.owneruuid
七. 子查询
1.where子句中的子查询
a)单行子查询
只返回一条记录
单行操作符
操作符 含义
= Equal to> Greater than
>= Greater than or equal
< Less than
<= Less than or equal to<>Not equal to
eg:查询2012年1月用水量大于平均值的台账记录
select*from T_ACCOUNT whereyear='2012'andmonth='01'and usenum>(selectavg(usenum)from T_ACCOUNT whereyear='2012'andmonth='01')
b)多行子查询
返回了多条记录
多行操作符
操作符 含义
IN 等于列表中的任何一个
ANY 和子查询返回的任意一个值比较
ALL 和子查询返回的所有的值比较
in 运算符(其中之一)
eg1:查询地址编号为1 、3、4 的业主记录
select*from T_OWNERS where addressid in(1,3,4)
eg2:查询地址含有“花园”的业主的信息
select*from T_OWNERS where addressid in(select id from t_address where name like'%花园%')
eg3:查询地址不含有“花园”的业主的信息
select*from T_OWNERS where addressid notin(select id from t_address where name like'%花园%')any运算符(和其中的一个值进行比较,判断是否满足条件)select*from t_account where usenum >any(select usenum from t_account where money>10000);select*from t_account where usenum >any(10000,8130,20099);2.from子句中的子查询
from子句的子查询为多行子查询
eg:查询显示业主编号,业主名称,业主类型名称,条件为业主类型为”居民”,
select*from(select o.id 业主编号,o.name 业主名称,ot.name 业主类型
from T_OWNERS o,T_OWNERTYPE ot where o.ownertypeid=ot.id)where 业主类型='居民'3.select子句中的子查询
select 子句的子查询必须为单行子查询*
eg1:列出业主信息,包括ID,名称,所属地址。
select id,name,(select name from t_address where id=addressid) addressname from t_owners
eg2:列出业主信息,包括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.简单的分页(需要用到伪列ROWNUM和嵌套查询)
eg:分页查询台账表T_ACCOUNT,每页10条记录
select rownum,t.*from T_ACCOUNT t where rownum<=10
rownum是在查询语句扫描每条记录时产生的,所以不能使用“大于”
符号,只能使用“小于”或“小于等于” ,只用“等于”也不行。
eg:显示第11条到第20条的记录
select*from(select rownum r,t.*from T_ACCOUNT t
where rownum<=20)where r>102.基于排序的分页
需求:分页查询台账表T_ACCOUNT,每页10条记录,按使用字数降序排序。
查询第2页数据,使用排序
eg:select*from(select rownum r,t.*from T_ACCOUNT t
where rownum<=20orderby usenum desc)where r>10
结果:rownum是乱序,因为ROWNUM 伪列的产生是在表记录扫描是产生的,
而排序是后进行的,排序时R已经产生了,所以排序后R是乱的。
让结果先排序,然后对排序后的结果再产生R,这样就不会乱了。
select*from(select rownum r,t.*from(select*from T_ACCOUNT
orderby usenum desc) t where rownum<=20)where r>10