Oracle-day02 上

一、单表查询
(一)简单条件查询
1.精确查询
需求:查询水表编号为 30408 的业主记录
查询语句:

select * from T_OWNERS where watermeter='30408'
查询结果:
Oracle-day02 上
2.模糊查询
需求:查询业主名称包含“刘”的业主记录
查询语句:

select * from t_owners where name like '%刘%'
查询结果:
Oracle-day02 上

  1. and 运算符
    需求:查询业主名称包含“刘”的并且门牌号包含 5 的业主记录
    查询语句:
select * from t_owners where name like '%刘%' and housenumber
like '%5%'

查询结果:

Oracle-day02 上

  1. or 运算符
    需求:查询业主名称包含“刘”的或者门牌号包含 5 的业主记录
    查询语句:
select * from t_owners
where name like '%刘%' or housenumber like '%5%'

查询结果:
Oracle-day02 上

  1. and 与 or 运算符混合使用
    需求:查询业主名称包含“刘”的或者门牌号包含 5 的业主记录,并且地址编号
    为 3 的记录。
    语句:

select * from t_owners where (name like '%刘%' or housenumber
like '%5%') and addressid=3
查询结果:
Oracle-day02 上
因为 and 的优先级比 or 大,所以我们需要用 ( ) 来改变优先级。

  1. 范围查询
    需求:查询台账记录中用水字数大于等于 10000,并且小于等于 20000 的记录
    我们可以用>= 和<=来实现,语句
select * from T_ACCOUNT
where usenum>=10000 and usenum<=20000

我们也可以用 between
.. and
..来实现

select * from T_ACCOUNT
where usenum between 10000 and 20000
  1. 空值查询
    需求:查询 T_PRICETABLE 表中 MAXNUM 为空的记录
    语句:

select * from T_PRICETABLE t where maxnum is null
查询结果:
Oracle-day02 上
需求:查询 T_PRICETABLE 表中 MAXNUM 不为空的记录
语句:

select * from T_PRICETABLE t where maxnum is not null
查询结果:
Oracle-day02 上
(二)去掉重复记录
需求:查询业主表中的地址 ID,不重复显示
语句:

select distinct addressid from T_OWNERS
[img=381,124]

(三)排序查询
1.升序排序
需求:对 T_ACCOUNT 表按使用量进行升序排序
语句:

扫描二维码关注公众号,回复: 1243327 查看本文章

select * from T_ACCOUNT order by usenum
查询结果:
Oracle-day02 上
2.降序排序
需求:对 T_ACCOUNT 表按使用量进行降序排序
语句:

select * from T_ACCOUNT order by usenum desc
查询结果:
Oracle-day02 上
(四)基于伪列的查询
在 Oracle 的表的使用过程中,实际表中还有一些附加的列,称为伪列。伪列就
像表中的列一样,但是在表中并不存储。伪列只能查询,不能进行增删改操作。
接下来学习两个伪列:ROWID 和 ROWNUM。
1ROWID
表中的每一行在数据文件中都有一个物理地址,ROWID 伪列返回的就是该行的
物理地址。使用 ROWID 可以快速的定位表中的某一行。ROWID 值可以唯一的
标识表中的一行。由于 ROWID 返回的是该行的物理地址,因此使用 ROWID 可
以显示行是如何存储的。
查询语句:

select rowID,t.* from T_AREA t
查询结果如下:
Oracle-day02 上
我们可以通过指定 ROWID 来查询记录

select rowID,t.*
from T_AREA t
where ROWID='AAAM1uAAGAAAAD8AAC';

查询结果如下:
Oracle-day02 上
2ROWNUM
在查询的结果集中,ROWNUM 为结果集中每一行标识一个行号,第一行返回 1,第二行返回 2,以此类推。通过 ROWNUM 伪列可以限制查询结果集中返回的行数。[img=295,37]
查询语句:

select rownum,t.* from T_OWNERTYPE t
查询结果如下:
Oracle-day02 上
我们的分页查询需要用到此伪列,在本章第四小节详细讲解。
(五)聚合统计
ORACLE 的聚合统计是通过分组函数来实现的,与 MYSQL 一致。

  1. 聚合函数
    (1)求和 sum
    需求:统计 2012 年所有用户的用水量总和

select sum(usenum) from t_account where year='2012'

查询结果如下:
 ![](http://i2.51cto.com/images/blog/201805/31/7881a55e66ea0c5ad2be6c5dbf8985f7.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
(2)求平均 avg
需求:统计 2012 年所有用水量(字数)的平均值

select avg(usenum) from T_ACCOUNT where year='2012'
查询结果如下:
 ![](http://i2.51cto.com/images/blog/201805/31/41d988d6b359f5db0d1cc7bb323e126e.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
(3)求最大值 max
需求:统计 2012 年最高用水量(字数)[img=168,44]

`select max(usenum) from T_ACCOUNT where year='2012'`
查询结果如下:
 ![](http://i2.51cto.com/images/blog/201805/31/b74638d7f8252f860219cbcc56615f8a.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
(4)求最小值 min
需求:统计 2012 年最低用水量(字数)

`select min(usenum) from T_ACCOUNT where year='2012'`
查询结果如下:
 ![](http://i2.51cto.com/images/blog/201805/31/1459333e5fe1d437322cf805fe31b36f.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
(5)统计记录个数 count
需求:统计业主类型 ID 为 1 的业主数量

select count(*) from T_OWNERS t where ownertypeid=1

查询结果如下:
 ![](http://i2.51cto.com/images/blog/201805/31/6fe428066f53e515664b5579df8290b9.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
2. 分组聚合 Group by
需求:按区域分组统计水费合计数
语句:

`select areaid,sum(money) from t_account group by areaid`
查询结果:

![](http://i2.51cto.com/images/blog/201805/31/d816ce8c197cd1d3aed0516325aae8e0.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
3. 分组后条件查询 having
需求:查询水费合计大于 16900 的区域及水费合计
语句:

select areaid,sum(money) from t_account group by areaid
having sum(money)>169000


查询结果:
 ![](http://i2.51cto.com/images/blog/201805/31/77729ecd463953b2dca238ed6ec33ba8.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

猜你喜欢

转载自blog.51cto.com/13587708/2122372