Oracle数据库 基础查询语句(1)
·
目录
一、单表查询
(一)简单条件查询
1.
精确查询
需求:查询水表编号为
30408
的业主记录
查询语句:
select
*
from
T_OWNERS
where
watermeter=
'30408'
查询结果:
2.
模糊查询
需求:查询业主名称包含“刘”的业主记录
查询语句:
select
*
from
t_owners
where name like
'%
刘
%'
查询结果:
3. and
运算符
需求:查询业主名称包含“刘”的并且门牌号包含
5
的业主记录
查询语句:
select
*
from
t_owners
where name like
'%
刘
%'
and
housenumber
like
'%5%'
查询结果:
4. or
运算符
需求:查询业主名称包含“刘”的或者门牌号包含
5
的业主记录
查询语句:
select
*
from
t_owners
where name like
'%
刘
%'
or
housenumber
like
'%5%'
查询结果:
5. and
与
or
运算符混合使用
需求:查询业主名称包含“刘”的或者门牌号包含
5
的业主记录,并且地址编号
为
3
的记录。
语句:
select
*
from
t_owners
where
(
name like
'%
刘
%'
or
housenumber
like
'%5%'
)
and
addressid=
3
查询结果:
因为
and
的优先级比
or
大,所以我们需要用
( )
来改变优先级。
6.
范围查询
需求:查询台账记录中用水字数大于等于
10000
,并且小于等于
20000
的记录
我们可以用
>=
和
<=
来实现,语句
select
*
from
T_ACCOUNT
where
usenum>=
10000
and
usenum<=
20000
北京市昌平区建材城西路金燕龙办公楼一层
电话:400-618-9090
我们也可以用
between
.. and
..
来实现
select
*
from
T_ACCOUNT
where
usenum
between
10000
and
20000
7.
空值查询
需求:查询
T_PRICETABLE
表中
MAXNUM
为空的记录
语句:
select
*
from
T_PRICETABLE t
where
maxnum
is null
查询结果:
需求:查询
T_PRICETABLE
表中
MAXNUM
不为空的记录
语句:
select
*
from
T_PRICETABLE t
where
maxnum
is not null
(二)去掉重复记录
需求:查询业主表中的地址
ID,
不重复显示
语句:
select distinct
addressid
from
T_OWNERS
(三)排序查询
1.
升序排序
需求:对
T_ACCOUNT
表按使用量进行升序排序
语句:
select
*
from
T_ACCOUNT
order by
usenum
查询结果:
2.
降序排序
需求:对
T_ACCOUNT
表按使用量进行降序排序
语句:
select
*
from
T_ACCOUNT
order by
usenum
desc
(四)基于伪列的查询
在
Oracle
的表的使用过程中,实际表中还有一些附加的列,称为伪列。伪列就
像表中的列一样,但是在表中并不存储。伪列只能查询,不能进行增删改操作。
接下来学习两个伪列:
ROWID
和
ROWNUM
。
1 ROWID
表中的每一行在数据文件中都有一个物理地址,
ROWID
伪列返回的就是该行的
物理地址。使用
ROWID
可以快速的定位表中的某一行。
ROWID
值可以唯一的
标识表中的一行。由于
ROWID
返回的是该行的物理地址,因此使用
ROWID
可
以显示行是如何存储的。
查询语句:
select rowID
,t.*
from
T_AREA t
查询结果如下:
我们可以通过指定
ROWID
来查询记录
select rowID
,t.*
from
T_AREA t
where ROWID
=
'AAAM1uAAGAAAAD8AAC'
;
查询结果如下:
2
ROWNUM
在查询的结果集中,
ROWNUM
为结果集中每一行标识一个行号,第一行返回
1
,
第二行返回
2
,以此类推。通过
ROWNUM
伪列可以限制查询结果集中返回的行数。
查询语句:
select rownum
,t.*
from
T_OWNERTYPE t
查询结果如下:
我们的分页查询需要用到此伪列,在本章第四小节详细讲解。
(五)聚合统计
ORACLE
的聚合统计是通过分组函数来实现的,与
MYSQL
一致。
1.
聚合函数
(
1
)求和
sum
需求:统计
2012
年所有用户的用水量总和
select sum
(usenum)
from
t_account
where year
=
'2012'
查询结果如下:
(
2
)求平均
avg
需求:统计
2012
年所有用水量(字数)的平均值
select avg
(usenum)
from
T_ACCOUNT
where year
=
'2012'
查询结果如下:
(
3
)求最大值
max
需求:统计
2012
年最高用水量(字数)
select max
(usenum)
from
T_ACCOUNT
where year
=
'2012'
查询结果如下:
(
4
)求最小值
min
需求:统计
2012
年最低用水量(字数)
select min
(usenum)
from
T_ACCOUNT
where year
=
'2012'
查询结果如下:
(
5
)统计记录个数
count
需求:统计业主类型
ID
为
1
的业主数量
select count
(
*
)
from
T_OWNERS t
where
ownertypeid=
1
查询结果如下:
2.
分组聚合
Group by
需求:按区域分组统计水费合计数
语句:
select
areaid,
sum
(money)
from
t_account
group by
areaid
查询结果:
3.
分组后条件查询
having
需求:查询水费合计大于
16900
的区域及水费合计
语句:
select
areaid,
sum
(money)
from
t_account
group by
areaid
having sum
(money)>
169000
查询结果:
二、连接查询
(一)多表内连接查询
(
1
)需求:查询显示业主编号,业主名称,业主类型名称,如下图:
查询语句:
select
o.id
业主编号
,o.name
业主名称
,ot.name
业主类型
from
T_OWNERS o,T_OWNERTYPE ot
where
o.ownertypeid=ot.id
(
2
)需求:查询显示业主编号,业主名称、地址和业主类型,如下图
分析:此查询需要三表关联查询。分别是业主表,业主分类表和地址表
语句:
select
o.id
业主编号
,o.name
业主名称
,ad.name
地址
,
ot.name
业主类型
from
T_OWNERS o,T_OWNERTYPE ot,T_ADDRESS ad
where
o.ownertypeid=ot.id
and
o.addressid=ad.id
(
3
)需求:查询显示业主编号、业主名称、地址、所属区域、业主分类,如下
图:
分析:这里需要四个表关联查询,比上边多了一个区域表(
T_AREA
)
查询语句:
select
o.id
业主编号
,o.name
业主名称
,ar.name
区域
, ad.name
地
址
, ot.name
业主类型
from
T_OWNERS o ,T_OWNERTYPE ot,T_ADDRESS ad,T_AREA ar
where
o.ownertypeid=ot.id
and
o.addressid=ad.id
and
ad.areaid=ar.id
(
4
)需求:查询显示业主编号、业主名称、地址、所属区域、收费员、业主分
类,如下图:
分析:此查询比上边又多了一个表
T_OPERATOR
语句:
select
ow.id
业主编号
,ow.name
业主名称
,ad.name
地址
,
ar.name
所属区域
,op.name
收费员
, ot.name
业主类型
from
T_OWNERS ow,T_OWNERTYPE ot,T_ADDRESS ad ,
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
(台账表) 按照查询结果,业主表为左表、账务表为右表。
按照
SQL1999
标准的语法,查询语句如下:
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,ow.name,ac.year ,ac.month,ac.money
FROM
T_OWNERS ow,T_ACCOUNT ac
WHERE
ow.id=ac.owneruuid
(+)
如果是左外连接,就在右表所在的条件一端填上(
+
)
(三)右外连接查询
需求:查询业主的账务记录,显示业主编号、名称、年、月、金额。如果账务记
录没有对应的业主信息,也要列出记录。如下图:
SQL1999
标准的语句
select
ow.id,ow.name,ac.year,ac.month,ac.money
from
T_OWNERS ow
right join
T_ACCOUNT ac
on
ow.id=ac.owneruuid
ORACLE
的语法
select
ow.id,ow.name,ac.year,ac.month,ac.money
from
T_OWNERS ow , T_ACCOUNT ac
where
ow.id(+) =ac.owneruuid
三、子查询
(一)where 子句中的子查询
1.
单行子查询
只返回一条记录
单行操作符
需求:查询
2012
年
1
月用水量大于平均值的台账记录
语句:
select
*
from
T_ACCOUNT
where year
=
'2012'
and month
=
'01'
and
usenum>
(
select avg
(usenum)
from
T_ACCOUNT
where year
=
'2012'
and
month
=
'01'
)
查询结果:
平均值为:
2.
多行子查询
返回了多条记录
多行操作符
in
运算符
(
1
)需求:查询地址编号为
1
、
3
、
4
的业主记录
分析:如果我们用
or
运算符编写,
SQL
非常繁琐,所以我们用
in
来进行查询
语句如下:
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
业主编号
,o.name
业主名称
,ot.name
业主类型
from
T_OWNERS o,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,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;
查询结果如下:
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)