oracle笔记

 

一、Oracle前置知识:

1.    相关服务启动: 运行 > services.msc

I.     OracleServiceXE(ORCL):Oracle主(核心)服务,开启后才可通过本机访问数据库。

II.    OracleXE(oraDb11g_home1)TNSListener:Oracle监听服务,对外提供连接访问,开启后才可通过应用程序或其他客户端进行访问。

 

2.    解锁HR用户:开始>运行 >cmd >

sqlplus /nolog > conn sys as sysdba > alteruser hr identified by 密码 account unlock;

      登录:C: sqlplus hr/123456

登录:SQL> conn hr > 123456

查表:select table_name from user_tables;

 

3.    设置hr用户会话特权和操作权限:

<user test lacks create sessionprivilege logon denied>     缺少特权

I.     grantconnect to hr;

II.    grantresource to hr;

III.   grantcreate session to hr;

OracleDay1

一、现有的数据存储方式:

1.    Java程序存储数据(变量、对象、数组、集合),数据保存在内存中,属于瞬时状态存储。

2.    文件(File)存储数据,保存在硬盘上,属于持久状态存储。

I.     缺点:

a.    没有数据类型的区分。

b.    存储数据量级较小。

c.    没有访问安全限制。

d.    没有备份、恢复机制。

 

二、数据库管理系统DBMS(Database Management System):

1.    网状结构数据库:美国通用电气公司IDS(integrated Data Store),以节点形式存储和访问。

2.    层次结构数据库:IBM公司IMS(informationManagement System)定向有序的树状结构实现存储和访问。

3.    关系结构数据库:Oracle、DB2、MySQL、SQL Server,以表格(Table)存储,多表间建立关联关系,通过分类、合并、连接、选取等运算实现访问。

4.    非关系型数据库:MongDB、Redis,使用哈希表,表中以键值(key-value)的方式实现特定的键和一个指针指向的特定数据。

 

三、Oracle数据库:

1.    Oracle服务器:安装在操作系统中的关系数据库管理系统(RDBMS Relationship),并对外提供存储及访问的服务(增删改查)。

相关服务启动: 运行 > services.msc

I.     OracleServiceXE(ORCL):数据库服务(实例),Oracle主(核心)服务,开启后才可通过本机SQL*Plus访问数据库。

II.    OracleXE(oraDb11g_home1)TNSListener:Oracle监听服务,对外提供连接,开启后才可通过应用程序或其他客户端(PL/SQL)进行访问。

III.   OracleJobSchedulerXE(ORCL):Oracle作业调度(定时器)服务。

 

2.    Oracle客户端:对DBMS中数据的访问渠道。

I.     SQL*Plus:  DOS操作界面,运行-> cmd -> sqlplus 用户名/密码  |  sqlplus /nolog -> conn 用户名; -> 密码

II.    iSQL*Plus: Web操作界面,访问http://localhost:8080/apex

III.   PL/SQLDeveloper:Oracle数据库集成开发工具。

 

四、结构化查询语言SQL(Structured Query Language):用于操作数据和管理关系型数据库系统的程序设计语言。

 

五、数据查询:明确两点,从哪查、查什么?

1.    基本查询:

I.     语法:select 列名 from 表名

II.    案例:

1).   查询部分列:

//查询员工表中的所有员工的编号、名字、邮箱。

select employee_id , first_name , email

from employees;

 

2).   查询所有列:

select * from employees;

注:生产环境下,优先使用列明查询,*的方式需要转换成全列明,效率低,可读性差。

 

3).   对列中的数据进行计算:+ - * /

//查询员工表中所有员工的编号、名字、年薪。

select employee_id , first_name , salary * 12

from employees;

 

4).   列的别名:

select employee_id as"工号" , first_name as "名字" , salary * 12 as "年薪"

from employees;

别名中如果有空格必须加“ ”

 

5).   拼接字符串:

//查询所有员工的编号和“姓名”

select employee_id , first_name || '.' || last_name

from employees;

注:SQL中的字符串使用 ' (单引号)表示;双引号在列明中使用,常用于定义别名。

 

6).

//查询员工表中所有经理的ID。

select distinct manager_id

from employees;

 

2.    排序:对查询后的结果数据进行排列。

I.     语法:select 列名 from 表名 order by 排序列(默认升序  asc | 降序desc)

II.    案例:

1).   依据列排序

//查询员工表中编号、名字、薪资,按照薪资降序排序

select *

from employees

order by salary desc

 

2).   依据列排序

select *

from employees

order by salary desc , employee_id desc

3.    条件查询:筛选符合条件的查询结果

I.     语法:select ... from ... where 布尔表达式

II.    案例:

1).   等值判断:(=)

//查询薪资是11000的员工信息

select *

from employees

where salary = 11000

字符串常量,日期格式要用‘ ’圈上,区分大小写

‘King’       查日期都要用这种格式,不管表里格式是什么  '17-6月-1987'       (年用后两位数字也可查询)

 

2).   多条件判断:(and、or)

//查询薪资是11000的员工信息,并且提成为0.30

select *

from employees

where salary = 11000 and commission_pct = 0.30

 

3).   不等值判断:(>= <=  >  < !=  <>)

//查询员工的薪资在6000~10000之间的员工信息

select *

from employees

where salary >= 6000 and salary <= 10000

 

4).   区间判断:(between and)

//查询员工的薪资在6000~10000之间的员工信息

select *

from employees

where salary between 6000 and 10000

 

取非:/查询员工的薪资不在6000~10000之间的员工信息

select *

from employees

where salary not between 6000 and 10000

 

 5).   null值判断:(is null、is not null)

//查询没有提成的员工信息

select *

from employees

where commission_pct is not null

 

6).   枚举查询:(in(v1,v2,v3))     or 的效率比in

//查询部门编号为60、70、80、90的员工信息

select *

from employees

where department_id in(60,70,80,90)

 

//查询部门编号不为60、70、80、90的员工信息

select *

from employees

where department_id not in(60,70,80,90)

 

 

7).   模糊查询(%:任意长度的任意字符,_:长度为1的任意字符)like

//查询名字以"L"开头的员工信息

select *

from employees

where first_name like 'L%'

 

//查询名字以"L"开头,同时名字长度为4的员工信息

select *

from employees

where first_name like 'L___'

 

4.    时间查询:

I.     语法:select 系统时间 from 表名[虚表]

II.    详解:

sysdate:当前系统时间(年、月、日、时、分、秒、星期)

systimestamp:当前系统时间(年、月、日、时、分、秒、毫秒)

 

III.   案例:

select sysdate from dual;

select systimestamp from dual;

 

5.    单行函数:

I.     语法:select 单行函数(列名) from 表名

 

//显示当前系统时间

select sysdate from dual;

select systimestamp from dual;

 

II.    详解:

1).   to_char(日期 , "日期格式")

2).   to_date(字符串,"日期格式")

 

 

III.   案例:

       to_cahr

//日期转字符串,

根据格式把日期转化为字符串。同时可以根据需求获取日期中的不同部分

 

//显示系统当前时间

年月日

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

精确时间

select to_char(systimestamp,'yyyy/mm/dd hh:mi:ss:ff') from dual;

 

//显示员工入职年份

select first_name,to_char(hire_date,'yyyy') from employees

//查询六月份入职的所有员工

select * from employees where to_char(hire_date,'mm')='06'

                     查询本月(系统时间显示的本月)入职的员工

select * from employees whereto_char(hire_date,'mm')=to_char(sysdate,'mm')

//查询2008.08.08是星期几?

select to_char( to_date('2008/8/8' , 'yyyy-mm-dd'),'day') from dual;

 

to_date

//字符串转日期

select to_date('2000-1-1','yyyy-mm-dd') from dual;

 

 

补充:mod() 模、取余

select mod(salary , 10000) from employees;

 

6.    聚合函数(组函数):作用于一组已分好组的数据上。对多条数据的单列进行统计,返回统计后的一行结果。

I.     语法:select 聚合函数(列名) from 表名

II.    详解:

sum() 求和

avg() 求平均

max() 求最大值

min() 求最小值

count() 求总行数

 

III.       案例:

1).      单列总和

//每个部门最低工资

select department_id,min(salary)from employees group by department_id

 

//统计所有员工每个月工资的总和
    select sum(salary)

from employees

 

2).   单列平均值

//统计所有员工每个月工资的平均值

select avg(salary)

from employees

 

3).   单列最大值、最小值

select max(salary)

from employees

 

select min(salary)

from employees

 

4).   单列总行数

select count(*)

from employees

 

count(字段):对该字段的所有非null值进行计数。

//有id的员工条数

 

select count(employee_id)

from employees

 

//department_id =30这一组的的员工数

select count(*),department_id  from employees where department_id = 30

group by department_id

注:聚合函数自动忽略null值。

 

//查询所有员工编号、名字、薪资、提成、月工资(工资+提成(工资*提成比例))

select employee_id , first_name , salary ,commission_pct , salary + (salary *  nvl(commission_pct,0) ) as "月工资"

from employees

补充:注:nvl(值1 , 值2) // 对值1进行 !=null的判断,如果为真,则使用值1本身的值;如果为假,则使用值2

 

7.    分组查询:

注:在分组查询中只能写,出现在select关键字后的内容(包含1.分组依据,2.聚合函数[对每个分组进行一次统计]),不能出现其他列。

 

I.     语法:select ... from ... where ... group by 分组依据(列)

II.    案例:

//查询各个部门的总人数

select department_id , count(*) , max(salary)

from employees

group by department_id

 

//1997年各个部门入职人数

select department_id,count(*) from employees whereto_char(hire_date,'yyyy')=1997

group by department_id

 

//查询各个部门,各个岗位的总人数

select department_id , job_id , count(*)

from employees

group by department_id , job_id

 

8.    分组过滤:用于对分组后的结果做条件过滤

I.     语法:select ... from ... where ... group by ... having 过滤规则

II.    案例:

//统计60,70,,90号部分的最高工资

select department_id , max(salary)

from employees

where department_id in(60,70,90) //结果正确,逻辑错误(先进行条件筛选,排除多余信息,再完成分组操作)

group by department_id

 

//统计60,70,,90号部分的最高工资

select department_id , max(salary)

from employees

group by department_id

having department_id in(60,70,90) //结果正确,逻辑正确(先分组,再过滤)

 

//查询平均工资超过7000的部门编号和人数

select department_id , count(*) , avg(salary)

from employees

group by department_id

having avg(salary) > 7000

注:where仅能判断表中存在的字段,对分组前数据进行过滤

having还可判断表中不存在的字段(聚合函数计算出来的数据),对分组后数据进行过滤

 

9.    SQL顺序:

I.    书写顺序:select ... from ...where ... group by ... having ... order by[asc|desc]

II.   执行顺序:

1). from:           指定数据来源表

2). where:    对查询数据的第一次过滤(现有列)

3). group by:    分组

4). having:   对分组后的数据进行第二次过滤(除现有列以外,还可以过滤聚合函数计算的列)

5). select:          获取各个字段的值

6). order by:     排序

 

10.  伪列:虚列,在原表中不存在的列,可通过select关键字查询,附着在物理表上。

I.     语法:select 伪列 from 表名

II.    详解:

rowid【了解】:唯一标识一行数据的物理位置。//Oracle内部优化查询使用。 file# block# row#

rownum【重点】:为查询出的每一行符合要求的数据分配逻辑编号。//从1开始,依次递增1

 

III.   案例:

//表别名(没有as,没有"")

select e.* , rowid ,rownum

from employees e

 

//查询员工表中前5名员工信息

select e.* , rownum

from employees e

where rownum <= 5

 

//查询员工表中第6名~第10名的员工信息

select e.* , rownum

from employees e

where rownum >= 6 and rownum <= 10 //Error

注:rownum总是从1开始生成,只在 <= 的环境下使用;在 >= 环境下无效

 

//查询员工表中,工资排名靠前的5位员工信息

select e.* , rownum

from employees e

where rownum <= 5

order by salary desc //未完待续

 

璇:

selecte.*,rownum r from employees e order by hire_date

先编号再排序

selectt.* ,rownum r from(select e.* from employees e order by hire_date) t

先排序再编号

 

 

11.  子查询:嵌套查询

I.     语法:与基本查询一致。

II.    详解:

将子查询“一行一列”的结果作为条件执行第二次查询。

将子查询“多行一列”的结果作为枚举条件执行第二次查询。

将子查询“多行多列”的结果作为一张临时表进行第二次查询。

III.   案例:

//(一行一列)查询工资大于平均工资的员工信息

select *

from employees

where salary > (select avg(salary) fromemployees);

 

//(多行一列)查询与姓氏为"King"的员工所在部门的所有员工信息

select *

from employees

where department_id in(select department_id fromemployees where last_name = 'King')

 

//(多行多列)

//查询员工表中,工资排名靠前的5位员工信息

select *

from (select e.* , rownum RN from employees e)

where RN >= 6 and RN <=10

 

 

Oracle Day2

 

12.  分页查询【重点】:

//对员工表进行分页查询(编号的区间查询)

--为Employees添加编号列,组成新的临时表

select e.* , rownum RN from employees e

 

select *

from (select e.* , rownum RN from employees e)--带有编号的临时表

where RN >= 6 and RN <= 10

 

 

//对员工表中的工资进行降序排列,再完成分页查询

--1.降序

select * from employees order by salary desc

 

--2.对降序表再生成编号

select e.* , rownum RN from (select * from employeesorder by salary desc) e

 

--3.获得工资最高的前5行数据

select *

from (select e.* , rownum RN from (select * fromemployees order by salary desc) e)

where RN >=6 and RN <=10 -- RN between 6 and10

 

13.  表连接查询:

I.     语法:table1 连接方式 table2 on 条件

II.    详解:(特点:主表的所有数据行,全部展示;由从表一一匹配)

外连接:

左外连接:主表 left join 从表     (employee为主,则会存在没有部门的员工)

右外连接:从表 right join 主表  (departments为主,展示所有部门信息,包含没有员工的部门信息)

全外连接:主表 full join 主表      (两表中所有信息,全部展示)

内连接:从表 inner join 从表             (两表中一一匹配的数据才进行展示)

自连接:逻辑表 left join 逻辑表

 

III.   案例:

【左外】//查询员工表与部门表的所有信息

select *

from employees e left join departments d

on e.department_id = d.department_id

 

【左外】

//查询员工的编号、名字、工资、部门编号、部门名称

select e.employee_id , e.first_name , e.salary ,d.department_id , d.department_name

from employees e left join departments d

on e.department_id = d.department_id

 

【自连接:逻辑上的两张表,物理上的一张表】//查询员工的编号、名字、直接领导的ID,直接领导的名字

select e.employee_id , e.first_name , m.employee_id, m.first_name

from employees e leftjoin employees m

on e.manager_id = m.employee_id

 

//多表连接查询

三表连接查询

--      (employees)(departments)   (locations)

--查询员工编号、名字,    部门名称    ,部门所在的城市

select e.employee_id , e.first_name ,d.department_name , l.city

from employees e left join departments d

on e.department_id = d.department_id

left join locations l

on d.location_id = l.location_id

 

四表连接查询

--      (employees)(departments)   (locations)    (countries)

--查询员工编号、名字,    部门名称    ,部门所在的城市 ,所属国家的全称

select e.employee_id , e.first_name ,d.department_name , l.city , c.country_name

from employees e left join departments d

on e.department_id = d.department_id

left join locations l

on d.location_id = l.location_id

left join countries c

on l.country_id = c.country_id

 

六、自定义表:

1.    数据类型:

I.     字符串:

char(n):固定长度的字符串,上限2000,最大长度为n,实际长度为n,其余用空格填充。(如果不设定长度,则默认长度为1)

例如:char(5)  'abcd'最大长度5,实际长度5。

 

varchar2(n):可变长度的字符串,上限4000,最大长度为n,实际长度为字节个数。(必须设置固定长度)

例如:varchar2(5)  '你好' 最大长度5,实际长度4 | 'ab'最大长度为5,实际长度为2  //存储字节:5个,字符2个

 

nvarchar2(n):可变长度的字符串,上限2000,最大长度为n,实际长度为字符个数。(必须设置固定长度)

例如:nvarchar2(5) '你好' 最大长度为5,实际长度为2 | 'ab' 最大长度为5,实际长度为2 //存储字节:5个,字符:5个

 

II.    数字:

integer:任意长度的整数,超过15位之后会使用科学计数法表示 xE10^N。(值保留整数部分,小数部分自动失去精度)

 

number / number(n) / number(n,m):可用于描述整数、小数

例如:number可存储任意长度的小数

例如:number(n)可存储长度为n的整数   

例如:number(n,m)可存储总长度为n,保留m个小数位。number(5,2)   123 --> 123.00 √  | 1234 --> 1234.00  ×

取值范围:n【0,38】 m【-84,127】


number(p,s),s大于0,表示有效位最大为p,小数位最多为s,小数点右边s位置开始四舍五入,

若s>p,小数点右侧至少有s-p个0填充(必须从小数点处开始并连续)。

举例:

number(2,1) 有效位最大为2,小数点后最多保留1位:

存1.115 得1.2

存1.11 的1.1
存1 得1
存0.01 得0
存11.1 得出错 有效位为3,大于2了
存11 得出错 因为11等于11.0 有效位为3,大于2

number(2,4) 有效位最大为2,小数点后最多保留4位:璇:有效位指的是从左到右从第一个不为0的数字算起
最大存值:0.0099,至少从小数点处开始并连续填充4-2=2个0,
如存1出错,因为1等于1.0000,有效位为5,大于2

number(p,s),s小于0,表示有效位最大为p+|s|,没有小数位,小数点左边s位置开始四舍五入,小数点左侧s位,每一位均为0。

举例:
number(2,-3)
有效位最大为2+3=5,没有小数位:
存11111 得11000,因为11111等于11111.0,从小数点左侧3位处开始四舍五入。
存11545 得12000
存11545.5 得12000,因为不存小数位,所以舍去小数位
存99999 得出错,因为四舍五入后变为,100000,有效位为6,大于5
存9999 得10000


III.   时间:

date:年月日时分秒,只精确到秒。通过sysdate获取的系统时间即是date类型的数据。

timestamp:年月日时分秒毫秒。通过systimestamp获取的系统时间即是timestamp类型的数据。

 

IV.   大对象类型【了解】:

CLOB:存储大文本(字符)数据。

BLOB:存储较大二进制文件(多媒体文件,最大4GB)。  MapReduce + HDFS 大数据分析+文件存储(PB级)

 

2.    约束:

I.     主键约束:primary key  唯一的标识表中的一行数据,此列的值不可为null,不可重复,一张表中只能有一个主键,不变的列适合作为主键。

 

II.    唯一约束:unique           唯一的标识表中的一行数据,此列的值可以为null,不可重复,一张表中可以有多个唯一列。

 

III.   非空约束:not null          此列的值不能为空

 

IV.   检查约束:check             通过制定规则,通过逻辑判断对数据进行校验,满足条件才可插入

//email:要求此列中的值必须包含'@zparkhr'

check( email like '%@zparkhr.com.cm' )

 

//password:要求此列中的值长度必须大于等于6

check( password like '______') //密码必须为6位

check( length(password) >= 6 ) //密码>=6位

 

//sex:要求此列的值必须为'男'或者'女'

check( sex = '男'or sex = '女' )

check( sex in('男', '女') )

 

//age:要求此列的值必须在1 ~ 160之间

check( age >= 1 and age <= 160)

check( age between 1 and 160)

 

V.    外键约束:foreign key 引用外部表的某个列的值,插入数据时,约束此列的值必须是引用表中以存在的值,二者的数据类型也必须一致。

语法:references 外部表(字段)    // class_id number(6)references t_class(class_id)   且 子表类型必须与父表类型相同

 

(1)直接在建表时添加外键:

createtable t_b(

        id_bintegerprimarykey,

        foreign_keyreferencest_a(id)

)

(2)在表中增加一列为外键

alter table t_b add foreign_key references t_a(id)

(3)添加数据

父表按照自身表格要求添加数据

子表外键按照父表里被定义为外键的那列数据存在的数值

(顺序可以与父表不一致,只要父表被定义为外键的那列中存在此数值就行;子表添加外键数据时,数据可以为null,可以重复),

外键与被定义为外键的数据的类型一致。被定义为外键的列一定是父表的唯一标示

子表:insert into t_bvalues(test1.nextval ,5)

 

3.    建表【重点】

I.     1.语法:

create table 表名(

列名 数据类型 [约束],

列名 数据类型 [约束],

....

列名 数据类型 [约束] //最后一列不加逗号

)

 

//create table 表名(列名数据类型 [约束] , 列名 数据类型 [约束] , 列名 数据类型 [约束] )

 

2.修改表   alter

           修改表中的数据类型: alter table 表名  modify  列名  类型.

           注意:表中可以存在数据吗?     一定不可以存在

           修改列名: alter table 表名 rename column  原来的列名  to 新列名.

           添加列:  alter  table  表名   add  列名  类型.

 

3.删表    (1)drop  table  表名;  整个表全部删除

                  如果存在外键的引用 应该先删子表 再删父表.

               特殊情况:  级联删除 --- drop table t_class cascade constraints;

        允许强制删除父表,同时删除子表的外键关联(约束).

 

      (2)删除表格中全部数据

①delete  from  表名;   

  逐条删除表格中的数据

 

* 指定删除内容delete from 表名  where 条件

 

②truncate table  表名;

                       把整个表格全部删除后再重建

                                         

            drop,delete,truncate区别:

①delete是 DML(data maintain Language), 删除过后这个操作会被放到 rollback segment中,

需要commit提交后才生效。

truncate、drop是DLL(data define language),操作立即生效,

原数据不放到 rollback segment中,不能回滚truncate不需要提交

②delete逐条删除数据,并同时将该行的删除操作作为事务记录在日志中保存以便进行进行rollback操作。

truncate删除整个表格再重建,不把删除操作记录记入日志保存,删除行是不能恢复的。在删除的过程中

不会激活与表有关的删除触发器,效率高于delete。

drop把整个表格全部删除

在速度上,一般来说,drop> truncate > delete

③所占空间:

     delete操作不会减少表或索引所占用的空间,保持删除操作之前的大小

truncate 操作会使这个表和索引所占用的空间恢复到刚建表时初始大小,

    drop语句将表所占用的空间全释放掉。

④delete和truncate删除表格数据。drop删除表格数据和结构

⑤delete如果使用自增字段的列,会保留标识计数值,可用于有foreignkey引用的表格。

Truncate如果使用了自增字段的列, 计数归零。由foreign key约束引用的表,不能使用。

truncate不能用于参与了索引和视图的表。

 

璇:

 rollback segment 回滚段。

设置回滚段的目的:

(1)对表格的操作先存放在回滚段中,不commit之前是可以进行rollback恢复到未改变前数据。

如果执行了commit,回滚段中的数据就会失效,数据改变将永久化。

(2)在并发访问时。一个数据值改变但是事务还没commit前。如果同时对一个表格的数据进行查询和修改时,

那么修改后的值会先保存在回滚段中,select也是从回滚段中读取数据的。此时rollback会恢复到修改前的数据。

 

       Test:在并发操作的时候,同时select和update 会显示noresult set。

之后再进行select查询操作的时候,会从回滚段中查询数据即修改后数据,

若此时commit 就把修改后的数据永久化。若此时rollback还将恢复到修改前数据

I.     创建班级表与学生表

注:

1).   创建关系表时,先创建父表,再创建子表。

2).   删除关系表时,先删除子表,再删除父表。

3).   使用代码完成删除表结构的操作:drop table 表名

 

七、数据操作:

1.    插入(insert):

I.     语法:insert into 表名(列1,列2,列3,列n ...) values(值1,值2,值3,值n ...)

II.    案例:

 

2.    修改(update):

I.     语法:update 表名 set 列1 = 新值1 , 列2 = 新值2 ,... where 条件;

II.    案例:

 

3.    删除(delete):

I.     语法:delete from 表名 where 条件;

II.    案例:

注:删除具有主外键关系的数据行时,需保证父表中的数据已无被引用方,否则无法删除。

 

4.    补充:联合主键、联合约束

 

八、事务【重点】:

t_account银行账户(cardNo , password , balance.....)

问题:A账户向B账户转账1000元

 

update t_account set balance = balance - 1000 where cardNo ='6222020200001234567'  --A账户减少1000元 √

--断电、down机   --事务并没有提交

update t_account set balance = balance + 1000 where cardNo ='6222020200007654321'  --B账户增加1000元 ×

 

 

1.    概念:事务是一个原子操作,可以由一条或多条SQL语句组成。

 

2.    特点:数据库会为每一个客户端都维护一个独立的回滚段(缓存),一个客户端所有的增删改操作结果,都会缓存到回滚段中,只有当事务中的所有SQL         全部执行成功,则事务提交,正常结束;如果当中有一条SQL执行失败,则事务回滚,异常结束。(都成功,则成功;有一个失败,则失败)

 

3.    事务的边界:

I.     开始:上一个事务结束后的第一条增删改语句。 //客户端打开

 

II.    结束:

1).   提交:

a.    显示提交:commit;  //点击提交按钮

b.    隐式提交:一条create、drop语句、客户端正常退出

 

2).   回滚:

a.    显示回滚:rollback;  //点击回滚按钮

b.    隐式回滚:非正常退出(断电、down机)

 

4.    生产环境:基于增删改操作的返回结果(受影响行数),决定提交事务或是回滚事务。

 

5.    事务的特性:ACID

I.     原子性(Atomic)   :同一个事务中的多条SQl是不可分割的整体,都成功才成功,有一个失败,则都失败。

II.    一致性(Consistency):事务开始前和事务结束后,数据库数据保持一致、正确。

III.   隔离性(Isolation):事务与事务之间相互独立,互不干涉。

IV.   持久性(Durability):事务执行后,对数据库的影响是持久、永久的。

 

九、操作优化:

1.    序列【重点】:

I.     语法:create sequence 序列名 [参数]   序列名称.nextval

II.    详解:用来生成一列自动增长的整数值。

III.   (1)创建序列:

①Create  sequence  名字   start with 1 

          创建     序列      名       从···开始

            ②Create   sequence   user_seq4    start with 10      increment by 2       maxvalue 30    minvalue10;

创建    序列       序列名称      从多少开始    每一次增长多少(默认 1)    最大值         最小值

 

(2)如何使用:

序列名.nextval   

//获得序列的值,充当主键

 

(3)删除序列:

dorp   sequence  序列名称;

 

2.  视图:View: 是数据库中的一个  虚表(相对于实际存在的数据表----- 基表) 视图本身依赖于基本表.

  视图本质上不是一张表,是一条SQL语句.  

 

I.创建视图对象:   create  view   视图名as (SQL语句);

                 创建      视图    视图名是    SQL语句

 

II.    详解:保存SQL语句,简化查询操作。

createviewmy_view as (select e.*,rownum r from employees e);

 

select * from my_view;

select * from  (select e.*,rownum r fromemployees e);

 

 

III删除视图:drop  view  视图名称;

 

视图本身是没有任何效率的提升,使用视图相当于重新执行一次SQL语句

视图不会独立存储数据,原表发生改变,视图数据也会发生改变。

 

优点: 1.只授予用户使用视图的权限,来屏蔽敏感列内容. (简化权限的使用)

2.简化数据库查询复杂度   
3. 语法强制(使用视图会更加的简单)使用视图

4. 不建议使用视图进行DML操作   ***

 

 

3.    索引:

I.     语法:create index 索引名 on 表(列)

II.    详解:索引类似与字典的目录,用于加快查询速度。

III.   案例:

注:

1).   高频查询的列,可以创建索引来提高查询效率,一个列只能有一个索引。

2).   索引并非越多越好(占用存储空间,增删改原表数据时,需独立维护索引的内容,从而会额外消耗资源)

3).   Oracle默认在主键上创建索引

4).   dropindex 索引名

 

十、SQL的详细分类:

1.    数据查询语言DQL(Data Query Language):select、where、orderby、group by、having。

2.    数据操作语言DML(Data Manipulation Language):insert、update、delete。

3.    数据定义语言DDL(Data Definition Language):create、drop、alter。

4.    事务处理语言TPL(Transaction Process Language):commit、rollback。

5.    数据控制语言DCL(Data Control Language):grant、revoke。

 

 

 

 

 

 

 

 

 

 

 

 

阅读更多
文章标签: oracle
个人分类: 二阶段
下一篇jar包
想对作者说点什么? 我来说一句

oracle笔记总结

2011年06月23日 20KB 下载

Oracle笔记Oracle笔记

2011年08月22日 147KB 下载

oracle学习笔记.docx

2010年08月25日 34KB 下载

oracle经典笔记

2018年01月11日 19.62MB 下载

Oracle 笔记.rar

2009年09月17日 27KB 下载

oracle培训18天笔记

2010年06月25日 509KB 下载

oracle学习 授课笔记

2011年04月08日 20KB 下载

oracle随手笔记oracle随手笔记

2009年10月24日 16KB 下载

最全的oracle笔记

2009年10月18日 52KB 下载

没有更多推荐了,返回首页

关闭
关闭