oracle学习总结

1.创建表:

create table IT_EMPLOYEES(
       EMPLOYEE_ID NUMERIC(6) NOT NULL UNIQUE,
       FIRST_NAME VARCHAR2(20),
       LAST_NAME VARCHAR2(25) NOT NULL,
       EMAIL VARCHAR2(25),
       PHONE_NUMBER VARCHAR2(10),
       JOB_ID VARCHAR2(10),
       SALARY NUMBER(8,2),
       MANAGER_ID NUMBER(6)
);

2.创建视图:

(1)

create view prog_employees_1
as 
select employee_id,first_name,last_name,email,
phone_number,salary,manager_id from it_employees
where job_id='IT_PROG';

(2)

create view prog_employees_1
as 
select employee_id,first_name,last_name,email,
phone_number,salary,manager_id from it_employees
where job_id='IT_PROG';
with check option;

(3)删除视图

drop view prog_employees;

3.创建索引

(1)Create 【unique】【cluster】INDEX<索引名> ON<表名>(<列名> <次序>)

例:

create index IT_LASTNAME ON IT_EMPLOYEES(LAST_NAME);

用户可以在查询频率最高的列上建立聚簇索引,由于聚簇索引是将索引和表记录放在一起存储,所以在一个基表上只能建立一个聚簇索引。在建立聚簇索引之后,由于更新索引列数据时会导致表中记录的物理顺序的变更,系统代价较高,因此对于经常更新的列不适宜建立聚簇索引。

(2)删除索引

Drop index <索引名>;

4.Alter

(1) 增加一列

alter table It_Employees add BIRTH_DATE DATE;

(2)修改字段

alter table It_Employees modify manager_id number(8);

(3)删除约束条件

alter table It_Employees drop unique(employee_id);

4.select / group by /having

注意:select子句后面只有两类表达式,统计函数和进行分组的列明。

Having 子句对分组的结果进一步筛选,having子句与分组有关,而where子句与单个行有关。

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

 

select deptno,avg(sal),sum(sal),max(sal),min(sal),count(sal),count(*) from emp group by deptno having avg(sal) > 2000;

5.内连接inner join /外连接(左left outer join/右外连接 right outer join/全外连接 full <outer> join )

区别:内连接进行多表查询时,返回的查询结果集中仅仅包含符合查询条件(where 条件和having条件)和连接条件的行。内连接消除了与另一个表中的任何行不匹配的行,而外连接扩展了内连接的结果集,除返回所有匹配的行外,还返回不匹配的行。

select empno,ename,dname from emp inner join dept on emp.deptno = dept.deptno where job='SALESMAN';

 

1 7499 ALLEN SALES

2 7654 MARTIN SALES

3 7844 TURNER SALES

4 7521 WARD SALES

5 5555 lipeng OPERATIONS

测试数据:deptno为null的

insert into 

emp values(6666,'lipeng','SALESMAN',6666,to_date('2013-04-02','yyyy/mm/dd'),5000.00,1000.00,null);

 

select empno,ename,dname from emp left outer join dept on emp.deptno = dept.deptno where job='SALESMAN'

 

1 5555 lipeng OPERATIONS

2 6666 lipeng

3 7499 ALLEN SALES

4 7521 WARD SALES

5 7654 MARTIN SALES

6 7844 TURNER SALES

 

从结果可以看出:做外连接不仅包含连接相匹配的行,而且还包含左表emp中所有满足where限制的行,而不论是否与右表相匹配。

5.union /union all/intersect/minus

union 将集合中的重复记录滤除,而union all包含两个子结果集重复的行。

select ename,SAL from emp where ename like 'S%' OR ename like 'J%'
 union all
  select ename,SAL from emp where ename like 'J%' OR ename like 'C%';

6.子查询in/exists/比较运算符

(1)select empno,ename,deptno 
from emp where deptno in (select deptno from dept where loc='CHICAGO');

执行顺序:先执行括号内的子查询,然后将查询到的deptno结果跟emp中的deptno进行比较,若列值存在于这些返回值中,则外层查询结果会在结果集中显示该行。

(2)select empno,ename from emp where exists (
       select * from dept where emp.deptno = dept.deptno and loc='CHICAGO'
);

(3)查询emp表,将将薪资大于本职位平均薪资的雇员信息显示出来。

select empno,ename,sal,job from emp 
       where job='SALESMAN' and sal >(
             select avg(sal) from emp where job='SALESMAN'
       );

7.数据操纵 INSERT/UPDATE/DELETE/TRUNCATE

 

update emp 
       set sal =  
       (select avg(sal) from emp where job='SALESMAN')
       where empno=6666;
       commit;

delete from emp where empno=5555;

DELETE/TRUNCATE区别:

如果确定要删除表中所有记录时,建议使用TRUNCATE,因为TRUNCATE删除数据时要比DELETE快的多。但是TRUNCATE删除数据后,不能用rollback来恢复数据,但是delete可以用。

Reuse storage/drop storage 

Truncate table emp reuse storage;

Reuse storage表示删除记录后保存记录占用的空间。

drop storage 表示删除记录后立刻回收记录占用的空间。

8.授权grant/回收revoke

 

grant  select on emp to sup2db;

revoke select on  emp from sup2db;

9.字符类函数

select ASCII('A') big_A,ASCII('a') small_a from dual;

select CHR(65),CHR(97) from dual;

select concat('oracle','11g') oraclename from dual;

select initcap('hello world') name from dual;

select replace('feelblue','blue','yellow') from dual;

日期函数:

select add_months(hiredate,1) from emp;

 

第七章 oracle数据库管理操作

一.增加安全性

解决的问题:例如,销售经理需要访问数据库中有关该部门员工的信息。但是该经理没有理由访问有关其它部门员工的信息。

(1)以系统管理员的身份进行登录:

conn sys/change_in_stall as sysdba;

(2)激活人力资源示例数据库账户,连接到HR示例数据库

Alter user hr identified by hr account unlock;

Conn hr/hr;

查看hr用户下面的所有表:

(1)连接到hr用户

(2)Select table_name from user_tables;

或者使用 Select * from tab;

 

(3)为销售经理创建用户ID,用户名salesmanger,密码sales,并将connect权限授予销售经理。

(4) Conn sys/change_in_stall;

 grant connect to salesmanger identified by sales;

(4)定义一个查看员工编号和姓名的视图,将数据库中员工等信息隐藏起来。

 create view emp_sales

 as

 select employee_id,first_name,last_name from hr.employees;

}

(5)授予salesmanger查看emp_sales视图的权限

grant select on emp_sales to salesmanger;

(6)让销售经理以用户salesmanger登录数据库后,销售经理可以查看员工的编号和姓名,但是不允许查看员工的工资信息,这样在一定程度保证了数据的安全性。 

conn salesmanger/sales

select * from sys.emp_sales;

select * from sys.emp_sales;

二.隐藏数据的复杂性 

现有一机场数据库,拥有pilotSkills表和hanger表,

其中表pilotSkills描述了飞行员和他们能够驾驶的飞机信息,表hanger描述了停在飞机棚中的飞机信息。

现在要求查询能够驾驶飞机棚中每一架飞机的飞行员的姓名。

--创建pilotSkills表

create table pilotSkills(
     pilot char(15) not null,
     plane char(15) not null,
     primary key(pilot,plane)
);
create table hanger(
     plane char(15) primary key
);

创建视图,实现“找出能够驾驶飞机棚中每一架飞机的飞行员的姓名”

Create view QualifiedPilots(pilot)
As
Select ps.pilot from pilotSkills ps,hanger h 
Where ps.plane = h.plane
Group by ps.pilot
Having count(ps.plane) = (select count(plane) from hanger);

 

select pilot from QualifiedPilots;

三、实现记录的唯一性

--增加主键

Alter table stu add constrait c1 primary key(sno);

--删除主键约束

Alter table stu drop constrait c1;

--创建一个名为ind1的唯一索引

Create unique index ind1 on emp(empno);

当插入一条重复数据的时候会报错。

四.实现数据的完整性

Alter table student modify sname not null;

第八章 数据库用户管理

1.创建一个用户使其具有登陆,连接的系统权限

 create user stu identified by stu;

  grant create session to stu;

2.用户HR将Employees表的查询、查询、更改表的对象的权限授予stu,那么stu具有了对HR的employees表的select对象权限,但不具备其它对象权限。

conn hr/hr;

grant select,insert,update on employees to stu;

select first_name,last_name,job_id,salary from hr.employees where salary>15000;

3.授权角色

数据字典dba_roles可以了解数据库中全部的角色信息。

 select * from dba_roles;

角色connect、resource和DBA主要用于数据库管理。对于数据库管理员分别授予Connnect、resources和DBA角色。

创建角色:

 create role access_database;

Create role access_database identified by 123;

(2) 授权

grant create session,create table,create view to access_database;

(3)可将角色授予用户,使用户获得该角色所拥有的所有权限。

grant access_database to scott;

4.修改用户的默认角色

(1)设置用户的角色失效

Alter user scott default role none;

用户角色失效后,该用户中的权限将全部丢失。用户连接数据库权限create session存储于ACCESS_DATEBASE中,当该角色失效后,用户scott就不能登录到数据库中。

(2)设置用户角色生效

Alter user scott default role all;

(3)查看session_roles视图,确认会话所用的角色

connect stu/stu;

select * from session_roles;

结果:

ROLE

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

CONNECT

RESOURCE

 

(4)为当前用户启用ACCESS_DATABASE角色。

Set role access_database;

5.回收权限

*逐一回收

Connect sys/change_in_stall as sysdba;

(1)系统权限的回收

收回scott用户的select any dictionary系统权限。

Revoke select any dictionary from scott;

(2)对象权限的回收

Hr用户回收scott对employees表的select对象权限。

Connect hr/hr

Revoke select on employees from scott;

用户HR将基表Employees的所有权限从public用户回收。

Revoke all on employees from public;

6.删除角色

Drop role access_database;

删除用户:

Drop user stu;

7.使用数据库连接

是为了访问远程数据库而创建的数据库通信链路。

链接到指定的用户:

CREATE DATABASE LINK link_name CONNECT TO USER IDENTIFIED BY password USING server_name;

link_name:表示要链接到远程数据库名。

Server_name:表示远程数据库的服务名。

数据库空间管理

1.设置其它表空间初值

例如学生信息库,要把有关学生信息的一些表放到一个表空间中,如果有2000多名学生,则存储学生个人信息最多也不超过100MB的空间,但是为了保险,我们可以设置两个数据文件,每个数据文件的大小均设置为100MB

 

create Tablespace student_info

 datafile 'C:oracleproduct10.2.0oradataorclstudent01.dbf'size 100M,       'C:oracleproduct10.2.0oradataorclstudent02.dbf'size 100M
         default storage(
                 initial 10M
                 next 10M
                 minextents 1
                 maxextents 10
                 pctincrease 20
         )      
           online;

说明:

Storage 指定表空间的存储参数,这些参数对于数据库的性能影响很大,选着时要慎重。

initial 10M:--表空间student_information初始空间大小为10MB

next 10M: -- 当初始区间填满后,分配第二个区间的大小为10MB

pctincrease 20:--当在填满时,按照20%的增长速率分配区间大小。

minextents 1:-- 初始为该表空间分配1个区间

maxextents 10:  --最多为该表空间分配10个区间

2.空间充足的管理

查看表空间使用情况,使用以下方法避免空间的不足:

(1)使用数据字典动态监视

这里使用的数据字典是dba_free_space和user_free_space,可以查看其内容来得到有关表空间的空间信息。

以system的身份登录:

select * from dba_free_space;

(2)向表空间增加数据文件

alter tablespace student_info
 add datafile 

'C:oracleproduct10.2.0oradataorclstudent03.dbf' 

size 2M;

注意:通过上述方法给表空间分配太多的空间并不好,因为这样做无疑造成较大空间的浪费。因此建议做好空间估计,并合理利用空间,无论是对减少资源浪费还是提高系统性能都有好处。

3.解决空间不足的方法

扩充数据库存储空间常用的方法有如下三种:

(1)增加SYSTEM表空间中数据文件的大小

(2)创建新的表空间

(3)创建新的数据文件

 

(1)增加SYSTEM表空间中数据文件的大小

数据库中的数据其实都是存储在数据文件中的,SYSTEM表空间的数据文件是在创建数据库的时候给定的,并且给其大小给定了一个初值。那么System表空间不够时就可以Alter DataBase命令动态的增加SYSTEM表空间数据文件的大小。

 

查11g

Alter DATABASE orcl
Datafile 'C:oracleproduct10.2.0oradataorclsystem01.dbf' 
resize 750M;

(2)创建新的表空间 

表空间其实是一个逻辑概念,它所有数据和结构信息都存储在一个或者多个数据文件当中,当需要扩充数据库存储空间时,可以创建新的表空间并指定它的数据文件,系统就会划出一块磁盘空间给这个表空间.

注意:创建数据库时最好能创建几个私用的表空间,因为SYSTEM表空间是系统表空间,其中存储数据字典和数据库结构等重要信息,他是数据库运行的基础,若是把所有信息都存放在这个表空间里,一方面会迅速占满它的空间,另一方面也加大了出错的可能性。

1. Create tablespace 命令简介

Create tablespace 表空间名

Datafile{

文件名[autoextend {off | on next数值 maxsize数值}],

}

Mininum extend 数值

Logging | nologging

Default storage{...}

Online | offline

Permanent | temporary;

 

2.用create tablespace创建表空间

create tablespace test
datafile 'C:oracleproduct10.2.0oradataorcl est01.dbf' size 2M
default storage(initial 2M
        next 2M
        minextents 2
        maxextents 10
        pctincrease 20
)
online;

(3)动态的增加表空间

1.Alter tablespace 命令简介

向表空间中增加数据文件使用的命令:

Alter tablespace 表空间名

Loggin | nologging

Add datafile{数据库文件名 [autoextend],...}

Rename datafile 原文件名 to 新文件名

Coalesce

Default storage

Mininum extend 数值

Online | offline [normal | temporary | immediate | for recover]

[begin | end] backup

Read only | write

Permanent | temporary

说明:

Add datafile:用于增加数据文件,可在联机或者是脱机下增加,但所增加的数据文件不能是其它表空间或者数据库已经使用的,它同样可带autoextend参数选项。

Coalesce:用于所有相连的空间范围合并到相邻较大的范围当中去,这一项不能被其它命令所指定。

[begin | end] backup:用于开始或者结束联机备份表空间的数据文件,在备份过程中用户可以继续访问该表空间,但备份过程中不能将表空间脱机,也不能关闭数据库。

Read only | write:其中Read only表示此表空间的内容是只读的,不能像其中写入任何数据,而read write则可以对此表空间的数据进行读写操作。

向表空间test中增加两个大小为10MB的数据文件

Alter tablespace test

Add datafile 

'C:oracleproduct10.2.0oradataorcl est02.dbf size 10M' ;

 

原文地址:https://www.cnblogs.com/200911/p/3202165.html