百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 优雅编程 > 正文

程序员不得不看Oracle干货(oracle编程软件)

sinye56 2024-09-19 02:19 6 浏览 0 评论

接着上一篇Oracle入门篇

1数据库用户

1.1系统常见用户

用户

说明

sys

超级用户,主要用来维护系统信息和管理实例,以SYSDBA或SYSOPER角色登录。密码为在安装时设置的管理口令,如一般设置为:orcl

system

默认的系统管理员,拥有DBA权限,通常用来管理Oracle数据库的用户、权限和存储,以Normal方式登录。密码为在安装时设置的管理口令,如一般设置为:orcl

scott

示范用户,使用users表空间。一般该用户默认密码为tiger

1.2用户管理

Oracle中有个模式(schema)的概念,它是用户的所有数据库对象的集合;一般在创建用户的同时会自动创建一个这样的模式,名称和用户名称一样。

1.2.1查询系统用户

select * from all_users;

select * from dba_users; --更详细的用户信息

1.2.2解锁用户

【语法】

ALTER USER 用户名 ACCOUNT UNLOCK;

【示例】解锁hr用户

alter user hr account unlock;

1.2.3创建用户

【语法】

CREATE USER 用户名 IDENTIFIED BY 密码

DEFAULT TABLESPACE 表空间;

【示例】

CREATE USER itcast IDENTIFIED BY itcast

DEFAULT TABLESPACE itcast_ts

TEMPORARY TABLESPACE temp;

1.2.4修改用户密码

【语法】

ALTER USER 用户名 identified by 密码

【示例】

ALTER USER itcast identified by it;

1.2.5删除用户

【语法】

DROP USER 用户名 CASCADE;

【示例】

DROP USER itcast CASCADE;

2DCL数据控制语言

2.1授予

【语法1】

GRANT 角色权限(角色)[,角色权限] TO 用户;

【示例1】

--授予CONNECT和RESOURCE两个角色

GRANT connect, resource TO itcast;

【备注】使用如下语句可以查看resource角色下的权限

SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE='RESOURCE'

【语法2】

GRANT 操作 ON 模式.对象 TO 用户;

【示例2】

--允许用户查看、更新 EMP 表中的记录

GRANT select,update ON SCOTT.emp TO itcast;

--查看当前用户的系统权限

select * from user_sys_privs;

--查看当前用户的对象权限

select * from user_tab_privs;

--查看当前用户的所有角色

select * from user_role_privs;

2.2撤销

【语法1】

REVOKE 角色权限(角色)[,角色权限] FROM 用户;

【示例1】

--撤销CONNECT和RESOURCE两个角色

REVOKE connect, resource FROM itcast;

【语法2】

REVOKE 操作 ON 模式.对象 FROM 用户;

【示例2】

--撤销用户查看、更新 EMP 表中的记录的操作

REVOKE select,update ON SCOTT.emp FROM itcast;

3DDL数据定义语言

3.1创建表

【语法】

CREATE TABLE <table_name>(

column1 DATATYPE [NOT NULL] [PRIMARY KEY],

column2 DATATYPE [NOT NULL],

...

[constraint <约束名> 约束类型 (要约束的字段)

... ] );

【说明】

DATATYPE --是Oracle的数据类型

NUT NULL --可不可以允许资料有空的(尚未有资料填入)

PRIMARY KEY --是本表的主键

constraint --是对表里的字段添加约束.(约束类型有

Check,Unique,Primary key,not null,Foreign key);

【示例】

create table t_student(

s_id number(8) PRIMARY KEY,

s_name varchar2(20) not null,

s_sex varchar2(8),

clsid number(8),

constraint u_1 unique(s_name),

constraint c_1 check (s_sex in ('MALE','FEMALE'))

);

--从现有的表创建表及复制其数据

【语法】

CREATE TABLE <table_name> as <SELECT 语句>

【示例】

create table emp as select * from scott.emp;

create table emp as select empno,ename from scott.emp --表结构只有empno和ename两个字段及该两字段对应的数据

--如果只复制表的结构不复制表的数据则:

create table emp as select * from scott.emp where 1=2;

3.2修改表

【语法1】向表中添加新字段

ALTER TABLE <table_name> ADD (字段1 类型 [NOT NULL],

字段2 类型 [NOT NULL] ... );

【示例1】

alter table t_student add (s_age number(3),s_address varchar2(20));

【语法2】修改表中字段

ALTER TABLE <table_name> MODIFY(字段1 类型,字段2 类型 ... );

【示例2】

alter table t_student modify(s_name varchar2(50),s_address varchar2(100));

【语法3】删除表中字段

ALTER TABLE <table_name> DROP(字段1,字段2... );

【示例3】

alter table t_student drop(s_age,s_address);

【语法4】修改表字段名称

ALTER TABLE <table_name> RENAME COLUMN 原字段名称 TO 新字段名称;

【示例4】

alter table t_student rename column s_id to s_no;

3.3删除表

【语法1】

--删除表结构及数据(删除后可在回收站查看并恢复)

DROP TABLE <table_name>;

--删除表结构及数据(删除后不可在回收站查看并恢复)

DROP TABLE <table_name> PURGE;

【示例1】

drop table t_student;

3.4回收站

3.4.1查看回收站

--查看回收站

show recyclebin; 或 select * from recyclebin;

3.4.2清空回收站

--清空回收站

purge recyclebin;

3.5oracle数据类型

数据类型

描述


VARCHAR2(size)

可变长度的字符串,其最大长度为size个字节;size的最大值是4000,而最小值是1;你必须指定一个VARCHAR2的size;


NVARCHAR2(size)

可变长度的字符串,依据所选的国家字符集,其最大长度为size个字符或字节;size的最大值取决于储存每个字符所需的字节数,其上限为4000;你必须指定一个NVARCHAR2的size;


NUMBER(p,s)

精度为p并且数值范围为s的数值;精度p的范围从1到38;数值范围s的范围是从-84到127;

例如:NUMBER(5,2) 表示整数部分最大3位,小数部分为2位;NUMBER(5,-2) 表示数的整数部分最大为7其中对整数的倒数2位为0,前面的取整。NUMBER 表示使用默认值,即等同于NUMBER(5);








LONG

可变长度的字符数据,其长度可达2G个字节;


DATE

有效日期范围从公元前4712年1月1日到公元后9999年12月31日


RAW(size)

长度为size字节的原始二进制数据,size的最大值为2000字节;你必须为RAW指定一个size;


LONG RAW

可变长度的原始二进制数据,其最长可达2G字节;


CHAR(size)

固定长度的字符数据,其长度为size个字节;size的最大值是2000字节,而最小值和默认值是1;


NCHAR(size)

也是固定长度。根据Unicode标准定义


CLOB

一个字符大型对象,可容纳单字节的字符;不支持宽度不等的字符集;最大为4G字节


NCLOB

一个字符大型对象,可容纳单字节的字符;不支持宽度不等的字符集;最大为4G字节;储存国家字符集


BLOB

一个二进制大型对象;最大4G字节


BFILE

包含一个大型二进制文件的定位器,其储存在数据库的外面;使得可以以字符流I/O访问存在数据库服务器上的外部LOB;最大大小为4G字节.


4DML数据操作语言

4.1新增

【语法1】

INSERT INTO table_name (column1,column2,...)

VALUES ( value1,value2, ...);

【示例1】

insert into emp (empno,ename) values(1111,'itcast');

【语法2】

INSERT INTO <table_name> <SELECT 语句>;

【示例2】

create table t1 as select * from emp where 1=2;

insert into t1 select * from emp where sal>2000;

4.2修改

【语法1】

UPDATE table_name SET column1=new value,column2=new value,...

WHERE <条件>;

【示例1】

update emp set sal=3000 where ename='itcast';

4.3查询

4.3.1伪表dual

DUAL是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录。以用它来做很多事情,如:

1.查看当前用户

select user from dual;

2.用来调用系统函数

--查询系统的当前时间并格式化

select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

3.得到序列的下一个值或当前值

--获得序列seq的下一个值

select seq.nextval from dual;

--获得序列seq的当前值

select seq.currval from dual;

4.可以用做计算器

select 2*8 from dual;

4.3.2伪列rowid

rowid是物理结构上的,在每条记录insert到数据库中时,都会有一个唯一的物理记录,同一条记录在不同查询中对应的rowid相同。

【用法】

SELECT ROWID,字段名... FROM 表名;

【示例】

select rowid, emp.* from emp;

4.3.3伪列rownum

rownum是根据sql查询出的结果给每行分配一个逻辑编号;每次的查询都会有不同的编号。编号从1开始。

【用法】

SELECT ROWNUM,字段名... FROM 表名;

【注意】

ROWNUM 不能使用大于号“>”

即 select rownum, emp.* from emp where rownum > 2 是不对的,没有任何结果

【示例】

select rownum, emp.* from emp;

/* 关于分页:由于不能使用>,所以为了达到分页目的得如下执行;如获取第2页数据(每页3条)*/

select * from (select rownum r,emp.* from emp where rownum < 7) where r > 3;

/* 关于排序:由于rownum是查询结果的行编号,排序后这个编号便有可能被打乱,如果需要该编号和排序的结果列表序号保持一致可以如下执行*/

select rownum,t.* from (select empno,ename from emp order by empno desc) t;

4.3.4连接查询

准备查询数据,将scott用户下的dept表复制到itcast用户下。

使用sys用户登录系统;替itcast用户创建dept表,表结构和数据来自scott.dept。

--执行语句如下

create table itcast.dept as select * from scott.dept;

1、 等值查询

--查询emp表中各用户对应的部门名称

select empno,ename,dname from emp,dept where emp.deptno=dept.deptno;

--练习:按部门统计员工的人数,要求显示部门号、部门名称、和部门人数

select d.deptno,d.dname,count(e.empno) from dept d,emp e

where d.deptno=e.deptno

group by d.deptno,d.dname;

2、左外/右外连接查询:左外连接是在等号左边的集合,无论条件是否成立均在结果集合,写法就是在等号右边使用(+),这个写法是oracle专用的,如果需要全数据库类型通用应该使用left join)

--按部门统计员工的人数,要求显示部门号、部门名称、和部门人数,部门下没有人的也将显示

select d.deptno,d.dname,count(e.empno) from dept d,emp e

where d.deptno=e.deptno(+) group by d.deptno,d.dname;

--上述语句的通用数据库写法(left join方式)

select d.deptno,d.dname,count(e.empno) from dept d left join emp e

on d.deptno=e.deptno group by d.deptno,d.dname;

3、自连接查询:查询的2张表是同一张表,一般是该表的字段之间存在上下级关系

--查询员工和老板的上下级关系

select e.ename || ' 的老板是: '|| b.ename from emp e,emp b

where e.mgr=b.empno;

【注意】上述查询语句中的||表示为字符的连接

4.3.5组合查询

1、 计算部门工资总和,最高工资,最低工资

select deptno,sum(sal),max(sal),min(sal) from emp group by deptno;

2、部门平均工资

--查询部门的平均工资

select deptno,avg(sal) from emp group by deptno;

--查询平均工资大于2000的部门,并按照平均工资降序排序

select deptno,avg(sal) 平均工资 from emp

group by deptno

having avg(sal)>2000

order by 平均工资 desc ;

--查询除了20部门以外,平均工资大于2000的部门

select deptno,avg(sal) from emp

where deptno <> 20

group by deptno

having avg(sal)>2000;

【注意】SQL语句中的各子句执行顺序:

from->where->group by->having->select->order by

3、 子查询:将子查询放入括号中;group by后不能使用子查询;select、from、where后面都可以使用子查询;可以将子查询看作一张新表

--select后面的子查询

select (select dname from dept where deptno=10),ename from emp where deptno=10;

--from后面的子查询

select * from (select ename,sal from emp);

--将子查询视为一个表

select e.ename,e.sal from (select ename,sal from emp) e;

--where后面的子查询;查询工资比10号部门员工中任意一个员工的工资低的员工信息

select * from emp where sal < (select min(sal) from emp where deptno=10);

4、其它查询

--查询姓名是5个字符的员工,且第二个字符是C,使用_只匹配一个字符并且不能标识0或多个字符

select * from emp where ename like '_C___';

--查询员工姓名中含有‘_’的员工,使用\转义字符

select * from emp where ename like '%\_%' escape '\';

4.4删除

--根据条件删除表数据

delete from emp where empno=0000

--清空表数据(表还在),不写日志,省资源,效率高,属于数据定义语言

--先创建要清空数据的表

create table myemp as select * from emp;

--清空表数据

truncate table myemp;

5TCL事务控制语言

5.1提交

事务的提交比较简单;直接在执行DML语句后进行提交即可,如果不提交事务则刚刚通过DML语句进行修改的内容还未保存到数据库中,只在当前用户的连接会话中有效。要永久变更数据需要显示地执行提交、回滚或者退出当前回话(如退出sqlplus)。

提交的命令为:commit;

5.2保存点与回滚

保存点savepoint一般与回滚rollback配合使用。在设置了savepoint后事务的粒度可以控制的更加细化,可以回滚到特定的保存点。

【语法】保存点savepoint

SAVEPOINT <savepoint_name>;

【示例】

--创建一个保存点,名称为a

savepoint a;

【注意】当创建保存点之后执行的DML操作,可以进行回滚,而保存点之前未提交的DML操作不受影响。

【语法】回滚

ROLLBACK [TO savepoint];

【示例】

--回滚到保存点a,即在保存点a之后的所有未提交的DML都无效。

rollback to a;

/*保存点与回滚完整示例*/

--1、创建保存点a

savepoint a;

--2、插入emp数据 it1

insert into emp(empno,ename) values(1234,'it1');

--3、创建保存点b

savepoint b;

--4、插入emp数据 it2

insert into emp(empno,ename) values(1235,'it2');

--5、查看emp表数据,存在it1、it2两条数据

select ename from emp;

--6、回滚到保存点b,即it2数据将消失

rollback to b;

--7、查看emp表数据,存在it1的数据,it2已不在

select ename from emp;

--8、提交数据

commit;

--9、查看emp表数据,存在it1的数据

select ename from emp;

--10、回滚到保存点a,将报错保存点不存在的错误信息

rollback to a;

6运算符

6.1算术运算符

+、-、*、/

6.2比较(关系)运算符

=、!=、<>、< 、 > 、 <= 、 >= 、 between...and... 、in 、like

、is null

6.3逻辑运算符

AND(逻辑与),表示两个条件必须同时满足

OR(逻辑或),表示两个条件中有一个条件满足即可

NOT(逻辑非),返回与某条件相反的结果

6.4连接运算符

||

【示例】

select '工号为:' || empno || ' 的员工的姓名为:'|| ename from emp;

6.5集合运算符

union(并集无重复)

union all(并集有重复)

intersect(交集,共有部分)

minus(减集,第一个查询具有,第二个查询不具有的数据)

【注意】:列数相关,对应列的数据类型兼容,不能含有Long类型的列,第一个select语句的列或别名作为结果标题

--union(并集将去重复)

select * from emp where deptno=10

union

select * from emp where deptno=20;

--intersect(交集) 查询工资即属于1000~2000区间和1500~2500区间的工资

select ename,sal from emp where sal between 1000 and 2000

intersect

select ename,sal from emp where sal between 1500 and 2500;

--minus(减集)

select ename,sal from emp where sal between 1000 and 2000

minus

select ename,sal from emp where sal between 1500 and 2500;

6.6运算符优先级

优先级

运算符

1

算术运算符

2

连接符

3

比较符

4

IS[NOT]NULL, LIKE, [NOT]IN

5

[NOT] BETWEEN

6

NOT

7

AND

8

OR

可以使用括号改变优先级顺序;OR的优先级最低,算术运算符的优先级最高。

7常用函数

7.1数值型函数

round(x[,y])

【功能】返回四舍五入后的值

【参数】x,y,数字型表达式,如果y不为整数则截取y整数部分,如果y>0则四舍五入为y位小数,如果y小于0则四舍五入到小数点向左第y位。

【返回】数字

【示例】

select round(5555.6666,2.1),round(5555.6666,-2.6),round(5555.6666) from dual;

返回: 5555.67 , 5600 , 5556

trunc(x[,y])

【功能】返回x按精度y截取后的值

【参数】x,y,数字型表达式,如果y不为整数则截取y整数部分,如果y>0则截取到y位小数,如果y小于0则截取到小数点向左第y位,小数前其它数据用0表示。

【返回】数字

【示例】

select trunc(5555.66666,2.1),

trunc(5555.66666,-2.6),trunc(5555.033333)from dual;

返回:5555.66 5500 5555

7.2字符型函数

LENGTH(c1)

【功能】返回字符串的长度;

【说明】多字节符(汉字、全角符等),按1个字符计算

【参数】C1 字符串

【返回】数值型

【示例】

select length('半城雨落'),length('itcast半城雨落') from dual;

LENGTH('半城雨落') LENGTH('ITCAST半城雨落')

------------------ ------------------------

4 10

LPAD(c1,n[,c2])、RPAD(c1,n[,c2])

【功能】在字符串c1的左(右)边用字符串c2填充,直到长度为n时为止

【说明】如果c1长度大于n,则返回c1左边n个字符

【参数】C1 字符串

n 追加后字符总长度

c2 追加字符串,默认为空格

【返回】字符型

【示例】

select lpad('itcast',10,'*'),rpad('itcast',10,'*') from dual;

REPLACE(c1,c2[,c3])

【功能】将字符表达式值中,部分相同字符串,替换成新的字符串

【参数】

c1 希望被替换的字符或变量

c2 被替换的字符串

c3 要替换的字符串,默认为空(即删除之意,不是空格)

【返回】字符型

【示例】

select replace('he love you','he','i') from dual;

SUBSTR(c1,n1[,n2])

【功能】取子字符串

【说明】多字节符(汉字、全角符等),按1个字符计算

【参数】在字符表达式c1里,从n1开始取n2个字符;若不指定n2,则从第n1个字符直到结束的字串.

【返回】字符型

【示例】

select substr('123456789',4,4),substr('123456789',3) from dual;

7.3日期函数

sysdate

【功能】:返回当前日期。

【参数】:没有参数,没有括号

【返回】:日期

【示例】select sysdate from dual;

add_months(d1,n1)

【功能】:返回在日期d1基础上再加n1个月后新的日期。

【参数】:d1,日期型,n1数字型

【返回】:日期

【示例】select sysdate,add_months(sysdate,3) from dual;

months_between(d1,d2)

【功能】:返回日期d1到日期d2之间的月数。

【参数】:d1,d2 日期型

【返回】:数字

如果d1>d2,则返回正数

如果d1<d2,则返回负数

【示例】

select sysdate,

months_between(sysdate,to_date('2015-01-01','YYYY-MM-DD')) 距2015元旦,

months_between(sysdate,to_date('2016-01-01','YYYY-MM-DD')) 距2016元旦 from dual;

extract(c1 from d1)

【功能】:日期/时间d1中,参数(c1)的值

【参数】:d1日期型(date)/日期时间型(timestamp),c1为字符型(参数)

【参数表】:c1对应的参数表详见示例

【返回】:字符

【示例】

select

extract(YEAR from timestamp '2015-5-1 12:26:18 ' ) 年,

extract(MONTH from timestamp '2015-5-1 12:26:18 ' ) 月,

extract(DAY from timestamp '2015-1-5 12:26:18 ' ) 日,

extract(hour from timestamp '2015-5-1 12:26:18 ' ) 小时,

extract(minute from timestamp '2015-5-1 12:26:18' ) 分钟,

extract(second from timestamp '2015-5-1 12:26:18 ' ) 秒

from dual;

select extract (YEAR from date '2015-5-1' ) from dual;

select sysdate 当前日期,

extract(YEAR from sysdate ) 年,

extract(MONTH from sysdate ) 月,

extract(DAY from sysdate ) 日

from dual;

--如下语句也可获取年份、月份等

select to_number(to_char(sysdate,'yyyy')) from dual;

7.4转换函数

TO_CHAR(x[[,c2],C3])

【功能】将日期或数据转换为char数据类型

【参数】

x是一个date或number数据类型。

c2为格式参数

c3为NLS设置参数

【返回】varchar2字符型

【示例】

select to_char(sysdate,'YYYY-MM-DD HH24:MI:SS') FROM dual;

select to_char(1210.7, '$9,999.00') FROM dual;

TO_DATE(X[,c2[,c3]])

【功能】将字符串X转化为日期型

【参数】c2,c3,字符型,参照to_char()

【返回】字符串

如果x格式为日期型(date)格式时,则相同表达:date x

如果x格式为日期时间型(timestamp)格式时,则相同表达:timestamp x

【示例】

select to_date('201212','yyyymm'),

to_date('2012.12.20','yyyy.mm.dd'),

(date '2012-12-20') XXdate,

to_date('2012-12-20 12:31:30','yyyy-mm-dd hh24:mi:ss'),

to_timestamp('2012-12-20 12:31:30','yyyy-mm-dd hh24:mi:ss'),

(timestamp '2012-12-20 12:31:30') XXtimestamp

from dual;

TO_NUMBER(X[[,c2],c3])

【功能】将字符串X转化为数字型

【参数】c2,c3,字符型

【返回】数字串

【示例】

select TO_NUMBER('201212') + 3,TO_NUMBER('450.05') + 1 from dual;

--等同上述结果

select '201212' + 3 from dual;

7.5聚合函数

sum:求和

avg:求平均数

count:计数

max:求最大值

min:求最小值

7.6分析函数

分析函数中了解rank()/dense_rank()/row_number()的使用:

--查询部门的员工工种情况,并在部门内重新进行排序;PARTITION BY类似group by,根据ORDER BY排序字段的值重新由1开始排序。

--RANK 使用相同排序排名一样,后继数据空出排名;即有2个排序为1的,那么接下来的排序号则为3

select deptno,ename,job,rank() over(partition by deptno order by job) as myRank from emp e;

--DENSE_RANK使用,使用相同排序排名一样,后继数据不空出排名;即有2个排序为1的,那么接下来的排序号则为2

select deptno,ename,job,dense_rank() over(partition by deptno order by job) as myDenseRank from emp e;

--ROW_NUMBER使用,不管排名是否一样,都按顺序排名;即有2个排序为1的,那么排序号不会重现重复

select deptno,ename,job,row_number() over(partition by deptno order by job) as myRowNumber from emp e;

7.7其它函数

NVL()/NVL2()

【语法】NVL (expr1, expr2)

【功能】若expr1为NULL,返回expr2;expr1不为NULL,返回expr1。注意两者的类型要一致

【示例】将员工的奖金如果是空的话则设置为0

select ename,sal,comm,nvl(comm,0) from emp;

【语法】NVL2 (expr1, expr2, expr3)

【功能】expr1不为NULL,返回expr2;expr2为NULL,返回expr3。

expr2和expr3类型不同的话,expr3会转换为expr2的类型

【示例】

select ename,job,nvl2(job,'job有值','job无值') from emp;

decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)

【功能】根据条件返回相应值

【参数】c1, c2, ...,cn,字符型/数值型/日期型,必须类型相同或null

注:值1……n 不能为条件表达式,这种情况只能用case when then end解决

含义解释:  

  decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)  

  该函数的含义如下:  

  IF 条件=值1 THEN

  RETURN(翻译值1)

  ELSIF 条件=值2 THEN

  RETURN(翻译值2)

  ......

  ELSIF 条件=值n THEN

  RETURN(翻译值n)  

  ELSE

  RETURN(缺省值)

  END IF

【示例】根据员工的部门号,条件判断找到对应的部门名称

select ename,deptno,decode(deptno,10,'ACCOUNTING',20,'RESEARCH',30,'SALES','无部门') from emp;

8视图

8.1视图简介

视图是由一个或者多个表组成的虚拟表;那些用于产生视图的表叫做该视图的基表。视图不占用物理空间,这个也是相对概念,因为视图本身的定义语句还是要存储在数据字典里的。视图只有逻辑定义。每次使用的时候只是重新执行SQL。一个视图也可以从另一个视图中产生。视图没有存储真正的数据,真正的数据还是存储在基表中。一般出于对基本的安全性和常用的查询语句会建立视图;并一般情况下不对视图进行新增、更新操作。

【语法】

--创建视图

CREATE [OR REPLACE] VIEW <view_name>

AS

<SELECT 语句>;

--删除视图

DROP VIEW <view_name> ;

8.2视图操作

-- 授予itcast用户 创建视图 的权限

grant create view to itcast;

-- 登录itcast,创建视图

create or replace view v_emp

as

select empno,ename from emp;

--通过视图查询数据

select * from v_emp;

--通过视图添加数据,需要保证基表的其它数据项可以为空

insert into v_emp(empno,ename) values(3333,'itcast3');

--通过视图修改数据

update v_emp set ename='半城雨落3' where empno=3333;

--通过视图删除数据

delete from v_emp where empno=3333;

--基于多个基表的视图,不建议使用视图进行增删改操作

create or replace view v_dept_emp

as

select dept.deptno,dept.dname,ename from emp inner join dept on emp.deptno=dept.deptno;

--查询多个基表的视图

select * from v_dept_emp;

--创建基于视图的视图

create or replace view vv_emp

as

select ename from v_emp;

--查询基于视图的视图

select * from vv_emp;

--删除视图

drop view v_emp;

drop view v_dept_emp;

drop view vv_emp;

9同义词

同义词是数据库模式对象的一个别名,经常用于简化对象访问和提高对象访问的安全性。在使用同义词时,Oracle数据库将它翻译成对应模式对象的名字。与视图类似,同义词并不占用实际存储空间,只有在数据字典中保存了同义词的定义。在Oracle数据库中的大部分数据库对象,如表、视图、同义词、序列、存储过程等,数据库管理员都可以根据实际情况为他们定义同义词。隐藏对象名称和所有者。

9.1私有同义词

私有Oracle同义词由创建它的用户所有;创建的用户需要具有CREATE SYNONYM权限。

【语法】

CREATE SYNONYM <synonym_name> for <tablename/viewname...>

【示例】

--管理员 授权用户itcast创建同义词的权限

grant create synonym to itcast;

--创建私有同义词

create synonym syn_emp for emp;

create synonym syn_v_emp for v_emp;--为视图v_emp创建私有同义词(别名)

--使用私有同义词

select empno,ename from syn_emp;

update syn_emp set ename='itcast5' where empno='1234';

--删除同义词

drop synonym syn_emp;

9.2公有同义词

公有Oracle同义词由一个特殊的用户组Public所拥有。顾名思义,数据库中所有的用户都可以使用公有同义词。公有同义词往往用来标示一些比较普通的数据库对象,这些对象常需要引用。公有同义词一般由管理员用户创建及删除,普通用户需要创建及删除需要create public synonym和drop public synonym权限。

【语法】

CREATE PUBLIC SYNONYM <synonym_name> for <tablename/viewname...>

--登陆sys管理员用户,授权用户itcast创建、删除(公有的删除权限需要特别给定)公有同义词权限

grant create public synonym,drop public synonym to itcast;

--revoke create public synonym,drop public synonym from itcast;

--登陆itcast用户创建公有同义词 conn itcast/itcast;

create public synonym syn_public_emp for emp;

--使用公有同义词

select * from syn_public_emp;

-- 登录system管理员 conn system/orcl; 创建itcast2并授权

--create user itcast2 identified by itcast2 default tablespace itcast_ts;

--grant connect,resource to itcast2;

--为其它用户itcast2授权使用公有同义词(需要给予使用表的权限)

grant select,update on itcast.emp to itcast2;

--revoke select,update on itcast.emp from itcast2;

--登陆itcast2用户下使用公有同义词syn_public_emp

select * from syn_public_emp;

update syn_public_emp set ename='半城雨落5' where empno=5555;

--删除同义词

--登陆itcast,删除公有同义词

drop public synonym syn_public_emp;

10索引

索引是建立在数据库表中的某些列的上面,是与表关联的,可提供快速访问数据方式,但会影响增删改的效率;常用类型(按逻辑分类):单列索引和组合索引、唯一索引和非唯一索引。

什么时候要创建索引

(1)在经常需要搜索、主键、连接的列上

(2)表很大,记录内容分布范围很广

(3)在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的

(4)在经常使用在WHERE子句中的列上面创建索引

什么时候不要创建索引

(1)表经常进行 INSERT/UPDATE/DELETE 操作

(2)表很小(记录超少)

(3)列名不经常作为连接条件或出现在 WHERE 子句中

(4)对于那些定义为text, image和bit数据类型的列不应该增加索引

10.1创建索引

【语法】

CREATE [UNIQUE] INDEX <index_name> ON <table_name>(字段 [ASC|DESC]);

【说明】

UNIQUE --确保所有的索引列中的值都是可以区分的。

[ASC|DESC] --在列上按指定排序创建索引。

(创建索引的准则:

1.如果表里有几百行记录则可以对其创建索引(表里的记录行数越多索引的效果就越明显)。

2.不要试图对表创建两个或三个以上的索引。

3.为频繁使用的行创建索引。)

【示例】

--创建单列唯一索引,表中的列值将不允许重复

create unique index index_emp_empno on emp(empno);

--创建单列非唯一索引

create index index_emp_ename on emp(ename);

--创建组合列、唯一索引

create unique index index_emp_ename_job on emp(ename,job);

--创建组合列、非唯一索引

create index index_emp_job_sal on emp(job,sal);

10.2删除索引

【语法】

DROP INDEX <index_name>;

【示例】

--删除索引

drop index index_emp_empno;

drop index index_emp_ename;

drop index index_emp_ename_job;

drop index index_emp_job_sal;

11序列

序列是oracle提供的一个产生唯一数值型值的机制。通常用于表的主健值,序列只能保证唯一,不能保证连续。

11.1创建序列

【语法】

CREATE SEQUENCE <sequencen_name>

[INCREMENT BY n]

[START WITH n]

[MAXVALUE n][MINVALUE n]

[CYCLE|NOCYCLE]

[CACHE n|NOCACHE];

INCREMENT BY n --表示序列每次增长的幅度;默认值为1.

START WITH n --表示序列开始时的序列号。默认值为1.

MAXVALUE n --表示序列可以生成的最大值(升序).

MINVALUE n --表示序列可以生成的最小值(降序).

CYCLE --表示序列到达最大值后,在重新开始生成序列.默认值为 NOCYCLE。

CACHE n--允许更快的生成序列.预先生成n个序列值到内存(如果没有使用完,那下次序列的值从内存最大值之后开始;所以n不应该设置太大)

【示例】

--创建递增序列

create sequence seq_test

increment by 1

start with 1

maxvalue 1000

nocycle;

--创建递减序列

create sequence seq_test2

increment by -1

start with 5

maxvalue 5

minvalue 1

nocycle;

11.2序列使用

1、NEXTVAL 返回序列下一个值;第一次访问时,返回序列的初始值,后继每次调用时,按步长增加的值返回

【语法】

select <sequence_name>.nextval from dual;

【示例】

select seq_test.nextval from dual;

2、CURRVAL 返回序列的当前值.注意在刚建立序列后,序列的CURRVAL值为NULL,所以不能直接使用。使用过NEXTVAL访问序列后才能使用

【语法】查看序列的当前值

select <sequence_name>.currval from dual;

【示例】

select seq_test.nextval from dual;

select seq_test.currval from dual;

运用序列

-- 创建序列

create sequence seq_emp_empno

start with 1000

increment by 1

maxvalue 9000

minvalue 1000

nocycle;

-- 使用序列作为主键插入emp表的empno列

insert into emp(empno,ename)

values(seq_emp_empno.nextval,'itcast1');

insert into emp(empno,ename)

values(seq_emp_empno.nextval,'itcast2');

-- 查看emp表数据

select empno,ename from emp;

-- 查看当前序列的值

select seq_emp_empno.currval from dual;

--修改序列

alter sequence seq_emp_empno

maxvalue 9999

cycle;

11.3删除序列

【语法】

DROP SEQUENCE <sequence_name>

【示例】

drop sequence seq_test;

11.4序列与sys_guid

sys_guid和序列都可以作为主键值。

--使用SYS_GUID函数,32位,由时间戳和机器标识符生成,保证唯一

select sys_guid() from dual;

12分区表

12.1分区表用途

分区表通过对分区列的判断,把分区列不同的记录,放到不同的分区中。分区完全对应用透明。Oracle的分区表可以包括多个分区,每个分区都是一个独立的段(SEGMENT),可以存放到不同的表空间中。查询时可以通过查询表来访问各个分区中的数据,也可以通过在查询时直接指定分区的方法来进行查询。

分区表的优点:

(1)由于将数据分散到各个分区中,减少了数据损坏的可能性;

(2)可以对单独的分区进行备份和恢复;

(3)可以将分区映射到不同的物理磁盘上,来分散IO;

(4)提高可管理性、可用性和性能。

数据量大的表,一般大于2GB;数据有明显的界限划分;对于Long和Long Raw类型列不能使用分区。

12.2分区表类型

一般包括范围分区,散列分区,列表分区、复合分区(范围-散列分区,范围-列表分区)、间隔分区和系统分区等。

12.2.1范围分区

范围分区根据数据库表中某一字段的值的范围来划分分区。

【语法】

在Create Table语句后增加

PARTITION BY RANGE(column_name)

(

PARTITION part1 VALUES LESS THAN (range1) [TABLESPACE tbs1],

PARTITION part2 VALUES LESS THAN (range2) [TABLESPACE tbs2],

....

PARTITION partN VALUES LESS THAN (MAXVALUE) [TABLESPACE tbsN]

);

【说明】

MAXVALUE:当分区列值都不在设置的范围内时,新增数据将到这个分区中

【示例】

-- 创建表,并设置分区

create table myemp

( empno number(4) primary key,

ename varchar2(10),

hiredate date,

sal number(7,2),

deptno number(2)

)

partition by range(sal)

(

partition p1 values less than(1000),

partition p2 values less than(2000),

partition p3 values less than(maxvalue)

);

-- 插入数据

insert into myemp(empno,ename,hiredate,sal,deptno)

select empno,ename,hiredate,sal,deptno from emp;

-- 查看工资1000-2000的数据

select * from myemp partition(p2);

-- 删除工资小于1000的数据

delete from myemp partition(p1);

-- 查看数据

select * from myemp;

12.2.2列表分区

列表分区明确指定了根据某字段的某个具体值进行分区,而不是像范围分区那样根据字段的值范围来划分的。

【语法】

在Create Table语句后增加

PARTITION BY LIST(column_name)

(

PARTITION part1 VALUES (values_list1),

PARTITION part2 VALUES (values_list2),

....

PARTITION partN VALUES (DEFAULT)

);

其中:column_name是以其为基础创建列表分区的列。

part1...partN是分区的名称。

values_list是对应分区的分区键值的列表。

DEFAULT关键字允许存储前面的分区不能存储的记录。

【示例】

-- 创建表,并设置分区

create table myemp2

( empno number(4) primary key,

ename varchar2(10),

hiredate date,

sal number(7,2),

deptno number(2)

)

partition by list(deptno)

(

partition dept10 values(10),

partition dept20 values(20),

partition dept30 values(30),

partition deptx values(default)

);

-- 插入数据

insert into myemp2(empno,ename,hiredate,sal,deptno)

select empno,ename,hiredate,sal,deptno from emp;

-- 查看部门20的数据

select * from myemp2 partition(dept20);

-- 删除部门30的数据

delete from myemp2 partition(dept30);

-- 查看数据

select * from myemp2;

相关推荐

Linux在线安装JDK1.8

首先在服务器pingwww.baidu.com查看是否可以连网然后就可以在线下载一、下载安装JDK1.81、在下载安装的同时做好一些准备工作...

Linux安装JDK,超详细

1、了解RPMRPM是Red-HatPackageManager(RPM软件包管理器)的缩写,这一文件格式名称虽然打上了RedHat的标志,但是其原始设计理念是开放式的,现在包括OpenLinux...

Linux安装jdk1.8(超级详细)

前言最近刚购买了一台阿里云的服务器准备要搭建一个网站,正好将网站的一个完整搭建过程分享给大家!#一、下载jdk1.8首先我们需要去下载linux版本的jdk1.8安装包,我们有两种方式去下载安装...

Linux系统安装JDK教程

下载jdk-8u151-linux-x64.tar.gz下载地址:https://www.oracle.com/technetwork/java/javase/downloads/index.ht...

干货|JDK下载安装与环境变量配置图文教程「超详细」

1.JDK介绍1.1什么是JDK?SUN公司提供了一套Java开发环境,简称JDK(JavaDevelopmentKit),它是整个Java的核心,其中包括Java编译器、Java运行工具、Jav...

Linux下安装jdk1.8

一、安装环境操作系统:CentOSLinuxrelease7.6.1810(Core)JDK版本:1.8二、安装步骤1.下载安装包...

Linux上安装JDK

以CentOS为例。检查是否已安装过jdk。yumlist--installed|grepjdk或者...

Linux系统的一些常用目录以及介绍

根目录(/):“/”目录也称为根目录,位于Linux文件系统目录结构的顶层。在很多系统中,“/”目录是系统中的唯一分区。如果还有其他分区,必须挂载到“/”目录下某个位置。整个目录结构呈树形结构,因此也...

Linux系统目录结构

一、系统目录结构几乎所有的计算机操作系统都是使用目录结构组织文件。具体来说就是在一个目录中存放子目录和文件,而在子目录中又会进一步存放子目录和文件,以此类推形成一个树状的文件结构,由于其结构很像一棵树...

Linux文件查找

在Linux下通常find不很常用的,因为速度慢(find是直接查找硬盘),通常我们都是先使用whereis或者是locate来检查,如果真的找不到了,才以find来搜寻。为什么...

嵌入式linux基本操作之查找文件

对于很多初学者来说都习惯用windows操作系统,对于这个系统来说查找一个文件简直不在话下。而学习嵌入式开发行业之后,发现所用到的是嵌入式Linux操作系统,本想着跟windows类似,结果在操作的时...

linux系统查看软件安装目录的方法

linux系统下怎么查看软件安装的目录?方法1:whereis软件名以查询nginx为例子...

Linux下如何对目录中的文件进行统计

统计目录中的文件数量...

Linux常见文件目录管理命令

touch用于创建空白文件touch文件名称mkdir用于创建空白目录还可以通过参数-p创建递归的目录...

Linux常用查找文件方法总结

一、前言Linux系统提供了多种查找文件的命令,而且每种查找命令都具有其独特的优势,下面详细总结一下常用的几个Linux查找命令。二、which命令查找类型:二进制文件;...

取消回复欢迎 发表评论: