MySQL基础知识大全

  • 1.操作数据库
    • 1.1 创建表
    • 1.2 修改表名
    • 1.3 增加表的字段
    • 1.4 修改表的字段
      • 1.4.1 修改表的字段
      • 1.4.2 修改表名
    • 1.5 删除表的字段
    • 1.6 删除表(如果表名存在)
  • 2. MySQL数据管理
    • 2.1 外键(了解)
    • 2.2 DML语言(熟悉)
    • 2.3 添加
    • 2.4 修改
    • 2.5 删除
  • 3.DQL查询数据
    • 3.1 指定字段查询
    • 3.2 where查询子句
    • 3.3 联表查询
    • 3.4 自连接查询
    • 3.5 分页和排序
    • 3.6 子查询
    • 3.7 分组和过滤
  • 4. SQL函数
    • 4.1 常用函数
    • 4.2 聚合函数(常用)
    • 4.3 数据库级别的MD5加密
  • 5. 事务
    • 5.1 事务的四大特性
      • 1) 原子性(Atomic)
      • 2) 一致性(Consistency)
      • 3) 隔离性(Isolation)
      • 4) 持久性(Durability)
    • 5.2 事务的隔离级别
      • 脏读
      • 不可重复读
      • 虚读/幻读
      • 丢失更新
      • 1)Read Uncommitted(读未提交)
      • 2)Read Committed(读已提交)
      • 3)Repeatable Read(可重复读取)
      • 4)Serializable(可串行化)
    • 5.3 事务的流程
  • 6. 索引
    • 6.1 索引的分类
    • 6.2 索引原则
  • 7.权限管理和备份
    • 7.1 权限管理
    • 7.2 数据库备份
  • 8.规范数据库设计
    • 8.1 为什么需要数据规范化?

1.操作数据库

1.1 创建表

CREATE TABLE IF NOT EXISTS `student` (
`id` INT (4) NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` VARCHAR (30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`password` VARCHAR (20) NOT NULL DEFAULT '123456' COMMENT '密码',
`gender` VARCHAR (2) NOT NULL DEFAULT '男' COMMENT '性别',
`birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
`address` VARCHAR (100) DEFAULT NULL COMMENT '家庭住址',
`email` VARCHAR (50) DEFAULT NULL COMMENT '邮箱',PRIMARY KEY (`id`)
) ENGINE = INNODB DEFAULT CHARSET = utf8

1.2 修改表名

ALTER TABLE `旧表名` RENAME AS `新表名`

1.3 增加表的字段

ALTER TABLE `表名` ADD 字段名 列属性

1.4 修改表的字段

1.4.1 修改表的字段

ALTER TABLE 表名 MODIFY 字段名 新的列属性

1.4.2 修改表名

ALTER TABLE 表名 CHANGE 旧表名 新表名 新的列属性

1.5 删除表的字段

ALTER TABLE 表名 DROP 字段名

1.6 删除表(如果表名存在)

DROP TABLE IF EXISTS 表名

2. MySQL数据管理

2.1 外键(了解)

-- 方式一.在创建表时就添加外键
-- 步骤
-- 1.定义外键key
-- 2.为外键添加约束(执行引用references)
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=utf8CREATE TABLE IF NOT EXISTS `student` (
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` VARCHAR(20) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`password` INT(50) NOT NULL COMMENT '密码',
`birthday` DATETIME COMMENT '出生日期',
`gradeid` INT(10) COMMENT '年级id',
`gender` VARCHAR(3) NOT NULL DEFAULT '男' COMMENT '性别',
`email` VARCHAR(50) NOT NULL COMMENT '邮箱',
PRIMARY KEY(`id`),
KEY  `FK_gradeid` (`gradeid`),
CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES grade(`gradeid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8-- 方式二、存在表的时候为表添加上外键
ALTER TABLE `student`
ADD CONSTRAINT `FK_gradeid` FOREIGN KEY(`gradeid`) REFERENCES `grade`(`gradeid`)

以上操作都是在物理外键,数据库级别的外键,这里不推荐使用!(数据库过多,会引起删改操作上的困扰)

2.2 DML语言(熟悉)

2.3 添加

INSERT INTO `student` (`name`,`password`,`birthday`,`email`)
VALUES ('张三',123456,'2000-02-10','1428606687@qq.com')

语法:

INSERT INTO 表名 ([字段名1],[字段名2],[字段名3]……)
VALUES (值1,值2,值3……),(值1,值2,值3……)……

说明:

  • 字段和字段之间用英文逗号隔开
  • 字段可以省略,但是省略后,后面的值必须要表中的字段一一对应,一个不少!
  • 同时插入多条语句,在values后面的值中,需要使用(值1,值2,值3……),(值1,值2,值3……)……

2.4 修改

​ update

UPDATE `student` SET `name`='王五' WHERE id=4;--不指定条件下,会修改所有的表!
UPDATE `student` SET `name`='二狗子';

语法:

-- column_name1:要修改的值所在的字段名
-- value1:修改后的新值
-- column_name3:要修改的值所在的字段名的其他字段名(定位条件)
-- value3:定位条件的值
UPDATE 表名 SET column_name1=value1,column_name2=value2 where column_name3 条件判断符 value3;
条件判断符 含义
= 等于
<>或!= 不等于
> 大于
< 小于
>= 大于或等于
<= 小于或等于
BETWEEN……AND…… 在某个范围内
AND
OR

说明:

  • 要修改多个值,要用英文逗号在中间隔开
  • 若省略了where,则表示修改表中的所有数据

2.5 删除

​ DELETE/TRUNCATE(删节:尤指掐头或去尾)

-- 删除指定内容
DELETE FROM `student` WHERE id=2;-- 删除表中全部内容
-- 1.使用truncate
TRUNCATE `student`
-- 2.使用delete
DELETE `student`

语法:

DELETE FROM 表名 WHERE column_name1 条件判断符 value1;

说明:

  • 如果不添加where,则默认删除表中全部内容,但不会删除表头

truncate和delete的共同点:

  • 都能删除数据,且不会删除掉表头

truncate和delete的不同点:

  • TRUNCATE会重新设置自增列,计数器归零;而delete不会
  • TRUNCATE不会影响事务

3.DQL查询数据

3.1 指定字段查询

-- 查询全部学生
SELECT * FROM `student`-- 查询指定字段
SELECT `studentname`,`gradeid` FROM `student`-- 别名,给结果起一个名字, AS 可以给字段起别名,也可以给表起别名
SELECT `studentname` AS 学生名字,`phone` AS 手机号码 FROM `student` AS 学生-- 使用函数 Cancat(a,b) 来拼接两个字符串
SELECT CONCAT('学生名字:',`studentname`) AS 新名字 FROM `student`

语法:

-- 查询指定字段
SELECT 字段名1 AS 新字段名1,字段名2 AS 新字段名2 FROM 表名 AS 新表名-- 使用函数Cancat(a,b),来拼接a和b两个字符串,a或b为字段名
SELECT CONCAT(a,b) AS 新字段名 FROM 表名

​ 去重:distinct

-- 去重 distinct
SELECT * FROM `result` -- 查询全部的考试成绩
SELECT `studentno` FROM `result`  -- 查询有哪些同学去参加了考试
SELECT DISTINCT `studentno` FROM `result`  -- 发现重复数据,去重

​ SELECT的多种用法

-- SELECT表达式的操作
-- 数据库中的表达式包括:文本值,列,Null,函数,计算表达式,系统变量……
SELECT VERSION()  -- 查询系统版本 (函数)
SELECT 100*8-1 AS 计算结果 -- 用于计算 (计算表达式)
SELECT @@auto_increment_increment  -- 查询自增步长 (变量)
SELECT `studentresult`+1 AS 学生成绩加一 FROM `result`  -- 查询学生成绩后再加一分  (计算表达式)

3.2 where查询子句

作用:检索数据中符合条件的语句

运算符 语法 描述
and 或 && a and b 逻辑与
or 或 || a or b 逻辑或
not 或 ! not a 逻辑非
SELECT `studentresult` FROM `result`
-- 搜索考试成绩在95-100区间的成绩
-- 使用and查询
SELECT `studentresult` FROM `result`
WHERE `studentresult`>95 AND `studentresult`<100
-- 使用between查询
SELECT `studentresult` FROM `result`
WHERE `studentresult` BETWEEN 95 AND 100-- 搜索考试成绩在0-60或90-100区间的成绩
SELECT `studentresult` FROM `result`
WHERE `studentresult`<60 OR `studentresult`>90-- 搜索考试成绩不在90-100区间的成绩
SELECT `studentresult` FROM `result`
WHERE NOT `studentresult` BETWEEN 90 AND 100

模糊查询:比较运算符

运算符 语法 描述
IS NULL a is null 如果操作符为NULL,结果为真
IS NOT NULL a is not null 如果操作符不为NULL,结果为真
BETWEEN a is between b and c 若a在b和c之间,结果为真
LIKE a like b SQL匹配,如果a匹配b,则结果为真
IN a in (a1,a2,a3……) 假设a在a1,或者a2……其中某一个值中,结果为真

​ %:代表0到任意个字符

​ _ : 代表一个字符

-- 查询住址在广东的同学
SELECT `studentno`,`studentname` FROM `student`
WHERE `address` LIKE '广东%'、-- 查询姓张的,名字有两个字的同学
SELECT `studentno`,`studentname` FROM `student`
WHERE `studentname` LIKE '张_'

3.3 联表查询

​ 七种 join 理论

操作 描述
inner join 如果表中至少有一个匹配,就返回值
left join 会从左表中返回所有的值,即使右表中没有匹配
right join 会从右表中返回所有的值,即使左表中没有匹配
-- 联表查询
-- 使用inner join
SELECT s.`studentno`,`studentname`,`subjectno`,`studentresult`
FROM `student` AS s
INNER JOIN `result` AS r
ON s.studentno = r.studentno-- 使用left join
SELECT s.`studentno`,`studentname`,`subjectno`,`studentresult`
FROM `student` AS s
LEFT JOIN `result` AS r
ON s.studentno = r.studentno-- 使用right join
SELECT s.`studentno`,`studentname`,`subjectno`,`studentresult`
FROM `student` AS s
RIGHT JOIN `result` AS r
ON s.studentno = r.studentno-- 匹配缺考学生
SELECT s.`studentno`,`studentname`,`subjectno`,`studentresult`
FROM `student` AS s
INNER JOIN `result` AS r
ON s.studentno = r.studentno
WHERE studentresult IS NULL

多表查询要点:先查询两张表,再不断增加一张表。

-- 查询参加了考试的同学的信息:学号,学生姓名,科目名,分数
SELECT s.`studentno`,`studentname`,`subjectname`,`studentresult`
FROM `student` s
RIGHT JOIN `result` r
ON r.`studentno` = s.`studentno`
INNER JOIN `subject` sub
ON r.`subjectno` = sub.`subjectno`

3.4 自连接查询

自己的表和自己的表连接,核心:一张表拆为两张一样的表即可

-- 自连接查询
SELECT a.`categoryname` AS '父栏目', b.`categoryname` AS '子栏目'
FROM `category` AS a
INNER JOIN `category` AS b
ON a.`categoryid` = b.`pid`
categoryid pid categoryname
2 1 信息技术
3 1 软件开发
4 3 美术设计
5 1 数据库
6 3 办公信息
7 5 web开发
8 2 ps技术

自连接查询后得到

父栏目 子栏目
软件开发 web开发
软件开发 数据库
美术设计 ps技术
信息技术 办公信息

3.5 分页和排序

排序

-- 排序  升序 ASC,降序 DESC
-- ORDER BY 通过哪个字段排序
SELECT s.`studentno`,`studentname`,`subjectname`,`studentresult`
FROM `student` s
INNER JOIN `result` r
ON s.`studentno` = r.`studentno`
INNER JOIN `subject` sub
ON r.`subjectno` = sub.`subjectno`
ORDER BY `studentresult` DESC

分页

-- 分页的作用:缓解数据库压力,给人的体验更好
-- 注意:分页的关键字limit要放在所有字段的最后
-- 第一页 limit 0,2       (1-1)*2
-- 第二页 limit 2,2       (2-1)*2
-- 第三页 limit 4,2       (3-1)*2
-- 第N页  limit (N-1)*pageSize,pageSize (n-1)*pageSize
-- pageSize:页面大小
-- (n-1)*pageSize:查询起始下标
SELECT s.`studentno`,`studentname`,`subjectname`,`studentresult`
FROM `student` s
INNER JOIN `result` r
ON s.`studentno` = r.`studentno`
INNER JOIN `subject` sub
ON r.`subjectno` = sub.`subjectno`
ORDER BY `studentresult` DESC
LIMIT 4,2

语法:

limit 查询起始下标,页面大小

3.6 子查询

where中的值是计算值,而不是固定值

-- 查询 C语言-1 的所有考试结果,包括(学号、姓名、科目编号、成绩)降序排列
-- 1.联表查询
SELECT `studentno`,`studentresult`,s.`subjectno`
FROM `subject` s
RIGHT JOIN `result` r
ON s.`subjectno` = r.`subjectno`
WHERE s.`subjectno` = 5-- 2.子查询
SELECT `studentno`,`studentresult`,`subjectno`
FROM `result`
WHERE `subjectno` = (SELECT `subjectno` FROM `subject`WHERE`subjectno` = 5
)

3.7 分组和过滤

分组:group by

过滤:having

-- 查询不同课程的平均分,最高分,最低分,平均分大于80
-- 核心: 根据不同的课程分组
SELECT `subjectname`,AVG(`studentresult`) AS 平均分,MAX(`studentresult`) AS 最高分,MIN(`studentresult`) AS 最低分
FROM `subject` s
INNER JOIN `result` r
ON s.`subjectno` = r.`subjectno`
GROUP BY r.`subjectno`
HAVING 平均分 >= 80

4. SQL函数

4.1 常用函数

-- 查询姓张的同学,并将他的姓改成章
SELECT REPLACE(`studentname`,'张','章') FROM `student`
WHERE `studentname` LIKE '张%'-- 数字运算
SELECT ABS(-10)  -- 返回绝对值
SELECT CEILING(2.5)  -- 向上取整
SELECT FLOOR(2.5)  -- 向下取整
SELECT RAND()  -- 返回一个 0~1 之间的随机数
SELECT SIGN(-10)  -- 判断一个数的符号 0为0 负数为-1 整数为1-- 字符串函数
SELECT CHAR_LENGTH('Merrill He')  -- 字符串长度 当前为10
SELECT CONCAT('Hello',',','world')  -- 拼接字符串 当前为Hello,world
SELECT INSERT('我爱编程',2,1,'超级爱')  -- 在指定位置插入子字符串,最多可指定字符数  当前为“我超级爱编程”
SELECT LOWER('Merrill He')  -- 返回小写字母
SELECT UPPER('Merrill He')  -- 返回大写字母
SELECT REPLACE('我爱编程','爱','超级爱')  -- 替换出现的指定字符串 当前为“我超级爱编程”
SELECT SUBSTR('我爱编程',3,2)  -- 返回指定的字符串(第一个数字为截取的位置,第二个数字为截取的长度)  当前为编程
SELECT REVERSE('我爱编程')  -- 反转字符串 当前为“程编爱我”-- 时间和日期函数
SELECT CURRENT_DATE()  -- 获取当前年月日
SELECT CURDATE()  -- 获取当前年月日(缩写版)
SELECT NOW()  -- 获取当前年月日时分秒
SELECT LOCALTIME()  -- 获取本地时间
SELECT SYSDATE()  -- 获取系统时间SELECT YEAR(NOW())  -- 获取当前年份
SELECT MONTH(NOW())  -- 获取当前月份
SELECT DAY(NOW())  -- 获取当前日期
SELECT HOUR(NOW())  -- 获取当前时钟
SELECT MINUTE(NOW())  -- 获取当前分钟
SELECT SECOND(NOW())  -- 获取当前秒钟-- 系统
SELECT SYSTEM_USER()  -- 客户端提供的用户名和主机名
SELECT USER()  -- 与SYSTEM_USER()同义
SELECT VERSION() -- 获取当前版本号

4.2 聚合函数(常用)

函数名 描述
count() 计数
sum() 求和
avg() 获取平均值
max() 获取最大值
min() 获取最小值

4.3 数据库级别的MD5加密

什么是MD5?

MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5由MD4、MD3、MD2改进而来,主要增强算法复杂度和不可逆性。

-- ==== 测试MD5加密 ====
-- 删除同名表
DROP TABLE testmd5-- 创建一个测试表
CREATE TABLE testmd5(id INT(5) NOT NULL,NAME VARCHAR(50) NOT NULL,pwd VARCHAR(50) NOT NULL,PRIMARY KEY(id)
)ENGINE=INNODB DEFAULT CHARSET = utf8-- 插入数据
INSERT INTO testmd5 VALUES
(1,'张三','123456'),
(2,'翠花','123456'),
(3,'李四','123456'),
(4,'二狗','123456')-- 为第一条数据加密
UPDATE testmd5 SET pwd=MD5(pwd) WHERE id=1-- 插入数据时进行加密
INSERT INTO testmd5 VALUES(5,'李蛋',MD5('123456'))-- 传入的值与数据库中的值进行校验
SELECT * FROM testmd5 WHERE NAME='张三' AND pwd=MD5('123456')

5. 事务

5.1 事务的四大特性

事务(Transaction)的定义:在数据库操作中,一项事务(Transaction)是由一条或多条操作数据库的 SQL 语句组成的一个不可分割的工作单元,这些操作要么都完成,要么都取消

事务的四大特性,俗称ACID

1) 原子性(Atomic)

表示将事务中所进行的操作捆绑成一个不可分割的单元,即对事务所进行的数据修改等操作,要么全部执行,要么全都不执行。

2) 一致性(Consistency)

表示事务完成时,必须使所有的数据都保持一致状态。

3) 隔离性(Isolation)

指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

4) 持久性(Durability)

持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。提交后的其他操作或故障不会对其有任何影响。

5.2 事务的隔离级别

  • 脏读

指一个事务读取到另一个事务未提交的数据。

  • 不可重复读

指一个事务对同一行数据重复读取两次,但得到的结果不同。

  • 虚读/幻读

指一个事务执行两次查询,但第二次查询的结果包含了第一次查询中未出现的数据。

  • 丢失更新

指两个事务同时更新一行数据,后提交(或撤销)的事务将之前事务提交的数据覆盖了。

丢失更新可分为两类,分别是第一类丢失更新第二类丢失更新

  • 第一类丢失更新是指两个事务同时操作同一个数据时,当第一个事务撤销时,把已经提交的第二个事务的更新数据覆盖了,第二个事务就造成了数据丢失。
  • 第二类丢失更新是指当两个事务同时操作同一个数据时,第一个事务将修改结果成功提交后,对第二个事务已经提交的修改结果进行了覆盖,对第二个事务造成了数据丢失。

为了避免上述事务并发问题的出现,在标准的 SQL 规范中定义了四种事务隔离级别,不同的隔离级别对事务的处理有所不同。这四种事务的隔离级别如下。

1)Read Uncommitted(读未提交)

一个事务在执行过程中,既可以访问其他事务未提交的新插入的数据,又可以访问未提交的修改数据。如果一个事务已经开始写数据,则另外一个事务不允许同时进行写操作,但允许其他事务读此行数据。此隔离级别可防止丢失更新。

2)Read Committed(读已提交)

一个事务在执行过程中,既可以访问其他事务成功提交的新插入的数据,又可以访问成功修改的数据。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。此隔离级别可有效防止脏读。

3)Repeatable Read(可重复读取)

一个事务在执行过程中,可以访问其他事务成功提交的新插入的数据,但不可以访问成功修改的数据。读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。此隔离级别可有效防止不可重复读和脏读。

4)Serializable(可串行化)

提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,不能并发执行。此隔离级别可有效防止脏读、不可重复读和幻读。但这个级别可能导致大量的超时现象和锁竞争,在实际应用中很少使用。

​ 一般来说,事务的隔离级别越高,越能保证数据库的完整性和一致性,但相对来说,隔离级别越高,对并发性能的影响也越大。因此,通常将数据库的隔离级别设置为 Read Committed,即读已提交数据,它既能防止脏读,又能有较好的并发性能。虽然这种隔离级别会导致不可重复读、幻读和第二类丢失更新这些并发问题,但可通过在应用程序中采用悲观锁和乐观锁加以控制。

5.3 事务的流程

-- mysql是默认开启事务自动提交的
SET autocommit = 0 -- 关闭自动提交
SET autocommit = 1 -- 开启自动提交(默认)-- 手动处理事务的步骤
SET autocommit = 0 -- 1.关闭自动提交-- 事务开启
START TRANSACTION -- 2.标记一个事务的开始,从这个之后sql都在同一个事务里-- 事务内容
INSERT ××
INSERT ××-- (如果成功)3.提交:持久化
COMMIT
-- (如果失败)4.回滚:回到原来的样子
ROLLBACK-- 事务结束
SET autocommit = 1 -- 5.开启自动提交-- 了解
SAVEPOINT 保存点名称 -- 设置一个事务的保存点
ROLLBACK SAVEPOINT 保存点名称 -- 回滚到保存点
RELEASE SAVEPOINT 保存点名称 -- 撤销保存点

示例:

-- 转账事务模拟
CREATE DATABASE shop CHARACTER SET utf8 COLLATE utf8_general_ci  -- 创建数据库
USE shop  -- 切换到shop数据库-- 创建表格
CREATE TABLE `account`(`id` INT(3) NOT NULL AUTO_INCREMENT,`name` VARCHAR(50) NOT NULL,`money` DECIMAL(9,2) NOT NULL,PRIMARY KEY(`id`)
)ENGINE = INNODB DEFAULT CHARSET = utf8-- 在表格中插入数据
INSERT INTO `account`(`name`,`money`)
VALUES('张三',2000.00),
('李四',10000.00)-- 模拟转账事务
SET autocommit = 0 -- 关闭自动提交
START TRANSACTION -- 开启一个事务
UPDATE `account` SET money=money-500 WHERE NAME='张三';  -- 张三减去500
UPDATE `account` SET money= money+500 WHERE NAME='李四';  -- 李四加上500
COMMIT -- 提交事务
ROLLBACK -- 回滚
SET autocommit = 1 -- 开启自动提交

6. 索引

定义: 索引是帮助MYSQL高效获取数据的数据结构

6.1 索引的分类

在一个表中,主键索引只能有一个,唯一索引可以有多个

  • 主键索引(PRIMARY KEY)

唯一的标识,主键不可重复,只能有一个列作为主键

  • 唯一索引(UNIQUE KEY)

作用是避免重复的列出现,唯一索引可以重复,多个列都可以标识唯一索引

  • 常规索引(KEY/INDEX)

默认的索引

  • 全文索引(FullText)

作用是快速定位数据。在特定的数据库引擎下才会有,例如MyISAM

示例:

-- 索引的使用-- 显示所有的索引信息
SHOW INDEX FROM student-- 增加一个全文索引
ALTER TABLE school.student ADD FULLTEXT INDEX `studentname`(`studentname`)-- explain 分析sql执行状况
EXPLAIN SELECT * FROM student;  -- 非全文索引
EXPLAIN SELECT * FROM student WHERE MATCH(studentname) AGAINST('张%');

6.2 索引原则

  • 索引不是越多越好
  • 不要对进程变动数据添加索引
  • 小数据量的表不需要加索引
  • 索引一般加在常用来查询的字段上

索引的数据结构

  • hash类型的索引
  • Btree类型的索引:innoDB默认数据结构

7.权限管理和备份

7.1 权限管理

基本命令行操作:

-- 创建用户
-- 语法:create user 用户名 identified by '密码'
CREATE USER Merrill_he IDENTIFIED BY '123456'-- 修改密码(修改当前用户密码)
-- 语法:set password = password('新密码')
SET PASSWORD = PASSWORD('123456')-- 修改密码(修改指定用户密码)
-- 语法:set password for 用户名 = password('新密码')
SET PASSWORD FOR Merrill_he = PASSWORD('123456')-- 重命名
-- 语法:rename user 旧名 to 新名
RENAME USER Merrill_he TO Merrill_he2-- 用户授权
-- 语法:grant all privileges on 库名.表名 to 用户名
GRANT ALL PRIVILEGES ON *.* TO Merrill_he2-- 查询权限
-- 语法:show grants for 用户名
/* 注意:查询主机权限时,需要在用户名后加上 @localhost普通用户在授权时不会授予“grant”权限
*/
SHOW GRANTS FOR Merrill_he2
SHOW GRANTS FOR root@localhost-- 撤销权限
-- 语法:revoke all privileges on 库名.表名 from 用户名
REVOKE ALL PRIVILEGES ON *.* FROM Merrill_he2-- 删除用户
DROP USER Merrill_he2

7.2 数据库备份

为什么要备份:

  • 保证重要的数据不丢失
  • 方便数据转移

MySQL数据库备份的方式:

  • 直接拷贝物理文件

  • 在sqlyog这种可视化工具中手动导出

    • 选中想要备份的表或者库,右击,选择 “备份/导出” ,选择 “备份表到SQL存储” 或 “备份数据库,转储到SQL…”
  • 使用命令行mysqldump导出

    # 导出
    # mysqldump -h主机名 -u用户名 -p密码 数据库 表名 >物理磁盘位置/文件名# mysqldump -h主机名 -u用户名 -p密码 数据库 表名1 表名2 表名3 >物理磁盘位置/文件名# mysqldump -h主机名 -u用户名 -p密码 数据库 > 物理磁盘位置/文件名# 导入
    # 登录的情况下,切换到指定的数据库
    # source 备份文件
    # mysql -u用户名 -p密码 库名<备份文件
    

8.规范数据库设计

8.1 为什么需要数据规范化?

  • 信息重复
  • 更新异常
  • 插入异常
    • 无法正常显示信息
  • 删除异常
    • 丢失有效信息

三大范式

第一范式(1NF):列不可再分

1.每一列属性都是不可再分的属性值,确保每一列的原子性

2.两列的属性相近或相似或一样,尽量合并属性一样的列,确保不产生冗余数据

第二范式(2NF):属性完全依赖于主键

满足第一范式,

第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主键。

第三范式(3NF):属性不依赖于其他非主属性,属性直接依赖于主键

数据不能存在传递关系,即每个属性都跟主键有直接关系而不是间接关系。像:a–>b–>c 属性之间含有这样的关系,是不符合第三范式的。

规范数据库的设计:规范性和性能的问题

  • 关联查询的表不得超过三张表
  • 在规范性能的问题时候,需要适当的考虑一下的规范性
  • 多表查询尽量减少为单表查询
  • 故意增加一些计算列,从大数据量降低为小数据量的查询

《MySQL》入门基础知识点大全:数据库操作、增删改查、联表查询、常用函数、MD5加密、事务特性、隔离级别相关推荐

  1. PHP:ThinkPHP5数据库操作增删改查-Model类

    1.Model的命名规范 一般model的名字和表名是对应的,例如 表名 pre_user -> 模型名 User.php User 表名 pre_user_info -> 模型名 Use ...

  2. 二、PHP基础——连接msql数据库进行增删改查操作 实战:新闻管理项目

    Mysql扩展 PHP针对MySQL数据库操作提供的扩展:允许PHP当做MySQL的一个客户端连接服务器进行操作. 连库基本操作 连接数据库服务器 1)资源 mysql_connect(服务器地址,用 ...

  3. jdbc mysql增删改查_使用JDBC连接MySQL数据库操作增删改查

    更多精彩内容欢迎访问我的个人博客皮皮家园:http://www.zhsh666.xyz或者http

  4. springboot如何对本地数据库增删改查_SpringBoot 数据库操作 增删改查

    1.pom添加依赖 org.springframework.boot spring-boot-starter-data-jpa mysql mysql-connector-java org.apach ...

  5. 通过JDBC实现对Oracle,mysql数据库的增删改查,模糊查询,查询全部,根据ID查询,分页查询,统计查询,

    首先,需要了解一些连接Oracle的基础的知识 jdbc:oracle:thin:@localhost:1521:orcl是java程序通过jdbc连接oracle数据库的一种方式. 解释: jdbc ...

  6. elasticsearch索引的初始化操作以及marvel操作(增删改查),批量查询_mget,批量操作_bulk

    文中的简洁版都是使用marvel操作的 安装marvel插件的教程 https://blog.csdn.net/u013294097/article/details/100144725 1.创建索引之 ...

  7. 通过Loadruner对mysql数据库进行增删改查

    通过Loadruner对mysql数据库进行增删改查 操作mysql数据库,是在实现mysql数据源配置的基础上操作,可先阅读:loadrunner参数化使用mysql数据源失败解决方法 写之前先理一 ...

  8. NodeJS里如何连接MySQL并分别操作增删改查

    本文简介 Node.js 里连接 MySQL ,并分别操作增删改查 . 你需要在电脑里安装一下 MySQL ,最好再安装一个数据库管理工具.我使用的是 MySQL Workbench ,这是一款 My ...

  9. MySQL 之基础操作增删改查等

    一:MySQL基础操作 使用方法: 方式一: 通过图型界面工具,如 Navicat,DBeaver等 方式二: 通过在命令行敲命令来操作 SQL ( Structure query language ...

  10. adodb mysql.inc.php,php adodb操作mysql数据库示例(增删改查)

    php adodb操作mysql数据库示例(增删改查) 发布于 2014-10-05 08:16:18 | 113 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: H ...

最新文章

  1. 推荐并简要分析一个silverlight的相册DEMO--ImageSnipper(V2)
  2. 两套代码详解LSTM-RNN——有记忆的神经网络
  3. Linux局域网搭建
  4. RPC和Restful深入理解
  5. 0x13链表与邻接表之邻值查找
  6. gnome硬盘分析_解决八种Linux硬盘问题的技巧
  7. html第八章制作花样链接卡,利用flex布局横向滚动制作滑动选项卡以及内容滑块...
  8. golang日志服务器_golang 写日志到syslog
  9. SmartBusinessDevFramework架构设计-2:结构图示
  10. 如何将iTunes资料安全地备份到外部硬盘驱动器?
  11. 为什么都不想去二次开发_为什么现在的一些大学生都不想处理各种人际关系了?...
  12. 【日常学习】【二叉树遍历】Uva548 - Tree题解
  13. css怎么去掉字体样式,css怎么去掉字体粗体样式
  14. 电路设计基础--MOS管驱动直流电机电路,看懂芯片手册
  15. java后端开发(二):web开发历史解读
  16. 2020超星android测试,2020知到《现代物流学》免费答案超星尔雅《测试作业导入》答案公众号...
  17. python编程实例题目
  18. 深度解析C/C++中的宏是什么?有什么作用呢?
  19. 颜值为王 美图M8成京东618新机好评榜最大黑马
  20. 2021-09-02牛客网每日10题--前端

热门文章

  1. 特色棒球夏令营·棒球1号位
  2. 业务流程图、数据流程图、功能流程图、页面流程图
  3. blend2d + MFC
  4. 关于Git 和Github的学习
  5. C语言实现人物动态移动效果
  6. PMCAFF微课17期 - 教你如何用数据玩转移动互联网APP运营(笔记下载)
  7. 笔记 | 初探Kotlin协程
  8. 蓝海彤翔执行副总裁张加廷接受【联播苏州】独家专访
  9. Word中的插入页眉 ?Word中页眉横线如何删除?
  10. OGG跳过事务 logdump FORCETRANS begin now