mysql知识点合集

## 第一章

> 三大范式

**第一范式:**

确保每列的原子性(每列都是不可再分的最小数据单元)

**第二范式:**

满足第一范式的前提下,确保表中每列都和主键相关(一张表只干一件事)

**第三范式:**

满足第一二范式的前提下,确保表中每列都和主键直接相关,而不是间接相关。

> 注意:三大范式只作为一种规范作为参考,阿里巴巴数据库规范要求表之间连接最多不超过三张

## 第二章

### 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():释放资源

你可能感兴趣的:(mysql,数据库)