一、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用户会话特权和操作权限:
I. grantconnect to hr;
II. grantresource to hr;
III. grantcreate session to hr;
一、现有的数据存储方式:
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。