## 第一章
> 三大范式
**第一范式:**
确保每列的原子性(每列都是不可再分的最小数据单元)
**第二范式:**
满足第一范式的前提下,确保表中每列都和主键相关(一张表只干一件事)
**第三范式:**
满足第一二范式的前提下,确保表中每列都和主键直接相关,而不是间接相关。
> 注意:三大范式只作为一种规范作为参考,阿里巴巴数据库规范要求表之间连接最多不超过三张
## 第二章
### 2.1 命令行操作MySQL
> 1.命令行启动MySQL命令:net start mysql
>
> 2.命令行停止MySQL命令:net stop mysql
>
> 3.命令行登录MySQL命令:mysql [-h服务器主机地址] -u用户名 -p密码
### 2.2 SQL语句操作数据库
> 1. 创建数据库:create database 数据库名;
> 2. 查看数据库列表:show databases;
> 3. 选择数据库:use 数据库名;
> 4. 删除数据库:drop database 数据库名;
### 2.3 结构化查询语言
> 1. DML(数据操作语言):用来插入、修改和删除表中的数据,如insert、update、delete等
> 2. DDL(数据定义语言):在数据苦衷创建或删除数据库对象等操作create、drop、alter等
> 3. DQL(数据查询语言):用来数据库中的数据进行查询,指select语句
> 4. DCL(数据控制语言):用来控制数据库组件的存取许可,存取权限等,如grant、revoke等
### 2.4 数据类型
> 1. int[(M)]:4字节,整数用,M可省略
> 2. double[(M,D)]:8字节,小数用,M表示总位数,D表示小数点后保留位数,均可省略
> 3. decimal[(M[,D])]:小数用,比double精度高
> 4. char[(M)]:M字节,M取值为0~255,固定长字符串
> 5. varchar(M):可变长度字符串,M取值范围:0~65535
> 6. datetime:日期,格式YY-MM-DD hh:mm:ss
> 7. timestamp:日期,格式YYYYMMDDHHMMSS
### 2.5 字段约束及属性
> 1. 非空约束:not null
> 2. 默认约束:default
> 3. 唯一约束:unique key
> 4. 主键约束:primary key
> 5. 自动增长:auto_increment(注意,只有主键且整数类型可用)
> 6. foreign key:外键,了解即可
> 7. comment:注释
> 8. engine:存储引擎 选用innodb
> 9. charset/character set:字符集,选用utf8
> 10. collate:排序规则,选用utf8_general_ci
### 2.6创表语句
```sql
create table [if not exists] 表名(
...
primary key(字段名)
)ENGINE=innodb charset=utf8 COLLATE=utf8_general_ci;
```
### 2.7 sql语句操作表
> 1. 查看表:show tables
> 2. 查看表的定义:describe/desc 表名
> 3. 删除表:drop table [if exists] 表名
> MyISAM和InnoDB对比:
>
> 1. MyISAM:节约空间,速度较快
> 2. InnoDB:安全性高,行级锁,支持事务处理,支持多表多用户操作
## 第三章
### 3.1 修改表
```sql
-- 修改表名,语法格式
alter table 旧表名 rename to 新表名;
-- 添加字段,语法格式
alter table 表名 add 字段名 数据类型 属性;
-- 修改字段,语法格式
alter table 表名 change 原字段名 新字段名 数据类型[属性];
alter table 表名 modify 字段名 数据类型 [属性];
-- modify 和change对比:
-- modify用于修改数据类型和属性约束,不能修改字段名
-- change用于修改字段名,数据类型,约束
-- 删除字段,语法格式:
alter table 表名 drop 字段名;
```
### 3.2 数据操作语言
#### 3.2.1 插入数据 insert
```sql
insert into 表名[(字段名列表)] values (值列表1),(值列表2)... ;
```
#### 3.2.2 更新数据记录
```sql
update 表名 set 字段1=值1,字段2=值2,...字段n=值n [where 条件];
```
#### 3.3.3 删除数据记录
```sql
delete from 表名 [where 条件]
```
```sql
truncate table 表名;
```
> delete 和truncate对比:
>
> 1.相同:都能删除数据,不删表结构
>
> 2.不同:truncate重置自增列,执行速度比delete快,慎用
>
> delete不会重置自增列
## 3.3 数据查询
#### 3.3.1 查询语句
```sql
select 字段名列表
from 表名或视图名
[where 查询条件]
[group by 分组字段名]
[having 分组后筛选条件]
[order by 排序字段名 [asc/desc]]
[limit [位置偏移量,]行数]
```
#### 3.3.2 limit子句
> 位置偏移量index,当前页码数 pageNum,每页显示条数pageSize关系:index = (pageNum-1)*pageSize
#### 3.3.3常用函数
> 聚合函数:
>
> 求平均值:avg()
>
> 返回某字段的行数:count()
>
> 求最大值:max()
>
> 求最小值:min()
>
> 返回某字段的和:sum()
SELECT avg(score) as '平均值' from sc; -- 求平均值
SELECT max(score) as '最大值' from sc ;-- 最大值
SELECT min(score) as '最小值' from sc;-- 最小值
select SUM(score) as '和' from sc;-- 求和
select count(1) as '数量' from sc;-- count(*)和count(1)返回的是所有数据的行数,包含为null和空字符串的数据
select count(score) as '数量' from sc;-- count(`字段名`)返回除null和空字符串外的数据的行数
```
#### 3.3.4 子查询
```sql
-- 在查询语句中嵌套查询语句,执行顺序为先执行内层查询(先查询子句),再执行外层查询
select * from student where studentNo in (
select studentNo from result where studentresult<60
);
```
#### 3.3.5 连接查询
> 内连接: A inner join B ... on 条件
>
> 左连接: A leftjoin B ... on 条件
>
> 右连接: A right join B ... on 条件
>
> 等值连接 : from A,B where 条件
举例:
```sql
-- 内连接
select * from student inner join result on student.studentNo=result.studentNo;
-- 左连接
select * from student left join result on student.studentNo=result.studentNo;
-- 右连接
select * from student right join result on student.studentNo=result.studentNo;
-- 等值连接
select * from student, result where student.studentNo=result.studentNo;
```
#### 3.5 in 和not in
> 比较运算符:=、 <、 > 、 >=、 <= 、 !=
当子查询返回值不唯一时,使用in
> between...and ...区间范围取值
> 判断为空:is null /is not null
## 第四章
#### 4.1 exists子查询/not exists
> 语法:select ...from 表名 where exists(子查询);
>
> #exists后面的参数是一个任意的子查询,如果该子查询有返回行,则exists子查询的结果为true,此时再执行外层查询语句
#### 4.2子查询注意事项
常用语法:
> select 字段名列表 from 表名 where 条件字段 =(子查询)
>
> select 字段名列表 from (子查询) as 表的别名;
>
> #注意:使用第二种用法时,表的别名不能省略
###### 4.3常用的字符串函数
```sql
select CONCAT('hello','world','123');-- 拼接字符串
select INSERT("alsdkjaosigj",2,5,"1213");-- 字符串中插入字符串
select LOWER("A");-- 将大写的英文字符转换成小写的英文字符
SELECT UPPER("a"); -- 将小写的英文字符转成大写的英文字符
SELECT SUBSTRING("abcdefg",2,3);-- 将截取到的字符返回
```
补充:去重
- 1.去重关键字 DISTINCT
- 2.使用分组去重
## 第五章
### 事务的属性
> 1. 原子性(Atomicity):事务是一个完整的操作,事务的各元素是不可分割的(原子的)。事务中的所有元素必须作为一个整体提交或回滚。
> 2. 一致性(Consistency):当事务完成时,数据必须处于一致状态(最终结果一致性)。
> 3. 隔离性(Isolation):对数据进行修改的所有并发事务是彼此隔离的
> 4. 持久性(Durability):事务的持久性指不管系统是否发生了故障,事务处理的结果都是永久的
## 第七章
### 7.1 JDBC访问数据库的步骤
1. 加载JDBC驱动
2. 与数据库进行连接,获取连接对象Connection
3. 创建Statement对象,执行sql语句
4. 处理返回结果,若是查询语句,得到结果集ResultSet对象进行处理
### 7.2 Statement接口和ResultSet接口
> Connection常用方法:
- close():释放资源
- Statement createStatement():创建Statement对象用于执行SQL
- PreparedStatement prepareStatement(String sql):创建PreparedStatement对象,预编译sql语句,执行sql语句
> Statement常用方法:
- ResultSet executeQuery(String sql):可以执行SQL查询并获取ResultSet结果集
- int executeUpdate():执行增删改操作,返回受影响行数
> 使用Statement对象执行sql可能出现sql注入漏洞,如何解决?
PreparedStatement可以对sql进行预编译,避免sql参数拼接,安全性更高
常用方法:
- ResultSet executeQuery():可以执行查询并获取ResultSet结果集
- int executeUpdate():执行增删改操作,返回受影响行数
- void setObject(int index,Object obj):为占位符赋值,index对应问号占位符的位置。int类型可以用setInt(),String 类型可以用setString()等等
- void close():释放资源