MySQL

8 篇文章 0 订阅
3 篇文章 0 订阅

MySQL

1. 初识MySQL

一、什么是数据库?

数据库 ( DataBase , 简称DB )

​ 概念 : 长期存放在计算机内,有组织,可共享的大量数据的集合,是一个数据 “仓库”

​ 作用 : 保存,并能安全管理数据(如:增删改查等),减少冗余

二、数据库总览

①关系型数据库 ( SQL )

​ MySQL , Oracle , SQL Server , SQLite , DB2 , …

​ 关系型数据库通过外键关联来建立表与表之间的关系

②非关系型数据库 ( NOSQL )

​ Redis , MongoDB , …

​ 非关系型数据库通常指数据以对象的形式存储在数据库中,而对象之间的关系通过每个对象自身的属性来决定

③网状结构

​ 以节点形式存储和访问

④层次结构

​ 定向有序的树状结构实现存储和访问

三、什么是DBMS?

​ 数据库管理系统 ( DataBase Management System ),数据库管理软件(如MySQL等) , 科学组织和存储数据 , 高效地获取和维护数据

2. 数据库概述

2.1 结构化查询语句分类
名称解释命令
DDL (数据定义语言)定义和管理数据对象,如数据库,数据表等CREATE、DROP、ALTER
DML(数据操作语言)用于操作数据库对象中所包含的数据INSERT、UPDATE、DELETE
DQL(数据查询语言)用于查询数据库数据SELECT
DCL (数据控制语言)用于管理数据库的语言,包括管理权限及数据更改GRANT、commit、rollback
2.2 数据类型
2.2.1 数值类型
类型说明存储要求
tinyint非常小的数据1字节
smallint较小的数据2字节
mediumint中等大小的数据3字节
int整数4字节
bigint较大的整数8字节
float单精度浮点数4字节
double双精度浮点数8字节
decimal(m,d)字符串形式的浮点数m字节
2.2.2 字符串类型
类型说明最大长度
char(m)固定长度字符串,检索速度快,但费空间m字符
varchar(m)可变字符串,检索速度较char慢,节省空间变长度
tinytext微型文本串2的八次方-1字节
text文本串2的十六次方-1字节
2.2.3 日期和时间型数值类型
类型说明
DATEYYYY-MM-DD
TIMEHh:mm:ss
DATETIMEYYYY-MM-DD hh:mm:ss
TIMESTAMPYYYYMMDDhhmmss
YEARYYYY格式的年份值
2.2.4 NULL值

​ NULL值可以理解为“没有值”或“未知值”,不等于空字符串

2.3 其他注意事项

​ 一、可用反引号(`)为标识符(库名、表名、字段名、索引、别名)包裹,以避免与关键字重名;中文也可以作为标识符;
​ 二、每个库目录存在一个保存当前数据库的选项文件db.opt
​ 三、注释:
​ ①单行注释 # 注释内容
​ ②多行注释 /* 注释内容 */
​ ③单行注释 – 注释内容 (标准SQL注释风格,要求双破折号后加一空格符(空格、TAB、换行等))
​ 四、模式通配符:
​ ①_任意单个字符
​ ②%任意多个字符,甚至包括零字符
​ ③单引号需要进行转义’
​ 五、CMD命令行内的语句结束符可以为 “;” 或"\G"或"\g"仅影响显示结果;其他地方还是用分号结束;delimiter 可修改当前对话的语句结束符;
​ 六、SQL对大小写不敏感(关键字)
​ 七、清除已有语句:\c

3. MySQL数据操作

3.1 DDL

注意事项:
①反引号用于区别MySQL保留字与普通字符而引入的
②IF EXISTS为可选,判断是否存在该数据表如删除不存在的数据表会抛出错误
③在执行查询时,返回的结果集实际上是一张虚拟表
④在生产环境下,优先使用列名查询;*的方式查询效率低,可读性差

/*操作数据库*/
-- 创建数据库
create database [if not exists] 数据库名;
-- 删除数据库
drop database [if exists] 数据库名;
-- 查看数据库 
show databases;
-- 使用数据库
use 数据库名;
/*操作表*/
-- 创建表
create table [if not exists] `表名`('字段名1' 列类型 [属性][索引][注释],)[表类型][表字符集][注释];
-- 查看表
SELECT * FROM 表名;
SELECT 列名 FROM 表名;
-- 修改表
ALTER TABLE 旧表名 RENAME AS 新表名;
-- 删除表
DROP TABLE [IF EXISTS] 表名;
/*操作字段*/
-- 添加字段
ALTER TABLE 表名 ADD字段名 列属性[属性];
-- 修改字段
ALTER TABLE 表名 MODIFY 字段名 列类型[属性];
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 列属性[属性];
-- 删除字段 
ALTER TABLE 表名 DROP 字段名;
3.2 DQL
3.2.1 别名与去重
-- 列的别名 AS
SELECT id AS 学号,name AS 姓名 FROM t_student;
-- 查询结果去重 DISTINCT
SELECT DISTINCT id FROM t_student;
3.2.2 排序查询
-- 语法 ASC:默认为升序 DESC:降序
SELECT 列名 FROM 表名 ORDER BY 排序列[排序规则];
/*单列排序*/
SELECT id,name FROM t_student ORDER BY name DESC;
/*多列排序*/
SELECT id,name FROM t_student ORDER BY id ASC,name DESC;
3.2.3 条件查询
-- 语法 
SELECT 列名 FROM 表名 WHERE 条件;
3.2.3.1 等值判断
-- 与java中等值判断==不同,MySQL中使用=进行判断
SELECT id,name FROM t_student WHERE name = GuoJingPeng;
3.2.3.2 不等值判断
-- > <  >=  <=  !=  <>
SELECT score From t_student WHERE score >=60 AND score <= 90;
SELECT score From t_student WHERE score >= 90;
3.2.3.3 逻辑判断
-- AND OR NOT
SELECT id,name FROM t_student WHERE id = 1 AND name = GuoJingPeng;
SELECT id,name FROM t_student WHERE id = 1 OR name  = GuoJingPeng;
SELECT id,name FROM t_student WHERE id = 1 NOT name = GuoJingPeng;
3.2.3.4 区间判断
-- BETWEEN ADN
-- 判断中小值在前,大值在后,否则得不到正确结果
SELECT score FROM t_student WHERE score BETWEEN 60 AND 90;
3.2.3.5 NULL值判断
-- 列名为空 IS NULL
SELECT id,name FROM t_student WHERE name IS NULL;
-- 列名不为空 IS NOT NULL
SELECT id,name FROM t_student WHERE name IS NOT NULL;
3.2.3.6 枚举查询
-- IN(值2,值2,值3)
-- IN的查询效率低,可通过多条件拼接
SELECT id,name FROM t_student WHERE id IN (1,2,3);
3.2.3.7 模糊查询
-- WHERE 列名 LIKE 'GUO_'
-- LIKE通配符,模糊查询只能搭配LIKE使用
-- 查询列名为'GUO'开头,三个字符长度的名字
SELECT id,name FROM t_student WHERE name LIKE 'GUO___';
-- 查询列名为'GUO'开头,任意字符长度的名字
SELECT id,name FROM t_student WHERE name LIKE 'GUO%';
3.2.3.8 分支条件查询
-- 语法
CASE 
 WHERE 条件1 THEN 结果1 
 WHERE 条件2 THEN 结果2
 ELSE 结果3
END
3.2.4 分组查询
3.2.4.1 分组依据查询
-- SELECT 列名 FROM 表名 WHERE 条件 GROUP BY 分组依据列
SELECT id,name FROM t_student WHERE score > 90 GROUP BY id;
-- 使用聚合函数查询平均分、总人数
SELECT id AS 学号,COUNT(id) AS 总人数 FROM t_student GROUP BY id;
SELECT score AS 总分,AVG(id) AS 平均分 FROM t_student WHERE score > 90 GROUP BY score;
-- 分组查询中,select出来的列只能是分组依据列或聚合函数列,不能出现其他列
3.2.4.2 分组过滤查询
-- SELECT 列名 FROM 表名 WHERE 条件 GROUP BY 分组依据列 HAVING 过滤规则;
-- HAVING是对分组之后的数据进行过滤
SELECT id FROM t_student GROUP BY id HAVING id in (1,2,3);
3.2.5 限定查询
-- SELECT 列名 FROM 表名 LIMIT 起始行,结束行
-- 起始行是从0开始,代表第一行
-- 第二个参数代表了从指定行查询几行
SELECT id FROM t_student LIMIT 0,2;
3.2.5 子查询
3.2.5.1 作为条件判断

​ 一行一列的结果才能作为外部查询条件的等值判断条件或不等值条件判断

-- SELECT 列名 FROM 表名 WHERE 条件(子查询结果);
-- 查询成绩大于小郭的学生信息
-- 1.先查询小郭的成绩--95分
SELECT id,name,score FROM t_student WHERE name = '小郭';
-- 2.查询成绩大于95的学生信息
SELECT id,name,score FROM t_student WHERE score > 95;
-- 3.合并两条信息
SELECT id,name,score FROM t_student WHERE score > (SELECT id,name,score FROM t_student WHERE name = '小郭');
3.2.5.2 作为枚举查询条件
-- SELECT 列名 FROM 表名 WHERE 列名 IN(子查询结果);
-- 查询名字为小郭的同一部门的员工信息
-- 1.先查询小郭的部门信息--部门A,部门B
SELECT message FROM t_student WHERE name = '小郭';
-- 2.查询部门A,B的员工信息
SELECT message FROM t_student WHERE	message IN (部门A,部门B);
-- 3.合并两条信息
SELECT message FROM t_student WHERE message IN (SELECT message FROM t_student WHERE name = '小郭');
3.2.5.3 作为多行单列的结果

​ 当结果为多行单列时可以使用关键字ALL或ANY

-- 查询班级A所有人的成绩信息
SELECT score FROM t_student WHERE message = '班级A';
-- 查询高于班级A所有人的成绩的学生信息
SELECT score FROM t_student WHERE score > ALL(SELECT score FROM t_student WHERE message = '班级A');
-- 查询高于班级A部分人的成绩的学生信息
SELECT score FROM t_student WHERE score > ANY(SELECT score FROM t_student WHERE message = '班级A');
3.2.5.4 作为临时表

​ 作为一张临时表使用时,需要为临时表赋名

-- SELECT 列名 FROM(子查询结果) AS 别名 WHERE 条件;
-- 查询成绩为前五名的学生信息
-- 1.将成绩进行排序--排序后作为临时表
SELECT id,name FROM t_student ORDER BY score DESC;
-- 2.查询临时表的前五行学生信息
SELECT id,name FROM(SELECT id,name FROM t_student ORDER BY score DESC) AS 前五名成绩 LIMIT 0,5;
3.2.6 合并查询
-- 语法
-- 合并的两张表,列数必须相同,列的数据类型可以不同
SELECT 列名1 FROM 表名1 UNION/UNION ALL SELECT 列名2 FROM 表名2;
-- UNION 合并两张表,连接的结果集会去除重复的记录
SELECT id FROM t_student UNION SELECT name FROM t_employees;
-- UNION ALL 合并两张表,不会去除重复的记录
SELECT id FROM t_student UNION ALL SELECT name FROM t_employees;
3.2.7 连接查询
3.2.7.1 内连接
-- 语法
-- 查询两个表中的结果集中的交集
SELECT 列名 FROM 表名1 INNER JOIN 表名2 ON 连接条件; 
-- SQL标准,与其他数据库通用
-- 查询有备注的学生信息(不包括没有备注的学生)
SELECT * FROM t_student INNER JOIN t_student_message ON t_student.`id`= t_student_message.`id`;
-- MYSQL标准,也可作为内连接使用,但不符合SQL标准
SELECT * FROM t_student,t_student_message WHERE t_student.`id`= t_student_message.`id`;
3.2.7.2 左连接
-- 语法
-- 以左表作为基准,右边表来一一匹配,匹配不上的,返回左表的记录,右表以NULL填充
SELECT 列名 FROM 表名1 LEFT JOIN 表名2 ON 连接条件; 
-- 查询有备注学生信息(没有备注的学生信息也显示出来,并使用NULL填充)
SELECT * FROM t_student LEFT  JOIN t_student_message ON t_student.`id`= t_student_message.`id`;
3.2.7.3 右连接
-- 语法
-- 以右表作为基准,左边表来一一匹配,匹配不上的,返回右表的记录,左表以NULL填充
SELECT 列名 FROM 表名1 RIGTH JOIN 表名2 ON 连接条件; 
-- 查询所有的备注信息,以及有备注信息的学生信息(没有学生信息的备注信息也显示出来,并使用NULL填充)
SELECT * FROM t_student RIGHT JOIN t_student_message ON t_student.`id`= t_student_message.`id`;
3.2.7.4 自连接
-- 数据表与自身进行连接
-- 从一个包含栏目ID , 栏目名称和父栏目ID的表中查询父栏目名称和其他子栏目名称
-- 1.创建一个表
CREATE TABLE `category` (
`categoryid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主题ID',
`pid` INT(10) NOT NULL COMMENT '父ID',
`categoryName` VARCHAR(50) NOT NULL COMMENT '主题名字',
PRIMARY KEY (`categoryid`)
) ENGINE=INNODB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8
-- 2.插入数据
INSERT INTO `category` (`categoryid`, `pid`, `categoryName`)
VALUES('2','1','信息技术'),
('3','1','软件开发'),
('4','3','数据库'),
('5','1','美术设计'),
('6','3','Web开发'),
('7','5','PS技术'),
('8','2','办公信息');
-- 3.编写SQL语句,将栏目的父子关系呈现出来 (父栏目名称,子栏目名称)
-- 核心思想:把一张表看成两张一模一样的表,然后将这两张表连接查询(自连接)
SELECT a.categoryName AS '父栏目',b.categoryName AS '子栏目'FROM category AS a,category AS bWHERE a.`categoryid`=b.`pid`
3.3 DML
3.3.1 INSERT INTO
-- 语法
-- 表名中的列名要和VALUES里的值一一对应(个数、顺序、类型)
INSERT INTO 表名(列名1,列名2,列名3) VALUES(1,2,3);
-- 添加一名学生信息
INSERT INTO t_student(id,name,score) VALUES(4,'小王',85);
3.3.2 UPDATE
-- 语法
-- 绝大数情况要添加WHERE限定修改的条件,否则为整表更新
UPDATE 表名 SET1=新值1,2=新值2 WHERE 条件;
-- 将小郭的成绩修改为100
UPDATE t_student SET score=100 WHERE name='小郭';
3.3.3 DELETE
-- 语法
-- 绝大数情况要添加WHERE限定修改的条件,否则为整表删除
DELETE FROM 表名 WHERE 条件;
-- 删除小王的信息
DELETE FROM t_student WHERE name='小王';
3.3.4 TRUNCATE
-- 语法
-- 与DELETE不加WHERE条件不同,DELETE是删除表中数据
-- TRUNCATE是将表销毁,再按照原表生成一张新表
TRUNCATE TABLE 表名;
-- 如当前id为1,手动设置下一条数据id为99
-- 使用不加WHERE条件的DELETE后,进行填充数据但id自动填充,则id为100
-- 而使用TRUNCATE后,id则为1
TRUNCATE TABLE t_student_test;

4. 数据库三大约束

​ 用于限制加入表的数据的类型和规范

4.1 实体完整性约束
4.1.1 主键约束
-- 主键约束:PRIMARY KEY
-- 为适用于主键的列添加主键约束
-- 作用:标识此列的数据,值不可以重复,且不能为NULL
CREATE TABLE t_student(
	id   INT  PRIMARY KEY,
    name VARCHAR(20),
	message CHAR(50)
)CHARSET=UTF8;
4.1.2 唯一约束
-- 唯一约束:UNIQUE
-- 添加唯一约束
-- 作用:标识此列数据,值不可以重复,但可以为NULL
CREATE TABLE t_student(
	id   INT  PRIMARY KEY,
    name VARCHAR(20)UNIQUE,
	message CHAR(50)
)CHARSET=UTF8;
4.1.3 自动增长列
-- 自动增长列:AUTO_INCREMENT
-- 设置自动增长列
-- 不可以单独使用,配合PRIMARY KEY使用
-- 从1开始,每次加1
CREATE TABLE t_student(
	id   INT  PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(20)UNIQUE,
	message CHAR(50)
)CHARSET=UTF8;
4.2 域完整性约束

​ 限制单元格的数据正确性

-- 非空约束
-- NOT NULL 非空,必须有值
-- 默认值
-- DEFAULT 不指定值时,以默认值进行填充
4.3 引用完整性约束
-- 创建外键语法 
-- FOREIGN KEY引用外部表的某个列的值
-- 新增数据时,约束此列的值必须是引用表中已经存在的值
CONSTRAINT 外键名 FOREIGN KEY(列名) REFERENCES 被引用表(列名);
-- 方式一:创建表后添加外键
-- 将t_score中的sid与t_student的id进行关联
ALTER TABLE t_score ADD CONSTRAINT FOREIGN KEY(sid) REFERENCES t_student(id);
-- 方式二:创建表时添加
CREATE TABLE IF NOT EXISTS t_student(
	id   INT  PRIMARY KEY,
    name VARCHAR(20),
	message CHAR(50)
);
CREATE TABLE IF NOT EXISTS t_score(
	id   INT,
	sid  INT,
    score INT,
    CONSTRAINT fr_stu_scr FOREIGN KEY(sid) REFERENCES t_student(id)
);
-- 删除外键
-- 当两张表存在引用关系时,若执行删除操作时,一定要先删除引用表,再删除主表
ALTER TABLE student DROP FOREIGN KEY ST_gradeid;
-- 发现执行完上面的,索引还在,所以还要删除索引
-- 注:这个索引是建立外键的时候默认生成的
ALTER TABLE student DROP INDEX ST_gradeid;

5. 常用函数

5.1 数据函数
-- 绝对值
SELECT ABS(-8); 
-- 向上取整
SELECT CEILING(9.4); 
-- 向下取整
SELECT FLOOR(9.4);
-- 随机数,返回一个0-1之间的随机数
SELECT RAND(); 
-- 符号函数:负数返回-1,正数返回1,0返回0
SELECT SIGN(0); 
5.2 字符串函数
-- 返回字符串包含的字符数
SELECT CHAR_LENGTH('XiaoGuo'); 
-- 合并字符串,参数可以有多个
SELECT CONCAT('我','是','小郭'); 
-- 替换字符串,从某个位置开始替换某个长度
SELECT INSERT('XiaoGuo',1,2,'20'); 
-- 小写
SELECT LOWER('XiaoGuo'); 
-- 大写
SELECT UPPER('XiaoGuo'); 
-- 从左边截取
SELECT LEFT('Hello,World',5); 
-- 从右边截取
SELECT RIGHT('Hello,World',5); 
-- 替换字符串
SELECT REPLACE('小郭','20','MySQL');
-- 截取字符串,开始和长度
SELECT SUBSTR('小郭',4,6); 
-- 反转
SELECT REVERSE('狂神说坚持就能成功'); 
-- 查询姓马的同学,改成郭
SELECT REPLACE(studentname,'马','郭') AS 修改后 FROM student WHERE studentname LIKE '马%';
5.3 时间日期函数
-- 获取当前日期
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());
5.4 系统信息函数
-- 版本
SELECT VERSION(); 
-- 用户
SELECT USER(); 
5.6 聚合函数
-- 从含义上讲,count(1)与count(*)都表示对全部数据行的查询
-- count(字段)会统计该字段在表中出现的次数,忽略字段为null的情况,即不统计字段为null的记录
-- count(*)包括了所有的列,相当于行数,在统计结果的时候,包含字段为null的记录
-- count(1)用1代表代码行,在统计结果的时候,包含字段为null的记录 
函数名称描述
COUNT()返回满足Select条件的记录总和数,如 select count(*) 【不建议使用 *,效率低】
SUM()返回数字字段或表达式列作统计,返回一列的总和
AVG()通常为数值字段或表达列作统计,返回一列的平均值
MAX()可以为数值字段,字符字段或表达式列作统计,返回最大的值
MIN()可以为数值字段,字符字段或表达式列作统计,返回最小的值

6. 事务

​ ①事务就是将一组SQL语句放在同一批次内去执行

​ ②如果一个SQL语句出错,则该批次内的所有SQL都将被取消执行

​ ③MySQL事务处理只支持InnoDB和BDB数据表类型

6.1 事务的特性

一、原子性(Atomic)

​ ①整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节

​ ②事务在执行过程中发生错误,会被回滚(ROLLBACK)到事务开始前的状态,就像这个事务从来没有执行过一样

二、一致性(Consist)

​ ①一个事务可以封装状态改变(除非它是一个只读的)

​ ②如果事务是并发多个,系统也必须如同串行事务一样操作;其主要特征是保护性和不变性

​ ③以转账案例为例,假设有五个账户,每个账户余额是100元,那么五个账户总额是500元,如果在这个5个账户之间同时发生多个转账,无论并发多少个,比如在A与B账户之间转账5元,在C与D账户之间转账10元,在B与E之间转账15元,五个账户总额也应该还是500元,这就是保护性和不变性。

三、隔离性(Isolated)

​ ①隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作

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

​ ③脏读:脏读指一个事务读取了另外一个事务未提交的数据

​ ④不可重复读:不可重复读指在一个事务内读取表中的某一行数据,多次读取结果不同

​ ⑤虚读(幻读) : 虚读(幻读)是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致

四、持久性(Durable)

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

6.2 事务的实现
-- MySQL中默认是自动提交
-- 使用事务时应先关闭自动提交
-- 使用set语句来改变自动提交模式
SET autocommit = 0; /*关闭*/
SET autocommit = 1; /*开启*/
**********************************
-- 开始一个事务,标记事务的起始点
START TRANSACTION
**********************************
-- 提交一个事务给数据库
COMMIT
**********************************
-- 将事务回滚,数据回到本次事务的初始状态
ROLLBACK
**********************************
-- 还原MySQL数据库的自动提交
SET autocommit =1;
**********************************
-- 保存点
SAVEPOINT 保存点名称 -- 设置一个事务保存点
ROLLBACK TO SAVEPOINT 保存点名称 -- 回滚到保存点
RELEASE SAVEPOINT 保存点名称 -- 删除保存点
6.3 事务的练习
/*
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; -- 恢复自动提交

7. 视图

​ 视图即虚拟表,从一个表或多个表中查询出来的表,作用和真实表一样

一、作用

​ ①作用和真实表一样,包含一系列带有行和列的数据

​ ②视图中,用户可以使用SELECT语句查询数据,也可以使用DML操作记录

​ ③视图可以使用户操作更加方便,并保证数据库系统安全

二、特点

​ ①优点:简单化,数据所见即所得;安全性,用户只能查询或修改他们所能见得到的数据

​ ②缺点:性能相对较差,简单的查询也会变得稍显复杂;修改不方便,特别是复杂的聚合视图基本无法修改;

三、创建视图

CREATE VIEW 视图名 AS 查询语句;

四、修改视图

-- 如果视图已存在则替换,反之新建
CREATE OR REPLACE VIEW 视图名 AS 查询语句;
-- 对已存在的视图进行修改
ALTER VIEW 视图名 AS 查询语句;

五、删除视图

-- 视图的删除不会影响原表
DROP VIEW 视图名;

六、注意事项

​ ①视图不会独立存储数据,原表发生改变,视图也发生改变

​ ②没有优化任何查询性能

​ ③如果视图包含以下结构中的一种,则视图不可更新:1.聚合函数的结果 2.DISTINCT 去重后的结果 3.GROUP BY 分组后的结果 4.HAVING 筛选过滤后的结果 5.UNION、UNION ALL联合后的结果

8. 索引

8.1 索引分类

一、作用

​ ①提高查询速度

​ ②确保数据的唯一性

​ ③可以加速表和表之间的连接 , 实现表与表之间的参照完整性

​ ④使用分组和排序子句进行数据检索时 , 可以显著减少分组和排序的时间

​ ⑤全文检索字段进行搜索优化

二、分类

​ ①主键索引 (Primary Key)

​ ②唯一索引 (Unique)

​ ③常规索引 (Index)

​ ④全文索引 (FullText)

8.2 主键索引

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

​ 二、特点 :

​ ①最常见的索引类型

​ ②确保数据记录的唯一性

​ ③确定特定数据记录在数据库中的位置

8.3 唯一索引

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

二、与主键索引的区别

​ ①主键索引只能有一个

​ ②唯一索引可能有多个

CREATE TABLE `Grade`(
`GradeID` INT(11) AUTO_INCREMENT PRIMARYKEY,
`GradeName` VARCHAR(32) NOT NULL UNIQUE
-- 或 UNIQUE KEY `GradeID` (`GradeID`)
)
8.4 常规索引

一、作用 : 快速定位特定数据

二、注意 :

​ ①index 和 key 关键字都可以设置常规索引

​ ②应加在查询找条件的字段

​ ③不宜添加太多常规索引,影响数据的插入,删除和修改操作

CREATE TABLE `result`(
-- 省略一些代码
INDEX/KEY `ind` (`studentNo`,`subjectNo`) -- 创建表时添加
)
-- 创建后添加
ALTER TABLE `result` ADD INDEX `ind`(`studentNo`,`subjectNo`);
8.5 全文索引

一、作用 : 快速定位特定数据

二、注意 :

​ ①只能用于MyISAM类型的数据表

​ ②只能用于CHAR , VARCHAR , TEXT数据列类型

​ ③适合大型数据集

/*
开始之前,先说一下全文索引的版本、存储引擎、数据类型的支持情况
MySQL 5.6 以前的版本,只有 MyISAM 存储引擎支持全文索引;
MySQL 5.6 及以后的版本,MyISAM 和 InnoDB 存储引擎均支持全文索引;
只有字段的数据类型为 char、varchar、text 及其系列才可以建全文索引;
测试或使用全文索引时,要先看一下自己的 MySQL 版本、存储引擎和数据类型是否支持全文索引;
*/
#方法一:创建表时
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('XiaoGuo');
8.6 索引准则

​ ①索引不是越多越好

​ ②不要对经常变动的数据加索引

​ ③小数据量的表建议不要加索引

​ ④索引一般应加在查找条件的字段

8.7 索引的数据结构
-- 我们可以在创建上述索引的时候,为其指定索引类型,分两类
hash类型的索引:查询单条快,范围查询慢
btree类型的索引:b+树,层数越多,数据量指数级增长(我们就用它,因为innodb默认支持它)
-- 不同的存储引擎支持的索引类型也不一样
InnoDB 支持事务,支持行级别锁定,支持 B-tree、Full-text 等索引,不支持 Hash 索引;
MyISAM 不支持事务,支持表级别锁定,支持 B-tree、Full-text 等索引,不支持 Hash 索引;
Memory 不支持事务,支持表级别锁定,支持 B-tree、Hash 等索引,不支持 Full-text 索引;
NDB 支持事务,支持行级别锁定,支持 Hash 索引,不支持 B-tree、Full-text 等索引;
Archive 不支持事务,支持表级别锁定,不支持 B-tree、HashFull-text 等索引;

9.权限管理

9.1 用户权限管理
/* 用户和权限管理 */ 
-- 用户信息表:mysql.user
-- 刷新权限
FLUSH PRIVILEGES
-- 增加用户 CREATE USER xiaoguo IDENTIFIED BY '123456'
CREATE USER 用户名 IDENTIFIED BY [PASSWORD] 密码(字符串)
-- 必须拥有mysql数据库的全局CREATE USER权限,或拥有INSERT权限。
-- 只能创建用户,不能赋予权限。
-- 用户名,注意引号:如 'user_name'@'192.168.1.1'
-- 密码也需引号,纯数字密码也要加引号
-- 要在纯文本中指定密码,需忽略PASSWORD关键词。要把密码指定为由PASSWORD()函数返回的混编值,需包含关键字PASSWORD
-- 重命名用户 RENAME USER xiaoguo TO XiaoGuo
RENAME USER old_user TO new_user
-- 设置密码
SET PASSWORD = PASSWORD('密码') -- 为当前用户设置密码
SET PASSWORD FOR 用户名 = PASSWORD('密码') -- 为指定用户设置密码
-- 删除用户 DROP USER XiaoGuo
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
PRIVILEGESCREATE 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] ...
9.2 数据库备份

一、MySQL数据库备份方法

​ ①mysqldump备份工具 ②数据库管理工具,如SQLyog ③直接拷贝数据库文件和相关配置文件

二、mysqldump客户端

​ 作用:转储数据库、搜集数据库进行备份、将数据转移到另一个SQL服务器,不一定是MySQL服务器

/*导出*/
-- 导出一张表 mysqldump -u用户名 -p密码 库名 表名 > 文件名(D:/a.sql)
mysqldump -uroot -p123456 school student >D:/a.sql
-- 导出多张表 mysqldump -u用户名 -p密码 库名 表1 表2 表3 > 文件名(D:/a.sql)
mysqldump -uroot -p123456 school student result >D:/a.sql
-- 导出所有表 mysqldump -u用户名 -p密码 库名 > 文件名(D:/a.sql)
mysqldump -uroot -p123456 school >D:/a.sql
-- 导出一个库 mysqldump -u用户名 -p密码 -B 库名 > 文件名(D:/a.sql)
mysqldump -uroot -p123456 -B school >D:/a.sql
/*备份*/
-- source 备份文件(在登录mysql的情况下)
source D:/a.sql
-- 在不登录的情况下
mysql -u用户名 -p密码 库名 < 备份文件

10. 规范化数据库设计

10.1 为什么需要数据库设计

一、良好的数据库设计

​ ①节省数据的存储空间

​ ②能够保证数据的完整性

​ ③方便进行数据库应用系统的开发

二、软件项目开发周期中数据库设计

​ ①需求分析阶段: 分析客户的业务和数据处理需求

​ ②概要设计阶段:设计数据库的E-R模型图 , 确认需求信息的正确和完整.

三、设计数据库步骤

​ ①收集信息:与该系统有关人员进行交流 , 座谈 , 充分了解用户需求 , 理解数据库需要完成的任务

​ ②标识实体[Entity]:标识数据库要管理的关键对象或实体,实体一般是名词

​ ③标识每个实体需要存储的详细信息[Attribute]

​ ④标识实体之间的关系[Relationship]

10.2 数据库三大范式

一、为什么需要数据规范化?

​ 防止信息重复、更新异常、插入异常(无法正确表示信息)、删除异常(丢失有效信息)

二、三大范式

​ 1.第一范式 (1st NF)

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

​ 2.第二范式(2nd NF)

​ ①第二范式是在第一范式的基础上建立起来的,即满足第二范式必须先满足第一范式

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

​ 3.第三范式(3rd NF)

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

养匹小马

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值