数据库知识点总结
1. MySQL
1. 数据库的基本概念
1 | 数据库(DataBase,简称:DB),用于存储和管理数据的仓库。 |
数据库的特点:
- 持久化存储数据,数据库就是一个文件系统
- 方便存储和管理数据
- 使用了统一的方式操作数据库 – SQL
2. MySQL配置操作
1 | 服务启动: |
3. SQL概念
1 | Structured Query Language:结构化查询语言。 |
SQL通用语法:
- SQL 语句可以单行或多行书写,以分号结尾。
- 可使用空格和缩进来增强语句的可读性。
- MySQL 数据库的 SQL 语句不区分大小写,关键字建议使用大写。
- 注释:
- 单行注释: – 注释内容 或 # 注释内容(mysql 特有)
- 多行注释: /* 注释 */
SQL分类:
- DDL(Data Definition Language)数据定义语言:用来定义数据库对象:数据库,表,列等。
- DML(Data Manipulation Language)数据操作语言:用来对数据库中表的数据进行增删改。
- DQL(Data Query Language)数据查询语言:用来查询数据库中表的记录(数据)。
- DCL(Data Control Language)数据控制语言:用来定义数据库的访问权限和安全级别,创建用户。
4. DDL 定义数据库
操作数据库
操作 | 代码 | 备注 |
---|---|---|
创建 | create database 数据库名称 |
创建数据库 |
创建 | create database if not exists 数据库名称 |
创建数据库,判断不存在,再创建 |
创建 | create database 数据库名称 character set 字符集名称 |
创建数据库,并指定字符集 |
查询 | show databases | 查询所有数据库的名称 |
查询 | show create database 数据库名称 |
查询某个数据库的字符集/创建语句 |
修改 | alter database数据库名称 character set 字符集名称 |
修改数据库的字符集 |
删除 | drop database 数据库名称 |
删除数据库 |
删除 | drop database if exists 数据库名称 |
判断数据库存在,存在再删除 |
使用 | select database() | 查询当前正在使用的数据库名称 |
使用 | use 数据库名称 |
使用数据库 |
注意:数据库的名称不可修改
操作表
操作 | 代码 | 备注 |
---|---|---|
创建 | create table 表名(列名1 数据类型1,....列名n 数据类型n) ; |
创建一个表 |
创建 | create table 表名 like 被复制的表名 |
复制表 |
查询 | show tables | 查询某个数据库中所有的表名称 |
查询 | desc 表名 |
查询表结构 |
修改 | alter table 表名 rename to 新的表名 |
修改表名 |
修改 | alter table 表名 character set 字符集名称 |
修改表的字符集 |
修改 | show create table 表名 |
查看表的字符集 |
修改 | alter table 表名 add 列名 数据类型 |
添加一列 |
修改 | alter table 表名 add 列名 数据类型 after 指定列名 |
在指定的列后添加一列 |
修改 | alter table 表名 change 列名 新列别 新数据类型 |
修改列名称和数据类型 |
修改 | alter table 表名 modify 列名 新数据类型 |
修改数据类型 |
修改 | alter table 表名 drop 列名 |
删除列 |
删除 | drop table 表名 |
删除表 |
删除 | drop table if exists 表名 |
判断表存在,存在再删除 |
数据类型:
- int:整数类型
age int
- double:小数类型
score double(5,2)
- date:日期,只包含年月日
yyyy-MM-dd
- datetime:日期,包含年月日时分秒
yyyy-MM-dd HH:mm:ss
- timestamp:时间戳,包含年月日时分秒
yyyy-MM-dd HH:mm:ss
(默认使用系统当前时间赋值)- varchar:字符串
name varchar(20)
(括号里数字为可接收最大字符数)
5. DML 增删改表中数据
操作 | 代码 | 备注 |
---|---|---|
添加 | insert into 表名 values (值1,值2,...值n) |
给表中每一列赋值 |
添加 | insert into 表名(列名1,列名2,...列名n) values(值1,值2,...值n) |
选择地给表中某一列赋值 |
删除 | delete from 表名 [where 条件] |
删除符合条件的记录 |
删除 | truncate table 表名 |
删除整张表 |
修改 | update 表名 set 列名1 = 值1, 列名2 = 值2,... [where 条件] |
修改指定列的数据 |
注意:
- 除了数字类型,其他类型需要使用引号(单双都可以)引起来,数值类型加引号也不会报错,但是不推荐加
- 若要删除整表,推荐使用
truncate table
,效率高;delete from
内部采用逐个删除,效率低- 若要修改多条记录,可以指定条件数据范围
in()
6. DQL 查询表中记录
1 | 语法格式: |
基础查询
多个字段的查询:
select 字段名1,字段名2... from 表名;
(*来替代查询所有字段)去除重复:
select
distinct字段名1,字段名2... from 表名;
计算列:一般可以使用四则运算计算一些列的值。(一般只会进行数值型的计算)
null参与的运算,计算结果都为null。
ifnull(表达式1,表达式2):
表达式1:需要判断是否为null的字段;表达式2:若该字段为null后的替换值
- 起别名:as(as也可以省略)
条件查询
1. where子句后跟条件 2. 运算符 * <> (相当于!=) * BETWEEN...AND * IN( 集合) 3. 模糊查询 LIKE:占位符:`_`:单个任意字符;`%`:多个任意字符(含0个) 4. IS NULL (是否为空,不能用=null判断) ;IS NOT NULL:不为空
排序查询
- 语法:
order by 排序字段1 排序方式1 ,排序字段2 排序方式2...
- 排序方式:ASC:升序,默认的;DESC:降序
- 如果有多个排序条件,则当前边的条件值一样时,才会判断第二条件
聚合函数
将一列数据作为一个整体,进行纵向的计算,需要排除null值
- count:计算个数(
count(*)
:只要该数据有一列不为空)- max:计算最大值
- min:计算最小值
- sum:计算和
- avg:计算平均值
分组查询
语法:group by 分组字段;
要求:查询条件的字段只能是分组字段和聚合函数
分页查询
语法:limit 要开始显示的索引,每页查询的条数;
公式:开始的索引 = (当前的页码 - 1) * 每页显示的条数
limit 是一个MySQL”方言”
where 和 having 的区别?
- where 在分组之前进行限定,如果不满足条件,则不参与分组;having在分组之后进行限定,如果不满足结果,则不会被查询出来。
- where 后不可以跟聚合函数,having可以进行聚合函数的判断。
7. 约束
非空约束
1 | not null,某一列的值不能为null |
- 创建表时,添加非空约束:CREATE TABLE stu(id INT,NAME VARCHAR(20) NOT NULL);
- 创建表后,添加非空约束:ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;
- 删除非空约束:ALTER TABLE stu MODIFY NAME VARCHAR(20);
唯一约束
1 | unique,某一列的值不能重复,但可以有多个NULL值 |
- 创建表时,添加唯一约束:CREATE TABLE stu(id INT, NAME VARCHAR(20) UNIQUE );
- 创建表后,添加唯一约束:ALTER TABLE stu MODIFY NAME VARCHAR(20) UNIQUE;
- 删除唯一约束:ALTER TABLE stu DROP INDEX NAME;
主键约束
1 | primary key,非空且唯一,一张表只能有一列的值设为主键,是表中记录的唯一标识,一般是数据无关列 |
- 创建表时,添加主键约束:CREATE TABLE stu(id INT PRIMARY KEY, NAME VACHAR(20));
- 创建表后,添加主键约束:ALTER TABLE stu MODIFY id INT PRIMARY KEY;
- 删除主键约束:ALTER TABLE stu DROP PRIMARY KEY;
- 主键约束添加自增长:id INT PRIMARY KEY AUTO_INCREMENT;
外键约束
1 | foreign key,让表于表产生关系,从而保证数据的正确性 |
创建表时,添加外键约束:
constraint
外键名称
foreign key(外键列名称)
references主表名称(主键列名称)
①外键列名称为受约束的列名称,主键列名称为约束别人的列名称;
外键名称可以自定义,起到删除时索引的作用 。一般格式:当前表名 _ 外键表名 _ fk
创建表之后,添加外键约束:ALTER TABLE stu ADD + ①
删除外键约束:ALTER TABLE stu DROP FOREIGN KEY
外键名称
;级联操作:级联更新:ON UPDATE CASCADE ;级联删除:ON DELETE CASCADE
8. 数据库的设计
1 | 1. 一对一:实现方式:一对一关系实现,可以在任意一方添加唯一外键指向另一方的主键。 |
9. 数据库设计范式
1 | 1. 第一范式(1NF):每一列都是不可分割的原子数据项 |
几个概念:
- 函数依赖:A–>B,如果通过A属性(属性组)的值,可以确定唯一B属性的值,则称B依赖于A。
- 完全函数依赖:A–>B, 如果A是一个属性组,则B属性值的确定需要依赖于A属性组中所有的属性值。
- 部分函数依赖:A–>B, 如果A是一个属性组,则B属性值得确定只需要依赖于A属性组中某一些值即可。
- 传递函数依赖:A–>B, B – >C . 如果通过A属性(属性组)的值,可以确定唯一B属性的值,在通过B属性(属性组)的值可以确定唯一C属性的值,则称 C 传递函数依赖于A。
- 码:一张表中,一个属性或属性组,被其他所有属性所完全依赖,则称这个属性(属性组)为该表的码。
第一范式表(1NF):原子数据项
学号 | 姓名 | 系名 | 系主任 | 课程名称 | 分数 |
---|---|---|---|---|---|
10010 | 张无忌 | 经济系 | 张三丰 | 高等数学 | 95 |
10010 | 张无忌 | 经济系 | 张三丰 | 大学英语 | 87 |
10010 | 张无忌 | 经济系 | 张三丰 | 计算机基础 | 65 |
10011 | 令狐冲 | 法律系 | 任我行 | 法理学 | 77 |
10011 | 令狐冲 | 法律系 | 任我行 | 大学英语 | 87 |
10011 | 令狐冲 | 法律系 | 任我行 | 法律社会学 | 65 |
10012 | 杨过 | 法律系 | 任我行 | 法律社会学 | 95 |
10012 | 杨过 | 法律系 | 任我行 | 法理学 | 97 |
10012 | 杨过 | 法律系 | 任我行 | 大学英语 | 99 |
存在问题:
- 存在非常严重的数据冗余(重复):姓名、系名、系主任
- 数据添加存在问题:添加新开设的系和系主任时,数据不合法
- 数据删除存在问题:张无忌同学毕业了,删除数据,会将系的数据一起删除。
第二范式表(2NF):消除部分函数依赖
学号 | 课程名称 | 分数 | 学号 | 姓名 | 系名 | 系主任 |
---|---|---|---|---|---|---|
10010 | 高等数学 | 95 | 10010 | 张无忌 | 经济系 | 张三丰 |
10010 | 大学英语 | 87 | 10011 | 令狐冲 | 法律系 | 任我行 |
10010 | 计算机基础 | 65 | 10012 | 杨过 | 法律系 | 任我行 |
10011 | 法理学 | 77 | ||||
10011 | 大学英语 | 87 | ||||
10011 | 法律社会学 | 65 | ||||
10012 | 法律社会学 | 95 | ||||
10012 | 法理学 | 97 | ||||
10012 | 大学英语 | 99 |
第三范式表(3NF):消除传递依赖
学号 | 课程名称 | 分数 | 学号 | 姓名 | 系名 | 系名 | 系主任 |
---|---|---|---|---|---|---|---|
10010 | 高等数学 | 95 | 10010 | 张无忌 | 经济系 | 经济系 | 张三丰 |
10010 | 大学英语 | 87 | 10011 | 令狐冲 | 法律系 | 法律系 | 任我行 |
10010 | 计算机基础 | 65 | 10012 | 杨过 | 法律系 | ||
10011 | 法理学 | 77 | |||||
10011 | 大学英语 | 87 | |||||
10011 | 法律社会学 | 65 | |||||
10012 | 法律社会学 | 95 | |||||
10012 | 法理学 | 97 | |||||
10012 | 大学英语 | 99 |
10. 数据库的备份和还原
备份:
mysqldump -u用户名 -p密码 数据库名称 > 保存的路径
还原:登录数据库—>创建数据库—>使用数据库—>执行文件 source 文件路径
11. 多表查询
隐式内连接
使用where条件消除无用数据:
SELECT * FROM emp,dept WHERE emp.dept_id = dept.id
显式内连接
表名1 [inner] join 表名2 on 条件:
SELECT * FROM emp INNER JOIN dept ON emp.dept_id= dept.id
外链接查询
左外连接:查询左表所有数据以及其和右表交集部分
语法:select 字段列表 from 表1 left [outer] join 表2 on 条件
右外连接与左外连接正好相反:select 字段列表 from 表1 right [outer] join 表2 on 条件;
子查询
1 | 查询中嵌套查询,称嵌套查询为子查询。 |
- 子查询的结果是单行单列的:子查询可以作为条件,使用运算符去判断。
- 子查询的结果是多行单列的:子查询可以作为条件,使用in(结果)来判断。
- 子查询的结果是多行多列的:子查询可以作为一张虚拟表参与查询。
12. 事务
1 | 如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。 |
基本操作:
- 开启事务:
start transaction;
- 回滚:
rollback;
- 提交:
commit;
提交方式:
- 自动提交:一条DML(增删改)语句会自动提交一次事务。(mysql)
- 手动提交:需要先开启事务,再提交。(Oracle)
- 修改事务的默认提交方式:
- 查看事务的默认提交方式:
SELECT @@autocommit;
1 代表自动提交,0 代表手动提交- 修改默认提交方式:
set @@autocommit = 0;
四大特征ACID
- 原子性Atomic:是不可分割的最小操作单位,要么同时成功,要么同时失败。
- 一致性Consistent:事务操作前后,数据总量不变
- 隔离性Isolated:多个事务之间。相互独立。
- 持久性Duration:当事务提交或回滚后,数据库会持久化的保存数据。
隔离级别
1 | 多个事务之间隔离的,相互独立的。但是如果多个事务操作同一批数据,则会引发一些问题: |
四种隔离级别:
- read uncommitted:读未提交。产生的问题:脏读、不可重复读、幻读
- read committed:读已提交 (Oracle)。产生的问题:不可重复读、幻读
- repeatable read:可重复读 (MySQL默认)。产生的问题:幻读
- serializable:串行化。可以解决所有的问题
数据库查询隔离级别:
select @@tx_isolation;
数据库设置隔离级别:
set global transaction isolation level 级别字符串;
注意:隔离级别从小到大安全性越来越高,但是效率越来越低
13. DCL 控制用户权限
用户管理
操作 | 代码 | 备注 |
---|---|---|
添加 | CREATE USER '用户名'@'主机名' IDENTIFIED BY'密码' |
创建一个用户 |
删除 | DROP USER '用户名'@'主机名' |
删除指定用户 |
修改 | UPDATE USER SET PASSWORD = PASSWORD('新密码') WHERE USER ='用户名' |
修改用户密码 |
修改 | SET PASSWORD FOR '用户名'@'主机名' = PASSWORD('新密码') |
修改用户密码 |
查询 | 切换到mysql数据库后,SELECT * FROM 用户名 |
查询用户信息 |
重置root用户密码:
- 停止mysql服务:管理员运行cmd – > net stop mysql
- 使用无验证方式启动mysql服务: mysqld –skip-grant-tables
- 打开新的cmd窗口,直接输入mysql命令,敲回车。就可以登录成功
- 切换到mysql数据库:use mysql;
- 重置密码:update user set password = password(‘你的新密码’) where user = ‘root’;
- 关闭两个窗口
- 打开任务管理器,手动结束mysqld.exe 的进程
- 启动mysql服务:net start mysql
- 使用新密码登录
权限管理
操作 | 代码 | 备注 |
---|---|---|
查询 | SHOW GRANTS FOR '用户名'@'主机名' |
查询权限 |
授予 | grant 权限列表 on数据库名.表名 to '用户名'@'主机名' |
授予权限 |
撤销 | revoke 权限列表 on数据库名.表名 from '用户名'@'主机名' |
撤销权限 |
通配符: % 表示可以在任意主机使用用户登录数据库;
localhost
主机名仅限于本机使用。给user用户授予所有权限,在任意数据库任意表上:
GRANT ALL ON * . * TO ‘user’ @ ‘%’;
2. JDBC
1. JDBC
1 | Java DataBase Connectivity Java :数据库连接 |
操作步骤:
导入驱动jar包
- 复制mysql-connector-java-5.1.37-bin.jar到项目的libs目录下
- 右键–>Add As Library
注册驱动(mysql5之后的驱动jar包可以省略注册驱动的步骤)
Class.forName("com.mysql.jdbc.Driver");
获取数据库连接对象 Connection
Connection conn = DriverManager.getConnection(String url, String user, String password);
定义sql语句
String sql = "update account set balance = 500 where id = 1";
获取执行sql的对象 Statement
Statement stmt = conn.createStatement();
执行sql
int count = stmt.executeUpdate(sql);
处理结果
System.out.println(count);
释放资源
stmt.close(); conn.close();
Connection 数据库连接对象
1 | Connection conn = DriverManager.getConnection(String url, String user, String password); |
功能:
- 获取执行sql 的对象:
Statement createStatement()
PreparedStatement prepareStatement(String sql)
- 管理事务:
- 开启事务:
setAutoCommit(boolean autoCommit)
:调用该方法设置参数为false,即开启事务- 提交事务:
commit()
- 回滚事务:
rollback()
Statement 执行sql的对象
boolean execute(String sql)
:可以执行任意的sqlint executeUpdate(String sql)
:执行DML(insert、update、delete)语句、DDL(create,alter、drop)语句。返回值为影响的行数,可以通过这个影响的行数判断DML语句是否执行成功:返回值>0的则执行成功,反之,则失败。ResultSet executeQuery(String sql)
:执行DQL(select)语句
ResultSet 结果集对象
boolean next()
:游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据),如果是,则返回false,如果不是则返回true。
getXxx(参数)
:获取数据,XXX如:int getInt(),String getString()参数可以是int,代表列的编号,从1开始;也可以是String,代表列名称。
1 | //代码展示,展示指定表中数据 |
2. JDBCUtils 抽取JDBC工具类
1 | //JDBCUtils 代码展示 |
3. 用户登录案例与sql注入问题
1 | 在拼接sql时,有一些sql的特殊关键字参与字符串的拼接,会造成安全性问题。PreparedStatement对象可以解决这个问题,预编SQL语句时使用“?”作为占位符,可以防止SQL注入,同时效率更高。 |
1 | // 使用JDBCUtils完成登录案例代码展示 |
4. JDBC事务控制
1 | public static void main(String[] args) { |
5. 数据库连接池
1 | 本质是一个存放数据库连接的容器(集合)。当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。 |
好处:针对数据库连接对象的复用,可以节约创建以及销毁数据库连接对象的资源,提高用户访问效率。
标准接口:DataSource
常用方法:获取连接:getConnection();归还连接:Connection.close()
C3P0 数据库连接池技术
1 | //使用步骤: |
Druid 数据库连接池技术
1 | //使用步骤: |
1 | //代码展示:根据Druid技术,定义工具类JDBCUtils |
6. Spring JDBC
1 | Spring框架对JDBC的简单封装,提供了一个JDBCTemplate对象简化JDBC的开发。 |
常用方法:
使用数据源DataSource,创建JdbcTemplate对象:
JdbcTemplate template = new JdbcTemplate(ds);
update():执行DML增、删、改语句:
int count = template.update(sql);
queryForMap():将列名作为key,值作为value,将一条记录封装为一个map集合
Map<String, Object> map = template.queryForMap(sql);
queryForList():将每一条记录封装为一个Map集合,再将Map集合装载到List集合中
List<Map<String, Object>> list = template.queryForList(sql);
query():查询结果,将结果封装为JavaBean对象
List<T> list = template.query(sql, new BeanPropertyRowMapper<T>(T.class));
queryForObject:查询结果,将结果封装为对象,一般用于获取单行单列的数值数据
String count = template.queryForObject(sql, String.class);
3. Redis
1. Redis
1 | Redis是用C语言开发的一个开源的高性能键值对的NOSQL(Not Only SQL)非关系型数据库,通过将数据缓存于内存中,提升程序的读写效率。官方测试:50个并发执行100000个请求,读的速度是110000次/s,写的速度是81000次/s。 |
NOSQL和关系型数据库
比较 | 非关系型数据库 | 关系型数据库 |
---|---|---|
成本 | 基本开源,部署简单 | 价格高昂 |
性能 | 不支持事务处理,不经过SQL层解析,性能高 | 事务支持,安全性高,可实现多表复杂查询 |
查询速度 | 数据存储于缓存中,速度快 | 数据存储于硬盘中,速度慢 |
拓展性 | 数据间没有耦合,容易水平拓展 | 多表查询机制导致拓展艰难 |
维护性 | 新技术维护工具和资料有限 | 长时间积累,工具丰富 |
存储格式 | 格式丰富(value、文档、图片等等) | 只支持基础类型 |
学习成本 | 没有统一工业标准,学习成本较高 | 支持sql标准,技能易迁移 |
对于这两类数据库,对方的优势就是自己的弱势,反之亦然。两者是互补的关系,一般会将全部数据存储在关系型数据库中,然后在nosql数据库中备份存储不常变化,使用频率高的数据。
主流的NOSQL产品
- 键值(Key-Value)存储数据库:Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB
- 列存储数据库:Cassandra, HBase, Riak
- 文档型数据库:CouchDB、MongoDB
- 图形(Graph)数据库:Neo4J、InfoGrid、Infinite Graph
Redis特点
Redis速度快的原因:
- 因为Redis使用C语言开发 C语言可以直接操作内存
- Redis 是内存(JVM)操作内存(redis数据库)
- Redis多路复用的IO
- Redis是单线程的,避免了并发和锁对性能的消耗
Redis支持的键值数据类型:
- 字符串类型 string
- 哈希类型 hash
- 列表类型 list:linkedlist格式,支持重复元素
- 集合类型 set:不允许重复元素
- 有序集合类型 sortedset:不允许重复元素,且元素有顺序
Redis命令操作
字符串类型(String)
- 存储:
set key value
- 获取:
get key
- 删除:
del key
哈希类型(hash)
存储:
hset key field value
获取:
hget key field
:获取指定的field对应的值
hgetall key
:获取所有的field和value删除:
hdel key field
列表类型(list)
添加:
lpush key value:将元素加入列表左表
rpush key value:将元素加入列表右边
获取:
lrange key start end
:start为起始位置,end为结束位置(0 -1可获取所有元素)删除:
lpop key
:删除列表最左边的元素,并将元素返回
rpop key
:删除列表最右边的元素,并将元素返回集合类型(set):不允许重复元素
- 存储:
sadd key value
:将一个value放入key集合中- 获取:
smembers key
:获取set集合中所有元素- 删除:
srem key value
:删除set集合中的某个元素有序集合类型(sortedset) :不允许重复元素,且元素有顺序。
每个元素都会关联一个double类型的分数,redis通过该分数来为集合中的成员进行从小到大的排序。
- 存储:
zadd key score value
- 获取:
zrange key start end [withscores]
- 删除:
zrem key value
通用命令:
- 获取所有的键:
keys *
- 获取键对应的value类型:
type key
- 删除指定的key-value:
del key
Redis持久化机制
RDB:在一定的间隔时间中,检测key的变化情况,然后持久化数据。为Redis默认持久化方式,通过编辑redis.windwos.conf文件可以自定义持久化参数:
save 900 1
:after 900 sec (15 min) if at least 1 key changed
save 60 10000
:after 60 sec if at least 10000 keys changedAOF:日志记录的方式,可以记录每一条命令的操作。触发设定的动作后,持久化数据,通过编辑redis.windwos.conf文件可以自定义持久化参数:
appendonly no
(关闭aof) –>appendonly yes
(开启aof)
appendfsync always
:每一次操作都进行持久化
appendfsync everysec
:每隔一秒进行一次持久化
appendfsync no
:不进行持久化
2. Jedis
1 | 一款java操作redis数据库的工具。 |
Jedis方法:
- 获取连接:
Jedis jedis = new Jedis("localhost",6379);
- 操作:
jedis.set("username","zhangsan");
- 关闭连接:
jedis.close();
- 指定过期时间:
jedis.setex("activecode",20,"hehe");
1 | //jedis连接池 |
4. Oracle
1. Oracle
1 | ORACLE数据库是目前最流行的C/S或B/S体系结构的关系型数据库,具有完整的数据管理和分布式处理的功能。 |
数据库:Oracle数据库是一个操作系统只有一个库,可以看做是Oracle就只有一个大数据库。
实例:一个Oracle实例(Oracle Instance)有一系列的后台进程(Backguound Processes)和内存结构 (Memory Structures)组成。一个数据库可以有n个实例。
用户:用户在实例下建立,不同实例可以创建相同名字的用户。
表空间:表空间是Oracle对物理数据库上相关数据文件(ORA或者DBF文件)的逻辑映射。每个表空间由同一磁盘上的一个或多个文件组成,这些文件叫数据文件(datafile)。一个数据文件只能属于一个表空间。
数据文件:数据文件(dbf、ora)是数据库的物理存储单位,一个表空间可以由一个或多个数据文件组成,一个数据文件只能属于一个表空间。一旦数据文件被加入到某个表空间后,就不能删除这个文件,如果要删除某个数据文件,只能删除其所属于的表空间才行。
oracle通过用户和表空间对数据进行管理和存放,但是表不是由表空间去查询的,而是由用户去查询。不同用户可以在同一个表空间建立同一个名字的表,同名的表通过不同用户来区分。
创建表空间
1 | create tablespace itcast //指定表空间名称 |
创建用户
1 | create user itcastuser //指定用户名 |
Oracle中三个重要的角色:connect角色(用户),resource角色(开发人员),dba角色(最高权限)。
表的管理
1 | 创建person表: |
数据的管理
1 | INSERT(增加): |
序列
1 | 创建序列: |
其他函数
空值处理nvl:由于null和任何数值计算都是null,通过nvl处理,可以将null转换为0,nvl(comm,0)
。
Rownum与分页查询
1 | ----emp表工资倒叙排列后,每页五条记录,查询第二页。 |
Oracle视图
1 | 视图就是封装了一条复杂查询的语句,提供一个查询的窗口,所有数据来自于原表。 |
索引
1 | 索引就是在表的列上构建一个二叉树 B+Tree,达到大幅度提高查询效率的目的,但是索引会影响增删改的效率。 |
2. pl/sql语言
1 | PL/SQL(Procedure Language/SQL)是Oracle对sql语言的过程化扩展,在SQL命令语言中增加了过程处理语句(如分支、循环等),使SQL语言具有过程处理能力,结合了SQL语言的数据操纵能力与过程语言的数据处理能力。 |
基本语法
1 | 程序语法: |
变量的类型
基本类型:char, varchar2, date, number, boolean, long
引用变量:Myname emp.ename%type; 在sql中使用into来赋值
记录型变量:e1 emp%rowtype
if分支
1 | 语法1: |
LOOP循环语句
1 | --while循环 |
游标
1 | 游标可以存储查询返回的多条数据 |
1 | 范例:按员工的工种涨工资,总裁1000元,经理涨800元其,他人员涨400元 |
3. 存储过程
1 | 存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。 |
1 | 创建存储过程: |
1 | -- 创建存储过程,通过工号求年薪 |
4. 存储函数
1 | create or replace function 函数名(Name in type, Name in type, ...) return 数据类型 is |
1 | --使用存储函数来实现提供一个部门编号,输出一个部门名称 |
存储过程和存储函数的区别
存储过程和函数的区别在于函数可以有一个返回值;而过程没有返回值。
但过程和函数都可以通过out指定一个或多个输出参数。利用out参数可以在过程和函数中实现返回多个值。
5. 触发器
1 | 数据库触发器是一个与表相关联的、存储的PL/SQL程序。每当一个特定的数据操作语句(Insert,update,delete)在指定的表上发出时,Oracle自动地执行触发器中定义的语句序列。 |
1 | -- 禁止给员工降薪的触发器 |
6. Java程序调用存储过程
1 |
|
5. Lucene
1. 全文检索
1 | 结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等。通常都是使用sql语句进行查询,能很快的得到查询结果。 |
2. 创建索引
索引库的结构
关系型数据库 | 索引库 |
---|---|
库/表 | index |
一行记录 | Document 文档 |
字段 | Field 域 |
每个Document可以有多个Field,每个文档都有一个唯一的编号,就是文档的id。
分析文档
1 | 将原始内容创建为包含域(Field)的文档(document),需要再对域中的内容进行分析,分析的过程是经过对原始文档提取单词、将字母转为小写、去除标点符号、去除停用词等过程生成最终的语汇单元,可以将语汇单元理解为一个一个的单词。每个单词叫做一个Term,不同的域中拆分出来的相同的单词是不同的term。 |
创建索引
1 | 创建索引是对语汇单元索引,通过词语找文档,这种索引的结构叫倒排索引结构,最终可实现只搜索被索引的语汇单元从而找到Document(文档)。倒排索引结构也叫反向索引结构,包括索引和文档两部分,索引即词汇表,它的规模较小,而文档集合较大。 |
代码演示
1 | public void createIndex() throws IOException { |
3. 查询索引
1 |
|
4. 分词器
IKAnalyzer 中文分词器
使用方法:
把jar包添加到工程中
把配置文件和扩展词典和停用词词典添加到classpath下(禁止使用windows记事本编辑扩展词典文件)
使用自定义分词器
1
2
3
4
5
6 > public void createIndex() throws IOException {
> Directory directory = FSDirectory.open(new File("C:\\index").toPath());
> //基于Directory对象创建一个IndexWriter对象
> IndexWriterConfig config = new IndexWriterConfig(new IKAnalyzer());
> IndexWriter indexWriter = new IndexWriter(directory, config);}
>
5. Field域的属性
Field类 | 数据类型 | Analyzed | Indexed | Stored | Case |
---|---|---|---|---|---|
StringField | 字符串 | N | Y | Y/N | 身份证号 |
LongPoint | Long型 | Y | Y | N | |
StoredField | 支持多种类型 | N | N | Y | 文件路径 |
TextField | 字符串或流 | Y | Y | Y/N | 知网文章 |
是否分析:是否对域的内容进行分词处理。前提是我们要对域的内容进行查询。
是否索引:将Field分析后的词或整个Field值进行索引,只有索引方可搜索到。
是否存储:将Field值存储在文档中,存储在文档中的Field才可以从Document中获取
6. 索引库维护
1 |
|