猿创征文|深聊MySQL,从入门到入坟之:应该是全网最详细的MySQL知识点汇总,必须收藏。(三)

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: 猿创征文|深聊MySQL,从入门到入坟之:应该是全网最详细的MySQL知识点汇总,必须收藏。(三)

2.19 视图

2.19 定义

视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。

视图具有表结构文件,但不存在数据文件。

对其中所引用的基础表来说,视图的作用类似于筛选。定义视图的筛选可以来自当前或其它数据库的一个或多个表,或者其它视图。通过视图进行查询没有任何限制,通过它们进行数据修改时的限制也很少。

视图是存储在数据库中的查询的sql语句,它主要出于两种原因:①安全原因,视图可以隐藏一些数据;②是可使复杂的查询易于理解和使用。

2.19 操作

#-- 创建视图
  CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW view_name [(column_list)] AS select_statement
     -- 视图名必须唯一,同时不能与表重名。
     -- 视图可以使用select语句查询到的列名,也可以自己指定相应的列名。
     -- 可以指定视图执行的算法,通过ALGORITHM指定。
     -- column_list如果存在,则数目必须等于SELECT语句检索的列数
#-- 查看结构
    SHOW CREATE VIEW view_name
#-- 删除视图
  DROP VIEW [IF EXISTS] view_name
      -- 删除视图后,数据依然存在。
      -- 可同时删除多个视图。
#-- 修改视图结构
    ALTER VIEW view_name [(column_list)] AS select_statement
     -- 一般不修改视图,因为不是所有的更新视图都会映射到表上。
-- 视图作用
    --1. 简化业务逻辑
    --2. 对客户端隐藏真实的表结构
-- 视图算法(ALGORITHM)
    MERGE       合并
        --将视图的查询语句,与外部查询需要先合并再执行!
    TEMPTABLE   临时表
        --将视图执行完毕后,形成临时表,再做外层查询!
    UNDEFINED   未定义(默认),指的是MySQL自主去选择相应的算法。

2.20 事务

2.20.1 定义

事务是指逻辑上的一组操作,组成这组操作的各个单元,要不全成功要不全失败。


支持连续SQL的集体成功或集体撤销。

事务是数据库在数据晚自习方面的一个功能。

需要利用 InnoDB 或 BDB 存储引擎,对自动提交的特性支持完成。

InnoDB被称为事务安全型引擎。


2.20.2 操作

#-- 事务开启
    START TRANSACTION; 或者 BEGIN;
    --开启事务后,所有被执行的SQL语句均被认作当前事务内的SQL语句。
#-- 事务提交
    COMMIT;
#-- 事务回滚
    ROLLBACK;
    --如果部分操作发生问题,映射到事务开启前。
-- 保存点
    SAVEPOINT 保存点名称 -- 设置一个事务保存点
    ROLLBACK TO SAVEPOINT 保存点名称 -- 回滚到保存点
    RELEASE SAVEPOINT 保存点名称 -- 删除保存点
-- InnoDB自动提交特性设置
    SET autocommit = 0|1;   0表示关闭自动提交,1表示开启自动提交。
    - 如果关闭了,那普通操作的结果对其他客户端也不可见,需要commit提交后才能持久化数据操作。
    - 也可以关闭自动提交来开启事务。但与START TRANSACTION不同的是,
        SET autocommit是永久改变服务器的设置,直到下次再次修改该设置。(针对当前连接)
        而START TRANSACTION记录开启前的状态,而一旦事务提交或回滚后就需要再次开启事务。(针对当前事务)

2.20.3 事务特性,原理及实现

一、事务特性


#-- 
    1. 原子性(Atomicity)
        事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
    2. 一致性(Consistency)
        事务前后数据的完整性必须保持一致。
        - 事务开始和结束时,外部数据一致
        - 在整个事务过程中,操作是连续的
    3. 隔离性(Isolation)
        多个用户并发访问数据库时,一个用户的事务不能被其它用户的事物所干扰,多个并发事务之间的数据要相互隔离。
    4. 持久性(Durability)
        一个事务一旦被提交,它对数据库中的数据改变就是永久性的。

二、事务的实现


#-- 事务的实现
    1. 要求是事务支持的表类型
    2. 执行一组相关的操作前开启事务
    3. 整组操作完成后,都成功,则提交;如果存在失败,选择回滚,则会回到事务开始的备份点。

三、事务的原理


#-- 事务的原理
    利用InnoDB的自动提交(autocommit)特性完成。
    普通的MySQL执行语句后,当前的数据提交操作均可被其他客户端可见。
    而事务是暂时关闭“自动提交”机制,需要commit提交持久化数据操作。

注意:


数据定义语言(DDL)语句不能被回滚,比如创建或取消数据库的语句,和创建、取消或更改表或存储的子程序的语句。

事务不能被嵌套。


2.21 锁表


定义:

表锁定只用于防止其它客户端进行不正当地读取和写入


MyISAM 支持表锁;

InnoDB 支持行锁

操作

#-- 锁定
    LOCK TABLES tbl_name [AS alias]
#-- 解锁
    UNLOCK TABLES


2.22 触发器

定义

触发程序是与表有关的命名数据库对象,当该表出现特定事件时,将激活该对象

监听:


记录的增加

记录的修改

记录的删除。

操作


#-- 创建触发器
CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt
    参数:
    trigger_time是触发程序的动作时间。它可以是 before 或 after,以指明触发程序是在激活它的语句之前或之后触发。
    trigger_event指明了激活触发程序的语句的类型
        INSERT:将新行插入表时激活触发程序
        UPDATE:更改某一行时激活触发程序
        DELETE:从表中删除某一行时激活触发程序
    tbl_name:监听的表,必须是永久性的表,不能将触发程序与TEMPORARY表或视图关联起来。
    trigger_stmt:当触发程序激活时执行的语句。执行多个语句,可使用BEGIN...END复合语句结构
#-- 删除
DROP TRIGGER [schema_name.]trigger_name
可以使用old和new代替旧的和新的数据
    更新操作,更新前是old,更新后是new.
    删除操作,只有old.
    增加操作,只有new.
-- 注意
    1. 对于具有相同触发程序动作时间和事件的给定表,不能有两个触发程序。
#-- 字符连接函数
  concat(str1,str2,...])
  concat_ws(separator,str1,str2,...)
#-- 分支语句
  if 条件 then
     执行语句
  elseif 条件 then
     执行语句
  else
     执行语句
  end if;
#-- 修改最外层语句结束符
  delimiter 自定义结束符号
     SQL语句
  自定义结束符号
  delimiter ;     -- 修改回原来的分号
#-- 语句块包裹
  begin
     语句块
  end
#-- 特殊的执行
  1. 只要添加记录,就会触发程序。
  2. Insert into on duplicate key update 语法会触发:
     如果没有重复记录,会触发 before insert, after insert;
     如果有重复记录并更新,会触发 before insert, before update, after update;
     如果有重复记录但是没有发生更新,则触发 before insert, before update
  3. Replace 语法 如果有记录,则执行 before insert, before delete, after delete, after insert

2.23 用户和权限管理

#-- root密码重置
  1. 停止MySQL服务
  2.  [Linux] /usr/local/mysql/bin/safe_mysqld --skip-grant-tables &
     [Windows] mysqld --skip-grant-tables
  3. use mysql;
  4. UPDATE `user` SET PASSWORD=PASSWORD("密码") WHERE `user` = "root";
  5. FLUSH PRIVILEGES;
  用户信息表: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 表示所有权限
     - *.* 表示所有库的所有表
     - 库名.表名 表示某库下面的某表
     GRANT ALL PRIVILEGES ON `pms`.* TO 'pms'@'%' IDENTIFIED BY 'pms0817';
#-- 查看权限
  SHOW GRANTS FOR 用户名
    #-- 查看当前用户权限
      SHOW GRANTS; 或 SHOW GRANTS FOR CURRENT_USER; 或 SHOW GRANTS FOR CURRENT_USER();
#-- 撤消权限
  REVOKE 权限列表 ON 表名 FROM 用户名
  REVOKE ALL PRIVILEGES, GRANT OPTION FROM 用户名   -- 撤销所有权限
#-- 权限层级
  #-- 要使用GRANT或REVOKE,您必须拥有GRANT OPTION权限,并且您必须用于您正在授予或撤销的权限。
  全局层级:全局权限适用于一个给定服务器中的所有数据库,mysql.user
     GRANT ALL ON *.*和 REVOKE ALL ON *.*只授予和撤销全局权限。
  数据库层级:数据库权限适用于一个给定数据库中的所有目标,mysql.db, mysql.host
     GRANT ALL ON db_name.*和REVOKE ALL ON db_name.*只授予和撤销数据库权限。
  表层级:表权限适用于一个给定表中的所有列,mysql.talbes_priv
     GRANT ALL ON db_name.tbl_name和REVOKE ALL ON db_name.tbl_name只授予和撤销表权限。
  列层级:列权限适用于一个给定表中的单一列,mysql.columns_priv
     当使用REVOKE时,您必须指定与被授权列相同的列。
#-- 权限列表
  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    -- 允许授予权限

2.24 表维护

#-- 分析和存储表的关键字分布
  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] ...

2.25 编程


2.25.1 局部变量

局部变量

#-- 变量声明
    declare var_name[,...] type [default value]
    这个语句被用来声明局部变量。要给变量提供一个默认值,请包含一个default子句。值可以被指定为一个表达式,不需要为一个常数。如果没有default子句,初始值为null。
#-- 赋值
    使用 set 和 select into 语句为变量赋值。
    - 注意:在函数内是可以使用全局变量(用户自定义的变量)

2.25.2 全局变量

全局变量

#-- 定义、赋值
  set 语句可以定义并为变量赋值。
  set @var = value;
  也可以使用select into语句为变量初始化并赋值。这样要求select语句只能返回一行,但是可以是多个字段,就意味着同时为多个变量进行赋值,变量的数量需要与查询的列数一致。
  还可以把赋值语句看作一个表达式,通过select执行完成。此时为了避免=被当作关系运算符看待,使用:=代替。(set语句可以使用= 和 :=)。
  select @var:=20;
  select @v1:=id, @v2=name from t1 limit 1;
  select * from tbl_name where @var:=30;
  select into 可以将表中查询获得的数据赋给变量。
     -| select max(height) into @max_height from tb;
#-- 自定义变量名
  为了避免select语句中,用户自定义的变量与系统标识符(通常是字段名)冲突,用户自定义变量在变量名前使用@作为开始符号。
  @var=10;

2.25.3 结构控制

结构控制


#-- if语句
  if search_condition then
     statement_list  
  [elseif search_condition then
     statement_list]
  ...
  [else
     statement_list]
  end if;
#-- case语句
  CASE value WHEN [compare-value] THEN result
  [WHEN [compare-value] THEN result ...]
  [ELSE result]
  END
#-- while循环
  [begin_label:] while search_condition do
     statement_list
  end while [end_label];
  - 如果需要在循环内提前终止 while循环,则需要使用标签;标签需要成对出现。
     -- 退出循环
         退出整个循环 leave
         退出当前循环 iterate
         通过退出的标签决定退出哪个循环

2.25.4 内置函数

内置函数

#-- 数值函数
  abs(x)          -- 绝对值 abs(-10.9) = 10
  format(x, d)    -- 格式化千分位数值 format(1234567.456, 2) = 1,234,567.46
  ceil(x)         -- 向上取整 ceil(10.1) = 11
  floor(x)        -- 向下取整 floor (10.1) = 10
  round(x)        -- 四舍五入去整
  mod(m, n)       -- m%n m mod n 求余 10%3=1
  pi()            -- 获得圆周率
  pow(m, n)       -- m^n
  sqrt(x)         -- 算术平方根
  rand()          -- 随机数
  truncate(x, d)  -- 截取d位小数
#-- 时间日期函数
  now(), current_timestamp();     -- 当前日期时间
  current_date();                 -- 当前日期
  current_time();                 -- 当前时间
  date('yyyy-mm-dd hh:ii:ss');    -- 获取日期部分
  time('yyyy-mm-dd hh:ii:ss');    -- 获取时间部分
  date_format('yyyy-mm-dd hh:ii:ss', '%d %y %a %d %m %b %j'); -- 格式化时间
  unix_timestamp();               -- 获得unix时间戳
  from_unixtime();                -- 从时间戳获得时间
#-- 字符串函数
  length(string)          -- string长度,字节
  char_length(string)     -- string的字符个数
  substring(str, position [,length])      -- 从str的position开始,取length个字符
  replace(str ,search_str ,replace_str)   -- 在str中用replace_str替换search_str
  instr(string ,substring)    -- 返回substring首次在string中出现的位置
  concat(string [,...])   -- 连接字串
  charset(str)            -- 返回字串字符集
  lcase(string)           -- 转换成小写
  left(string, length)    -- 从string2中的左边起取length个字符
  load_file(file_name)    -- 从文件读取内容
  locate(substring, string [,start_position]) -- 同instr,但可指定开始位置
  lpad(string, length, pad)   -- 重复用pad加在string开头,直到字串长度为length
  ltrim(string)           -- 去除前端空格
  repeat(string, count)   -- 重复count次
  rpad(string, length, pad)   --在str后用pad补充,直到长度为length
  rtrim(string)           -- 去除后端空格
  strcmp(string1 ,string2)    -- 逐字符比较两字串大小
#-- 流程函数
  case when [condition] then result [when [condition] then result ...] [else result] end   多分支
  if(expr1,expr2,expr3)  双分支。
#-- 聚合函数
  count()
  sum();
  max();
  min();
  avg();
  group_concat()
#-- 其他常用函数
  md5();
  default();

2.25.5 自定义存储函数

#-- 新建
    CREATE FUNCTION function_name (参数列表) RETURNS 返回值类型
        函数体
    - 函数名,应该合法的标识符,并且不应该与已有的关键字冲突。
    - 一个函数应该属于某个数据库,可以使用db_name.funciton_name的形式执行当前函数所属数据库,否则为当前数据库。
    - 参数部分,由"参数名"和"参数类型"组成。多个参数用逗号隔开。
    - 函数体由多条可用的mysql语句,流程控制,变量声明等语句构成。
    - 多条语句应该使用 begin...end 语句块包含。
    - 一定要有 return 返回值语句。
#-- 删除
    DROP FUNCTION [IF EXISTS] function_name;
#-- 查看
    SHOW FUNCTION STATUS LIKE 'partten'
    SHOW CREATE FUNCTION function_name;
#-- 修改
    ALTER FUNCTION function_name 函数选项

2.25.6 自定义存储过程

#-- 定义
  存储存储过程 是一段代码(过程),存储在数据库中的sql组成。
  一个存储过程通常用于完成一段业务逻辑,例如报名,交班费,订单入库等。
  而一个函数通常专注与某个功能,视为其他程序服务的,需要在其他语句中调用函数才可以,而存储过程不能被其他调用,是自己执行 通过call执行。
#-- 创建
  CREATE PROCEDURE sp_name (参数列表)
     过程体
  参数列表:不同于函数的参数列表,需要指明参数类型
  IN:表示输入型;
  OUT:表示输出型;
  INOUT:表示混合型;

3、总结


看到这里,今天的分享就结束了。

肝了个通宵,总算把MySQL的知识点总结完成了。


这应该算得上全网最全的最详细的MySQL知识点汇总了。

如果你正在学习MySQL,或者你暂时对MySQL的知识点有盲区,建议你赶紧收藏起来学习吧。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
存储 监控 关系型数据库
轻松入门Mysql:MySQL性能优化与监控,解锁进销存系统的潜力(23)
轻松入门Mysql:MySQL性能优化与监控,解锁进销存系统的潜力(23)
|
1月前
|
SQL 数据可视化 关系型数据库
轻松入门MySQL:深入探究MySQL的ER模型,数据库设计的利器与挑战(22)
轻松入门MySQL:深入探究MySQL的ER模型,数据库设计的利器与挑战(22)
119 0
|
1月前
|
存储 关系型数据库 MySQL
轻松入门MySQL:数据库设计之范式规范,优化企业管理系统效率(21)
轻松入门MySQL:数据库设计之范式规范,优化企业管理系统效率(21)
|
1月前
|
SQL 关系型数据库 MySQL
轻松入门MySQL:MySQL 备份与恢复,保护数据安全,提高工作效率(20)
轻松入门MySQL:MySQL 备份与恢复,保护数据安全,提高工作效率(20)
|
1月前
|
SQL 存储 关系型数据库
轻松入门MySQL:深入理解MySQL日志,二进制日志、中继日志、回滚日志和重做日志(19)
轻松入门MySQL:深入理解MySQL日志,二进制日志、中继日志、回滚日志和重做日志(19)
|
1月前
|
存储 关系型数据库 MySQL
MySQL基础入门:数据库操作全攻略
MySQL基础入门:数据库操作全攻略
56 0
|
14天前
|
存储 关系型数据库 MySQL
MySQL数据库实战:从入门到精通
本文介绍了MySQL的使用和优化,适合Web开发者阅读。首先,确保安装并配置好MySQL,熟悉SQL基础。接着,通过命令行客户端连接数据库,执行创建、查询、添加、修改和删除数据等操作。学习数据类型并创建表存储数据。最后,探讨了数据库优化,包括查询优化和索引使用,以提升性能。
26 2
|
2天前
|
关系型数据库 MySQL 数据库
docker MySQL删除数据库时的错误(errno: 39)
docker MySQL删除数据库时的错误(errno: 39)
10 0
|
2天前
|
关系型数据库 MySQL 数据库连接
用Navicat备份Mysql演示系统数据库的时候出:Too Many Connections
用Navicat备份Mysql演示系统数据库的时候出:Too Many Connections
|
3天前
|
存储 Oracle 关系型数据库
oracle 数据库 迁移 mysql数据库
将 Oracle 数据库迁移到 MySQL 是一项复杂的任务,因为这两种数据库管理系统具有不同的架构、语法和功能。
15 0