5. SQL高级--表优化相关(序列、视图等)
5.1 INDEX(索引)
可以在表中创建索引,以便更加快速高效地查询数据。
用户无法看到索引,它们只能被用来加速搜索/查询。
PS:更新一个包含索引的表需要比更新一个没有索引的表花费更多的时间,这是由于索引本身也需要更新。因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引。
5.2 索引新增
--在表上创建一个简单的索引。允许使用重复的值
CREATE INDEX 索引名
ON 表 (列)
--在表上创建一个唯一的索引。不允许使用重复的值:唯一的索引意味着两个行不能拥有相同的索引值。
CREATE UNIQUE INDEX 索引名
ON 表 (列)
--若希望索引不止一个列(联合索引),可以在括号中列出这些列的名称用逗号隔开
CREATE INDEX 索引名
ON 表 (列1, 列2)
5.3 索引查询
--查询某个表的索引
SELECT * FROM USER_INDEXES WHERE TABLE_NAME=UPPER(\'表名\');
--根据“索引名”查询索引的字段
SELECT * FROM USER_IND_COLUMNS WHERE INDEX_NAME=(\'索引名\');
--根据“索引名”查询创建的索引(PS:第一个参数INDEX是固定写法)
SELECT DBMS_METADATA.GET_DDL(\'INDEX\',\'索引名\') FROM DUAL ;
5.4 DROP(撤销/删除)
--删索引
DROP INDEX 索引名
--删表(表结构也删)
DROP TABLE 表
--删表(只删数据)
TRUNCATE TABLE 表
--删库(这个有点刺激哈,别乱整~)
DROP DATABASE 数据库名称
5.5 ALTER(增、删、改)
--增加一列
ALTER TABLE 表
ADD 列 数据类型
--删除一列
ALTER TABLE 表
DROP COLUMN 列
--改列的数据类型(Oracle 10G 以后的版本可以省略COLUMN关键字)
ALTER TABLE 表
MODIFY COLUMN 列 数据类型
5.6 AUTO INCREMENT(自增)
Auto increment 会在新记录插入表中时生成一个唯一的数字,可以利用这一特性自动生成主键序列号。
在 Oracle 中,必须通过 sequence 对象(该对象生成数字序列)创建 auto-increment 字段。
--创建序列
CREATE SEQUENCE 序列名
MINVALUE 1--最小值
START WITH 1--1为起始
INCREMENT BY 1--以1为递增量
CACHE 10--缓存10个值
--调用nextval函数自增
INSERT INTO 表 (ID,列2,列3)
VALUES (序列名.nextval,值2,值3)
5.7 VIEWS(视图)
视图是基于 SQL 语句的结果集的可视化的表。
视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。
可以向视图添加 SQL 函数、WHERE 以及 JOIN 语句,也可以呈现数据,就像这些数据来自于某个单一的表一样。
- 视图的作用:
视图隐藏了底层的表结构,简化了数据访问操作,客户端不再需要知道底层表的结构及其之间的关系。
视图提供了一个统一访问数据的接口。(即可以允许用户通过视图访问数据的安全机制,而不授予用户直接访问底层表的权限)
从而加强了安全性,使用户只能看到视图所显示的数据。视图还可以被嵌套,一个视图中可以嵌套另一个视图。
--创建视图
CREATE VIEW 视图名称 AS 查询语句
--更新视图
CREATE OR REPLACE VIEW 视图名称 AS 查询语句
--撤销视图
DROP VIEW 视图名称
6. DBLINK
6.1 DBLINK 学习
目的:为了解决跨库访问的需求。
场景如下:tnsnames.ora(oracle的库配置文件)下配置了2个库的环境地址,现在要实现跨库访问。
PS:DBLINK和是否同一个主机无关,只要跨库,不管2个库是不是在一台主机上,都要使用DBLINK进行通信(前提条件:两个库端口要通,可以使用telnet命令来测试)
6.2 赋予权限
--在创建database link(DBLINK)之前需要判断,登陆的用户是否具备创建database link 的权限
PS:注意,此时登陆的账号是需要创建dblink的账号(用这个库去调用其他库)
-- 1、查看当前登陆的账号是否具备创建database link 权限
select * from user_sys_privs where privilege like upper(\'%DATABASE LINK%\') AND USERNAME=\'当前登陆的账号\';
PS:如果查询有返回行,则表示具备创建database link权限,否则,则需要使用sys登陆orcl为当前登陆的账号赋予创建权限
-- 2、给当前登陆的账号授予创建dblink的权限
grant create public database link to \'当前登陆的账号\';
-- 3、 再次执行第一条查看是否具备权限的sql语句,会发现有返回行,表示,当前登陆的账号已经具备创建database link的权限
select * from user_sys_privs where privilege like upper(\'%DATABASE LINK%\') AND USERNAME=\'当前登陆的账号\';
6.3 创建 dblink
方式1:pl/sql developer 图形化创建
方式2:sql语句创建
-- 1、注意一点,如果密码是数字开头,用“”括起来
CREATE PUBLIC DATABASE LINK DBLINK名称 CONNECT TO 当前登陆账号 IDENTIFIED BY "密码" USING \'连接的数据库\'
--例:
CREATE PUBLIC DATABASE LINK TESTDBLINK CONNECT TO ZHANGHAO IDENTIFIED BY "123456" USING \'TESTDATABASE\'
-- 2、sql中直接写入库配置
CREATE DATABASE LINK DBLINK名称 CONNECT TO 当前登陆账号 IDENTIFIED BY "密码" USING \'
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS =
(PROTOCOL = TCP)
(HOST = XXX.XXX.XXX)
(PORT = 1521)
)
)
(CONNECT_DATA =
(SERVICE_NAME = XXXX)
)
)
\';
6.4 操作
首先,我们需要在ORCL2库中新建一张表,并插入部分数据,如下图:
现在,我们通过database link 在orcl中访问这张属于orcl2库中WANGYONG的表COMPANY
从截图中可以看到,在ORCL中可以成功访问到ORCL2中用户WANGYONG的表
下面,利用同样的方式,进行插入,修改,删除操作,依次看截图,每一次操作后均执行查询语句,可对比执行效果:
6.4.1 插入
6.4.2 修改
6.4.3 删除
6.5 创建同义词(简化操作)
-- 创建同义词
create synonym TESTSYNONYM(同义词) FOR company@TESTLINK1;
PS:创建同义词以后,查询、插入、修改、删除中可直接用 TESTSYNONYM 代替company@TESTLINK1,例如查询语句可改成如下方式(插入,修改,删除类似):
SELECT * FROM TESTSYNONYM(同义词) order by id -- 查询ORCL2中WANGYONG用户的表COMPANY
参考资料:
Oracle DBLINK 简单使用(特此感谢!)
转载自:有梦想的肥宅