oracle入门
本笔记用vnote书写,格式有点飘,不过在vnote上浏览还是很清晰的,不打算整理,故放于此处
oracle入门
一、介绍oracle比mysql的复杂之处
1、MySQL 数据库
- 概念
mysql单个用户可创建的多个数据库。database是一个变量(url中标红处)。- 图片解析
)
2、oracle 数据库
- 概念
oracle数据库是数据的物理存储。包括(数据文件ORA或者DBF、控制文件、联机日志文件、参数文件)。其实Oracle数据库的概念和其他数据库不一样,这里的数据库是一个操作系统只有一个库。可以看作是Oracle就只有一个大的数据库。用户是一个变量。- 图片解析
- 实例:
在oracle的数据库中,可以有多个实例,通常只用一个实例- 用户:
一个实例下可以有多个用户,和多个表空间,每个用户需要有一个默认表空间(可以多个用户公用一个默认表空间,天然隔离不需要加锁访问)- 表空间:
一个实例下可以有多个表空间,表空间是逻辑概念,一个表空间对应着一个或多个物理存储文件(.dbf或.ora)。- 用户和表空间的关系:
一个用户有一个默认表空间。而且一个表空间是可以为多个用户作为默认表空间的,即便这样操作,用户和用户之间的数据也不会混,因为天然隔离。- oracle数据库源:
driver:oracle.jdbc.OracleDriver
url : jdbc:oracle:thin:@localhost:1521:orcl
username: zhangsan
passworle: zhangsan
本章总结
oracle中用户的概念,相当于,mysql中数据库(datebase)的概念。
二、oracle 命令行常用操作
1、登录
1 | ###---------------------------------------- |
本章总结
我们不是数据库管理员,没必要把这些命令给整的很熟练。开发人员基本了解这些,会用图形界面验证–>准备封装到代码中的语句就可以了。
三、常用数据类型及SQL语句
1、常用数据类型
- Number 数值类型 相当于mysql中的int, 例:
Number(4) 最大长度为4的数值类型
Number(4,2) 最大长度为4,整数位为(4-2),小数位为2- Varchar2
最大长度为10的字符串,varchar2用于存储可变长度的字符串,varchar2把所有字符都占两个字节处理(一般情况下)。
而varchar只对汉字和全角等字符占两字节,数字,英文字符等都是一个字节。
varchar2把空串等同于null处理,而varchar仍按照空串处理。
建议在oracle中使用varchar2。- Date
时间类型
2、SQL语句
- 1、SQL简介
结构化查询语言,简称SQL。是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理数据库系统;同时也是数据库与脚本文件的扩展名。结构化查询语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统,可以使用相同的结构化查询语言作为数据输入与管理的接口。结构化查询语言语句可以嵌套,这是它具有极大的灵活性和强大的功能。- DML(数据库操作语言)
其语句包括动词 INSERT,UPDATE 和 DELETE。他们分别用于添加,修改和删除表中的行。也称为动作查询语言。我们开发人员对DML使用的频率最高。- DDL(数据库定义语言)
其语句包括动词 CREATE 和 DROP。在数据库中创建信标或删除表(CREAT TABLE 或 DROP TABLE)为表加入索引等。DDL包括许多与人数据库目录中获得数据有关的保留字。它也是动作查询的一部分。- DCL(数据库控制语言)
他的语句通过GRANT 或 REVOKE 获得许可, 确定单个用户和用户组对数据库对象的访问。某些RDBMS可用GRANT 或 REVOKE 控制对表单个列的访问。
本章总结
开发人员在代码中用的最多的是DML(数据库操作语言),做增删改查
四、查询语句
1、查询某张表中的 所有列 或 某一列
select *|列名 from 表名
查询某张表中的 所有列 或 某一列
- select a,b,c from name
从name这张表里查询a列,b列,c列这三列
2、给查询出来的列,取一个别名
select 列名1 as 列别名1,列名2 as 列别名2 from 表名
(推荐: 因mysql也这样用)select 列名1 列别名1, 列名2 列别名2 from 表名
给查询出来的列,取一个别名(注:以上两种写法,oracle中第二种更常用, 如果你工作中还涉及mysql则推荐你使用第一种)
- select a as 哈哈,b as 嘿嘿 ,c as 哇哇 from name
- select a 哈哈,b 嘿嘿 ,c 哇哇 from name – 两种写法结果一样
3、注释
--
/* */
注释(注:以上两种写法皆可)
- –这里是注释
- /* 这里是注释 */
4、查询并消除列中的重复数据
select distinct 列名 from 表名
查询并消除列中的重复数据
- select distinct a from name
a列中如果有重复的字段,将会取集合- select distinct a,b from name
a列 和 b列中同时有重复的字段,将会合并查询结果(即并不是想单个那样返回消除重复字段的集合结果,而是需要照顾差异,因此合并) -> [注意是合并,并不是消除失败]- select distinct a,b,c from name
a列 和 b列 和 c列 中同时有重复的字段,将会合并查询结果(即并不是想单个那样返回消除重复字段的集合结果,而是需要照顾差异,因此合并) -> [注意是合并,并不是消除失败]
5、字符串连接查询
select '字符串1' || a || '字符串n' || b from 表名
字符串链接查询
- select ‘哈哈’ || a || ‘嘿嘿’ || b || ‘哇哇’ || c from name
哈哈a嘿嘿b哇哇c –假设的表头
哈哈1嘿嘿2哇哇3 –假设的内容
哈哈3嘿嘿5哇哇5 –假设的内容
6、查询时的四则运算(加减乘除)
select 列名1,列名2*11 from 表名
(列名2必须是数值类型)
查询时的四则运算(注:不推荐使用,会影响性能)
- select a,b*55,c from name
b必须是数值类型
7、限定查询 (带条件的查询)
select 列名 from 表名 where 条件
限定查询
- select a,b from name where b>1500;
一些常用条件- select a,b from name where b is not null;
非空 IS NOT NULL (为空 IS NULL)- select a,b from name where b is not null and a>1000;
多个条件 用 AND 做连接- select a,b from name where b is not null or a>1000;
多个条件 用 OR 做连接- select a,b from name where not(b is not null or a>1000);
非运算 NOT- select * from name where b between to_date(‘1981-3-4’, ‘yyyy-MM-dd’) and to_date(‘1982-5-17’, ‘yyyy-MM-dd’);
between and 不仅可以使用在数值之间,也可以用在日期的区间
列名 between 1500 and 3000 等价于 列名 >= 1500 and 列名 <=3000- IN 关键字 相当于连续的 OR
列名 IN (50 , 100 ,14) 等价于 列名=50 or 列名=100 or 列名=14
- NOT IN 关键字 相当于 连续的 OR 结果 加了个 非运算 NOT
- 不等号有两种: <> 和 !=
- oracle中’没有’ limit 关键字。 mysql中’有’limit关键字, 对于mysql, limit关键字主要用于指定查询结果从哪条记录开始显示,一共显示多少条记录;它有3种使用语法
LIMIT 初始位置,记录数
、LIMIT 记录数
和LIMIT 记录数 OFFSET 初始位置
”用法中的’初始位置’从0开始算起。 如从第4行开始返回就指定为3。
比如: ‘LIMIT 3 5’ 和 ‘LIMIT 5 OFFSET 3’ 的执行结果相同, 都是返回从第4条记录开始之后的5条记录。
08、模糊查询
select 列名 from 表名 where 列名 like '_M%'
模糊查询 like (其实也是限定查询中的一个常用条件)
- select * from name where b like ‘_M%’
查询b列中 第二个字母为M的模糊查询中的 ‘_’和’%’
代表一个字符 _
代表多个字符 %
%% 作为全匹配使用
本章总结
本章节涉及到查询语句属于DML中开发人员的常用基础,需要刻意去记忆,多复习笔记
五、排序
1、在sql中,可以使用ORDER BY 对查询结果进行排序
SELECT *|列名 FROM 表名 {WHERE 查询条件} ORDER BY 列名1 ASC|DESC, 列名2 ASC|DESC
注意:
- 1、ORDER BY 列名
默认升序排列(也就是说可以省略ASC);如果降序排列(DESC必须写上)- 2、当排序列如示例语法有两个, 那就是在第一个列的排序遇到相同行时,在此基础上按后面第二列的条件继续排。依次类推。
本章总结
不管查询语句有多长,排序语句都要写在最后
六、Oracle中的函数
1、伪表概念(凭空获得数据)
当我们需要凭空获得一些值或数据的时候,只用 select 值|数据 这个语句时行不通的,一定要加 from 表名 才行。 这里的表名就可以用 伪表 dual。
- SELECT 1 FROM dual
这个语句可以凭空获得一个数值 1
2、单行函数
01.字符函数
- 1.把小写的字符转换成大写的字符
upper(‘smith’)SELECT upper('smith') FROM dual
–结果是 SMITH- 2.把大写的字符转换成小写的字符
lower(‘SMITH’)SELECT lower('SMITH') FROM dual
–结果是 smith- 3.把首字母大写
initcap(‘smith’)SELECT initcap('smith') FROM dual
–结果是 Smith- 4.字符串的连接可以使用concat 也可以使用“ || ”。建议使用后者
concat(‘hello’,’world’)
‘hello’ || ‘world’ –建议使用SELECT concat('hello','world') FROM dual
–结果是 helloworldSELECT 'hello' || 'world' FROM dual
–结果是 helloworld –建议使用- 5.字符串的截取,使用 substr , 第一个参数是源字符串,第二个参数是开始索引,第三个参数结束的索引,开始的索引使用1和0效果相同
substr(‘hello’,1,3) –索引是从1开始的,而1和0效果一样SELECT substr('hello',1,3) FROM dual
–结果是 hel- 6.获取字符串的长度
length(‘hello’)SELECT length('hello') FROM dual
–结果是 5- 7.字符串替换,第一个参数是源字符串,第二个参数是被替换的字符串,第三个是替换字符串
replace(‘hello’,’l’,’x’)SELECT replace('hello','l','x') FROM dual
–结果是 hexxo
02.数值函数
- 1.四舍五入函数
round()SELECT round(12.534) from dual
–结果是 13SELECT round(12.534,2) from dual
–结果是 12.53- 2.去掉小数
trunc()SELECT trunc(12.834) from dual
–结果是 12SELECT trunc(12.838,2) from dual
–结果是 12.83- 3.取余
mod(10, 3)SELECT mod(10,3) from dual
–结果是 1
03.日期函数
Oracle中提供了很多和日期相关的函数,包括日期的加减,在日期加减时有一些规律
- 日期 - 数字 = 日期
- 日期 + 数字 = 日期
- 日期 - 日期 = 数字(天)
- 范例:查询雇员进入公司的周数。
- 分析:查询雇员进入公司的天数(sysdate - 入职日期)/7 就是周数
- 1.查询当前日期
sysdateSELECT sysdate from dual
–结果是 当前的系统日期- 2.查询两个日期之间的月数
months_between(日期1, 日期2)SELECT months_between(sysdate, 入职日期) from dual
–结果是 月数- 3.获取几个月后的日期
add_months(日期1, 月数)SELECT add_months(sysdate, 5) from dual
–结果是 几个月后的 日期- 4.指定给出下次某日期数
next_day(sysdate, ‘星期一’) –下一个星期一是什么日期SELECT next_day(sysdate, '星期一') from dual
–结果是 下个星期一的 日期- 5.某日期月份的最后一天是什么日期
last_day(sysdate) –当前日期月份最后一天的日期SELECT last_day(sysdate) from dual
–结果是 当前日期月份最后一天的 日期
04.转换函数
- 1.字符串转换函数
to_char(sysdate, ‘yyyy’) –年
to_char(sysdate, ‘mm’) –月
to_char(sysdate, ‘dd’) –日
to_char(sysdate, ‘HH’) –时 12进制
to_char(sysdate, ‘HH24’) –时 24进制 (一般使用24进制)
to_char(sysdate, ‘mi’) –分
to_char(sysdate, ‘ss’) –秒
to_char(sysdate, ‘fmyyyy-mm-dd’) –fm 会去掉前导0 (1997-08-24 -> 1997-8-24)
总之 第二个参数 是一个通配格式 如还有一些不常用的 $美元 L人民币SELECT a, to_char(某日期列,'yyyy') 年, to_char(某日期列,'mm') 月, to_char(某日期列,'dd') 日 from name
–结果是 把某 日期列 拆分成了别名分别为 年 月 日 的三列- 2.数值转换函数
to_number(‘13’) –参数必须是数字的字符串SELECT to_number('10')+to_number('10') from dual
–结果是 20- 3.日期转换函数
to_date(‘1985-04-22 21:34:22’,’yyyy-mm-dd HH24-mi-ss)SELECT to_date('1985-04-22 21:34:22','yyyy-mm-dd HH24-mi-ss) from dual
–结果是 日期
05.通用函数
- 1.空值处理函数
nvl(某列,0) –这里第二个参数0,代表遇到null就用0替换SELECT nvl(b,0) from name
–结果是 b列是空值的行显示的是0- 2.Decode函数
该函数类似 switchSELECT decode(参数,1,'我是1',2,'我是2','其他') from dual
–结果是 参数匹配的字段后的字符串
注意:这个函数很常用 参数可以是 数值。 也可以是 某一列的名字->这一列的变量一个一个的switch匹配后替换- 3.case when … then … when … then … else … end
该函数类似case if … else if … else … end
也就像:when -> if , then -> elif , else -> else 。 case end是代码块边界
本章总结
这些函数中,有些重要的可以记一下,并且其他的也最好能有个印象,知道在哪里查笔记
七、多表查询(重点)
1、多表连接基本查询
顾名思义,使用一张以上的表做查询就是多表查询
SELECT {DISTINCT} *|列名.. FROM 表明1 别名1, 表明2 别名2 {WHERE 限制条件 ORDER BY 排序字段 ASC|DESC...}
- 解释:在多表联合查询时,查出的时多张表的笛卡尔乘积。所以需要在限制条件里做一些匹配,使其各章表中按指定的对应关系连接出查询结果。而某些时候表名会很长,我们一般给表起别名后,然后就可以更方便地使用表中的任意列了。
- 技巧:可以通过别名多次使用同一张表,做列显示,和限定条件判断(避免一些逻辑冲突).
2、外连接(左右连接)
在做多表连接查询时,我们发现,当某些做为限制条件的数据只有单张表中存在的时候,由于限定条件的限制,这些数据就会被丢弃,查不出来。
所以我们引入外连接的概念: 外连接可以至少保证我们一张表的数据是全量的。
- 语法:
(+)
–在限制条件中,要求谁是全量表,就放到其对面非全量表的后面- 解释:
(+)
放到谁后面,谁就是非全量表,谁的对面就是全量表。 (全量表就是不会因为另一张表的数据关联而被筛选掉)- 技巧:做外连接查询的时候。全量表在左端就是左连接,在右端就是右连接。
3、sql1999 对 SQL 的支持
01.交叉连接 CROSS JOIN(了解)
- 交叉连接会产生笛卡尔积 (相当于直接做多表连接查询)
02.自然连接 NATURAL JOIN (了解)
- 自然连接会自动的分析管理条件进行连接,去掉笛卡尔积。 (基本外连接加上限制条件轻松做到)
03.USING 子句, 直接管理操作 (了解)
- 这些能做到的,用普通多表外连接可以更容易的做到。 (了解有这个东西就行)
本章总结
SELECT 列名 FROM 表名 LEFT/RIGHT JOIN 全量列/非全量列 ON 条件 –左右连接通用方法
八、分组查询(重点)
1、分组函数
- 1、 count() 计数
- 2、 max() 最大
- 3、 min() 最小
- 4、 avg() 平均数
- 5、 round() 用于把数值字段四舍五入为指定的小数位数。
2、分组统计
- 1、SELEST 分组函数, 列名 FROM 表名 GROUP BY 列名 ORDER BY 列名
3、分组函数加条件
- 1、 需要给分组函数加条件,不能用where,可以使用 HAVING 。之前表连接需要使用WHERE就正常用。
本章总结
在分组统计的时候,除了分组函数以外的结果列,必须是group by 后面分组中有的列(后面有的列前面才能有,后面没有前面绝对不能有)
九、子查询(重点)
1、子查询
所有的子查询必须在()中编写
子查询的操作中有三类单列子查询: 返回的结果是一列的一个内容
单行子查询: 返回多个列,有可能是一个完整的记录
多行子查询: 返回多条记录
- 1、exists(子语句有返回) 整体结果为真
- 2、not exists(子语句无返回) 整体结果为真
2、并集
- 3、union 对两个结果集进行合并操作(相当于两个都是子集),结果去重(不包括重复行)
- 4、union all 对两个结果集进行合并操作,结果不去重(包括重复行)
本章总结
并集时要合并的列类型必须一致,列名可以不一致,结果列的数量必须一致
十、数据库的变更(增删改)(事务)(重点)
1、增删改
1、增
INSERT INTO 表名 values ( )
– 表名后若不跟具体列名,则 values 后()中要按顺序填入每一列的新增值
INSERT INTO 表名 (列名) values (列名对应新增值) 注意列名 和 新增值 相对位置一致2、改
UPDATE 表名 SET 需要改的列名=值 where 条件
– 这里的条件一般为限制修改哪一行的值等3、删
DELETE FROM 表名 where 条件
– 这里的条件如果没有就是删除整张表的数据
Oracle中可以不写from,但是mysql不行, 而且mysql删除不能有表别名
2、事务
- 增删改等引起数据库变更的操作,必须开启事务
- 1、commit 提交
- 2、rollback 回滚
- 执行update修改数据时,没有提交之前事务是挂起状态,这时这条数据被锁住,如果其他并发者操作此数据,将会阻塞等待被锁住数据解锁后才能操作。
- 3、SELECT * FROM 列名 FOR UPDATE;
本章总结
查询语句后面加上 for update 可使其加上事务锁,在处理并发业务时用得到。
十一、表的管理(重点了解)
1、常用的数据类型
No 数据类型 描述 1 Varchar,varchar2 表示一个字符串 2 NUMBER NUMBER(n)表示一个整数,长度是n
NUMBER(m,n)表示一个小数,总长度是m,小数是n,整数是m-n3 DATA 表示日期类型 4 CLOB 大对象,表示大文本数据类型,可存4G 5 BLOB 大对象,表示二进制数据,可存4G 2、建表
语法:
1
2
3
4
5
6Create table 表名 (
字段1 数据类型 [default 默认值],
字段2 数据类型 [default 默认值],
...
字段n 数据类型 [default 默认值]
);例如:
1
2
3
4
5
6create table person(
person_id number(4),
pname varchar2(10),
age number(3),
birthday date
);3、删表
语法:
1
drop table 表名;
4、截断表
–虽然效果也是删除一张表,不过这个不支持事务,无法回滚,需谨慎使用
1
TRUNCATE TABLE 表名;
5、表的修改
在sql中,使用 alter 可以修改表
添加语法:
1
ALTER TABLE 表名 ADD(列名1 类型 【DEFAULT 默认值】,列名2 类型 【DEFAULT 默认值】...)
修改语法:
1
ALTER TABLE 表名 MODIFY(列名1 类型 【DEFAULT 默认值】, 列名2 类型 【DEFAULT 默认值】。。。)
注意:修改时,如果原有某列的数据长度为200, 则不可以吧该列修改成小于200的列.
本章总结
本章内容比较简单,但一定要会用,能看懂,而日常使用中,一般使用建表工具来做这些事情,可视化强。
十二、约束(重点)
在数据库开发中,约束是必不可少,使用约束可以更好的保证数据的完整性。
1、单表约束
01.主键约束(不能为空,且有唯一性)
主键约束都是在id上使用,而且本身已经默认了内容不能为空,可以在建表的时候指定。
创建一张表,把pid作为主键
1
2
3
4create table person(
pid namber(10) primary key,
name varchar2(10)
)还可以自定义主键名称(比如给主键pid起个叫ppppp的名字
1
2
3
4
5create table person(
pid namber(10) ,
name varchar2(10),
constraint ppppp primary key(pid)
)
02.非空约束(不能为空)
语法:
1 | create table person( |
03.唯一约束(唯一性)
语法:
1 | create table person( |
- 也可以自定义名称 (参考主键约束自定义名称)
constraint 自定义名 unique(真实列名)
04.检查约束
使用检查约束可以来约束字段值的合法范围。
范例:创建一张表性别只能是1或2
1
2
3
4
5
6create table person(
pid number(10),
name varchar2(10),
gender number(1) check(gender in(1,2)),
birthday date
);也可以自定义名称 (参考主键约束自定义名称)
外键约束(不建议使用物理外键)
外键是两张表的约束。可以保证关联数据的完整性。
- 范例:创建两张表,一张订单表,一张是订单明细表,订单和明细是一对多的关系。
create table orders(
order_id number(4),
totalPrice number(7,2),
order_time date,
constraint orders_order_id_pk primary key(oredr_id)
)create table order_detail(
detail_id number(4),
item_name varchar2(10),
price number(7,2),
quantity number(4),
order_id number(4), –另一个表的主键,因此插入时,另一个表中没有的数据不能插入
constraint order_detail_id_pk primary key(detail_id)
constraint order_deteil_order_id_fk foreign key(order_id) references orders(order_id)
)
–最后一句中使用 foreign key( ) references orders( ) 给两张表做了外键约束- 有外键约束关系的表,子表插入时有外键约束;主表删除数据和删除表是有外键约束,需要先子表删除数据和删除表。 如果在外键约束后 跟上on delete cascade 级联删除设置,就可以任意的删除主表内容了。
十三、rownum 和 分页 (重点)(注意: mysql使用limit即可)
oracle数据库不支持mysql、postgresql的limit功能,但是可以通过rownum来限制返回结果集的行数,达到同样的效果。
使用时需要注意, 如下例:
select rownum,t.* form emp t where rownum < 6;
rownum 大于号>, 所以下面的分页方式是错误的
select rownum,t.* form emp t where rownum > 5 and rownum < 11;
- 正确的分页步骤:(通过子查询实现)
- 第一步,查询全量的数据
select * from emp;
- 第二步,以第一步的结果集作为一张表,限定条件是rownum小于结束行号, 结果列把rownum作为结果集
select rownum rw, a.* from (select * from emp) a where rownum < 11;
- 第三步,以第二步的结果集作为一张表,限定条件是第二步的rownum列大于开始行号,结果列是*
select * from (select rownum rw, a.* from (select * from emp) a where rownum < 11) b where b.rw > 5;
- 第一步,查询全量的数据
####### 最终分页模板 #######
select
from (select rownum rw, a. from (
select * from emp –这里就是需要分页的表
) a where rownum < 11) b –页码范围,结束行号
where b.rw > 5; –页码范围,开始行号
/* 像这种简单繁琐的东西,都是可以用写小脚本解决的
已知条件:
pageNo: 当前的页码
pageSize:每页记录数
未知条件:
startNum:开始行号
endNum: 结束行号
pageNo | pageSize | startNum | endNum |
---|---|---|---|
1 | 5 | 0 | 6 |
2 | 5 | 5 | 11 |
3 | 5 | 10 | 16 |
公式:
startNum = (pageNo - 1)pageSize;
endNum = pageNopageSize + 1;
*/
十四、视图(一般不做增删改)
视图就是封装了一条复杂的查询语句
语法1: CREATE VIEW 视图名称 AS 子查询
范例: 建立一个视图,此视图包括了20部门的全部员工信息
create view empvd20 as select * from emp t where t.deptno = 20
视图创建完毕就可以通过视图来查询了select * from empvd20
- 创建视图的时候,后面查询的sql语句中不能有重复的列名
语法2: CREATE OR REPLACE VIEW 视图名称 AS 子查询
如果视图已经存在我们可以使用语法2来创建视图,这样已有的视图会被覆盖。
- 对视图做修改,其实是修改视图对应的表的数据,视图不建议修改(跟mysql不一样)
- 建议创建只读视图,在视图创建语句的末尾加上 with read only 使视图无法修改。
十五、序列(重点)
在很多数据库中都存在一个自动增长的列,如果目前想在 oracle 中完成自动增长的功能,则只能依靠序列完成,所有的自动增长操作,需要用户手工完成处理。
语法:CREATE SEQUENCE 序列名
- 下面写了一些语法内的可选项:
- INCREMENT BY n
–设置步长 (不设置时默认为1) - START WITH n
–设置序列从几开始 - {MAXVALUE/MINVALUE n|NOMAXVALUE}
–设置 最大/最小值 数值|没有限制 - {CYCLE|NOCYCLE}
–设置 循环序列|不循环序列 循环序列就是到头了再走一圈 - {CACHE n|NOCACHE}
–关于序列缓存的设置
- INCREMENT BY n
序列虽然是给某张表使用,但是序列和这张表并没有绑定关系,任何一张表使用这个序列都可以。
操作序列的语法:
–创建一个序列,给seqpersonid这张表来用
create sequence seqpersonid;–查询序列的下一个值 (重点)
select seqpersonid.nextval from dual; –每查一次,序列都会做一次自增–查询序列的当前值
select seqpersonid.currval from dual;
十六、索引
索引是用于加速数据存取的数据对象,合理的使用索引可以大大降低 i/o 次数,从而提高数据访问性能。索引有很多种我们主要介绍常用的几种:
先问一个问题:为什么添加了索引之后,会加快查询速度呢?
回答:图书馆里,如果杂乱的放书,检索起来就非常困难,所以将书分类,然后再建一个箱子,箱子里放卡片,卡片里面可以按类查询,这样的话查询速度会快很多很多,这个就有点像索引。索引的好处就是提高你找到书的速度,但是正是因为你建了索引,就应该有人专门来维护索引,维护索引是要有时间精力等开销的,也就是说索引是不能乱建的。因此我们建索引有个原则:如果有一个字段,不经常查询,就不要给他建索引。现在把书变成我们的表,把卡片变成我们的索引,就知道为什么索引会快,又是为什么会有开销。
主键 默认 自带索引
我们创建索引后,不需要主动使用,根据索引列查询时就自动使用了索引
创建索引:
- 单例索引
单例索引是基于单个列建立的索引,比如:CREATE INDEX 索引名 on 表明(列名)
- 单例索引
- 复合索引
复合索引是基于两个列或多个列的索引
在同一张表上可以有多个索引,但是要求列的组合必须不重复CREATE INDEX 索引名1 on 表明(列名1,列名2)
查询数据使用的时候,是由顺序的
比如:CREATE INDEX 索引名2 on 表明(列名2,列名1)
索引名2 和 之前的 索引名1 是两个索引
- 复合索引
索引使用的原则:
- 在大表上建立索引才有意义
- 在where子句后面或者是连接条件上建立索引 (一定程度上保证索引的使用率,避免创建出不使用的索引)
- 索引的层次不要超过4层