您的位置:首页 > 数据库 > MySQL

MySQL数据库总结

2019-03-02 19:32 155 查看

1 操作数据库语言分类

DDL(Data Definition Language)数据定义语言

​ 用来定义数据库对象:数据库,表,列等。关键字:create,drop,alter等

DML(Data Manipulation Language)数据操作语言

​ 用来对数据库中表的数据进行增删改。关键字:insert,delete, update等

DQL(Data Query Language) 数据查询语言
DQL语言并不是属于MYSQL官方的分类,但是对数据库的操作最多就是查询,所以我们的程序员把查询语句的语句称作为DQL语言

DCL(Data Control Language)数据控制语言
用来定义数据库的访问权限和安全级别,及创建用户。关键字:GRANT, REVOKE等

TCL(Transaction Control Language) 事务控制语言
用于控制数据库的事务操作,关键字; COMMIT,SAVEPOINT,ROLLBACK等

2 DDL(Data Definition Language)数据定义语言

2.1 DDL操作库

2.1.1 建库语句:

CREATE DATABASE 数据库名;

直接新建数据库

CREATE DATABASE IF NOT EXISTS 数据库名;

如果该数据库不存在,则新建该数据库

CREATE DATABASE 数据库名 CHARACTER SET 字符集;

新建指定字符集的数据库

2.1.2 查看数据库

SHOW DATABASES;

查看所有数据库

SHOW CREATE DATABASE 数据库名;

查看某个数据库的定义信息

2.1.3 修改数据库

ALTER DATABASE 数据库名 DEFAULT CHARACTER SET 字符集;

修改数据库字符集格式

2.1.4 删除数据库

DROP DATABASE 数据库名;

删除数据库

2.1.5 使用数据库

SELECT DATABASE();

​ 查看正在使用的数据库

USE 数据库名;

​ 使用该数据库

2.1.6 数据库备份

数据库的备份

mysqldump -u用户名 -p密码 数据库 > 文件的路径

数据库的还原

SOURCE 导入文件的路径;

2.2 DDL操作表

2.2.1 创建表语句

​ CREATE TABLE 表名 (字段1 字段类型1,字段2 字段类型2.。。。。。) 新建表(无任何约束)

新建表(包含约束)

​ CREATE TABLE 新表名 LIKE 旧表名; 新建一个和旧表结构完全相同的表

2.2.2 查看表

SHOW TABLES;

​ 查看当前数据库中国的所包含的表

DESC 表名;

​ 查看表结构(字段名称,字段类型,约束)

SHOW CREATE TABLE 表名;

​ 查看建表语句

2.2.3 删除表

DROP TABLES 表名;
删除表
DROP TABLES IF EXISTS 表名;

​ 如果表存在,则删除表

2.2.4 修改表结构

ALTER TABLE 表名 ADD 列名 类型;

​ 给该表添加新的一列

ALTER TABLE 表名 MODIFY 列名 新的类型

​ 修改列类型

ALTER TABLE 表名 CHANGE 旧列名 新列名 类型;

​ 修改列名及属性

ALTER TABLE 表名 DROP 列名;

​ 删除列

2.2.5 修改表名

RENAME TABLE 表名 TO 新表名;

修改表名

2.2.6 修改字符集

ALTER TABLE 表名 CHARACTER SET 字符集;

修改表的字符集

2.3 数据库的约束

2.3.1 PRIMARY KEY : 主键

用来唯一标识一条记录,一个表有且只有一个主键。一个主键可以只有一个字段,也可以由多个字段组成(联合主键)

哪个字段应该作为表的主键? 通常不用业务字段作为主键,单独给每张表设计一个id的字段,把id作为主键。

主键特点:非空,唯一,可自增,

创建主键方式:

​ 1在创建表的时候给字段添加主键

字段名 字段类型 PRIMARY KEY[AUTO_INCREMENT ]

​ 2在已有表中添加主键

ALTER TABLE 表名 ADD PRIMARY KEY(字段名) [AUTO_INCREMENT ];
删除主键
ALTER TABLE 表名 DROP PRIMARY KEY;

2.3.2 UNIQUE : 唯一

在这张表中这个字段的值不能重复。

唯一约束的基本格式

字段名 字段类型 UNIQUE

2.3.3 NOT NULL : 非空

这个字段必须设置值,不能是NULL

字段名 字段类型 NOT NULL

2.3.4 DEFAULT : 默认

往表中添加数据时,如果不指定这个字段的数据,就使用默认值
默认值格式

字段名 字段类型 DEFAULT 默认值

2.3.5 FOREIGN KEY : 外键

​ 一张表中的某个字段引用另一个表的主键

​ 主表: 约束别人

​ 副表/从表: 使用别人的数据,被别人约束

创建外键

​ 1 新建表时增加外键:

[CONSTRAINT][外键约束名称] FOREIGN KEY(外键字段名) REFERENCES 主表名(主键字段名)

关键字解释:
CONSTRAINT – 约束关键字

CONSTRAINT 外键约束名称:建议不能缺少,否则没法删除该外键

​ FOREIGN KEY(外键字段名) –- 某个字段作为外键
REFERENCES – 主表名(主键字段名) 表示参照主表中的某个字段

2 已有表增加外键:

ALTER TABLE 从表 ADD [CONSTRAINT][外键约束名称] FOREIGN KEY (外键字段名) REFERENCES 主表(主键字段名);
删除外键
ALTER TABLE 从表 drop foreign key 外键名称;

3 DML(Data Manipulation Language)语句

3.1 插入记录

INSERT INTO 表名(字段名1,字段名2...) VALUES(值1,值2...);

​ 对应字段插入值(可以不全写)

INSERT INTO 表名 VALUES(值1,值2...值n);

​ 插入所有字段(ps:插入的值要与表中字段顺序相对应)

​ 补充:

show variables like 'character%';

查看数据库内部字符编码

set names 字符集;

修改本次操作数据库的编码(退出重进后不在生效)

INSERT INTO 表1 SELECT * FROM 表2;

​ 将后面查询语句所得到的数据复制到当前表中(注意,查询的结果要与当前表结构相同)

3.2 更新表记录

UPDATE 表名 SET 字段名=值;

​ 修改该字段的所有值为当前值

UPDATE 表名 SET 字段名=值 WHERE 字段名=值;

​ 只修改特定行的该字段的值

3.3 删除表记录

DELETE FROM 表名;

删除当前表中的所有数据(一条一条删除)

DELETE FROM 表名 WHERE  字段名=值;

只删除符合 条件的表记录

TRUNCATE TABLE 表名;

​ 删除当前表中所有记录(将整个表摧毁,重新创建一个新的表)

4 DQL(Data Query Language) 数据查询语言

4.1 简单查询(单表查询)

4.1.1 查询表所有数据(无别名)

SELECT * FROM 表名;

查询表中的所有数据(单表);

SELECT 字段名1,字段名2.... FROM 表名;

查询给定字段的数据

SELECT 字段名1 AS 别名,字段名2 AS 别名.... FROM 表名;

​ 查询给定字段的数据,并将结果按别名的形式展示出来;

SELECT DISTINCT 字段名1,字段名2...FROM 表名;

查询给定的字段的数据,并去除重复的数据

SELECT 字段名1+固定值(或其他字段名)FROM 表名;

​ 查询结果参与计算,并返回结果

SELECT 字段名1, 字段名2 + IFNULL(字段名3,默认值) 联合字段别名 FROM 表名;

使用别名+默认值处理符合字段问题

4.1.2 条件查询 WHERE

SELECT 字段名 FROM 表名 WHERE 条件;
4.1.2.1 比较运算符

:>大于 < 小于 <= 小于等于 >= 大于等于 = 等于 <> 、 != 不等于

4.1.2.2 逻辑运算符:

and(&&) 多个条件同时满足 or(||) 多个条件其中一个满足 not(!) 不满足

4.1.2.3范围:
BETWEEN 值1 AND 值2

表示从值1到值2范围,包头又包尾

4.1.2.4 LIKE 表示模糊查询
SELECT * FROM 表名 WHERE 字段名 LIKE '通配符字符串';

满足 通配符字符串 规则的数据就会显示出来

所谓的 通配符字符串 就是 含有通配符的字符串 MySQL通配符有两个:

% : 表示0个或多个字符(任意个字符)

_ : 表示一个字符;

4.1.3 排序查询 ORDER BY

SELECT 字段名 FROM 表名 WHERE 字段=值 ORDER BY 字段名1 ASC|DESC 字段名2 ASC|DESC......;

将查询出的结果进行排序(排序只是显示方式,不会影响数据库中数据的顺序。ASC: 升序, 默认是升序 DESC: 降序。可以使用多个字段进行逐级排序。

4.1.4 聚合函数查询

聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个结果值。另外聚合函数会忽略空值。

五个聚合函数:

count : 统计指定列记录数,记录为NULL的不统计

sum : 计算指定列的数值和,如果不是数值类型,那么计算结果为0

max : 计算指定列的最大值

min : 计算指定列的最小值

avg : 计算指定列的平均值,如果不是数值类型,那么计算结果为0。

聚合函数的使用:写在 SQL语句 SELECT 后 字段名 的地方

SELECT COUNT(age) FROM 表名;

4.1.5 分组查询 GROUP BY

分组查询是指使用 GROUP BY 语句对查询信息进行分组, 相同数据作为一组

SELECT 字段1,字段2... FROM 表名 GROUP B
1c603
Y 分组字段 [HAVING 条件];

GROUP BY 将分组字段结果中相同内容作为一组,并且返回每组的第一条数据,所以单独分组没什么用处。分组的目的就是为了统计,一般分组会跟聚合函数一起使用。
分组后聚合函数的作用?不是操作所有数据,而是操作一组数据。

注意事项:当我们使用某个字段分组,在查询的时候也需要将这个字段查询出来,否则看不到数据属于哪组的.

对于分组后的条件需要使用 having 子句

having与where的区别

​ having是在分组后对数据进行过滤.
where是在分组前对数据进行过滤
having后面可以使用聚合函数
where后面不可以使用聚合函数

4.1.6 分页查询 LIMIT

LIMIT 是 限制 的意思,所以 LIMIT 的作用就是限制查询记录的条数

SELECT *|字段列表 [as 别名] FROM  表名 [WHERE子句] [GROUP BY子句] [HAVING子句] [ORDER BY子句] [LIMIT子句];

LIMIT语法格式

LIMIT offset,length; 
LIMIT length;

offset 是指偏移量,可以认为是跳过的记录数量,默认为0。 length 是指需要显示的总记录数

4.2 多表查询

4.2.1 多表之间的关系

一对一(有方向)

一对多(有方向)

多对多(无方向)

4.2.2 数据库建表规则(范式)

​ 目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式
(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。满足最低要求的范式是第一范式(1NF)。在
第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推。一般说来,数据库只需
满足第三范式(3NF)就行了

第一范式:表字段为原子性,即每一列不可以再分。

第二范式:不允许组合主键中的一部分属性可以决定表中的部分属性。(表不可再分)

第三范式:要求一个关系中不包含已在其它关系已包含的非主关键字信息。(包含的主键即为外键)(非外键不可重复)

4.2.3 查询(!!!!!!)

同时查询多张表获取到需要的数据。

多表查询时左表的每条数据和右表的每条数据组合,这种效果成为笛卡尔积

笛卡尔积大部分数据为无用数据,此时需要通过条件过滤掉没用的数据。

4.2.3.1 内连接

用左边表的记录去匹配右边表的记录,如果符合条件的则显示

隐式内连接
隐式内连接:看不到 JOIN 关键字,条件使用 WHERE 指定

SELECT 字段名 FROM 左表, 右表 WHERE 条件;

显示内连接
显示内连接:使用 INNER JOIN … ON 语句, 可以省略 INNER ,条件用ON指定

SELECT 字段名 FROM 左表 INNER JOIN 右表 ON 条件;
4.2.3.2 外连接

左外连接:使用 LEFT OUTER JOIN … ON , OUTER 可以省略

SELECT 字段名 FROM 左表 LEFT OUTER JOIN  右表 ON 条件;

用左边表的记录去匹配右边表的记录,如果符合条件的则显示;否则,显示NULL 可以理解为:在内连接的基础上保证左表的数据全部显示

右外连接:使用 RIGHT OUTER JOIN … ON , OUTER 可以省略

SELECT 字段名 FROM 左表 RIGHT OUTER JOIN   右表 ON 条件;

用右边表的记录去匹配左边表的记录,如果符合条件的则显示;否则,显示NULL 可以理解为:在内连接的基础上保证右表的数据全部显示

4.2.3.3 子查询

一条SELECT语句结果作为另一条SELECT语法一部分(作为查询条件或查询结果或表)

SELECT 查询字段 FROM 表  WHERE 查询条件();

子查询需要放在()中

子查询有三种结果:一个值 一列多行 多列多行

子查询的结果是一个值
子查询结果只要是单列 ,肯定在 WHERE 后面作为 条件

SELECT 查询字段 FROM 表 WHERE 字段=(子查询);

子查询结果是单列

子查询结果只要是单列,肯定在 WHERE 后面作为 条件子查询结果是单例多行,结果集类似于一个数组,父查询
使用 IN 运算符

SELECT 查询字段 FROM 表 WHERE 字段 IN (子查询);

子查询结果是 多列

子查询结果只要是 多列 ,肯定在 FROM 后面作为 表 SELECT 查询字段 FROM (子查询) 表别名 WHERE 条件; 子查询作为表需要取别名,否则这张表没用名称无法访问表中的字段

5 事务

理解:具有相关联系的,对数据库的一系列操作,而且部分操作会对数据库数据造成影响。

5.1 事务的四大特性(ACID):

原子性(Atomicity):事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

一致性(Consistency):事务前后数据的完整性必须保持一致

隔离性(Isolation):是指多个用户并发访问数据库时,一个用户的事务不能被其它用户的事务所干扰,多个
并发事务之间数据要相互隔离,不能相互影响。

持久性(Durability):指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发
生故障也不应该对其有任何影响。

5.2 事务的隔离级别:

级别 名字 隔离级别 脏读 不可重复读 幻读 数据库默认隔离级别
1 读未提交 read uncommitted 是 是 是
2 读已提交 read committed 否 是 是 Oracle和SQL Server
3 可重复读 repeatable read 否 否 是 MySQL
4 串行化 serializable 否 否 否

名词解释:

脏读

​ 一个事务读取到了另一个事务中尚未提交的数据

不可重复读

​ 一个事务中两次读取的数据内容不一致,要求的是一个事务中多次读取时数据是一致的,这是事务update时

​ 引发的问题
幻读
一个事务中两次读取的数据的数量不一致,要求在一个事务多次读取的数据的数量是一致的,这是insert或

​ delete时引发的问题。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: