title: book3 – sql
toc: true
comments: true
categories:
top:
abbrlink: 90843d6a
date: 2021-02-09 09:52:07
tags: Java
这里记录的是Oracle数据库和运维的学习 !
(一)关系型数据库(Oracle)
1. 数据库概述
2. 数据库系统发展史
2.1 数据库设计的三大范式
- 第一范式: 确保每一列的原子性, 不可拆分; 当两列属性相近或相似时, 尽量合并为一列
- 第二范式: 一条数据做一件事, 每一行数据只能与其中一列相关
- 第三范式: 表中的每一列都只能依赖主键, 数据不能存在传递关系, 通过主键可以唯一识别其他数据, 没有相互关联性
3. 主流数据库简介
3.1 常用数据库默认端口号
- SQL Server – 1433
- MyServer – 3306
- MySQL – 3306
- Oracle – 1521
- DB2 – 5000
- PostgreSQL – 5432
3.2 数据库, 数据库管理系统和数据库系统的差异
- 数据库(DB): 数据的仓库
- 数据库管理系统(DBMS): 管理数据库的软件
- 数据库系统(DBS): 计算机硬件 + 软件 + DB + DBMS + DBA(数据库管理员))
4. 结构化查询语言
5. Oracle安装
6. Oracle初使用
6.1 要使用PL/SQL Developer操作管理Oracle数据库
- 端口权限
- 端口配置
(二)查询与排序
1. 数据库表简介
1.1 创建数据表
- 语法
CRATE TABLE 表名
(
字段名1 字段类型,
字段名2 字段类型,
字段名3 字段类型,
…………
约束定义 1,
约束定义 2,
…………
)
- 示例(Oracle下)
CRATE TABLE T_Person
(
FName VARCHAR2(20),
FAGE NUMBER (10)
)
2. 数据查询
2.1 Oracle常用数据类型
类型 | 含义 |
---|---|
CHAR(size) | 存储固定长度的字符串。参数size指定了长度,如果存储的字符串长度小于size,用空格填充。默认长度为1,最长不超过2000字节 |
VARCHAR2(size) | 存储可变长度的字符串。参数size指定了该字符串的最大长度。默认长度为1,最长不超过4000字节 |
NUMBER(p, s) | 存储可变长的数字。既可以存储浮点数,也可以存储整数,p表示数字的最大位数(如果是小数包括整数部分、小数部分和小数点,p默认是38位),s表示小数位数 |
DATE | 存储定长的日期或时间。存储世纪、年、月、日、时、分、秒,存储范围从公元前4712年1月1日到公元后9999年12月31日 |
TIMESTAMP | 和DATE类型大致相同,不过TIMESTAMP精确到了秒后6位小数 |
CLOB | 存储单字节字符大数据。和VARCHAR2数据类型相似,可存储的数据最大可以达到4GB,可以用来存储非结构化的XML文档 |
BLOB | 存储无结构的二进制大数据。可存储的数据最大可以达到4GB,可以用来存储图像、视频、音频等信息 |
ROWID | 表中行的存储地址,该地址可以唯一标识数据库中的一行,可以使用ROWID伪列快速定位表中的一行 |
ROWNUM | 查询返回的结果集中行的序号,可以使用它来限制查询返回的行数 |
2.2 SELECT语句基本语法
SELECT *|字段名|表达式 FROM 表名 [WHERE 条件 [ORDER BY 字段名]]
在最简单的形式中,SELECT语句必须包含一个SELECT子句,指定需要显示的字段;还需要一个FORM子句,指定从哪个表获取数据
语法解释:
- *:选择表中的所有字段
- 字段名:选择表中的字段名称,可以选择多个字段,各个字段间用逗号隔开
- 表达式:由字段、函数等组成
- 表名:指定包含字段的表
- WHERE条件:查询的条件,可以通过该条件进行行选择
- ORDER BY字段名:要求在查询的结果中进行排序,默认是升序ASC,若希望是降序则使用关键字DESC。
假设要通过SQL语句查询DEPARTMENTS表中所有列、所有行的数据,可以使用下面的语句:
SELECT * FROM DEPARTMENTS
注:SQL语句不区分大小写,并以 “;” 结尾,同时,为了方便阅读,SQL关键字采用大写,非SQL关键字采用小写,SQL语句可以写成一行或多行,为了易于阅读和编辑,子句同常放在不同的行,且使用缩进
2.3 算术表达式
数据库中存储的数据可能并不是最终要显示的数据,会存在需要修改数据显示内容已达到显示所需数据的目的,这样就可能会用到算术表达式。一个算术表达式可以包含字段名、固定的数字值和算术运算符。
Oracle中算术运算符只有”+”, “-“, “*”, “/”四个,其中,”/”运算的结果是浮点数。求余运算只能借助函数MOD(x, y)来完成,这个函数的作用就是返回x除以y的余数。
更特别说明一点,在Oracle中,可以对DATE和TIMESTAMP类型进行加、减操作,具体加、减的含义和用法,在后面会说到。
2.4 practice01
- 操作employees表, 将last_name和job_id字段连接, 中间用逗号隔开, 使用Name and Job作为字段标题
select e.last_name || ',' || e.job_id Name and Job
from employees e
2.5 practice02
- 操作employees表, 选定查询department_id和job_id字段, 并去掉重复的行
2.6 SQL语句中有哪几个通配符, 含义分别是
- “%”: 替代0个或多个字符
- “_”: 替代一个字符
- “[charlist]”: 字符列中的任何单一字符
[^charlist]
或[!charlist]
: 不在字符列中的任何单一字符
3. 限定返回行
4. 排序
4.1 顺序排序: order by
4.2 逆序排序: desc
(三)单行函数与多表查询
1. SQL函数
1.1 fm, fx, th, sp四个元素的作用
- fx: 删除填补的空或前导0
- th和sp: 指定后缀来影响数字的显示, th加在数字后面表示序数, sp加在数字后面让数字以英文形式显示, 两个元素也可以结合起来使用
- fx: 指示对需要转换的字符类型和TO_DATE函数的格式或模板必须精确匹配, 包括标点符号和空格
2. 字符数字,日期函数
2.1 修改Oracle中日期显示结果为: “2013/6/23,22-7-16”
“YYYY/MM/DD, HH24-MIMI-SS”
3. 转换函数
4. 通用函数
5. 多表查询
5.1 什么是左连接, 右连接和全连接
- 左连接: 不仅查询出符合连接条件的数据, 还查询出left join 左边不符合连接条件的数据
- 右连接: 不仅查询出符合连接条件的数据, 还查询出right join 右边不符合连接条件的数据
- 全连接: 查询出full join 两边不符合连接条件的数据
6. 外连接
6.1 什么是内连接和外连接
- 内连接: 内查询出符合连接条件的数据
- 外连接: 不仅查询出符合条件的数据, 还查询出不符合条件的数据
(四)子查询与组函数
1. 子查询
1.1 使用GROUP BY进行分组后, select子句或ORDER BY 子句在选择字段时需要注意
- select或order by后面只能是组函数或group by后面出现过的字段, 且不能使用别名
1.2 使用group by 进行分组的sql语句中, where子句和having子句的作用的区别
- where: 用在group by之前; 作用于单个记录
- having: 用在group by之后; 作用于单个组(1行或多行)
2. 组函数
2.1 COUNT组函数的参数”*”和表达式之间的区别
参数是”*”, 则计算所有行, 包括空值; 如果参数是表达式, 如列名, 则忽略空值且考虑重复值
2.2 practice01
有如下表:
- S(SNO, SNAME)学生表, SNO为学号, SNAME为学生姓名;
- C(CNO, CNAME)课程表, CNO为课程号, CNAME为课程名
- SC(SNO, CNO, SCGRADE)选课成绩表, SCGRATE为成绩
使用SQL语句查询下面条件给出的信息:
Q1: 有两门以上(含两门)不及格课程的学生姓名及其平均成绩
Q2: 既学过”语文”又学过”英语”的所有学生姓名
(五)操作数据和管理表
1. 数据操纵语言DML
2. 事务处理
2.1 什么是事务, 其最大的特点是什么?并说明一个事务在什么情况下会结束
- 事务: 一个完整的DML操作
- 最大特点: 原子性, 一致性, 隔离性, 永久性
- 结束, DM了操作结束时就结束了
3. 表
3.1 用子查询创建一个表时, 定义新表的子段属性, 只能定义子段名和默认值
3.2 使用SQL命令查询一个表的表结构
4. 内置约束
4.1 数据库中有哪些常用内置约束
- 主键约束primary key
- 唯一键约束unique
- 非空约束not null
- 检查约束check (age in( , , ))
- 外键约束foreign key(tno) references tea(tno)
(六)视图,序列和索引
1. 视图
1.1 什么是视图, 使用视图可以带来什么好处
- 定义: 视图是一张逻辑表(基于表或其他视图), 其提供了另外一个视角查看或改变表中的数据
- 好处: 隐藏隐私字段, 使数据更加安全; 简化查询
2. 视图的DML操作
2.1 对什么样的视图可以执行DML操作
对于简单视图可以, 复杂视图不可以; 复杂视图指的是子查询中涉及表的数目超过一个, 或包含函数, 或包含数据分组的视图
3. 序列
3.1 什么是序列, 主要作用
- 序列是在数据中一个自动增加的列
- 主要作用
-
-
- 自动提供唯一的数值
- 共享对象
- 主要用于提供主键值
- 代替应用代码
-
4. 索引
4.1 什么是索引? 索引的好处, 在什么情况下创建索引?
- 索引: 能在表中快速查找一个行的数据库结构
- 好处: 提高数据的检索效率
- 创建索引的情况:
-
-
- 表的数据比较大, 则表适合创建索引, 反之小表不适合
- 频繁做查询, 而较少做增删则适合创建索引; 反之增删频繁查询较少的不适合
- where条件中出现的字段多表连接字段
-
4.2 索引会被自动创建的情况
- order会为unique或primary key声明创建一个索引
(七)访问控制和子程序
1. 访问控制
1.1 作为程序开发人员, 常被授予的系统权限包括
- create session
- create table
- create view
- create sequence
- create procedure
1.2 授予和撤销权限的关键字分别是:
- grant
- revoke
2. 子程序
2.1 什么是存储过程和触发器, 使用存储过程的好处
- 存储过程: 有名称的无返回值的程序块
- 触发器: 类似于过程, 不同的是, 触发器无需调用, 当满足一定条件时会自动调用
- 好处:
-
-
- 存储过程允许标准组件式编程;
- 能够实现较快的存储速度
- 能减少网络流量
- 可被作为一种安全机制来充分利用
-
2.2 一个触发器包括哪几个部分?语句触发器和行触发器有什么区别?
- 触发器组成部分: 触发时间(触发器体执行的时机); 触发事件(哪类具体的数据操纵); 触发器类型(触发器体被执行次数); 触发器体(触发器执行的具体操作)
- 语句触发器和行触发器的区别:
- 行触发器有for each row 子句语句, 语句触发器没有
- 行触发器可以有when作为触发限制, 可以使用new/old, 语句触发器不能有when作为触发限制
- 行触发器所对应DML语句所影响到的表中的每一行, 触发器都要执行一遍; 语句触发器对应的DML语句所影响到的表中的所有行, 触发器只执行一遍
(八)备份,恢复与SQL优化
1. 数据库备份与恢复概述
1.1 备份有哪几种不同的方式
- 逻辑备份
- 物理备份(冷备份, 热备份)
1.2 进行冷备份的具体操作步骤和需要注意的事项
冷备份具体步骤:
- 使用SYS登录数据库
SQLPLUS sys/change_on_install AS SYSDBA
- 查询所有控制文件的位置
select * from v$controlfile;
- 查询所有日志文件的位置
select * from v$logfile;
- 查询所有数据文件的位置
select * from v$datafile;
- 查询pfile文件的位置
show parameter pfile
- 记录以上所有文件的位置, 之后关闭数据库实例
shutdown immediate
- 根据记录的位置, 将以上所有文件复制到备份目录中
- 重新启动数据库实例
startup
冷备份注意事项
- 冷备份完成后, 若要进行恢复操作, 只需先关闭数据库实例, 然后将之前备份的文件再复制回原目录中, 重启数据库实例
1.3 使用EXP工具进行导出操作时, 有哪几种不同的方式
- 表方式
- 用户方式
- 全库方式
2. SQL优化
2.1 SQL优化目的
-
- 查询性能低
-
- 执行时间过长
-
- 等待时间过长
-
- SQL写得太差(尤其体现在多表查询上)
-
- 索引失效
-
- 服务器参数(缓存,线程数)设置不合理
-
- 项目需求不合理
2.2 UNION ALL与UNION在执行过程中有什么区别
- UNION ALL对两个结果集进行并集操作, 包括重复行, 不进行排序
- UNION对两个结果集进行并集操作, 不包括重复行, 同时进行默认规则的排序