一. 表空间,用户及授权
1. 创建表空间
Create tablespace waterboss Datafile ‘c:\waterboss.dbf’ Size 100m Autoextend on Next 10m |
解释:
Waterboss:表示表空间的名称
Datafile:表示存储到硬盘的物理路径文件
Size:用于设置表空间的初始的大小
Autoextends on:表示设置空间自动增长开启,超过容量自动扩容
Next:每次扩容的大小,表示10兆.
2. 创建用户
Create user wateruser Identified by zhaozhao Default tablespace waterboss |
解释:
Wateruser:创建的用户名
Zhaozhao:设置的密码
Waterboss:表示默认使用的表空间
3. 用户赋权
Grant dba to wateruser |
给用户wateruser赋予dba权限,dba是可以操作数据库的管理员的权限
二. 表的创建,修改与删除
1. 创建表
Oracle数据库不能自动生成主键
Create table 表名称( 字段名 类型(长度) primary key, 字段名 类型(长度), ..................... ); |
字符型:
Char:固定长度字符类型
Varchar2:可变长度字符类型
Long:大文本类型.最大可以储存
2个G
数值型:
Number:number(5) 表示最大的存的数为5位整数,最大为99999
Number(5,2) 总共数5位数,其中2位小数
日期型:
Date:日期时间型,精确到秒
timeStamp:精确到秒后的小数点后9位
二进制型(大数据类型)
Clob:储存字符,最大可以储存4G
Blob:储存图像,声音,视频等二进制数据,最大可以储存4G
创建业主表
create table owners( Id number primary key, Name varchar2(30), Addressid number, Housenumber varchar2(30), Waternumber varchar2(30), Adddate date, Ownertypeid number ); |
4. 修改表
4.1 增加字段的语法
Alter table 表名 add( 列名 类型 ) |
举例:
Alert table owners add(
Remark varchar2,
Outdate date
)
4.2 修改字段
一般是修改类型
Alert table 表明 modify( 列名 类型, ............. ) |
4.3 修改列名
Alter table 表名 rename column 原列名 to 新列名
如:
Alert table owners rename column outdate to exitdate
4.4 删除字段
Alter table 表明 drop column 列名
Alter table 表明 drop column (列名1,列名2....)
5. 删除表
Drop table 表名
三. 数据的增删改查
1. 插入数据
当值是字符串类型时候用’ ’,单引号
Insert into 表名 (列名1,列名2...) values(值1,值2.....)
执行insert 之后需要执行commit提交事物
6. 修改数据
Update 表名 set 列名=值1...where 修改条件
需求:将 ID 为 1 的业主的登记日期更改为三天前的日期
时间类型的数据可以直接加减,+3表示时间的天数+3天
Update owners set adddate=adddate+3 where id=1 Commit; |
7. 删除数据
语法1:
Delete from 表名 where 删除条件
Commit 提交事物
语法2:
Truncate table 表名
Truncate与delete的区别?
1 .delete删除的数据可以回滚
2 .delete删除可能产生碎片化,不能够释放空间,如:会占用id
3 .truncate是先摧毁表的结构,在重够表结构
四. 数据的导入与导出
1. 整库导入与导出
7.1 导出
方式一:整库导出到默认
Exp 用户名/密码 full=y
Full=y表示整库导出
方式二:整库导出到指定文件
Exp 用户名/密码 file=文件名.dmp full=y
7.2 导入
方式一:默认文件
Imp 用户名/密码 full=y
方式二:根据文件名导入
Imp 用户名/密码 full=y file=water.dmp
8. 按用户导入与导出
8.1 按用户导出
Exp 用户名/密码 owner=用户 file=water.dmp
8.2 按用户导入
Imp 用户名/密码 file=water.dmp fromuser=用户名
9. 按表导出与导入
9.1 按表导出
Exp 用户名/密码 file=a.dmp tables=t_account,a_area
多个表的话用逗号隔开
9.2 按表导入
Imp 用户名/mima file=a.dmp tables=t_account,a_area
五. 单表查询
1. 简单条件查询
9.3 精确查询
Select * from t_owners where watermeter=’30408’
9.4 模糊查询
Select * from t_owners where name like ‘%l刘%’
9.5 And运算符
Select * from t_owners where name like ‘%刘%’ and housenumber like ‘%5%’
9.6 or运算符
9.7 And和or混用
Select * from t_owners where (name like ‘%刘%’ and housenumber like ‘%5%’) and addressid=3
9.8 范围查询
Select * from t_account where usernum>=10000 and usenum<=20000
也可以用between...and....
Select * from t_Account where usernum between 10000 and 20000
9.9 空值查询
需求:查询 T_PRICETABLE 表中 MAXNUM 为空的记录
Select * from t_account where usernum is null
需求:查询 T_PRICETABLE 表中 MAXNUM 为空的记录
Select * from t_account where usernum is not null
10. 去掉重复的记录
需求:查询业主表中的地址 ID,不重复显示
Select distinct addressid from t_owners
Distinct去重
11. 排序查询
11.1 升序
Select * from t_account order by usenum asc
11.2 降序
Select * from t_account order by usernum desc
12. 基于伪列的查询
在 Oracle 的表的使用过程中,实际表中还有一些附加的列,称为伪列。伪列就
像表中的列一样,但是在表中并不存储。伪列只能查询,不能进行增删改操作。
12.1 Rowid
表中的每一行在数据文件中都有一个物理地址,ROWID 伪列返回的就是该行的
物理地址。使用 ROWID 可以快速的定位表中的某一行
Select rowId ,t* from t_area t |
12.2 rownum
在查询的结果集中,ROWNUM 为结果集中每一行标识一个行号,第一行返回 1,
第二行返回 2,以此类推。通过 ROWNUM 伪列可以限制查询结果集中返回的行
Select rownum,t.* from t_owner t |
13. 聚合统计
13.1 聚合函数
求sum
Select sum(usenum) from t_account where year=’2012’ |
求平均值
需求:统计 2012 年所有用水量(字数)的平均值
select avg(usenum) from T_ACCOUNT where year=‘2012‘ |
求最大值 max
需求:统计 2012 年最高用水量(字数)
select max(usenum) from T_ACCOUNT where year=‘2012‘ |
求最小值 min
需求:统计 2012 年最低用水量(字数)
select min(usenum) from T_ACCOUNT where year=‘2012‘ |
统计记录个数 count
需求:统计业主类型 ID 为 1 的业主数量
Select count(*) from t_owners where ownertypeid=1 |
13.2 分组聚合
需求:按区域分组统计水费合计数
Select areaid,sum(money) from t_account group by areaid |
结论:
在进行分组查找的时候,分组条件的列必须要在查找的结果中]
13.3 分组后的条件查询
需求:查询水费合计大于 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 |
需求:查询显示业主编号,业主名称、地址和业主类型(三个表关联查询)
需求:查询显示业主编号、业主名称、地址、所属区域、业主分类(四表关联查询)
七. 子查询
八. 分页查询
1. 简单分页
需求:分页查询台账表 T_ACCOUNT,每页 10 条记录
Select rownum,t.* from t_account t where rownum<=10 |
需求:查询第 11 条到第 20 条的记录
Select * from (select rownum r,t.* from t_account where rownum<=20) where r>10 |
14. 基于排序的分页
Rownum伪列的产生是在表记录扫描产生的,而排序是后进行的,排序是r已经产生了,所以排序后r是乱的
九. 单行函数
1. 字符函数
Initcat:将字符串的第一个字符变成大写
Instr:找出某个字符串的位置
Length:字符串的长度
Lower:将字符串转为小写
Substr:取字符串的子串
Translate:执行字符串的搜索和替换
Upper:将字符串变为大写
14.1 求字符串的长度
Select length(‘ABC’) from dual
14.2 求字符串的子串
SELECT SUBSTR(‘AB‘,2,2) from DUAL
说明:第一个2表示从第二个位置开始截取
第2个2表示截取的长度.
结果:
14.3 字符串拼接concat
SELECT CONCAT(‘ABC‘,‘DEF‘) FROM DUAL
结果:
也可以使用||进行字符串的拼接
select ‘ABC‘||‘DEF‘ from dual;
结果是一致的
注意:mysql数据库不能使用||这种方式字符串的拼接
15. 数值函数
ABS(value) 绝对值
COS(value) 余弦
EXP(value) e的value次幂
ROUND(value,precision) value按precision的精度四舍五入等
TRANC(value) 截取函数
15.1 四舍五入函数
SELECT ROUND(23.53,1) FROM DUAL
条件里面不写保留几位小数的话,默认是四舍五入取整的
SELECT ROUND(253.62) FROM DUAL
结果:
15.2 截取函数
SELECT TRUNCATE (1003.567,2) FROM DUAL
结果:
16. 日期函数
Add_months 在日期date上增加count个月
Last_day(date) 返回在日期date所在月的最后一天
Next_day(date,’day’) 给出日期date之后下一天的日期
获取当前时间:
SELECT SYSDATE() FROM DUAL
结果:
(1) 加月函数add_months
Select add_months(sysdate,2) from dual
查询结果:
注意:mysql数据库中没有此次函数,只有adddate函数
(2) 求所在月的最后的一天last_day
语句:
Select last_day(sysdate) from dual
结果:
(3) 日期截取tunc
Select trunc(sysdate) from dual
表示截取时间的年月日及星期
截取年:
Select trunc(sysdate,’yyyy’) from dual
表示截取当前年的第一天
截取月:
Select trunc(sysdate,’mm’) from dual
表示截取截取当前月的第一天
17. 转换函数
Charttorowid 将字符转换为rowid类型
Rowidtochar 转换rowid到字符
To_char 转换日期格式到字符串
To_date 按照指定的格式将字符串转换到日期的类型
To_number 将数字字串转换为数字
17.1 将数字转字符串
SELECT "TO_CHAR"(120) FROM dual
结果
注意:
Mysql里面没有此函数
17.2 日期转字符串to_char
SELECT TO_CHAR(SYSDATE,‘yyyy-mm-dd‘) FROM dual
结果:
SELECT TO_CHAR(SYSDATE,‘yyyy-mm-dd hh:mi:ss‘) FROM dual
结果:
17.3 字符串转日期
Select to_date(‘2017-12-01’,’yyyy-mm-dd’) from dual
结果:
17.4 字符串转数字
Select to_number(‘100’) from dual
18. 其它函数
18.1 空值处理函数nvl
用法:
NVL(检测的值,如果为 null 的值);
SELECT NVL(NULL, ‘我是空值函数‘) FROM dual
结果:
解释:表示如果是空的话,就显示为后面的内容
需求:显示价格表中业主类型ID为1的价格记录,如果上限值为NULL,则显示9999999
Select price,minnum,nvl(maxnum,9999999) from T_pricetable where id=1
查询结果:
18.2 控制处理函数NVL2
用法:
NVL2(检测的值,如果不为 null 的值,如果为 null 的值);
需求:显示价格表中业主类型 ID 为 1 的价格记录,如果上限值为 NULL,显示“不
限”.
Select price ,minnum,nvl2(maxnum,to_char(maxnum),’不限’) from t_pricetable where id=1
18.3 条件取值
语法:
Decode(条件,值1,翻译值1,值2,翻译值2,....缺省值)
需求:显示下列信息(不要关联查询业主类型表,直接判断 1 2 3 的值)
Select name,decode(ownertypeid,1,’居民’,2,’行政事业单位,3,’商业’’) as
“类型” from t_owners
总结:用””的情况,一般起的别名可以使用双引号,也可以不用引号
上面的语句也可以用case when then 语句来实现
Select name,(case ownertypeid when 1 then ‘居民
When 2 then ‘行政事业单位’
When 3 then ‘商业’
Else ‘其它’
End) from t_owners
还有另外一种写法
select name,(case
when ownertypeid= 1 then ‘居民‘
when ownertypeid= 2 then ‘行政事业‘
when ownertypeid= 3 then ‘商业‘
end )
from T_OWNERS
19. 行列转换
需求:按月份统计 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 where year=‘2012‘ group by areaid
20. 分析函数
分析函数主要可以用于排名
(1) rank 相同的值排名相同,排名跳跃
Select rank() over(order by usenum desc), usenum from T_account
注意:over不能单独使用,要和分析函数:rank(),dense_rank(),row_number()等一起使用。
(2) dense_rank 相同的值排名相同,排名连续
需求:对 T_ACCOUNT 表的 usenum 字段进行排序,相同的值排名相同,排名连
续
Select dense_rank(),over(order by usenum desc),usenum from t_account
(3) row_number 返回连续的排名,无论值是否相等
Select rownumber(),over(order by usenum desc ),usenum from t_account
用row_number()可以实现分页查询:
Select row_number(),over(order by usenum desc) as rownumber,usenum from t_account
Select * from(Select row_number(),over(order by usenum desc) as rownumber,usenum from t_account
)
Where rownumber>10 and rownumber<=20
十. 集合运算
集合运算,集合运算就是将两个或者多个结果集组合成为一个结果集
Union all(并集),返回各个查询的所有的记录,包括查询重复记录
Union(并集),返回各个查询的所有的记录,不包括重复记录
Intersect(交集),返回两个数据共有的记录
Minus(差集),返回第一个查询检索的记录减去第二个查询检索出记录后剩余的记录简单说就是左边减去右边剩下的结果
1. 并集
UNIONALL 不去掉重复记录
select * from t_owners where id<=7
union all
select * from t_owners where id>=5
UNION 去掉重复记录
select * from t_owners where id<=7
union
select * from t_owners where id>=5
2. 交集
select * from t_owners where id<=7
intersect
select * from t_owners where id>=5
3. 差集
select * from t_owners where id<=7
minus
select * from t_owners where id>=5
运用minus 运算来实现分页,语句如下
select rownum,t.* from T_ACCOUNT t where rownum<=20
minus
select rownum,t.* from T_ACCOUNT t where rownum<=10