MySQL①——核心基础(约束、数据库范式、多表、事务、权限、DDL、DML、DQL、DCL、TPL、忘记数据库密码)

MySQL①——核心基础(约束、数据库范式、多表、事务、权限、DDL、DML、DQL、DCL、TPL、忘记数据库密码)

<<<<>>>>

1、MySQL(关系型数据库管理系统)

①MySQL概述

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件。MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。由于其社区版的性能卓越,搭配 PHP 和 Apache 可组成良好的开发环境。

②下载、安装与卸载

下载
可以进 https://dev.mysql.com/downloads/mysql/ 选择下载mysql版本,暂时建议选用 5.x 版本(MySQL版本5.x有5.5、5.6、5.7,接着就是Mysql8.0的版本)

安装
按照自己的系统下载对应格式的MySQL安装,例如64位Windows电脑可以下载windows安装版本,以 .msi 结尾的,然后安装的时候可以根据提示和需要一步一步安装,不懂的可以查询其他相关资料

卸载
卸载的步骤(以Windows为例):
(1)我的电脑>>服务>>停止MySQL服务
(2)在安装程序中卸载MySQL
(3)删除MySQL下所有的安装文件
(4)删除C盘中ProgramData目录下的MySQL目录(ProgramData目录为隐藏目录,需要在文件浏览器中将 “显示隐藏” 打开)

③启动/关闭MySQL服务名(两种方式启动关闭)

(1)我的电脑>>管理>>服务,右击 MySQL 服务,选择启动或停止(或者直接在 cmd 窗口中输入 services.msc 进入服务管理)

(2)以管理员身份方式运行 命令提示符(即cmd,DOS窗口) (注意:如果不以管理员身份方式运行,将会提示 “发生系统错误5,拒绝访问”)
net start MySQL 启动MySQL服务
net stop MySQL 关闭MySQL服务

(注意上述命令中的 “MySQL” 是默认安装的MySQL服务名,如果你安装时有所更改,例如将MySQL服务名改为MySQLXXX,那么你需要通过命令 net start MySQLXXX 来启动MySQL服务,其他命令以此类推)

④登录/退出

登录(在 cmd 窗口中)
登录方式一(推荐):mysql -u root -p 然后会提示你输入密码,输入正确则会登录成功
登录方式二:mysql -u root -p密码 (注意-p和密码之间没有空格,此方法不推荐,因为密码会被看到)
登录方式三:mysql -u root -p -D 数据库名字 然后提示你输入密码,此方法登录成功后可以直接select该数据库
登录方式四(完整):mysql -h IP地址 -P 端口号 -u root -p密码 -D 数据库名 (其中,-选项可以根据自身需要选择是否加上,但是-u和-p是必须的)
登录方式五(全称):mysql --host=IP地址 --port=端口号 --user=root --password
(注意-p和密码之间没有空格,其他-选项和值之间可以不加空格也可以加空格)

退出(在 cmd 窗口中)
退出方式一:exit
退出方式一:quit

⑤MySQL目录结构

MySQL安装目录(即安装MySQL时你选择的目录)
bin目录 存放可执行文件目录
data目录 存放了数据文件、日志文件等
include目录 存放了一些C语言头文件等信息
lib目录 存放了一系列库文件
share目录 用于存放字符集、语言等信息
myini文件 是MySQL数据库中使用的配置文件
my-huge.ini、my-large.ini、my-medium.ini、my-small.ini 分别对应超大型数据库、大型数据库、中型数据库、小型数据库配置文件
my-template.ini 该文件是配置文件的模板,MySQL配置向导将该配置文件中选择项写入到my.ini文件之中

MySQL数据目录(C:\ProgramData\MySQL\MySQL Server x.x下 x.x为你安装的版本号)
该目录下的data目录中
mysql、performance_schema等文件夹就是你MySQL中的数据库
代表数据库目录下以 .frm 结尾的文件为数据表

2、结构化查询语言SQL(Structured Query Language)

①SQL概述

结构化查询语言(Structured Query Language)简称SQL(发音:/ˈes kjuː ˈel/ “S-Q-L”),是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。至于发音,中国的开发者创造了一种独特的SQL发音:/'sɜːkl/,Oracle沿用了/ˈsiːkwəl/这个读音,因为这门语言以前叫做“SEQUEL”。但更官方一些的读音应该是ISO标准规定的/ˌɛsˌkjuːˈɛl/。虽然SQL有国际标准,但是各种通行的数据库系统在其实践过程中都对SQL规范作了某些编改和扩充。所以,实际上不同数据库系统之间的SQL不能完全相互通用。

②SQL通用语法

(1)SQL可以单行或多行书写,以 分号; 结尾
(2)可以使用空格或缩进来增强语句的可读性
(3)MySQL数据库的SQL语句不区分大小写,但是关键字建议大写
(4)注释:
单行注释:-- 注释文字 (–和注释文字之间有空格)

注释内容 (#和注释文字之间虽然不强制有空格,但建议留有空格,这种注释为MySQL特有注释)

多行注释:/* 注释文字 */

③SQL语句分类

结构化查询语言包含6个部分:
一:数据查询语言(DQL:Data Query Language):
其语句,也称为“数据检索语句”,用以从表中获得数据,确定数据怎样在应用程序给出。保留字SELECT是DQL(也是所有SQL)用得最多的动词,其他DQL常用的保留字有WHERE,ORDER BY,GROUP BY和HAVING。这些DQL保留字常与其他类型的SQL语句一起使用。
二:数据操作语言(DML:Data Manipulation Language):
其语句包括动词INSERT,UPDATE和DELETE。它们分别用于添加,修改和删除表中的行。也称为动作查询语言。
三:事务处理语言(TPL:Transaction Processing Language):
它的语句能确保被DML语句影响的表的所有行及时得以更新。TPL语句包括BEGIN TRANSACTION,COMMIT和ROLLBACK。
四:数据控制语言(DCL:Data Control Language):
它的语句通过GRANT或REVOKE获得许可,确定单个用户和用户组对数据库对象的访问。某些RDBMS可用GRANT或REVOKE控制对表单个列的访问。
五:数据定义语言(DDL:Data Definition Language):
其语句包括动词CREATE和DROP。在数据库中创建新表或删除表(CREAT TABLE 或 DROP TABLE);为表加入索引等。DDL包括许多与人数据库目录中获得数据有关的保留字。它也是动作查询的一部分。
六:指针控制语言(CCL):
它的语句,像DECLARE CURSOR,FETCH INTO和UPDATE WHERE CURRENT用于对一个或多个表单独行的操作。

(接下来的学习建议使用SQLyog或者Navicat Premium图形化工具,更推荐SQLyog)

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

1、操作数据库:CRUD
C(Create) 创建:
CREATE DATABASE 数据库名; >>> 创建数据库
CREATE DATABASE IF NOT EXISTS 数据库名; >>> 创建数据库 (更加安全的方式)
CREATE DATABASE 数据库名 CHARACTER SET 字符集; >>> 以指定字符集创建该数据库
CREATE DATABASE IF NOT EXISTS 数据库名 CHARACTER SET 字符集; >>> 以指定字符集创建数据库 (更安全更完整)
R(Retrieve) 查询:
SHOW DATABASES; >>> 查询所有数据库名称
SHOW CREATE DATABASE 数据库名; >>> 查询数据库字符集/查询数据库创建语句
U(Update) 更新:
ALTER DATABASE 数据库名称 CHARACTER SET 字符集; >>> 修改指定数据库的字符集
D(Delete) 删除:
DROP DATABASE 数据库名; >>> 删除指定数据库
DROP DATABASE IF EXISTS 数据库名; >>> 删除指定数据库 (更安全的方式)
use 使用数据库:
SELECT DATABASE(); >>> 查询当前正在使用的数据库
USE 数据库名; >>> 使用指定数据库

2、操作数据表:CRUD
C(Create) 创建:
创建表格式:
CREATE IF NOT EXISTSTABLE 表名(
列名1 数据类型1,
列名2 数据类型2,

列名n 数据类型n
);
数据类型有:
整数类型:int
小数类型:double (double(6,2) 表示一共六位,最大整数占4位,小数占两位,最大表示9999.99)
日期:一、date 只包含年月日,格式为yyyy-MM-dd
二、datetime 包含年月日时分秒,格式为yyyy-MM-dd HH:mm:ss
时间戳:timestamp 包含年月日时分秒,格式为yyyy-MM–dd HH:mm:ss(如果该字段没有赋值或赋值为null,则默认使用当前的系统时间来赋值)
字符串:varchar (varchar(20)表示最大存储20个字符)
(注意:最后一列结尾不需要加逗号, ; 同理创建数据表那一行也可以加上IF NOT EXISTS)
复制表格式:
CREATE TABLE 表名 like 被复制的表名; >>> 不会复制表中的数据
R(Retrieve) 查询:
SHOW TABLES; >>> 查询某个数据库中所有的表
DESC 表名; >>> 查询表结构
SHOW CREATE TALBE 表名 >>> 查看数据表字符集
U(Update) 更新/修改:
ALTER TABLE 表名 RENAME TO 新表名 >>> 修改表名
ALTER TABLE 表名 CHARARCTER SET 字符集 >>> 修改表的字符集
ALTER TABLE 表名 add 列名 数据类型 >>> 添加一列
ALTER TABLE 表名 CHANGE 旧列名 新列名 新数据类型 >>> 修改列的名称、类型
ALTER TABLE 表名 MODIFY 列名 新数据类型 >>> 修改列的数据类型
ALTER TABLE 表名 DROP 列名 >>> 删除列
D(Delete) 删除:
DROP TABLE 表名; >>> 删除数据表
DROP TABLE IF EXISTS 表名; >>> 删除数据表 (更安全)

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

添加数据:
INSERT INTO 表名(列名1,列名2,…列名n) VALUES(值1,值2,…值n); >>> 添加数据 (列名和值一一对应,否则将会报错)
INSERT INTO 表名 VALUES(值1,值2,…值n); (该方法默认给表中所有列添加值,但是必须给所有列添加数据)
除了数字类型以外,其他类型需要使用引号(单双引号)引起来
删除数据:
DELETE FROM 表名 WHERE 条件; (例如:DELETE FROM USER WHERE id=1;)
DELETE FROM 表名; (注意:如果像这种不加条件,则默认删除表中所有记录;但是就算删除所有表也不推荐该方式,因为数据表中有多少条数据它就会执行多少次删除操作,效率低)
TRUNCATE TABLE 表名; (该方法结果也是清空表记录,它的原理是先删除表,然后再创建一张一模一样的空表,效率更高)
修改数据:
UPDATE 表名 SET 列名1=值1,…列名n=值n WHERE 条件;
UPDATE 表名 SET 列名1=值1,…列名n=值n;(注意:如果像这种不加条件,则会默认修改数据表中所有数据)

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

条件查询:
WHERE字句后跟条件
运算符:

、<、<=、>=、=、<>、!=
BETWEEN…AND >>> 包含首尾
IN(集合)
LIKE >>> 模糊查询 (和占位符搭配使用)
IS NULL(注意:NULL的值不能使用 =或者!= 判断)
AND 或 &&
OR 或 ||
NOT 或 !
占位符:
_ >>> 单个任意字符
% >>> 0个1个或多个任意字符
查询数据:
SELECT * FROM 表名; >>> 查询表中所有记录
SELECT 字段列表 FROM 表名列表 WHERE 条件列表 GROUP BY 分组字段 HAVING 分组之后的条件 ORDER 排序规则 LIMIT 分页限定 >>> 这是完整的查询语法,但是可以根据需要选择关键字进行组合
SELECT DISTINCT 字段列表 FROM 表名; >>> 去重查询 (注意:如果字段列表有多个,只有组合结果重复才会去重)
SELECT 字段名1 运算符 字段名2 AS 别名 FROM 表名 >>> 可以根据查询该表下字段1和字段2运算后的结果,并以别名命名查询显示出来,其中 AS省略也可以,也会以别名的方式显示 (如果其中一个字段为字符或字符串,则会将其结果看成0;如果其中一个字段值为null,则运算后结果也会是null,所以为了避免该情况,可以使用 IFNULL(判断的字段,0) 解决该问题)

排序查询:
SELECT * FROM 表名 ORDER BY 字段名; >>> 默认按该字段名升序排列该表名下的数据
SELECT * FROM 表名 ORDER BY 字段名 ASC; >>> 按该字段名升序排列该表名下的数据 (同上)
SELECT * FROM 表名 ORDER BY 字段名 DESC; >>> 按该字段名降序排列该表名下的数据
SELECT * FROM 表名 ORDER BY 字段名1 排序方式1,字段名2 排序方式2…; >>> 先按照排序方式1排序字段名1,当条件相同的值在一起,再按照排序方式2对字段名2进行排序,排序方式有ASC升序和DESC降序两种

聚合函数:
将一列数据作为一个整体,进行纵向计算(注意:聚合函数的计算会排除null值)
count:计算个数
SELECT COUNT(字段名) FROM 表名; >>> 计算字段名非空的有多少个
SELECT COUNT(IFNULL(字段名,如果为空就替换成的值)) FROM 表名; >>> 查询该字段名共有多少条记录,包括为空的字段
SELECT COUNT(*) FROM 表名; >>> 查看该表共有多少条数据(只要该数据有一个字段不为null,则算一条数据,效率不高)
SELECT COUNT(主键名) FROM 表名; >>> 查看该表共有多少条数据 (推荐,因为主键是不能为空的)
(选择不为空的字段,比如主键,因为主键是不能为空的)
max:计算最大值
SELECT MAX(字段名) FROM 表名; >>> 查看该表下字段的最大值
min:计算最小值
SELECT MIN(字段名) FROM 表名; >>> 查看该表下字段的最小值
sum:求和
SELECT SUM(字段名) FROM 表名; >>> 查看该表中字段的总和(字符串varchar等结果为0)
avg:计算平均值
SELECT AVG(字段名) FROM 表名; >>> 查看该表中字段的平均值(字符串varchar等结果为0)

分组查询:
格式:查询语句 GROUP BY 分组字段
注意分组之后查询的字段一般是:聚合函数、分组字段,其他的实用意义不大
例如:SELECT AVG(salary) AS a,department_id FROM employees GROUP BY department_id; >>> 查询每个部门的平均工资
查询语句 WHERE 条件 GROUP BY 分组字段
查询语句 WHERE 条件 GROUP BY 分组字段 HAVING 条件
区别:1、WHERE在分组之前限定,如果不满足条件,不参与分组;HAVING在分组之后进行限定,如果不满足条件,则不会被查询出来
2、WHERE后不可以跟聚合函数,HAVING可以进行聚合函数的判断

分页查询:
格式:查询语句 LIMIT 开始索引,每页查询的条数;
公式:开始索引=(当前页码-1)*每页显示的条数
该分页操作的语法只能在MySQL中使用,相当于MySQL的“方言”

SQLyog格式化代码快捷键,Ctrl+F12,让代码看起来更加整齐规范

⑦表约束

约束有缠缚,束缚,按照约定(特定)条件限制,管束等意思。约束用于限制加入表的数据,保证数据的正确性、有效性和完整性。

约束类型
主键约束(Primary Key constraint):要求主键列数据唯一,并且不允许为空也不能重复。
非空约束(Not Null constraint):非空约束。
唯一约束(Unique constraint):要求该列唯一,允许为空,MySQL允许存在多个空值
外键约束(Foreign Key constraint):用于在两个表之间建立关系,需要指定引用主表的哪一列。
默认约束(Default constraint):某列的默认值,如在数据库里有一项数据很多重复,可以设为默认值。
检查约束(Check constraint):某列取值范围限制,格式限制等,如有关年龄、邮箱(必须有@)的约束,该种约束在MySQL暂时无描述。

主键约束 PRIMARY KEY:主键约束,非空且唯一、一张表只能有一个字段为主键(但是可以创建联合主键)。主键可以看成一张表中的唯一标识
创建表时给 id字段 添加主键约束:
CREATE TABLE 表名(
id varchar(20) PRIMARY KEY, – 主键id
name varchar(20) NOT NULL, – 姓名 非空

IDCard varchar(20) NOT NULL UNIQUE – 身份证 非空且唯一
);
创建表之后添加主键约束:
ALTER TABLE 表名 MODIFY 字段名 数据类型 PRIMARY KEY;
创建表之后删除主键约束:
ALTER TABLE 表名 DROP PRIMARY KEY;

自动增长:如果某一列是数值类型的,使用 AUTO_INCREMENT可以来完成值的自动增长,一般配合主键来使用
创建表时给 id字段 添加主键约束并且自动增长
CREATE TABLE 表名(
id varchar(20) PRIMARY KEY AUTO_INCREMENT , – 主键id且自动增长
name varchar(20) NOT NULL, – 姓名 非空

IDCard varchar(20) NOT NULL UNIQUE – 身份证 非空且唯一
);
创建表之后添加自动增长
ALTER TABLE 表名 MODIFY 字段名 数据类型 AUTO_INCREMENT ;
创建表之后删除自动增长:
ALTER TABLE 表名 MODIFY 字段名 数据类型;
如果给某字段设置了自动增长后,再使用 INSERT INTO 插入语句,也可以将该字段值设置为 NULL 值,哪怕该字段原先设置了主键或者NOT NULL也没问题,它会在自动在以前该字段最大值的基础上+1;哪怕你将最大值那一列数据删除,他还是会记住历史的最大值,然后自动+1

非空约束 NOT NULL:要求数据不能为空
创建表时给 name字段 添加非空约束:
CREATE TABLE 表名(
id varchar(20), – id列

name varchar(20) NOT NULL – 姓名 非空
);
创建表之后添加非空约束
ALTER TABLE 表名 MODIFY 字段 数据类型 NOT NULL;
创建表之后删除非空约束
ALTER TABLE 表名 MODIFY 字段 数据类型 ;

唯一约束 UNIQUE:值不能重复,允许为空NULL,MySQL允许存在多个空值NULL
创建表时给 name字段 添加唯一约束
CREATE TABLE 表名(
id varchar(20), – id

name varchar(20) UNIQUE – 姓名 唯一
);
创建表之后添加唯一约束
ALTER TABLE 表名 MODIFY 字段 数据类型 UNIQUE;
创建表之后删除唯一约束
ALTER TABLE 表名 DROP INDEX 字段名;

外键约束 FOREIGN KEY:用于在两个表之间建立关系,需要指定引用主表的哪一列。
创建表时给 外键列 添加外键:
CREATE TABLE 表名(

外键列名 数据类型,
CONSTRAINT 外键名 FOREIGN KEY (外键列名称) REFERENCES 主表名称(关联的主表列名称)
);

创建表之后添加外键:
ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (外键列名称) REFERENCES 主表名称(主表列名称);
创建表之后删除外键:
ALTER TABLE 表名 DROP FOREIGN KEY 外建名;
级联更新和级联删除操作:级联更新简而言之就是更改 关联外键并且是主键那个字段 时,对应的关联外键另外一个字段的该值也会随之改成相应的值;级联删除简而言之就是
ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (外键列名称) REFERENCES 主表名称(关联的主表列名称) ON UPDATE CASCADE ON DELETE CASCADE;
级联更新:ON UPDATE CASCADE
级联删除:ON DELETE CASCADE
SQLyog的架构设计器(Ctrl+Alt+D)可以看到多表之间的一些关系

⑧多表关系

多表之间的关系:一对一(人和身份证)、一对多或多对一(常见,例如员工和部门或者部门和员工)、多对多(例如学生和课程)
实现:
一对一:可以在任何一方的添加唯一约束的外键指向另外一方;不过实际开发一般用到得少,一般合成一张表而不拆分成多表
一对多(多对一):在多的一方建立外键,指向一的一方的主键
多对多:借助第三张中间表,中间表至少包含两个字段,这两个字段作为第三张表的外键,分别指向两张表的主键

⑨数据库范式

数据库设计的范式Normal Form、数据库标准化Database Normalization:设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。
第一范式(1NF):数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。
第二范式(2NF):在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)
重要概念:
1、函数依赖:A–>B,如果通过A属性(属性组)的值,可以确定唯一B属性的值。则称B依赖于A
例如:下面例子中的 学号–>姓名 属性组(学号,课程名称)–> 分数
2、完全函数依赖:A–>B,如果A是一个属性组,则B属性值的确定需要依赖于A属性组中所有的属性值
例如:下面例子中的(学号,课程名称)–> 分数
3、部分函数依赖:A–>B,如果A是一个属性组,则B属性值的确定只需要依赖于A属性组的某一些值即可
例如:下面例子中的(学号,课程名称)–> 姓名
4、传递函数依赖:A–>B,B–>C,如果通过A属性(属性组)的值,可以确定唯一B属性的值,在通过B属性(属性组)的值可以确定唯一C属性的值,则称C传递函数依赖于A
例如:下面例子中的学号–>系名,系名–>系主任
5、主属性:在一个关系中,如一个属性是构成某一个候选关键字的属性集中的一个属性,则称它为主属性。
6、非主属性/非码属性:不包含在任何一个候选码中的属性称为非主属性。非主属性是相对与主属性来定义的,是指关系中不包含任何一个候选码中的属性。
例如:在关系——学生(学号,姓名,年龄,性别,班级)中,主码是“学号”,那么其他的“姓名”、“年龄”、“性别”、“班级”就都可以称为非主属性。
7、码:如果在一张表中,一个属性或属性组,被其他所有属性所完全依赖,则称这个属性(属性组)为该表的码
例如:下面例子中,(学号,课程名称)组成的属性组
8、主码/主键:主关键字(primary key)是表中的一个或多个字段,它的值用于唯一地标识表中的某一条记录,一个表的主键可以由多个关键字共同组成,并且主关键字的列不能包含空值
9、候选码:若关系中的一个属性或属性组的值能够唯一地标识一个元组,且他的真子集不能唯一的标识一个元组,则称这个属性或属性组做候选码。例如:在学生实体中,“学号”是能唯一的区分学生实体的,同时又假设“姓名”、“班级”的属性组合足以区分学生实体,那么{学号}和{姓名,班级}都是(超级码)候选码。候选码(超级码)就是可以被选为主码的属性或属性组。候选码中出现过的属性称为主属性;非主属性就是不包含在任何候选码中的属性。例如:关系 工人(工号,身份证号,姓名,性别,部门).显然工号和身份证号都能够唯一标示这个关系,所以都是候选码。工号、身份证号这两个属性就是主属性。如果主码是一个属性组,那么属性组中的属性都是主属性。
第三范式(3NF):在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)

三大范式应用举例:
假如需要开发一个信息管理系统,暂时设计表如下:

经过第一范式分析后处理:

经过第二范式分析处理后:

经过第三范式分析处理后:

⑩数据库的备份和还原

命令方式:
备份语法格式:mysqldump -u root -p密码 数据库名 > 保存的路径
mysqldump -u root -p 数据库名 > 保存的路径 >>> 当然也可以这种方式,更加安全
还原语法格式:1、登录数据库
2、创建数据库
3、使用数据库
4、执行文件 : source sql脚本文件路径全名
当然如果该数据库存在,可以: mysql –u用户名 –p密码 –D数据库 < sql脚本文件路径全名
图形化界面(SQLyog):
备份:进入SQLyog后选择需要备份的数据库>>> 右击,选择备份/导出>>>备份数据库,转储到SQL>>>选择存放路径>>>点击导出
还原:右击>>>执行SQL文件

命令行方式和图形化界面备份的区别:SQLyog备份的SQL文件包含创建数据库命令,而命令行方式没有;命令行导出后的SQL文件还原时需要自己创建一下数据库,而SQLyog备份后的SQL还原的时候可以创建也可以不创建数据库,只不过数据库名字和原来一样

⑪多表查询

语法:
SELECT 字段列表 FROM 表名列表 >>> 查出各个集合的组合结果集,笛卡尔积
SELECT 字段列表 FROM 表名列表 WHERE… >>> 使用条件消除无用数据
笛卡尔积:笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尓积(Cartesian product),又称直积,表示为X × Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员,A×B = {(x,y)|x∈A∧y∈B},即两个集合所有组成的情况
内连接查询:
隐式内连接:
SELECT 字段列表 FROM 表名列表 WHERE 两边相关条件
显式内连接:
SELECT 字段列表 FROM 表名1 INNER JOIN 表名2 ON 条件
SELECT 字段列表 FROM 表名1 INNER JOIN 表名2 ON 条件 >>> 该语法是上面语句的省略写法
内连接查询注意事项:
1、确定应该查询哪些表
2、明确两表之间查询的条件
3、需要查询哪些字段
外链接查询:
左外连接:
SELECT 字段列表 FROM 表1 LEFT OUTER JOIN 表2 ON 条件 >>> 查询表1所有数据以及其交集部分
SELECT 字段列表 FROM 表1 LEFT JOIN 表2 ON 条件 >>> 上面查询语句的简化形式
右外连接:
SELECT 字段列表 FROM 表1 RIGHT OUTER JOIN 表2 ON 条件 >>> 查询表2所有数据以及其交集部分
SELECT 字段列表 FROM 表1 RIGHT JOIN 表2 ON 条件 >>> 上面查询语句的简化形式
子查询:查询中嵌套查询,该嵌套查询即为子查询
例如:SELECT * FROM employees WHERE salary = (SELECT MAX(salary) FROM employees); >>> 查询工资最高的员工信息
子查询的各种情况:
1、子查询的结果是单行单列的
子查询作为条件,使用运算符进行判断。运算符:> >= < <= =
SELECT * FROM employees WHERE salary > (SELECT AVG(salary) FROM employees); >>> 查询工资比平均工资高的员工的信息
2、子查询的结果是多行单列的
子查询可以作为条件,使用运算符 IN 来判断
SELECT department_id FROM departments WHERE department_name =‘Adm’ OR department_name =‘Mar’; >>> 查询部门名字为"Adm"和"Mar"的部门id是多少,返回一列两条记录
SELECT * FROM employees WHERE department_id IN(SELECT department_id FROM departments WHERE department_name =‘Adm’ OR department_name =‘Mar’); >>> 查询部门名字为"Adm"和"Mar"的所有员工信息
3、子查询的结果是多行多列的
子查询可以作为一张虚拟表
SELECT * FROM 表1,(多行多列子查询SELECT语句) WHERE 条件

⑫事务、事务处理语言(TPL:Transaction Processing Language)

事务的基本介绍
概念:数据库事务(简称:事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。
目的:1、为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。
2、当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。
操作:开启事务 START TRANSACTION;
回滚 ROLLBACK;
提交 COMMIT;
例如:银行转账分为三步:1、查询转账人账户余额是否大于500 2、第1步条件成立则转账人账户金额 -500 3、被转账人账户余额 +500
可能会发生这样的情况,在第二步执行完后,发生了异常,或者说停电了等等意外情况,导致第三步没有执行,这将会给数据带来无法挽回的损失,而且这种情况出现几率非常高
事物提交的方式分为:自动提交和手动提交
自动提交:MySQL默认自动提交
手动提交:需要先开启事务,再提交。Oracle默认提交方式为手动提交
查看事务默认提交方式:SELECT @@autocommit; >>> 1代表自动提交 0代表手动提交
修改事务默认提交方式:SET @@autocommit=0; 或者 SET @@autocommit=1;
事务的四大特征
原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。
一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。
隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。相互独立。
持久性(Durability):已被提交的事务对数据库的修改应该永久保存在数据库中。
事务的并发问题
1、脏读 dirty read:脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。
2、不可重复读 non-repeatable read:不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了(不可重复读和脏读的区别是,脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据)
3、幻读 phantom read:幻读是事务非独立执行时发生的一种现象。例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读(幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数))
事务的隔离级别
1、read uncommitted (读未提交):最低级别,任何情况都无法保证。
2、read committed (读已提交):可避免脏读的发生。(Oracle默认)
3、repeatable read (可重复读):可避免脏读、不可重复读的发生。(MySQL默认)
4、serializable (串行化):可避免脏读、不可重复读、幻读的发生。
隔离级别从小到大安全性越来越高,但是效率越来越低
数据库查询隔离级别:
SELECT @@tx_isolation;
数据库设置隔离级别:
SET GLOBAL TRANSACTION ISOLATION LEVEL 级别字符串;(设置之后需要断开重新连接才会看到生效)
⑬用户管理和权限管理、数据控制语言(DCL:Data Control Language)
用户管理:
创建用户:
CREATE USER ‘用户名’@‘主机名’ IDENTIFIED BY ‘密码’;
删除用户:
DROP USER ‘用户名’@‘主机名’;
修改用户:
UPDATE user SET PASSWORD = PASSWORD(‘新密码’) WHERE USER = ‘用户名’;
SET PASSWORD FOR ‘用户名’@‘主机名’ = PASSWORD(‘新密码’);
查询用户:
切换到名字为 “mysql” 的数据库,查询user表 >>> SELECT * FROM USER; (如果查询到Host这一列有localhost,代表只能在本机登录MySQL;如果有通配符 % ,代表可以在任意主机登录MySQL)
补充:MySQL忘记了root用户的密码
1、管理员方式运行cmd >>> net stop mysql 停止mysql服务
2、使用无验证方式启动MySQL服务:mysqld --skip-grant-tables,然后保持该窗口不关
3、接下来新建一个cmd窗口,直接输入mysql登录mysql数据库,然后输入 use mysql; ,再使用更改用户密码的MySQL命令。更改完后关闭所有cmd窗口。
4、手动结束 mysqld.exe 进程,然后以管理员方式运行cmd,net start mysql 启动服务,就可以使用新密码登录了。
权限管理:
查询权限:
SHOW GRANTS FOR ‘用户名’@‘主机名’;
授予权限:
GRANT 权限列表 ON 数据库名.表名 TO ‘用户名’@‘主机名’; >>> 对表操作的权限列表有INSERT、DELETE、UPDATE、SELECT等
GRANT ALL ON . TO ‘用户名’@‘主机名’; >>> 所有数据库的所有表的所有权限授予给指定用户
撤销权限:
REVOKE 权限列表 ON 数据库名.表名 FROM ‘用户名’@‘主机名’;

你可能感兴趣的:(MySQL)