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。

 

 

 

 

 

 

 

 

 

 

 

 

阅读更多
想对作者说点什么?

博主推荐

换一批

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