前面我们详解了关于Oracle的增删改,今天让我们接着来学习Oracle的查询吧,
Oracle中查询可是重头戏噢!!!跟着煌sir的步伐,走位,走位~~~
小知识锦囊
在此前,先讲解一个小知识点 Oracle注释,这对我们开发也是挺有帮助的噢!!!
--表注释
comment on table 表名 is '注释';
--列注释
comment on column 列名 is '注释';
实用:
comment on table test1.ID is ''主键';
可以更清晰的看懂对应的字段意思,是不是就可以更快的操作了呢,嚯嚯~~~
接着,让我们进入查询吧!
查询_单表查询
一.标准SQL和方言
二. 标准DQL语法
select distinct * | 列名 as 别名, 列表2 as 别名2... | 聚合函数
from 表名 as 别名, 表名2 as 别名2 ,....
where 查询条件
group by 分组字段 having 分组条件
order by 排序字段 asc | desc,....
三.简单查询
--精确查询
--1 查询水表编号为30408的业主记录
select * from t_owners where WATERMETER='30408' ;
--使用表的别名
select * from t_owners ow as where ow.WATERMETER='30408' ;
--模糊查询
--2查询业主名称包含“刘”的业主记录
--like 语句 %匹配多个字符 _匹配1个字段
select * from t_owners ow where ow.NAME like '%刘%';
--and运算符
--3查询业主名称包含“刘”的并且门牌号包含5的业主记录
select * from t_owners ow where ow.name like '%刘%' and ow.HOUSENUMBER like '%5%';
--or运算符
--4查询业主名称包含“刘”的或者门牌号包含5的业主记录
select * from t_owners ow where ow.name like '%刘%' or ow.HOUSENUMBER like '%5%';
--and 与or运算符混合使用
--5查询业主名称包含“刘”的或者门牌号包含5的业主记录,并且地址编号为3的记录。
--and 优先级 高与or, 如果先执行or, 需要使用小括号
--1.不加括号,先执行and
select * from t_owners ow where ow.name like '%刘%' or ow.HOUSENUMBER like '%5%' and ow.ADDRESSID=3;
--2.加括号,先执行or
select * from t_owners ow where (ow.name like '%刘%' or ow.HOUSENUMBER like '%5%') and ow.ADDRESSID=3;
-- 范围查询
--6查询台账记录中用水字数大于等于10000,并且小于等于20000的记录
--1. > <
select * from t_account a where a.USENUM >=10000 and a.USENUM<=20000;
--2. between ..to..
select * from t_account a where a.usenum between 10000 and 20000;
-- 空值查询
--7 查询T_PRICETABLE表中MAXNUM为空的记录
select * from T_PRICETABLE p where p.maxnum is null;
--8 查询T_PRICETABLE表中MAXNUM不为空的记录
select * from T_PRICETABLE p where p.maxnum is not null;
四.去重复和排序
--1.升序排序
--需求:对T_ACCOUNT表按使用量进行升序排序
select * from T_ACCOUNT t order by t.USENUM asc;
--2.降序排序
--需求:对T_ACCOUNT表按使用量进行降序排序
select * from T_ACCOUNT t order by t.usenum desc;
--需求:对T_ACCOUNT表按month进行降序,如果相同按照usenum进行升序
select * from T_ACCOUNT t order by t.month desc ,t.usenum asc ;
五.伪列
伪列是oracle中独有的,伪列也是真实存在的列,用于查询操作,不能增删改操作。
ROWID:物理文件上唯一区别这条记录的唯一标识
表中的每一行在数据文件中都有一个物理地址,ROWID伪列返回的就是该行的物理地址。使用ROWID可以快速的定位表中的某一行。ROWID值可以唯一的标识表中的一行。由于ROWID返回的是该行的物理地址,因此使用ROWID可以显示行是如何存储的。
- rowid
- 在mysql表中存在数据相同记录,如果对某一条进行操作,将修改所有的数据。
Oracle使用rowid区别每一条数据,不会存在操作一条,影响多条的情况。
查询语句: select rowID,t.* from T_AREA t
- rownum
在查询的结果集中,ROWNUM为结果集中每一行标识一个行号,第一行返回1,第二行返回2,以此类推。通过ROWNUM伪列可以限制查询结果集中返回的行数。
查询语句: select rownum,t.* from T_OWNERTYPE t
六.聚合函数
-
ORACLE的聚合统计是通过分组函数来实现的,与MYSQL一致。
-
聚合函数:通过提供函数,将查询结果处理成一行一列数据。
-
特点:聚合函数不计算null值
-
实战样例:
--(五)聚合统计 ----不计算null值
--(1)求和 sum
--1 统计2012年所有用户的用水量总和
select sum(a.USENUM) from t_account a where a.YEAR='2012';
--(2)求平均 avg
--2 统计2012年所有用水量(字数)的平均值
select avg(a.usenum) from t_account a where a.year='2012';
--(3)求最大值 max
--3统计2012年最高用水量(字数)
select max(a.usenum) from t_account a where a.year='2012';
--(4)求最小值min
--4统计2012年最低用水量(字数)
select min(a.usenum) from t_account a where a.year='2012';
--(5)统计记录个数 count
--5统计记录个数 count
--1
select count(a.usenum) from t_account a ;
--2
select count(*) from t_account a ;
--2. 分组聚合Group by --+++++++++++++++++++++++++++++++++++++++++++++++++
--需求:按区域分组统计2012年水费合计数
select a.areaid 区域,sum(a.money) 年水费合计数 from t_account a where a.year='2012' group by a.areaid;
--3. 分组后条件查询 having
--需求:查询2012年水费合计大于169000的区域及水费合计
select a.areaid 区域,sum(a.money)水费合计 from t_account a where a.year='2012' group by a.areaid having sum(a.money)>=169000;
今天就到这里结束了噢,下期见,小伙伴们~~~
看完恭喜你,又知道了一点点!!!
你知道的越多,不知道的越多!
~感谢志同道合的你阅读, 你的支持是我学习的最大动力 ! 加油 ,陌生人一起努力,共勉!!
来源:oschina
链接:https://my.oschina.net/ithuang/blog/4291912