Oracle-5 查询

目录

5.1、单表查询

5.1.1、简单条件查询

5.1.2、去除重复记录

5.1.3、排序查询

5.1.4、基于伪列的查询

5.1.5、聚合统计

5.2、连接查询(多表查询)

5.2.1、多表内连接查询

5.2.2、左外连接查询

5.2.3、右外连接查询

5.3、子查询

5.3.1、where子句中的子查询

5.3.2、from子句中的子查询

5.3.3、select子句的子查询

5.4、分页查询

5.4.1、简单分页

5.4.2、基于排序的分页

5.5、单行函数

5.5.1、字符函数

5.5.2、数值函数

5.5.3、日期函数

5.5.4、转换函数

5.5.5、其他函数

5.6、行列转换

5.7、分析函数

5.8、集合运算


5.1、单表查询

5.1.1、简单条件查询

精确查询
--查询水表编号为30408的业主记录
SELECT * FROM T_OWNERS WHERE WATERMETER='30408'
模糊查询
--查询业主名称包含‘刘’的业主记录
SELECT * FROM T_OWNERS WHERE NAME LIKE '%刘%'
and运算符
--查询业主名称包含‘刘’且门牌号包含‘5’的业主记录
SELECT * FROM T_OWNERS WHERE NAME LIKE '%刘%' AND HOUSENUMBER LIKE '%5%'
or运算符
--查询业主名称包含‘刘’的或门牌号包含‘5’的记录
SELECT * FROM T_OWNERS WHERE NAME LIKE '%刘%' OR HOUSENUMBER LIKE '%5%'
and与or的混合使用
--查询业主名称包含‘刘’的或者门牌号包含‘5’的且地址编号为‘3’的业主记录
SELECT * FROM T_OWNERS WHERE (NAME LIKE '%刘%' OR HOUSENUMBER LIKE '%5%') AND ADDRESSID=3

注:由于and的优先级大于or所以需要使用()来改变优先级次序

范围查询
--查询台账记录中用水字数大于10000且小于等于20000的记录
SELECT * FROM T_ACCOUNT WHERE USENUM >=10000 AND USENUM<=20000

SELECT * FROM T_ACCOUNT WHERE USENUM BETWEEN 10000 AND 20000
空值查询
--查询T_PRICETABLE表中MAXNUM为空的记录
SELECT * FROM T_PRICETABLE WHERE MAXNUM IS NULL
--查询T_PRICETABLE表中MAXNUM不为空的记录
SELECT * FROM T_PRICETABLE WHERE MAXNUM IS NOT NULL

5.1.2、去除重复记录

--查询业主表中的地址ID,不重复显示
SELECT DISTINCT ADDRESSID FROM T_OWNERS

5.1.3、排序查询

升序排序
--对T_ACCOUNT表按使用量升序排序
SELECT * FROM T_ACCOUNT
ORDER BY USENUM ASC
降序排序
--对T_ACCOUNT表按使用量升序排序
SELECT * FROM T_ACCOUNT
ORDER BY USENUM DESC

5.1.4、基于伪列的查询

在Oracle 的表的使用过程中,实际表中还有一些附加的列,称为伪列。伪列就像表中的列一样,但是在表中并不存储。伪列只能查询,不能进行增删改操作。

ROWID

表中的每一行在数据文件中都有一个物理地址,ROWID 伪列返回的就是该行的物理地址。使用 ROWID 可以快速的定位表中的某一行。ROWID 值可以唯一的标识表中的一行。由于ROWID 返回的是该行的物理地址,因此使用 ROWID可以显示行是如何存储的。

SELECT ROWID,T.* FROM T_OWNERS T
--可通过ROWID进行查询
SELECT * FROM T_OWNERS WHERE ROWID='AAAM18AAGAAAAAsAAD'

ROWID本身是个物理地址,根据主键查询的实质是根据索引找到ROWID,所以ROWID的查询效率更高

ROWNUM

在查询的结果集中,ROWNUM为结果集中每一行标识一个行号,第一行返回1,第二行返回2,以此类推。通过ROWNUM伪列可以限制查询结果集中返回的行数

SELECT ROWNUM,T.* FROM T_OWNERS T

5.1.5、聚合统计

Oracle的聚合统计是通过分组函数来实现的,与MYSQL一致

1、聚合函数

求和 sum
--统计2012年所有用户的用水量总和
SELECT SUM(USENUM) FROM T_ACCOUNT WHERE YEAR='2012'
求平均 avg
--统计2012年所有用水量的平均值
SELECT AVG(USENUM) FORM T_ACCOUNT WHERE YEAR='2012'
求最值 max\min
--统计2012年最高用水量
SELECT MAX(USENUM) FROM T_ACCOUNT WHERE YEAR='2012'
--统计2012年最低用水量
SELECT MIN(USENUM) FROM T_ACCOUNT WHERE YEAR='2012'
统计个数 count
--统计业主类型ID为1的业主数量
SELECT COUNT(*) FROM T_OWNERS WHERE OWNERTYPEID=1

2、分组聚合 Group by

--按区域分组统计水费合计数
SELECT AREAID,SUM(MONEY) FROM T_ACCOUNT 
GROUP BY AREAID

SELECT后一定是分组聚合的条件或者是聚合函数

3、分组后条件查询 having

--查询水费合计大于169000的区域及水费合计
SELECT AREAID,SUM(MONEY) FROM T_ACCOUNT 
GROUP BY AREAID
HAVING SUM(MONEY)>169000

5.2、连接查询(多表查询)

5.2.1、多表内连接查询

--查询显示业主编号,业主名称,业主类型名称
SELECT T_OWNERS.ID 业主编号, T_OWNERS.NAME 业主姓名, T_OWNERTYPE.NAME 业主类型 
FROM T_OWNERS,T_OWNERTYPE 
WHERE T_OWNERS.OWNERTYPEID=T_OWNERTYPE.IDsq
--查询显示业主编号,业主名称,地址和业主类型
SELECT T_OWNERS.ID 业主编号,T_OWNERS.NAME 业主名称,T_ADDRESS.NAME 地址,T_OWNERTYPE.NAME 业主类型
FROM T_OWNERS,T_ADDRESS,T_OWNERTYPE
WHERE T_OWNERS.ADDRESSID=T_ADDRESS.ID AND T_OWNERS.OWNERTYPEID=T_OWNERTYPE.ID
--查询显示业主编号、业主名称、地址、所属区域、业主分类
SELECT T_OWNERS.ID 业主编号,T_OWNERS.NAME 业主名称,T_ADDRESS.NAME 地址,T_AREA.NAME 区域,T_OWNERTYPE.NAME 业主类型
FROM T_OWNERS,T_ADDRESS,T_OWNERTYPE,T_AREA
WHERE T_OWNERS.ADDRESSID=T_ADDRESS.ID AND T_OWNERS.OWNERTYPEID=T_OWNERTYPE.ID AND T_ADDRESS.AREAID=T_AREA.ID
--查询显示业主编号、业主名称、地址、所属区域、收费员、业主分类
SELECT T_OWNERS.ID 业主编号,T_OWNERS.NAME 业主名称,T_ADDRESS.NAME 地址,T_AREA.NAME 区域,T_OPERATOR.NAME 收费员,T_OWNERTYPE.NAME 业主类型
FROM T_OWNERS,T_ADDRESS,T_OWNERTYPE,T_AREA,T_OPERATOR
WHERE T_OWNERS.ADDRESSID=T_ADDRESS.ID AND T_OWNERS.OWNERTYPEID=T_OWNERTYPE.ID AND T_ADDRESS.AREAID=T_AREA.ID AND T_ADDRESS.OPERATORID=T_OPERATOR.ID

5.2.2、左外连接查询

--查询业主的账务记录,显示业主编号、名称、年、月、金额。如果此业主没有账务记录也要列出姓名
--SQL1999语法
SELECT T_OWNERS.ID 业主编号,T_OWNERS.NAME 名称,T_ACCOUNT.YEAR 年, T_ACCOUNT.MONTH 月,T_ACCOUNT.MONEY 金额
FROM T_OWNERS LEFT JOIN T_ACCOUNT
ON T_OWNERS.ID=T_ACCOUNT.OWNERUUID
--ORACLE语法
SELECT T_OWNERS.ID 业主编号,T_OWNERS.NAME 名称,T_ACCOUNT.YEAR 年, T_ACCOUNT.MONTH 月,T_ACCOUNT.MONEY 金额
FROM T_OWNERS,T_ACCOUNT
WHERE T_OWNERS.ID=T_ACCOUNT.OWNERUUID(+)

左外连接在右表(+),右外连接在左表(+)

5.2.3、右外连接查询

--查询业主的账务记录,显示业主编号、名称、年、月、金额。如果账务记录没有对应的业主信息也要列出记录
--SQL1999语法
SELECT T_OWNERS.ID 业主编号,T_OWNERS.NAME 名称,T_ACCOUNT.YEAR 年, T_ACCOUNT.MONTH 月,T_ACCOUNT.MONEY 金额
FROM T_OWNERS RIGHT JOIN T_ACCOUNT
ON T_OWNERS.ID=T_ACCOUNT.OWNERUUID
--ORACLE语法
SELECT T_OWNERS.ID 业主编号,T_OWNERS.NAME 名称,T_ACCOUNT.YEAR 年, T_ACCOUNT.MONTH 月,T_ACCOUNT.MONEY 金额
FROM T_OWNERS,T_ACCOUNT
WHERE T_OWNERS.ID(+)=T_ACCOUNT.OWNERUUID

5.3、子查询

5.3.1、where子句中的子查询

查询结果为where子句中的条件值

单行子查询
--查询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)
多行子查询
--查询地址编号为1,3,4的业主记录
SELECT * FROM T_OWNERS
WHERE ADDRESSID IN (1,3,4)
--查询地址含有“花园”的业主的信息
SELECT * FROM T_OWNERS
WHERE ADDRESSID IN
(SELECT ID FROM T_ADDRESS WHERE NAME LIKE '%花园%')
--查询地址不含有“花园”的业主的信息
SELECT * FROM T_OWNERS
WHERE ADDRESSID NOT IN
(SELECT ID FROM T_ADDRESS WHERE NAME LIKE '%花园%')

5.3.2、from子句中的子查询

from子句的子查询为多行子查询

--查询显示业主编号,业主名称,业主类型名称,条件为业主类型为“居民”
SELECT * FROM
(SELECT T_OWNERS.ID 业主编号,T_OWNERS.NAME 业主姓名, T_OWNERTYPE.NAME 业主类型 
FROM T_OWNERS,T_OWNERTYPE 
WHERE T_OWNERS.OWNERTYPEID=T_OWNERTYPE.ID AND T_OWNERTYPE.NAME='居民')

5.3.3、select子句的子查询

select子句的子查询必须为单行子查询

--列出业主信息,包括ID,名称,所属地址
SELECT ID,NAME,(SELECT NAME FROM T_ADDRESS WHERE ID=ADDRESSID) ADDRESSID
FROM T_OWNERS
--列出业主信息,包括ID,名称,所属地址,所属区域
SELECT ID,NAME,(SELECT NAME FROM T_ADDRESS WHERE ID=ADDRESSID) ADDRESSID,
(SELECT(SELECT NAME FROM T_AREA WHERE ID=AREAID)FROM T_ADDRESS WHERE ID=AREAID) AREANAME
FROM T_OWNERS

5.4、分页查询

5.4.1、简单分页

--分页查询台账表前10条记录
SELECT * FROM T_ACCOUNT WHERE ROWNUM<=10

注:rownum用于where判断时只能<或<=

rownum在查询时每查询到一条记录则为其赋值rownum,rownum从1开始,所以直接查询rownum>某个数时,是不存在的

--查询台账表10到20条记录
SELECT * FROM (SELECT ROWNUM R,T_ACCOUNT.* FROM T_ACCOUNT)
WHERE R<=20 AND R>10

5.4.2、基于排序的分页

--查询用水量降序11到20的台账记录
SELECT * FROM (SELECT ROWNUM R,T.* FROM(SELECT * FROM T_ACCOUNT ORDER BY USENUM DESC) T)
WHERE R<=20 AND R>10

注:rownum的生成是在排序之前

5.5、单行函数

Oracle函数大全

链接:百度网盘 请输入提取码 提取码:cp3r

5.5.1、字符函数

伪表dual

--求字符串长度
SELECT LENGTH('ABCD') FROM DUAL
--求字符串从第三个字符开始的2个字符构成的子串(字符从1开始)
SELECT SUBSTR('ABCDEFG',3,2) FROM DUAL
--字符串拼接
SELECT CONCAT('ABC','EFG') FROM DUAL
SELECT CONCAT('ABC',CONCAT('E','GH')) FROM DUAL
SELECT 'ABC'||'D'||'EFG' FROM DUAL

5.5.2、数值函数

--四舍五入
SELECT ROUND(100.45) FROM DUAL --100
SELECT ROUND(100.456,2) FROM DUAL --100.46
--数字截取
SELECT TRUNC(100.456) FROM DUAL --100
SELECT TRUNC(100.456,2) FROM DUAL --100.45
--模运算 MOD
SELECT MOD(10,3) FROM DUAL--1

5.5.3、日期函数

--获取当前日期 SYSDATE
SELECT SYSDATE FROM DUAL
--加月函数
SELECT ADD_MONTHS(SYSDATE,2) FROM DUAL
--求所在月的最后一天
SELECT LAST_DAY(SYSDATE) FROM DUAL
--日期直接加减数字默认为加减天
SELECT SYSDATE+5 FROM DUAL
--日期截取(获取第一天)
SELECT TRUNC(SYSDATE) FROM DUAL --按日截取(去掉时间)
SELECT TRUNC(SYSDATE,'MM') FROM DUAL --按月截取 xxxx/xx/1
SELECT TRUNC(SYSDATE,'YYYY') FROM DUAL --按年截取 xxxx/1/1
SELECT TRUNC(SYSDATE,'HH') FROM DUAL --按小时截取
SELECT TRUNC(SYSDATE,'MI') FROM DUAL --按分钟截取
--不能按秒截取

5.5.4、转换函数

--数字转字符串
SELECT TO_CHAR(1234) FROM DUAL--左对齐字符串,右对齐数字
SELECT 100||'' FROM DUAL--自动转换字符
--日期转字符串
SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH:MI:SS') FROM DUAL
--字符串转日期
SELECT TO_DATE('2023-01-07','YYYY-MM-DD') FROM DUAL
--字符串转数字
SELECT TO_NUMBER('100')+10 FROM DUAL
SELECT '100'+0 FROM DUAL--自动转换

5.5.5、其他函数

空置处理函数 NVL

当检测到某个值为null时,则自动转换为另一个值

SELECT NVL(给定的值,若为null则转成的值) FROM DUAL
--显示价格表中业主类型ID为1的价格记录,如果上限值为null则显示99999
SELECT ID,MINNUM,NVL(MAXNUM,99999) FROM T_PRICETABLE
WHERE OWNERTYPEID=1
空置处理函数 NVL2
--NVL2(检测值,如果部位null的值,如果为null的值)
SELECT NVL2(MAXNUM,TO_CHAR(MAXNUM),'不限')FROM T_PRICETABLE
WHERE OWNERTYPEID=1
条件取值 decode

类似于C的case

--DECODE(条件,值1,返回值1,值2,返回值2,值3,返回值3...,缺省值)
SELECT DECODE(100,1,1,2,2,100,200)FROM DUAL --200
SELECT DECODE(400,1,1,2,2,100,200,300)FROM DUAL --300(缺省值)
SELECT DECODE(400,1,1,2,2,100,200)FROM DUAL --NULL
SELECT DECODE(1,1,1,1,2,100,200,300)FROM DUAL --1(短路运算)
--CASE WHEN THEN END
SELECT NAME,
(CASE OWNERTYPEID 
      WHEN 1 THEN '居民'
      WHEN 2 THEN '单位'
      WHEN 3 THEN '商业'
        END)
FROM T_OWNERS
 
SELECT NAME,
(CASE  
      WHEN OWNERTYPEID=1 THEN '居民'
      WHEN OWNERTYPEID=2 THEN '单位'
      WHEN OWNERTYPEID=3 THEN '商业'
        END)
FROM T_OWNERS

5.6、行列转换

--按月份统计2012年各个地区的水费
SELECT(SELECT NAME FROM T_AREA WHERE ID=AREAID) 区域,
SUM( CASE WHEN MONTH='01' THEN MONEY ELSE 0 END) 一月,
SUM( CASE WHEN MONTH='01' THEN MONEY ELSE 0 END) 二月,
SUM( CASE WHEN MONTH='01' THEN MONEY ELSE 0 END) 三月,
SUM( CASE WHEN MONTH='01' THEN MONEY ELSE 0 END) 四月,
SUM( CASE WHEN MONTH='01' THEN MONEY ELSE 0 END) 五月,
SUM( CASE WHEN MONTH='01' THEN MONEY ELSE 0 END) 六月,
SUM( CASE WHEN MONTH='01' THEN MONEY ELSE 0 END) 七月,
SUM( CASE WHEN MONTH='01' THEN MONEY ELSE 0 END) 八月,
SUM( CASE WHEN MONTH='01' THEN MONEY ELSE 0 END) 九月,
SUM( CASE WHEN MONTH='01' THEN MONEY ELSE 0 END) 十月,
SUM( CASE WHEN MONTH='01' THEN MONEY ELSE 0 END) 十一月,
SUM( CASE WHEN MONTH='01' THEN MONEY ELSE 0 END) 十二月
FROM T_ACCOUNT
  GROUP BY AREAID

--按季度统计2012年各个地区的水费
SELECT(SELECT NAME FROM T_AREA WHERE ID=AREAID) 区域,
SUM( CASE WHEN MONTH>='01'AND MONTH<='03' THEN MONEY ELSE 0 END) 第一季度,
SUM( CASE WHEN MONTH>='04'AND MONTH<='06' THEN MONEY ELSE 0 END) 第二季度,
SUM( CASE WHEN MONTH>='07'AND MONTH<='09' THEN MONEY ELSE 0 END) 第三季度,
SUM( CASE WHEN MONTH>='10'AND MONTH<='12' THEN MONEY ELSE 0 END) 第四季度
FROM T_ACCOUNT
  GROUP BY AREAID

5.7、分析函数

三种排序规则:

分数

值相同,排名相同,序号跳跃

值相同,排序相同,序号连续

序号连续,不管值是否相同

100

1

1

1

98

2

2

2

98

2

2

3

98

2

2

4

96

5

3

5

96

5

3

6

95

7

4

7

90

8

5

8

90

8

5

9

--RANK 值相同,排名相同,序号跳跃(1)
--对账目表的usenum字段进行RANK排序
SELECT RANK() OVER(ORDERBY USENUM),T.*FROM T_ACCOUNT T
--DENSE_RANK 值相同,排序相同,序号连续(2)
SELECT DENSE_RANK() OVER(ORDERBY USENUM),T.*FROM T_ACCOUNT T
--ROW_NUMBER 序号连续,不管值是否相同(3)
SELECT ROW_NUMBER() OVER(ORDERBY USENUM),T.*FROM T_ACCOUNT T
--ROW_NUMBER实现分页
SELECT*FROM
(SELECT ROW_NUMBER() OVER(ORDERBY USENUM) R,T.*FROM T_ACCOUNT T)
WHERE R<=20AND R>10

5.8、集合运算

集合运算就是将两个或多个结果集组合成为一个结果集

包括:

  1. UNION ALL(并集):返回各个查询的所有记录,包括重复记录
  2. UNION(并集):返回各个查询结果的所有记录,不包括重复记录
  3. INTERSECT(交集):返回两个查询共有的记录
  4. MINUS(差集),返回第一个查询检索出的记录减去第二个查询检索出的记录后剩余的记录
--并集(包括重复)
SELECT*FROM T_OWNERS WHERE ID>5
UNION ALL
SELECT*FROM T_OWNERS WHERE ID<7
--并集(不包括重复)
SELECT*FROM T_OWNERS WHERE ID>5
UNION
SELECT*FROM T_OWNERS WHERE ID<7
--交集
SELECT*FROM T_OWNERS WHERE ID>5
INTERSECT
SELECT*FROM T_OWNERS WHERE ID<7
--差集
SELECT*FROM T_OWNERS WHERE ID>5
MINUS
SELECT*FROM T_OWNERS WHERE ID<7
--集合运算实现分页
SELECT*FROM T_ACCOUNT WHERE ROWNUM<=20
MINUS
SELECT*FROM T_ACCOUNT WHERE ROWNUM<=10
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值