Oracle公司简称甲骨文是全球最大的信息管理软件及服务提供商,成立于1977年,总部位于美国加州RedWood share。Oracle公司因其复杂的关系型数据库而闻名,Oracle数据库是第一个支持SQL语言的数据库。
Oracle数据库提供技术认证,分别是OCA、OCP、OCM认证。其中OCM认认证是对技术、知识和操作技能的最高级别的认可。
Oracle数据库按照版本号划分有多个版本
- 9i:为了适应互联网(internet)
- 10g、11g:为了适应分布式(grid)
- 12c:为了适应云服务(cloud)
以是否收费,也可以划分为多个版本
- 企业版:包含了数据库的所有功能
- 标准版:缺少集群功能
- 个人版:收费低,不能用于商业项目
- XE版:体验版,用于学习。
平时说的Oracle或Oracle数据库,指的是Oracle数据库管理系统,它由Oracle数据库(保存数据库的文件)和Oracle实例(提供服务的Service)组成。
操作Oracle数据库的5种语句
- DQL:数据查询语句,select
- DML:数据操作语言,insert、update、delete
- DDL:表结构操作语言
- DCL:用户与权限管理
- 事务控制语句:用于事物提交、回滚等
DQL语句
DQL也称为查询语句,指的是对表中数据的查询
基本查询
基本查询语法如下:
select
字段列表
from
表名列表
where
条件列表
group by
分组字段
having
分组之后的筛选条件
order by
排序
1.查询表中所有数据
select * from 表名;
2.查询指定列,多个列名用 , 隔开
select
列名1, -- 注释1
列名2 -- 注释2
from 表名;
3.列名起别名展示,使用as关键字,as可以省略,别名可以使用””也可以不使用,不使用””时默认大写
select 列名1 as 别名1, 列名2 别名2 from 表名;
4.查询结果去重复,使用distinct关键字
select distinct 列名称 from 表名称;
5.列结果连接符 || ,连接字符串或以字符串形式连接其他列,例:查询员工工资,显示100元、xxx元(sal为工资列名,emp为员工表),该字符串使用”括起来
select sal || '元' as "工资:(单位元)" from emp;
6.列结果进行四则运算,乘除法优先,有小括号优先小括号,仅限数字型数据,例如对工资加100显示
select 列名+100 from 表名;
7.查询结果升序排列:(默认asc升序)
select * from 表名 order by 列1,列2...;
8.查询结果降序,使用desc关键字:
select * from 表名 order by 列1 desc, 列2 desc...;
9.分组查询,分组字段应该是查询字段中的一个(展示字段通常包含聚合函数)
select 分组字段,展示字段1,展示字段2... from 表名 group by 分组字段;
10.分组筛选,having后的条件符合,才显示该分组数据(having条件通常是聚合函数)
select 分组字段,展示字段... from 表名 group by 分组字段 having 条件;
条件查询
在where语句后跟条件,形成条件查询语句。
oracle数据库可用运算符如下:
运算符 | 描述 |
---|---|
> | 大于 |
< | 小于 |
<= | 小于等于 |
>= | 大于等于 |
= | 等于 |
<> 或 != | 不等于 |
between … and | 在 … 之间,闭区间 |
in(集合) | 在 … 之中 |
is null | 是 null |
is not null | 不是 null |
and | 且 |
or | 或 |
not | 非,取反 |
like | 模糊运算 |
_ | 单个字符 |
% | 多个任意字符 |
1.查询工资=3000的员工
select * from emp where sal=3000;
2.查询姓马的人,name表示名字字段
select * from 表名 where name like '马%';
3.查询第二个字是 ’化‘ 的人
select * from 表名 where name like '_化%';
4.查询姓名是三个字的人(三个短杠 _ )
select * from 表名 where name like '___';
5.查询姓名中包含 ‘马’ 字的人
select * from 表名 where name like '%马%';
函数查询
oracle函数按功能可以分成多种类别函数。这里分为单行与聚合。
单行函数
单行函数,表示对一行数据进行处理,并返回一条数据。对多行数据处理时就会有多条数据
1.变小写(以下数据类型,表示该数据类型的列)
select lower(字符串) from 表名;
2.变大写
select upper(字符串) from 表名;
3.首字母大写,其余小写
select initcap(字符串) from 表名;
4.拼接(oracle中的dual表是一个虚拟表、测试表)
select concat(字符串1,字符串2) from dual;
5.截取字符串
select substr(字符串,起始位置,终止位置) from dual;
6.取字符串长度
select length(字符串) from dual;
7.找子串位置
select instr(字符串,子字符串) from dual;
8.左补齐lpad、右补齐rpad。
select lpad(字符串,补齐后总长度,补齐字符), rpad(字符串,补齐后总长度,补齐字符) from dual;
9.去除左右两边指定字符
select trim(指定字符 from 字符串) from dual;
10.四舍五入
select round(小数,保留小数点位数) from dual;
11.截取小数点位数,后续小数点丢弃
select trunc(小数,保留小数点位数) from dual;
12.求余数
select mod(被取余数,取余数) from dual;
13.取系统当前时间
select sysdate from dual;
14.日期可以作减法,结果为天数,为数字还可以继续加减乘除
select 时间1-时间2 from 表名;
15.日期做加法,表示天数加1,结果仍是日期
select 日期+1 from 表名;
16.计算两个日期相差的月份
select months_between(日期1,日期2) from dual;
17.向指定日期中添加若干月份
select add_months(日期1,整数) from dual;
18.表示日期中该月的最后一天
select last_day(日期) from dual;
19.隐式转换,自动完成
- 字符串转数字
- 字符串转日期
- 数字转字符串
- 日期转字符串
20.日期转字符串的多种格式
to_char(date,'格式')
- YYYY =》四位数年份,2002
- YEAR =》纯英文 TWO THOUSAND AND TWO
- MM =》纯数字月份,02
- MONTH =》 月份英文全称,JULY
- MON =》月份英文缩写,JUL
- DY =》 日期英文缩写 MON
- DAY =》日期英文全称,MONDAY
- DD =》日期数字,02
该语法中,有中文时需要使用双引号
select '当前时间:' || to_char(sysdate, 'YYYY"年"MM"月"DD"日"') from dual;
21.日期对数字转换多种格式
- 9 =》 数字
- 0 =》 零
- $ =》美元货币
- L =》当地货币
- . =》 小数点
- , =》千位符
select to_char(日期,'$999,999.99') from dual;
22.字符转日期TO_DATE
select to_date(日期,'DD-MON-RR') from dual;
23.字符串转数字TO_NUMBER
select to_number(字符串,'999,999') from dual;
24.为空候选nvl(a,b),如果a不为空返回a,否则返回b,其中ab数据类型相同
25.三元为空候选nvl2(a,b,c),如果a不为空返回b,否则返回c
26.判断相等nullif(a,b),如果a和b相等则返回空,不等非空
27.多级候选coalesce(a,b,c,d….n),按照a,b,c,d..优先返回一个不为空的值
引号归纳
在oracle的select语句中,存在“双引号”,“单引号”,“无引号”
对于通配符,必须是“无引号“的,不能加单、双引号。
对于”属性“,可以是”无引号“,也可以是“双引号”
单引号表示字符串,如果单引号中嵌套了字符串,里面的使用双引号
聚合函数
聚合函数,也叫分组函数、多行函数,通常在分组中使用。它指的是把列(多行)当做一个数据来计算,那么计算一列(多行)只会得到一个值。
注释:聚合函数会排除null,oracle中的null值表示空值,与”等价
1.count函数,返回某个字段的条数(如果使用*会计算最多的列,即得到表中数据条数)
select count(列名) from 表名;
2.计算某个列中最大的数据值,针对数字
select MAX(列名) from 表名;
3.计算某个列中最小的数据值,针对数字
select MIN(列名) from 表名;
4.计算某个列的数据和,针对数字
select SUM(列名) from 表名;
5.计算某个列的数据的平均值,针对数字
select AVG(列名) from 表名;
6.计算某个列的数据的标准方差,针对数字
select STDDEV(列名) from 表名;
7.计算某列的数据的统计方差,针对数字
select VARIANCE(列名) from 表名;
DQL语法执行顺序
sql查询时,有先后顺序,
- from =》 判断从哪些表取数据
- where =》判定条件,得出结果集
- group by=》对结果集分组
- having =》 对结果集过滤
- select =》 显示最终结果
查询平均分大于等于60的学生,并显示学号、姓名、平均分,那么你不能这么写
select sno,sname,avg(grade) from sc where avg(grade)>=60;
上述语句错误在于,你在where中使用了聚合函数,聚合函数也叫分组函数,它是对结果集的分组筛选,而where完成之后才能得出结果集,所以是错误的,你应该这么写:
select sno,sname,avg(grade) from sc group by sno having avg(grade)>=60;
在这里,我们使用了学号进行分组,虽然看起来没意义,但分组之后就可以进行having筛选了,也就达到了最终效果。
多表查询
默认多表查询是笛卡尔积的结果
-- 创建部门表
CREATE TABLE dept(
id INT PRIMARY KEY,
NAME VARCHAR(20)
);
INSERT INTO dept VALUES (1,'开发部');
INSERT INTO dept VALUES (2,'市场部');
INSERT INTO dept VALUES (3,'财务部');
-- 创建员工表
CREATE TABLE emp (
id INT PRIMARY KEY,
NAME VARCHAR(10),
gender CHAR(2), -- 性别
salary INT, -- 工资
join_date DATE, -- 入职日期
dept_id INT,
FOREIGN KEY (dept_id) REFERENCES dept(id) -- 外键,关联部门表(部门表的主键)
);
INSERT INTO emp(ID,NAME,gender,salary,join_date,dept_id) VALUES(1,'孙悟空','男',7200,date'2013-02-24',1);
INSERT INTO emp(ID,NAME,gender,salary,join_date,dept_id) VALUES(2,'猪八戒','男',3600,date'2010-12-02',2);
INSERT INTO emp(ID,NAME,gender,salary,join_date,dept_id) VALUES(3,'唐僧','男',9000,date'2008-08-08',2);
INSERT INTO emp(ID,NAME,gender,salary,join_date,dept_id) VALUES(4,'白骨精','女',5000,date'2015-10-07',3);
INSERT INTO emp(ID,NAME,gender,salary,join_date,dept_id) VALUES(5,'蜘蛛精','女',4500,date'2011-03-14',1);
比如,直接查询 emp, dept 这两张表的数据
select * from emp, dept;
得到的结果如下:
+----+--------+--------+--------+------------+---------+----+--------+
| id | NAME | gender | salary | join_date | dept_id | id | NAME |
+----+--------+--------+--------+------------+---------+----+--------+
| 1 | 孙悟空 | 男 | 7200 | 2013-02-24 | 1 | 1 | 开发部 |
| 1 | 孙悟空 | 男 | 7200 | 2013-02-24 | 1 | 2 | 市场部 |
| 1 | 孙悟空 | 男 | 7200 | 2013-02-24 | 1 | 3 | 财务部 |
| 2 | 猪八戒 | 男 | 3600 | 2010-12-02 | 2 | 1 | 开发部 |
| 2 | 猪八戒 | 男 | 3600 | 2010-12-02 | 2 | 2 | 市场部 |
| 2 | 猪八戒 | 男 | 3600 | 2010-12-02 | 2 | 3 | 财务部 |
| 3 | 唐僧 | 男 | 9000 | 2008-08-08 | 2 | 1 | 开发部 |
| 3 | 唐僧 | 男 | 9000 | 2008-08-08 | 2 | 2 | 市场部 |
| 3 | 唐僧 | 男 | 9000 | 2008-08-08 | 2 | 3 | 财务部 |
| 4 | 白骨精 | 女 | 5000 | 2015-10-07 | 3 | 1 | 开发部 |
| 4 | 白骨精 | 女 | 5000 | 2015-10-07 | 3 | 2 | 市场部 |
| 4 | 白骨精 | 女 | 5000 | 2015-10-07 | 3 | 3 | 财务部 |
| 5 | 蜘蛛精 | 女 | 4500 | 2011-03-14 | 1 | 1 | 开发部 |
| 5 | 蜘蛛精 | 女 | 4500 | 2011-03-14 | 1 | 2 | 市场部 |
| 5 | 蜘蛛精 | 女 | 4500 | 2011-03-14 | 1 | 3 | 财务部 |
+----+--------+--------+--------+------------+---------+----+--------+
可以测试任意两张表,可以发现笛卡尔积的规律如下:3条数据和5条数据的表一起查询,就得到15条数据,也就是一张中的每一条数据都与另一个表中的所有数据匹配。
造成笛卡尔积的原因是,表与表之间没有“联系”,我们应该指定多表之间的关系,这样才能消除笛卡尔积,得到真正需要的数据结果,这就是学习多表查询的目的
多表查询,有3种方式,①内连接,②外连接,③子查询
内连接
内连接就是限定了必须对应的字段信息
核心思想:多表当做一表查,再使用条件限定筛选。
1.隐式内连接
使用where限定连接条件
查询 emp, dept 表所有的数据
SELECT * FROM emp,dept WHERE emp.dept_id = dept.id;
查询 emp, dept 表其中的一些属性,可以使用 “表名.属性” 来表示 “属性”,这样能够在多表字段重名时进行区分。
SELECT emp.name,emp.gender,dept.name FROM emp,dept WHERE emp.dept_id = dept.id;
可以给表起别名的方式,简化查询,不能使用as
SELECT
t1.name, -- 员工表的姓名
t1.gender,-- 员工表的性别
t2.name -- 部门表的名称
FROM
emp t1,
dept t2
WHERE
t1.dept_id = t2.id;
2.显式内连接
显示内连接,使用join on限定
显式内连接效果一样,只是语法不同,语法如下
select 字段列表 from 表名1 [inner] join 表名2 on 条件;
其中 表1 是主表,后面的是从表,方括号表示 inner 关键字可以省略
例如,仍然查询 emp, dept 表的所有数据
SELECT * FROM emp INNER JOIN dept ON emp.dept_id = dept.id;
SELECT * FROM emp JOIN dept ON emp.dept_id = dept.id;
内连接注意事项
- 查询哪些字段
- 从哪些表查询数据
- 查询条件是什么
外连接
核心思想:按条件查询完成一表后,按顺序按条件继续查询下一张表。
1.左外连接
查询“左表”所有数据,并按照左表条件继续查询右表
左外连接语法如下
select 字段列表 from 表1 left [outer] join 表2 on 条件;
例如,查询所有员工信息,以及所在部门名称,即使没分配部门也显示
首先加入一个新入职员工,还未分配部门
insert into emp(id,name,gender,salary) values(6,'小马','男',3000);
SELECT t1.*,t2.name FROM emp t1 LEFT JOIN dept t2 ON t1.dept_id = t2.id;
2.右外连接
查询“右表”所有数据,并按照右表条件继续查询左表
select 字段列表 from 表1 right [outer] join 表2 on 条件;
例如,查询所有员工及其部门,如果员工没有加入部门,则不显示该行数据
SELECT t1.*,t2.name FROM emp t1 RIGHT JOIN dept t2 ON t1.dept_id = t2.id;
3.满外连接
满外连接:按顺序查询所有的表,最后按条件筛选
例如,查询员工信息,部门名称,没有部门的员工,以及没有员工的部分都要显示
select 字段列表 from 表1 full [outer] join 表2 on 条件
增加一个新部门,此时没有员工
INSERT INTO dept VALUES (4,'公关部');
select t1.*,t2.name from emp t1 full join dept t2 on t1.dept_id=t2.id;
子查询
查询中“嵌套”查询,则称为子查询
核心思想:查询一张表得到数据后,把这些数据当做新表、新数据给外层表使用
那么按照得到的数据不同,也有不同的语法,总体来说
使用一个小括号()把子查询嵌套起来
1.子查询的结果为单列
子查询结果为单列时,结果通常当作值使用。
查询工资最高的员工信息
SELECT * FROM emp WHERE emp.salary = (SELECT MAX(salary) FROM emp);
查询’财务部’和’市场部’所有的员工信息
SELECT * FROM emp WHERE dept_id IN (SELECT id FROM dept WHERE NAME = '财务部' OR NAME = '市场部');
注释:单列的也可以当作表使用,只是通常不这么用!!!
2.子查询的结果为多列
子查询结果为多列时,可以当做一张表使用
查询员工入职日期是2011-11-11日之后的员工信息和部门信息
SELECT * FROM dept t1 ,(SELECT * FROM emp WHERE emp.join_date > date'2011-11-11') t2
WHERE t1.id = t2.dept_id;
注释:多列的只能当作表使用,而不能做值判断
多表查询效率
多表查询,有3种方式,其中
- 内连接最简单
- 外连接效率最高
- 子查询最灵活
子查询效率和外连接相比,为什么效率低于外连接?
通常来说子查询更慢是有原因的,子查询虽然灵活,但是可能会被重复执行,理想情况下是我们认为会生成一个临时空间存放该数据,实际上可能没有,那么此时就慢了。
分页查询
oracle中查询数据时,结果集数据中的每一行数据都对应一个行号,行号所在的列,叫rownum
rownum从1开始,所以不能限定rownum大于一个正数。
在涉及排序时,排序后的rownum会被打乱。
那么,综上所述,容易得出一个解决方案:在进行分页时,首先把排序后的表当成一个新的表(取一个别名,假设tt),在对tt表进行<限定,以及对tt的行号rownum取别名(假设rn),接着再把这个表当成一个新表,在最外层的表中对rn进行>限定。
select * from(
select rownum rn, tt.* from(
select * from emp order by sal desc -- 真正的查询语句
) tt where rownum<11 -- 小于限定
) where rn>5 -- 大于限定
在上面这个例子中,我们取出了emp表按sal降序排序的6-10行,假设每页5行,那么这个就是第2页数据,修改大于、小于限定,即可取出想要的页数。
可以发现,真正的查询语句实际在最中间的位置,外表套了2层查询,格式是比较固定的,需要注意的是别名tt和rn,最好不要和真正的查询语句撞名。
DML语句
DML语句,包括了数据的“增、删、改”。
insert语句
insert语句用于插入数据
1.增加一条数据
insert into 表名 values(值1,值2...);
2.增加数据,指定要插入的列名
insert into 表名(列1,列2...) values(值1,值2...);
3.一次一个增加多条纪录,使用逗号隔开
insert into 表名 values(值1,值2...),(值3,值4...),(值5,值6...);
4.插入空值,该字段使用null
insert into 表名 values(null);
5.插入日期类型,对于字符串类型加上date
insert into 表名 values(date'2013-02-24');
6.从其他表拷贝过来
insert into 表名 select * from 表2;
update语句
update语句指的是更新表中数据,一般来说需要指定条件,否则会修改所有数据
update 表名 set 字段1=值1,字段2=值2... where 条件;
delete语句
delete语句用于删除数据。和update语句差不多,一次可以删除一条或多条语句,如果不指定条件会删除所有数据
delete from 表名 where 条件;
当然,如果想一次删除整张表中的所有数据,有2种方式
delete 表名;
truncate table 表名;
这两者在性能上是有区别的,前者是逐条删除,后者是删掉整个表并新建一个同结构的空表,前者会保留操作记录可回退,如果不需要记录,一般后者效率更高。
事务处理语句
概念:事务是工作的逻辑单元,一个事务是由一个或多个完成一组的相关行为的SQL语句组成,通过事务机制确保这一组SQL语句所作的操作要么完全成功执行,完成整个工作单元操作,要么一点也不执行。
事务有4大特征:
- 原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败。
- 持久性:当事务提交或回滚后,数据库会持久化的保存数据。
- 隔离性:多个事务之间。相互独立。(实际会相互影响,实现独立要手动隔离)
- 一致性:事务操作前后,数据总量不变(比如 a-50, b+50 ,但 a+b 的总量仍然是一致的)
通常来说,事务语句是针对DML的,也就是“增、删、改”
oracle不需要使用语句开启,默认是开启的,在执行完sql语句后,就可以
使用commit提交事务
commit;
使用rollback回滚
rollback;
DDL语句
DDL语句,是对表结构的操作,包括建表、修改表结构、增加约束等
表,是数据库的对象之一,常见的数据库对象:
- 表:基本的数据存储集合,由行和列组成
- 视图:从表中抽取出逻辑相关的数据集合
- 序列:提供有规律的数值
- 索引:提高查询的效率
- 同义词:给对象起别名
表的命名规则:
- 能使用unicode字符、$¥#_字符
- 必须以字母开头
- 长度在1~30个字符
- 不能与oracle保留字重名
- 不能与用户定义的其他对象重名
创建表语句
创建表,使用create table语句
create table 表名(
列名1 数据类型1(长度),
列名2 数据类型2
);
在创建时,应该符合json格式,最后一行不要有, 例如以下建表实例是正确的
create table dept(
deptno number(8,2), -- 总长8,小数点2位,整数6位
dname varchar2(99), -- 可变字符串99位
location varchar2(100)
);
此外,可以使用子查询创建表,例如
create table 表名 as select * from 表2;
查询表语句
在oracle中,只有一个数据库,你不能够创建数据库,如何查询已创建的表?
select * from user_tables;
这里的user_tables,是orale自动生成的一个表字典,它存储了当前用户所创建的所有表信息
通过使用该语句,就可以查看当前用于都有哪些表
Oracle数据类型
oracle数据库的数据类型,有以下几种
数据类型 | 描述 |
---|---|
varchar2(size) | 可变长度字符串 |
char(size) | 定长字符串数据 |
number(a,b) | 可变长度数字类型, a表示长度, b表示小数点位数 |
date | 日期类型 |
long | 可变长度字符串,最大可达2G |
clob | 字符数据,最大可达4G |
raw and long raw | 裸二进制数据 |
blob | 二进制数据,最大可达4G |
rowid | 行地址 |
bfile | 存储外部文件的二进制数据,最大可达4G |
修改表结构
表在创建后,结构仍然可以修改
1.增加一个新的字段
alter table 表名 add (列名 数据类型(长度));
2.修改现有字段,(不能修改字段名)
alter table 表名 modify (列名 数据类型(长度));
3.对列重命名
alter table 表名 rename column 列名 to 新列名;
4.删除一个字段
alter table 表名 drop column 字段名;
删除表语句
删除整张表
drop table 表名;
删除表中的数据
truncate table 表名;
建表约束
Oracle数据库支持以下建表约束
- 主键约束:primary key
- 检测约束:check
- 唯一约束:unique
- 非空约束:not null
- 外键约束:foreign key
在新建表、或对已建立的表增加约束都是可以的,每一个约束如果不指定约束名会有一个默认值
1.建表时增加非空约束
create table 表名(
列名 数据类型 not null
);
2.建表时增加唯一约束
create table 表名(
列名 数据类型 约束名 unique
);
3.建表时增加主键约束,主键约束包含了非空和唯一
create table 表名(
列名 数据类型 primary key
);
4.建表时增加check约束
create table 表名(
列名 数据类型 check(条件)
);
5.建表时增加外键约束
create table 表名(
列名 数据类型,
constraint 约束名 foreign key(列名) references 外表(列名)
);
6.建表时增加带有级联删除的外键约束
create table 表名(
列名 数据类型,
constraint 约束名 foreign key(列名) references 外表(列名) on delete cascade
);
7.建表后,增加check约束
alter table 表名 add constraint 约束名 check(条件);
8.建表后,增加唯一约束
alter table 表名 add constraint 约束名 unique(列名);
9.建表后,增加主键约束
alter table 表名add constraint 约束名 primary key(列名);
10.建表后,设置非空约束
alter table 表名 modify 列名 constraint 约束名 not null;
11.建表后,增加外键约束
alter table 表名 add constraint 约束名 foreign key(列名) references 外表(列名) 级联操作;
12.删除约束
alter table 表名 drop constraint 约束名;
13.无效化约束
alter table 表名 disalbe constraint 约束名;
14.激活无效约束,现有数据必须是合法的
alter table 表名 enable constraint 约束名;
DCL语句
DCL包括用户与权限管理
执行DCL语句时,本身需要权限,使用以下命令登录sys
sqlplus sys/sys as sysdba
1.查询所有用户
select username from all_users;
2.创建一个新用户
create user 用户名 identified by 密码;
3.修改用户密码
alter user 用户名 as identified by 新密码;
一些常见的权限
- create session 创建会话
- create table 创建表
- create sequence 创建序列
- create view 创建视图
- resource 操作表空间
4.给用户创建会话、创建表、创建视图等权限
grant create session, create table, create view to 用户名;
grant resource to 用户名;
一旦某个角色拥有某些权限,那么该角色也可以代表一些权限,首先使用role创建角色manager
create role manager;
grant create session to manager;
-- 接着创建一个用户pdd,把这个角色分给用户
create user pdd identified by 123456;
grant manager to pdd;
5.回收权限
revoke create session from 用户;
6.删除角色
drop role 角色名;
7.删除用户
drop user 用户名 cascade;
序列对象
序列是Oracle的对象之一,通常使用它来完成自增约束。
序列简单理解为一个数字,创建与修改序列对象的语法
--创建序列的语法 --
create sequence [user.]sequence_name
[increment by n]
[start with n]
[maxvalue n | nomaxvalue]
[minvalue n | nominvalue];
--修改序列的语法--
alter sequence [user.]sequence_name
[increment by n]
[maxvalue n | nomaxvalue]
[minvalue n | nominvalue];
参数说明:
- INCREMENT BY: 指定序列号之间的间隔,该值可为正的或负的整数,但不可为0。序列为升序。忽略该子句时,缺省值为1。
- START WITH:指定生成的第一个序列号。在升序时,序列可从比最小值大的值开始,缺省值为序列的最小值。对于降序,序列可由比最大值小的值开始,缺省值为序列的最大值。
- MAXVALUE:指定序列可生成的最大值。
- NOMAXVALUE:为升序指定最大值为1027,为降序指定最大值为-1。
- MINVALUE:指定序列的最小值。
- NOMINVALUE:为升序指定最小值为1。为降序指定最小值为-1026
额外的参数:nocache不缓存,nocycle不循环
创建一个序列对象,名为Admin_aid_Seq,
create table Admin( -- 管理员表
aid number primary key, -- 管理员编号
aname varchar2(20) unique, -- 管理员名
apwd varchar2(20), -- 管理员密码
hire_date date, -- 入职年月
sal number(8,2) check(sal >0) -- 工资
);
create sequence Admin_aid_Seq --aid序列
increment by 1
start with 1
minvalue 1
maxvalue 999999999
nocache
nocycle;
此对象有2个属性,使用nextval获取下一个值,它会自动增加
select Admin_aid_Seq.currval aid from dual; -- 获取当前序列号
select Admin_aid_Seq.nextval aid from dual; -- 取得下一个序列号
当它并未绑定到任何表上,比如要绑定到Admin表的aid字段,可以在插入数据时这样写就能实现自增约束
insert into Admin values (Admin_aid_Seq.nextval,'admin','123',sysdate,100); -- 第一个参数是序列
删除序列:
drop sequence 序列名称;
本篇完,还有疑问?留下评论吧