执行计划中牢记几句话:
-- 尽量避免是*代替所有列,编写查询语句时使用具体列名代替*,可以防止全表扫描
-- 尽可能少的使用like关键字进行模糊查询
-- 建立适当的索引可以提高查询效率
十三. 执行计划--通过PL/SQL Developer查看查询的
1 执行计划是一条查询语句在Oracle中的执行过程或访问路径的描述.
2 配置执行计划需要显示的项
3 执行计划的常用列字段解释
基数(Cardinality):Oracle 估计的当前操作的返回结果集行数
字节(Bytes):执行该步骤后返回的字节数
耗费(COST)、CPU 耗费:Oracle 估计的该步骤的执行成本,用于说明 SQL 执行的代价,理论上越小越好(该值可能与实际有出入)
时间(Time):Oracle 估计的当前操作所需的时间
4 使用执行计划
通过工具启动执行计划。选中需要查看执行计划的查询语句,在工具栏中选择Tools--->Explain Plan或者是选择需要查看执行计划的查询语句按 F5。
5 查看执行计划
5.1执行顺序
缩进最多的最先执行;(缩进相同时,最上面的最先执行)。
5.2表访问的几种常见方式(非全部):
(1) TABLE ACCESS FULL(全表扫描): --建议数据小的表使用
扫描所有表,并检查每一行是否满足where限制条件
(2) TABLE ACCESS BY INDEX ROWID(通过 ROWID 的表存取)
(****注意:rowid在这里也是伪列(和rownum一样) ,是由 Oracle 自动加在表中每行最后的一列伪列,是在该行生命周期内不会发生改变的列.)
行的 ROWID 指出了该行所在的数据文件、数据块以及行在该块中的位置,所以通过ROWID 可以快速定位到目标数据上,这也是 Oracle 中存取单行数据最快的方法
(3) TABLE ACCESS BY INDEX SCAN(索引扫描)
在索引块中,既存储每个索引的键值,也存储具有该键值的行的 ROWID
索引扫描分为两步:
1 扫描索引得到对应的 ROWID。
2 通过 ROWID 定位到具体的行读取数据。
索引扫描常用五种类型:
INDEX UNIQUE SCAN(索引唯一扫描)
针对唯一性索引(UNIQUE INDEX)的扫描,每次至多只返回一条记录;
表中某字段存在 UNIQUE、PRIMARY KEY 约束时,Oracle 常实现唯一性扫描;
INDEX RANGE SCAN(索引范围扫描)
使用一个索引存取多行数据;
发生索引范围扫描的三种情况:
1 在唯一索引列上使用了范围操作符(如:> < <> >= <= between);
2 在组合索引上,只使用部分列进行查询(查询时必须包含前导列,否则会走全表扫描);
3 对非唯一索引列上进行的任何查询;
INDEX FULL SCAN(索引全扫描)
进行全索引扫描时,查询出的数据都必须从索引中可以直接得到;
INDEX FAST FULL SCAN(索引快速扫描)
扫描索引中的所有的数据块,与 INDEX FULL SCAN 类似,但是一个显著的区别是它不对查询出的数据进行排序(即数据不是以排序顺序被返回);
INDEX SKIP SCAN(索引跳跃扫描)
表有一个复合索引,且在查询时有除了前导列(索引中第一列)外的其他列作为条件;
6 Oracle的优化器
Oracle 的优化器种类
RBO(Rule-Based Optimization) 基于规则的优化器 --已经被抛弃,过时了
CBO(Cost-Based Optimization) 基于代价的优化器
CBO比RBO更加合理可靠,是通过计算各种可能的执行计划的“代价”,即 COST,从中选用 COST 最低的执行方案作为实际运行方案
7 执行计划的使用
7.1单表中使用
7.1.1分析查询表中的所有数据
7.1.1.1 示例
查询 employees 表中的所有数据
7.1.2分析主键作为条件的查询
7.1.2.1 示例
查询 employees 表中 employees_id 为 100 的雇员
7.1.3分析非主键列作为查询条件
7.1.3.1 示例
查询雇员名字为 Tarloy 的雇员
7.1.4分析 like 条件
7.1.4.1 示例
查询雇员名字中含有 a 的雇员
7.1.5分析非唯一性索引列作为条件的查询
7.1.5.1 示例一
将 last_name 创建索引
create index emp_name on employees(last_name);
7.1.5.2 示例二
查询雇员名字为 Taylor 的雇员。
7.1.6分析非唯一性索引中=、>、< 、<>条件
7.1.6.1 示例一
对雇员薪水列做=、>、<、<>条件判断。
7.1.6.2 示例二
对薪水创建索引,使用薪水列做=、>、<、<>条件判断。
7.2多表
7.2.1内连接
7.2.1.1 示例一
使用等值连接,查询所有部门以及所有部门下的雇员。
7.2.1.2 示例二
使用子查询,查询所有部门以及所有部门下的雇员(代价值为3,性能提升一般)
7.2.2外连接
7.2.2.1 示例一
查询所有雇员与雇员的部门名称,包含那些没有部门的雇员。
7.2.2.2 示例二
查询所有部门以及雇员,包含哪些没有雇员的部门。
十四、 Oracle 的数据导入与导出
做数据备份--导出
做数据恢复时--导入
数据迁移--导入导出
1 数据库导入导出需要注意
1).目标数据库要与源数据库有着名称相同的表空间。
2).目标数据在进行导入时,用户名尽量相同(这样保证用户的权限级别相同)。
3).目标数据库每次在进行数据导入前,应做好数据备份。
4).目标数据导入前,弄清楚是数据覆盖(替换),还是仅插入新数据或替换部分数据表。
5).确定目标数据库磁盘空间是否足够容纳新数据,是否需要扩充表空间。
6).导入导出时注意字符集是否相同,一般 Oracle 数据库的字符集只有一个,并且固定,一般不改变。
7).确定操作者的账号权限。
2 导出数据格式:
Dmp 格式:.dmp 是二进制文件,可跨平台,还能包含权限,效率好。
Sql 格式:.sql 格式的文件,可以文本编辑器查看,通用性比较好,效率不如第一种,适合小数据量导入导出。尤其注意的是表中不能有大字段 (blob,clob,long),如果有,会报错。
Pde 格式:.pde 格式的文件,.pde 为 PL/SQL Developer 自有的文件格式,只能用 PL/SQLDeveloper 工具导入导出,不能用文本编辑器查看。
3 传统方式 exp(导出)和(imp)导入:
3.1命令执行方式
该命令需要在操作系统的命令窗口执行,而非 sql/plus
3.2命令格式
exp|imp 用 户 名 / 密 码 @ 连 接 地 址 : 端 口 / 服 务 名 file= 路 径 / 文 件 名 .dmp full=y|tabels(tablename,tablename...)|owner(username1,username2,username3)
exp:导出命令,导出时必写。
imp:导入命令,导入时必写,每次操作,二者只能选择一个执行。
username:导出数据的用户名,必写;
password:导出数据的密码,必写;
@:地址符号,必写;
SERVICENAME:Oracle 的服务名,必写;---比如:orcl就是服务名
1521:端口号,1521 是默认的可以不写,非默认要写;
file="文件名.dmp" : 文件存放路径地址,必写;
full=y :表示全库导出。可以不写,则默认为 no,则只导出用户下的对象;
tables:表示只导出哪些表;
owner:导出该用户下对象;
full|tables|owner:只能使用一种(不能同时出现 );
3.3导出数据
exp 用户名/密码@oracle 的连接地址:端口/需要导出的服务名 file=路径/文件名.dmp
3.3.1示例
将 HR 用户下的对象导出。
exp hr/oracle@localhost:1521/orcl file=d:/1.dmp
3.4导入数据
imp 用户名/密码@oracle 的连接地址:端口/需要导出的服务名 file=路径/文件名.dmp
3.4.1示例
将导出的 dmp 文件导入到数据库中。
imp hr/oracle@localhost:1521/orcl file=d:/1.dmp
4 使用 PL/SQL Developer 实现数据的导入与导出
4.1导出与导入表对象
有 DMP, SQL, PDE 三种格式,他们的导出导入方法都是大同小异
总体方法如下:
1. 在PL/SQLDeveloper 的tools 工具栏中,有两个选项 Export Tables/Inport Tables导出/导入表
2. 点击之后会出现所有表格,选择自己想要导出的表格,然后在下面栏中会有Oracle Eeport(dmp格式)和SQL Inserts(sql格式),选择之后
3. 再在下 面的 Output file /Input选择自己想要导出的位置,再点击旁边 Export/Inport即可
4.2数据中其他对象的导入与导出---视图,索引,序列
注意:
当使用Export User Objects 导出到结构都是SQL结构多种不同类型的对象时,表中导出的结果只是表结构,并不会包含任何数据.要想导出包含表数据,那就只能使用Export导出导入还是使用Inport 中的SQL insert 方法
在用户中删除导出的内容之后,也可直接将导出的sql内容用笔记本打开之后赋值,再在新打开的command Windows 中粘贴运行,也同样可以导入到处的内容
第三章 MySQL 数据库的使用
一、 MySQL 简介
1 什么是 MySQL
MySQL 是一个关系型数据库管理系统,关系型数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
2 MySQL 特点
MySQL 是开源的,所以你不需要支付额外的费用。
MySQL 支持大型系统的数据库。可以处理拥有上千万条记录的大型数据库。
MySQL 使用标准的 SQL 数据语言形式。
二、 MySQL 的安装与卸载
安装步骤:
license Agreement-->Next-->Sever Only Next-->Excute-->Tnstallation Next-->Product Configuration Next-->Type and Networking Next-->设密 码 Next-->Windows Service Next-->Plugins and Extensions Next-->Apply Server Configuration Execute-->Finish
卸载步骤
1停止 MySQL 服务
2卸载 mysql server
3MySQL 安装目录
4删除注册表中信息
5删除 MySQL 数据库目录
6删除服务中的 MySQL
7重启系统
三、 MySQL 的客户端工具
1 MySQL 自带的客户端端工具
2 第三方客户端工具 Navicat
四、 MySQL 与 Oracle 的区别
1 实例区别
MySQL 是轻量型数据库,开源免费。Oracle 是收费的而且价格非常高。
MySQL 一个实例可以操作多个库,而 Oracle 一个实例只能对应一个库。
MySQL 安装完后 300M 而 Oracle 有 3G 左右。
2 操作区别
主键: MySQL 一般使用自动增长类型,而 Oracle 则需要使用序列对象。
单引号的处理: MySQL 里可以用双引号包起字符串,ORACLE 里只可以用单引号包
起字符串。
分页的 SQL 语句: MYSQL 用 LIMIT,而 Oracle 需要使用内建视图和 rownum 伪列。事务处理:MySQL 默认是自动提交,而 Oracle 默认不自动提交,需要用户 CTL 语言进行事务提交。
这里个人见解: MySQL和Oracle对于数据物理隔离机制上的区别
Oracle装好后会有一个实例和一个库 库中可以创建多个不同的表空间,每个表空间对应一个数据文件.可以创建不同的用户分配不同的表空间,再通过表空间实现物理隔离.所以在Oracle中有一个库就够了.
MySQL是一个实例可以对对应多个不同的库 在MySQL中没有表空间这个概念我们可以创建不同的库,每个库用不同的用户来操作.库和库之间放的是不同的数据文件,所以MySQL是通过不同的库之间实现物理隔离.所以MySQL要先创建库
五 操作 MySQL
1 创建数据库:
CREATE DATABASE 数据库名 DEFAULT CHARACTER SET 字符编码;
1.1 示例
创建一个 test 的数据库,并查看该数据库,以及该数据库的编码。
创建数据库:
create database test default character set utf8;
查看数据库:
show databases;
查看数据库编码:
select schema_name,default_character_set_name from information_schema.schemata where schema_name = 'test';
删除数据库:
Drop database 数据库名称
2 选择数据库
需要在哪个库中创建表需要先选择该数据库。
Use 需要选择的库的名称。
2.1示例一
创建一个名称为 zzsxt 的数据库,编码为 utf8。
create database zzsxt default character set = utf8;
2.2示例二
选择该数据库
use bjsxt;
3 MySQL 中的数据类型
1)数值类型
数值类型中的长度 m 是指显示长度,并不表示存储长度,只有字段指定 zerofill 时有用
例如:int(3),如果实际值是 2,如果列指定了 zerofill,查询结果就是 002,左边用 0 来填充
2)浮点型
3)字符串类型
4)日期类型
二进制数据(BLOB)
1)BLOB 和 TEXT 存储方式不同,TEXT 以文本方式存储,英文存储区分大小写,而 Blob
是以二进制方式存储,不分大小写。
2)BLOB 存储的数据只能整体读出。
3)TEXT 可以指定字符集,BLOB 不用指定字符集。
4 创建表与删除表
4.1创建表
4.1.1通过 DDL 语句创建表
4.1.1.1 示例
创建一个 employees 表包含雇员 ID,雇员名字,雇员薪水。
create table employees(employee_id int,last_name varchar(30),salary float(8,2));
查看已创建的表
Show tables;
5 修改表
5.1使用 DDL 语句修改表名
ALTER TABLE 旧表名 RENAME 新表名
5.1.1示例一
创建一个 employees 表包含雇员 ID,雇员名字,雇员薪水。
create table employees(employee_id int,last_name varchar(30),salary float(8,2));
5.1.2示例二
将 employees 表名修改为 emp。
alter table employees rename emp;
5.2使用 DDL 修改列名
ALTER TABLE 表名 CHANGE COLUMN 旧列名 新列名 类型
ALTER TABLE 旧表名 RENAME 新表名
5.2.1示例
将 emp 表中的 last_name 修改为 name
alter table emp change column last_name name varchar(30);
5.3使用 DDL 语句修改列类型
ALTER TABLE 表名 MODIFY 列名 新类型
5.3.1示例
将 emp 表中的 name 的长度指定为 40
alter table emp modify name varchar(40);
5.4使用 DDL 语句添加列
ALTER TABLE 表名 ADD COLUMN 新列名 类型
5.4.1示例
在 emp 表中添加一个新的列为 commission_pct
alter table emp add column commission_pct float(4,2);
5.5使用 DDL 语句删除列
ALTER TABLE 表名 DROP COLUMN 列名
5.5.1示例
删除 emp 表中的 commission_pct
alter table emp drop column commission_pct;