MySQL

MySQL数据库

什么是数据库

简单的说就是一个来存储数据的仓库,我们可以将在程序执行时一些要保存的数据,如用户名、密码等信息存储到数据库,方便程序在运行时从中读取。

数据库的一点常识

数据库的分类:数据库分为关系型数据库和非关系型数据库。

  • 关系型数据库:MySQL、SQL Server、Oracle ……
  • 非关系型数据库:Redis、mongodb……

数据库管理系统(DataBaseManagementSystem)

建立在数据库之上的软件,可以说是一个接口通过给用户来访问操作数据库里的数据。

DBMS

数据库的一些命令基本操作语句

mysql -uroot -p123456 -- 连接数据库

update mysql.user set authentication_string=password('123456') where user='root' and Host = 'localhost';-- 修改数据库用户密码

flush privileges; -- 刷新数据库权限

show databases; -- 显示所有数据库

use dbname;-- 打开某个数据库/选择数据库

show tables; -- 显示数据库中所有的表

describe user; -- 显示表mysql数据库中user表的信息

create database dbname; -- 创建数据库

source d:/db.sql; -- 导入数据库sql文件

mysqldump -uroot -p123456 db > d:\db.sql -- 导出db数据库

exit; -- 退出Mysql

? -- 命令关键词 : 寻求帮助

-- 表示注释
/*多行注释*/

数据库的学习

数据库的学习主要是学习T-SQL语句,一共分类四种

T-SQL 描述 基本语句
DDL 数据定义语言 CREATE、ALTERR、DROP
DML 数据操纵语言 INSERT、UPDATE、DELETE
DQL 数据查询语言 SELECT
DCL 数据控制语言 GRANT、REVOKE、COMMIT、ROLLBACK

基础学习

数据类型

数值型

数据类型 长度
tinyint 1字节
smallint 2字节
mediumint 3字节
int 4字节
bigint 8字节
float 4字节
double 8字节
decimal

字符型

数据类型 长度
char[(n)] n字节
varchar[(n)] 可变长度
tinytext 28-1
text 216-1

日期、时间型

数据类型 字节数
date 1000-01-01~9999-12-31
time -838:59:59~838:59:59
datetime 1000-01-01 00:00:00~9999-12-31 23:59:59

变量

  • 声明变量
declare <@变量名><变量类型>
  • 变量赋值
select <@变量名>=<变量值>
set <@变量名>=<变量值>

输出语句

  • PRINT

    print <文本>|<变量名>
    
  • SELECT

    select <变量名> [as '别名'] 
    

条件控制语句

  • BEGIN...END:类似与{}

  • IF...ELSE

  • CASE

    CASE<输入条件表达式>
    	WHEN <条件表达式值1>	THEN<返回表达式1>
    	WHEN <条件表达式值2>	THEN<返回表达式2>
    	...
    	[ELSE <返回表达式n>]
    END
    
  • WHILE

  • WAITFOR

    WAIFOR DELAY <时间间隔>| TIME <等待时间点>
    

数据库

  • 创建数据库:create database [if not existe] 数据库名
  • 删除数据库:drop database [if exists] 数据库名
  • 修改数据库:alter database 数据库名
  • 查看数据库:show database
  • 使用数据库:use 数据库名

主键和外键

主键:主关键字(primary key)是表中的一个或多个字段,它的值用于唯一的标识表中的某一条记录。主关键字的列不能包含空值

外键:如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键。由此可见,外键表示了两个关系之间的相关联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表。

在实际操作中,将一个表的值放入第二个表来表示关联,所使用的值是第一个表的主键值(在必要时可包括复合主键值)。此时,第二个表中保存这些值的属性称为外键(foreign key)。

外键作用

保持数据一致性,完整性,主要目的是控制存储在外键表中的数据,约束。使两张表形成关联,外键只能引用外表中的列的值或使用空值。

实现

-- 年级表 (id\年级名称)
CREATE TABLE `grade` (
`gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年级ID',
`gradename` VARCHAR(50) NOT NULL COMMENT '年级名称',
-- 设置主键
PRIMARY KEY (`gradeid`)
) ENGINE=INNODB DEFAULT CHARSET=utf8

-- 学生信息表 (学号,姓名,性别,年级,手机,地址,出生日期,邮箱,身份证号)
CREATE TABLE `student` (
`studentno` INT(4) NOT NULL COMMENT '学号',
`studentname` VARCHAR(20) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`sex` TINYINT(1) DEFAULT '1' COMMENT '性别',
`gradeid` INT(10) DEFAULT NULL COMMENT '年级',
`phoneNum` VARCHAR(50) NOT NULL COMMENT '手机',
`address` VARCHAR(255) DEFAULT NULL COMMENT '地址',
`borndate` DATETIME DEFAULT NULL COMMENT '生日',
`email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
`idCard` VARCHAR(18) DEFAULT NULL COMMENT '身份证号',
-- 设置主键
PRIMARY KEY (`studentno`), 
-- 设置外键
KEY `FK_gradeid` (`gradeid`),
CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade` (`gradeid`)
) ENGINE=INNODB DEFAULT CHARSET=utf8

数据表

创建数据表

CREATE TABLE `student` (
  `id` INT(8) NOT NULL AUTO_INCREMENT, -- AUTO_INCREMENT	将`id`字段设置为自增
  `name` VARCHAR(6) NOT NULL,
  `age` INT(11) DEFAULT NULL, 
  PRIMARY KEY (`id`) -- 主键
) ENGINE=INNODB DEFAULT CHARSET=utf8

CREATE TABLE `student` (
  `id` INT(8) NOT NULL AUTO_INCREMENT,-- AUTO_INCREMENT	将`id`字段设置为自增
  `name` VARCHAR(6) NOT NULL,
  `sex` VARCHAR(2) DEFAULT NULL, -- DEFAULT 设置默认值
  `age` INT(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8 -- 设置引擎INNODB 字符集CHARSET

-- 基础格式
create table [if not exists] `表名`(
   '字段名1' 列类型 [属性][索引][注释],
   '字段名2' 列类型 [属性][索引][注释],
  #...
   '字段名n' 列类型 [属性][索引][注释]
)[表类型][表字符集][注释];

修改数据表

-- 创建外键方式二 : 创建子表完毕后,修改子表添加外键
ALTER TABLE `student`
ADD CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade` (`gradeid`);
-- 格式
ALTER TABLE `表名`
操作;

删除数据表

DROP TABLE `student`;
-- 格式
DROP TABLE `表名`;

数据操作

插入数据(insert)

INSERT INTO `student` VALUES(1,"张三",18),(2,"赵六咯",18),(3,"李四思",20),(4,"王五舞",19);
-- 格式
INSERT INTO `表名`[(字段1,字段2,···)] VALUES(值1,值2,...)[,VALUES(值1,值2,...)];

修改数据(update)

UPDATE `student` SET `name`='李四';

删除操作(delete/truncate)

-- delete
DELETE FROM `student` WHERE `name`='李四';
-- 基本格式
DELETE FROM `表名` [WHERE 筛选条件]; -- 不加条件是全部删除

-- truncate
TRUNCATE `student`;
-- 基本格式
TRUNCATE [TABLE] `表名`;

区别

  • 相同 : 都能删除数据 , 不删除表结构 , 但TRUNCATE速度更快
  • 不同 :
    • 使用TRUNCATE TABLE 重新设置AUTO_INCREMENT计数器
    • 使用TRUNCATE TABLE不会对事务有影响 (事务后面会说)

常用函数

MySQL常用函数

数据库数据MD5加密

MD5简介

MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。

实现数据加密

CREATE TABLE `testmd5` (
    `id` INT(4) NOT NULL,
    `name` VARCHAR(20) NOT NULL,
    `pwd` VARCHAR(50) NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8

-- 插入一些数据
INSERT INTO testmd5 VALUES(1,'kuangshen','123456'),(2,'qinjiang','456789')

-- 如果我们要对pwd这一列数据进行加密,语法是:
update testmd5 set pwd = md5(pwd);

-- 如果单独对某个用户(如kuangshen)的密码加密:
INSERT INTO testmd5 VALUES(3,'kuangshen2','123456')
update testmd5 set pwd = md5(pwd) where name = 'kuangshen2';

-- 要插入新的数据自动加密
INSERT INTO testmd5 VALUES(4,'kuangshen3',md5('123456'));

-- 查询登录用户信息(md5对比使用,查看用户输入加密后的密码进行比对)
SELECT * FROM testmd5 WHERE `name`='kuangshen' AND pwd=MD5('123456');

查询操作

简单查询

SELECT * FROM `student`;
-- 格式
SELECT `字段名`... FROM `表名`;

条件查询

  • 普通条件查询:

    SELECT * FROM `student` WHERE id=2;
    -- 格式
    SELECT 字段名... FROM `表名` WHERE 查询条件;
    
  • 范围条件查询:

    -- BETWEEN...AND...
    SELECT * FROM `student` WHERE `age` BETWEEN 15 AND 19;
    -- >、<、=、!=
    SELECT * FROM `student` WHERE `age` < 19;
    -- IN(数值1,...)
    SELECT * FROM `student` WHERE `name` IN ("张三","李四思");
    

模糊查询

-- _ 单个字符
SELECT * FROM `student` WHERE `name` LIKE '_四_';
-- % 多个字符
SELECT * FROM `student` WHERE `name` LIKE '王%';

分组查询

  • GROUP BY 是通过条件进行分组,通常用来实现分组统计

    SELECT COUNT(*) AS '人数',`sex` FROM `student`
    GROUP BY `sex`;
    

1635946954274

  • HAVING子句是对结果的进一步限制。

    SELECT COUNT(*) AS '人数',`sex` FROM `student` 
    GROUP BY `sex`
    HAVING `人数`>2;
    

    1635946996657

排序查询(ORDER BY)

-- ASC升序
SELECT * FROM `student`
ORDER BY `age` ASC;

-- DESC降序
SELECT * FROM `student`
ORDER BY `age` DESC;

多表查询

SELECT 字段1[字段2...]
FROM <表1> JOIN <表2> ON <连接条件>[JOIN <表3> ON <连接条件>...]

自查询

-- 在SC表(学号,课程号,成绩)中,查询选修C4课程的学生中成绩高于学号为S3学生成绩的所有学生
SELECT a.SNO,a.CNO,a.GRADE
FROM SC a JOIN SC b 
ON a.CNO='C4' AND a.GRADE>b.GRADE AND b.SNO='S3' AND b.CNO='C4'

分页(limit)

/*============== 分页 ================
语法 : SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset
好处 : (用户体验,网络传输,查询压力)

推导:
   第一页 : limit 0,5
   第二页 : limit 5,10
   第三页 : limit 10,15
   ......
   第N页 : limit (pageNo-1)*pageSzie,pageSzie
   [pageNo:页码,pageSize:单页面显示条数]
   
*/

-- 每页显示5条数据
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
INNER JOIN `subject` sub
ON r.subjectno = sub.subjectno
WHERE subjectname='数据库结构-1'
ORDER BY StudentResult DESC , studentno
LIMIT 0,5

-- 查询 JAVA第一学年 课程成绩前10名并且分数大于80的学生信息(学号,姓名,课程名,分数)
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
INNER JOIN `subject` sub
ON r.subjectno = sub.subjectno
WHERE subjectname='JAVA第一学年'
ORDER BY StudentResult DESC
LIMIT 0,10

视图

CREATE VIEW v_id_name
AS
SELECT `id`,`name`
FROM `student`

-- 格式

CREAT VIEW <视图名>
AS
-- 查询语句,结果作为视图内容

索引

索引的作用

  • 提高查询速度
  • 确保数据的唯一性
  • 可以加速表和表之间的连接 , 实现表与表之间的参照完整性
  • 使用分组和排序子句进行数据检索时 , 可以显著减少分组和排序的时间
  • 全文检索字段进行搜索优化.

分类

  • 主键索引 (Primary Key)
  • 唯一索引 (Unique)
  • 常规索引 (Index)
  • 全文索引 (FullText)

区分

  • 主键索引

    主键 : 某一个属性组能唯一标识一条记录

    特点 :

    • 最常见的索引类型
    • 确保数据记录的唯一性
    • 确定特定数据记录在数据库中的位置
  • 唯一性索引

    作用 : 避免同一个表中某数据列中的值重复

    与主键索引的区别

    • 主键索引只能有一个
    • 唯一索引可能有多个
  • 常规索引

    作用 : 快速定位特定数据

    注意 :

    • index 和 key 关键字都可以设置常规索引
    • 应加在查询找条件的字段
    • 不宜添加太多常规索引,影响数据的插入,删除和修改操作
  • 全文索引

    作用 : 快速定位特定数据

    注意 :

    • 只能用于MyISAM类型的数据表
    • 只能用于CHAR , VARCHAR , TEXT数据列类型
    • 适合大型数据集

基本语法

/*
#方法一:创建表时
    CREATE TABLE 表名 (
               字段名1 数据类型 [完整性约束条件…],
               字段名2 数据类型 [完整性约束条件…],
               [UNIQUE | FULLTEXT | SPATIAL ]   INDEX | KEY
               [索引名] (字段名[(长度)] [ASC |DESC])
               );


#方法二:CREATE在已存在的表上创建索引
       CREATE [UNIQUE | FULLTEXT | SPATIAL ] INDEX 索引名
                    ON 表名 (字段名[(长度)] [ASC |DESC]) ;


#方法三:ALTER TABLE在已存在的表上创建索引
       ALTER TABLE 表名 ADD [UNIQUE | FULLTEXT | SPATIAL ] INDEX
                            索引名 (字段名[(长度)] [ASC |DESC]) ;
                           
                           
#删除索引:DROP INDEX 索引名 ON 表名字;
#删除主键索引: ALTER TABLE 表名 DROP PRIMARY KEY;


#显示索引信息: SHOW INDEX FROM student;
*/

/*增加全文索引*/
ALTER TABLE `school`.`student` ADD FULLTEXT INDEX `studentname` (`StudentName`);

/*EXPLAIN : 分析SQL语句执行性能*/
EXPLAIN SELECT * FROM student WHERE studentno='1000';

/*使用全文索引*/
-- 全文搜索通过 MATCH() 函数完成。
-- 搜索字符串作为 against() 的参数被给定。搜索以忽略字母大小写的方式执行。对于表中的每个记录行,MATCH() 返回一个相关性值。即,在搜索字符串与记录行在 MATCH() 列表中指定的列的文本之间的相似性尺度。
EXPLAIN SELECT *FROM student WHERE MATCH(studentname) AGAINST('love');

/*
开始之前,先说一下全文索引的版本、存储引擎、数据类型的支持情况

MySQL 5.6 以前的版本,只有 MyISAM 存储引擎支持全文索引;
MySQL 5.6 及以后的版本,MyISAM 和 InnoDB 存储引擎均支持全文索引;
只有字段的数据类型为 char、varchar、text 及其系列才可以建全文索引。
测试或使用全文索引时,要先看一下自己的 MySQL 版本、存储引擎和数据类型是否支持全文索引。
*/

扩展,数据多时索引的作用

  1. 建app_user表

    CREATE TABLE `app_user` (
    `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(50) DEFAULT '' COMMENT '用户昵称',
    `email` VARCHAR(50) NOT NULL COMMENT '用户邮箱',
    `phone` VARCHAR(20) DEFAULT '' COMMENT '手机号',
    `gender` TINYINT(4) UNSIGNED DEFAULT '0' COMMENT '性别(0:男;1:女)',
    `password` VARCHAR(100) NOT NULL COMMENT '密码',
    `age` TINYINT(4) DEFAULT '0' COMMENT '年龄',
    `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP,
    `update_time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`)
    ) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COMMENT='app用户表'
    
  2. 插入100w条数据

    -- 插入100万数据
    DELIMITER $$	-- 写函数前必须写,标志
    CREATE FUNCTION mock_data()
    RETURNS INT
    BEGIN
    DECLARE num INT DEFAULT 1000000;
    DECLARE i INT DEFAULT 0;
    WHILE i < num DO
      INSERT INTO app_user(`name`, `email`, `phone`, `gender`, `password`, `age`)
       VALUES(CONCAT('用户', i), '24736743@qq.com', CONCAT('18', FLOOR(RAND()*(999999999-100000000)+100000000)),FLOOR(RAND()*2),UUID(), FLOOR(RAND()*100));
      SET i = i + 1;
    END WHILE;
    RETURN i;
    END;
    
    SELECT mock_data(); -- 执行函数
    
    
  3. 无索引效率测试

    SELECT * FROM app_user WHERE `name`='用户99999'; -- 耗时0.053 sec
    
    EXPLAIN SELECT * FROM app_user WHERE NAME = '用户99999'; -- 查询行数992391
    
  4. 创建索引

    CREATE INDEX idx_app_user_name ON app_user(name);
    
  5. 有索引效率测试

    SELECT * FROM app_user WHERE `name`='用户99999'; -- 耗时0.011 sec
    
    EXPLAIN SELECT * FROM app_user WHERE NAME = '用户99999'; -- 查询行数1
    

注意

  • 索引不是越多越好
  • 不要对经常变动的数据加索引
  • 小数据量的表建议不要加索引
  • 索引一般应加在查找条件的字段

事务

事务的ACID原则

原子性(Atomic)

  • 整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(ROLLBACK)到事务开始前的状态,就像这个事务从来没有执行过一样。

一致性(Consist)

  • 一个事务可以封装状态改变(除非它是一个只读的)。事务必须始终保持系统处于一致的状态,不管在任何给定的时间并发事务有多少。也就是说:如果事务是并发多个,系统也必须如同串行事务一样操作。其主要特征是保护性和不变性(Preserving an Invariant),以转账案例为例,假设有五个账户,每个账户余额是100元,那么五个账户总额是500元,如果在这个5个账户之间同时发生多个转账,无论并发多少个,比如在A与B账户之间转账5元,在C与D账户之间转账10元,在B与E之间转账15元,五个账户总额也应该还是500元,这就是保护性和不变性。

隔离性(Isolated)

  • 隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。

持久性(Durable)

  • 在事务完成以后,该事务对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

基本语法

-- 使用set语句来改变自动提交模式
SET autocommit = 0;   /*关闭*/
SET autocommit = 1;   /*开启*/

-- 注意:
--- 1.MySQL中默认是自动提交
--- 2.使用事务时应先关闭自动提交

-- 开始一个事务,标记事务的起始点
START TRANSACTION  

-- 提交一个事务给数据库
COMMIT

-- 将事务回滚,数据回到本次事务的初始状态
ROLLBACK

-- 还原MySQL数据库的自动提交
SET autocommit =1;

-- 保存点
SAVEPOINT 保存点名称 -- 设置一个事务保存点
ROLLBACK TO SAVEPOINT 保存点名称 -- 回滚到保存点
RELEASE SAVEPOINT 保存点名称 -- 删除保存点

示例

/*
课堂测试题目

A在线买一款价格为500元商品,网上银行转账.
A的银行卡余额为2000,然后给商家B支付500.
商家B一开始的银行卡余额为10000

创建数据库shop和创建表account并插入2条数据
*/

CREATE DATABASE `shop`CHARACTER SET utf8 COLLATE utf8_general_ci;
USE `shop`;

CREATE TABLE `account` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(32) NOT NULL,
`cash` DECIMAL(9,2) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8

INSERT INTO account (`name`,`cash`)
VALUES('A',2000.00),('B',10000.00)

-- 转账实现
SET autocommit = 0; -- 关闭自动提交
START TRANSACTION;  -- 开始一个事务,标记事务的起始点
UPDATE account SET cash=cash-500 WHERE `name`='A';
UPDATE account SET cash=cash+500 WHERE `name`='B';
COMMIT; -- 提交事务
# rollback;
SET autocommit = 1; -- 恢复自动提交

用户权限

命令

/* 用户和权限管理 */ 
用户信息表:mysql.user

-- 刷新权限
FLUSH PRIVILEGES

-- 增加用户
CREATE USER 用户名 IDENTIFIED BY [PASSWORD] 密码(字符串)
  -- 必须拥有mysql数据库的全局CREATE USER权限,或拥有INSERT权限。
  -- 只能创建用户,不能赋予权限。
  -- 用户名,注意引号:如 'user_name'@'192.168.1.1'
  -- 密码也需引号,纯数字密码也要加引号
  -- 要在纯文本中指定密码,需忽略PASSWORD关键词。要把密码指定为由PASSWORD()函数返回的混编值,需包含关键字PASSWORD

-- 重命名用户
RENAME USER old_user TO new_user

-- 设置密码
SET PASSWORD = PASSWORD('密码')    -- 为当前用户设置密码
SET PASSWORD FOR 用户名 = PASSWORD('密码')    -- 为指定用户设置密码

-- 删除用户
DROP USER 用户名

-- 分配权限/添加用户
GRANT 权限列表 ON 表名 TO 用户名 [IDENTIFIED BY [PASSWORD] 'password']
  - all privileges 表示所有权限
  - *.* 表示所有库的所有表
  - 库名.表名 表示某库下面的某表

-- 查看权限   SHOW GRANTS FOR root@localhost;
SHOW GRANTS FOR 用户名
   -- 查看当前用户权限
  SHOW GRANTS; 或 SHOW GRANTS FOR CURRENT_USER; 或 SHOW GRANTS FOR CURRENT_USER();

-- 撤消权限
REVOKE 权限列表 ON 表名 FROM 用户名
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 用户名    -- 撤销所有权限

权限解释

-- 权限列表
ALL [PRIVILEGES]    -- 设置除GRANT OPTION之外的所有简单权限
ALTER    -- 允许使用ALTER TABLE
ALTER ROUTINE    -- 更改或取消已存储的子程序
CREATE    -- 允许使用CREATE TABLE
CREATE ROUTINE    -- 创建已存储的子程序
CREATE TEMPORARY TABLES        -- 允许使用CREATE TEMPORARY TABLE
CREATE USER        -- 允许使用CREATE USER, DROP USER, RENAME USER和REVOKE ALL PRIVILEGES。
CREATE VIEW        -- 允许使用CREATE VIEW
DELETE    -- 允许使用DELETE
DROP    -- 允许使用DROP TABLE
EXECUTE        -- 允许用户运行已存储的子程序
FILE    -- 允许使用SELECT...INTO OUTFILE和LOAD DATA INFILE
INDEX     -- 允许使用CREATE INDEX和DROP INDEX
INSERT    -- 允许使用INSERT
LOCK TABLES        -- 允许对您拥有SELECT权限的表使用LOCK TABLES
PROCESS     -- 允许使用SHOW FULL PROCESSLIST
REFERENCES    -- 未被实施
RELOAD    -- 允许使用FLUSH
REPLICATION CLIENT    -- 允许用户询问从属服务器或主服务器的地址
REPLICATION SLAVE    -- 用于复制型从属服务器(从主服务器中读取二进制日志事件)
SELECT    -- 允许使用SELECT
SHOW DATABASES    -- 显示所有数据库
SHOW VIEW    -- 允许使用SHOW CREATE VIEW
SHUTDOWN    -- 允许使用mysqladmin shutdown
SUPER    -- 允许使用CHANGE MASTER, KILL, PURGE MASTER LOGS和SET GLOBAL语句,mysqladmin debug命令;允许您连接(一次),即使已达到max_connections。
UPDATE    -- 允许使用UPDATE
USAGE    -- “无权限”的同义词
GRANT OPTION    -- 允许授予权限


/* 表维护 */

-- 分析和存储表的关键字分布
ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE 表名 ...
-- 检查一个或多个表是否有错误
CHECK TABLE tbl_name [, tbl_name] ... [option] ...
option = {QUICK | FAST | MEDIUM | EXTENDED | CHANGED}
-- 整理数据文件的碎片
OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...

数据库的备份与还原

数据的导出

-- 导出
1. 导出一张表 -- mysqldump -uroot -p123456 school student >D:/a.sql
  mysqldump -u用户名 -p密码 库名 表名 > 文件名(D:/a.sql)
2. 导出多张表 -- mysqldump -uroot -p123456 school student result >D:/a.sql
  mysqldump -u用户名 -p密码 库名 表1 表2 表3 > 文件名(D:/a.sql)
3. 导出所有表 -- mysqldump -uroot -p123456 school >D:/a.sql
  mysqldump -u用户名 -p密码 库名 > 文件名(D:/a.sql)
4. 导出一个库 -- mysqldump -uroot -p123456 -B school >D:/a.sql
  mysqldump -u用户名 -p密码 -B 库名 > 文件名(D:/a.sql)

可以-w携带备份条件

-- 导入
1. 在登录mysql的情况下:-- source D:/a.sql
  source 备份文件
2. 在不登录的情况下
  mysql -u用户名 -p密码 库名 < 备份文件

三大范式

第一范式 (1st NF)

第一范式的目标是确保每列的原子性,如果每列都是不可再分的最小数据单元,则满足第一范式

第二范式(2nd NF)

第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。

第二范式要求每个表只描述一件事情

第三范式(3rd NF)

如果一个关系满足第二范式,并且除了主键以外的其他列都不传递依赖于主键列,则满足第三范式.

第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。

规范化和性能的关系

为满足某种商业目标 , 数据库性能比规范化数据库更重要

在数据规范化的同时 , 要综合考虑数据库的性能

通过在给定的表中添加额外的字段,以大量减少需要从中搜索信息所需的时间

注:本博客部分内容来自狂神说Java

posted @ 2021-11-04 20:43  Java小羊  阅读(108)  评论(1)    收藏  举报