oracle数据库

一. 表空间,用户及授权

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

时间: 2024-10-12 15:13:51

oracle数据库的相关文章

win7 64位系统 PB连接oracle数据库出现“oracle library oci.dll could not be loaded”问题的解决方法

今天与大家分享一个自己的学习笔记,希望能给遇到同样问题的人带来帮助. 不知道大家在win7 64位系统下用 PB连接oracle数据库时,是否遇到过“oracle library oci.dll could not be loaded”问题. 今天,在win7 64位系统下用 PB连接oracle数据库时,一直出现上述错误,在百度上找了很久,都没有找到一个完整的解决方案,咨询了很多人,(他们都说是我的PB和oracle没装好,但我装的时候没出现任何问题,一切都很顺利,而且PB和oracle都能正

Oracle数据库——触发器的创建与应用

一.涉及内容 1.理解触发器的概念.作用和类型. 2.练习触发器的创建和使用. 二.具体操作 (实验) 1.利用触发器对在scott.emp表上执行的DML操作进行安全性检查,只有scott用户登录数据库后才能向该表中执行DML操作.(第1题中,user是系统函数,返回当前用户.字符串中使用两个单引号表示一个单引号.) 要求:分别以system用户和scott用户对emp 表执行DML操作,试验触发器的运行效果. (1)在scott用户下创建触发器 语句: create or replace t

使用PL/SQL连接oracle数据库,并将数据进行导出备份和导入恢复

这种操作百度一搜一大片,今天整理以前做的项目时自己备份了一下数据库,试着将数据进行导出备份和导入恢复了一下:下面是操作过程: 1 开启服务 2 配置监听 找到下面文件: 记事本打开 在导航器的下拉菜单中选择:将数据库添加到树, 然后点击确定 然后使用PL/SQL就可以登录了: 3 建立新表空间和新用户 使用system用户登录:执行如下sql语句建立表空间和新用户,以及给用户授权 建立表空间 Create tablespace myyyjc datafile 'D:\app\Administra

利用SHELL脚本来验证Oracle数据库RMAN备份集的有效性

利用SHELL脚本来验证Oracle数据库RMAN备份集的有效性 作者:赵全文  网名:guestart 我们生产环境的Oracle数据库都做了RMAN备份,是采用了一周的RMAN备份保留策略:除了使用RMAN备份以外,我们还使用了爱数(Eisoo)备份软件来进行备份,可以说是做到了有备无患.可是,如果有一天,Oracle数据库由于主机层面硬件原因或是数据库层面的原因不能对外提供高可用服务的时候,假设数据丢了一大部分,我们只有用RMAN备份来进行恢复,再如果发现,RMAN备份失效了,那就往地缝里

PL/SQLDeveloper导入导出Oracle数据库方法

前一篇博客介绍了Navicat工具备份Oracle的方法,这篇博客介绍一下使用PL/SQL Developer工具导入导出Oracle数据库的方法. PL/SQL Developer是Oracle数据库用于导入导出数据库的主要工具之一,本文主要介绍利用PL/SQL导入导出Oracle数据库的过程. 1.Oracle数据库导出步骤 1.1 Tools→Export User Objects...选项,导出.sql文件. 说明:此步骤导出的是建表语句(包括存储结构). 1.2 Tools→Expor

Linux环境下Oracle数据库启动停止命令

切换root至oracle数据库账号 su – oracle 查看数据库服务状态: ps -ef |grep oracle netstat –an|grep 1521 查看数据库监听状态: [[email protected] ~]$ lsnrctl status LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 25-NOV-2016 03:36:45 Copyright (c) 1991, 2009, Oracle. All righ

Oracle数据库中文乱码问题

最近碰到Oracle乱码问题,刚开始甚是头疼,以前在合肥出差的时候,这种问题也碰到过,当时直接抛给了“乌压压一片”(一个搞数据的同事儿),这次没办法躲过,只好硬着头皮上.虽然我这次碰到的是Oracle乱码问题中的一个,但是我决定将这个乱码问题整理清楚(不整清楚,就觉得身边有个定时炸弹,怕下次整数据库的时候会突然又爆炸). 解决这个问题的关键在于理解字符集的概念,所以在正文开始之前,有必要先提一下字符集的相关知识!(这部分知识,对于解决j2ee中文参数传递过程中出现的乱码,也非常具有参考意义) 一

Oracle数据库语句大全

转自:http://blog.sina.com.cn/s/blog_b5d14e2a0101c56z.html ORACLE支持五种类型的完整性约束 NOT NULL (非空)--防止NULL值进入指定的列,在单列基础上定义,默认情况下,ORACLE允许在任何列中有NULL值. CHECK (检查)--检查在约束中指定的条件是否得到了满足. UNIQUE (唯一)--保证在指定的列中没有重复值.在该表中每一个值或者每一组值都将是唯一的. PRIMARY KEY (主键)--用来唯一的标识出表的每

Oracle数据库恢复案例

当我们在使用Oracle数据库时,突然断电,造成很多问题,致使旧数据丢失,影响了数据的正确性,破坏了数据库.此时,用户急切需求恢复数据.本文以此为例,讲述数据库数据恢复. 一.案例描述: 数据库因突然断电,数据库启库报system01.dbf需要更多的恢复来保持一致性,数据库无法打开:数据库没有备份,归档日志也不连续.客户提供了数据库的在线文件,急需恢复zxfg用户下的数据.   二.恢复流程:  1 数据库的故障检测 2 尝试挂起数据库并修复数据库 3解析数据文件 4 验证数据 5导出数据与交

重启oracle数据库的一次操作命令和alter日志。

今天重启oracle数据库的命令和alter日志: [email protected]:~> sqlplus '/as sysdba' SQL*Plus: Release 11.2.0.3.0 Production on Wed Jan 27 18:49:13 2016 Copyright (c) 1982, 2011, Oracle. All rights reserved. Connected to:Oracle Database 11g Enterprise Edition Release