MySQL

MySQL

墨菲定律主要包括四个方面:
	-任何事都没有表面看起来那么简单;
	-所有的事都会比你预计的时间长;
	-会出错的事总会出错;
	-如果你担心某种情况发生,那么它就更有可能发生。

初识MySQL

​ MySQL是目前最流行的开放源码数据库管理系统,是完全网络化的跨平台的关系型数据库系统,它是一款自由软件。其主要目标是快捷、简便、易用,但是它的规模小、功能有限…

MySQL的优势

  • 使用C/C++编写,源代码具有可移植性
  • 支持多种操作系统
  • 为多种编程语言提供了API
  • 支持多线程,充分利用CPU
  • 优化的SQL查询算法,有效地提高查询速度
  • 提供TCP/IP、ODBC、JDBC等多种数据库链接途径
  • 可以处理拥有上千万条记录的大型数据库
MySQL服务器启停(DOS窗口)
  • 启动服务器:

    • net start [服务名] eg: net start mysql
  • 停止服务器:

    • net stop [服务名] eg: net stop mysql
连接和断开MySQL服务器
  • 连接:
    • mysql [-h MySQL服务器所在地址] [-P 端口号] -u 用户名 -p密码
      • -h 默认是127.0.0.1或者localhost
      • -P 默认的端口号为3306 (若有更改,不可省略,必须有)
  • 断开:
    • quit;
      • 此操作是在mysql命令行中操作

MySQL数据类型

  • 数值类型
    • 整数类型
      • tinyint 占1个字节 表示范围:-128~127 (无符号:0~255)
      • smallint 占2个字节 表示范围:-32768~32767
      • mediumint 占3个字节 表示范围:-8388608~8388607
      • int 占4个字节 表示范围:-2147483648~2147483647
      • bigint 占8个字节
    • 小数类型
      • float 单精度 占4个字节
      • double 双精度 占8个字节
      • decimal[M,D] M表示长度,D表示小数点精确的位数 大小不确定
        • M默认为10,最大为65,
        • D默认为0,最大为30,表示小数点位数
  • 文本类型
    • 字符
      • char 表示范围:0~255个字符
        • char(长度) 表示定长,会分配固定长度的字符空间
    • 字符串
      • varchar 表示范围:0~65535个字节
        • varchar(长度) 表示变长,将按照实际字符长短来分配空间
        • 有效范围将少1~3个字节用于记录大小
        • 如果表的编码是utf8 则长度最长为 21844字符
        • 如果表的编码是gbk 则长度最长为32766字符
      • text 表示范围:0~2^16-1
      • longtext 表示范围:0~2^32-1
  • 二进制数据类型
    • blob 表示范围:0~2^16-1
    • longblob 表示范围:0~2^32-1
  • 日期类型
    • 常用
      • date 存放 年-月-日
      • time 存放 时:分:秒
      • datetime 存放 YYYY-MM-DD HH:mm:ss
      • year 存放 年
      • timestamp 时间戳
        • 若在该类型后加 not null default current_timestamp on update current_timestamp 便会在没有给定该字段值时,自动以当前时间进行更新

数据库管理

创建数据库

create database [if not exists] 库名
  		[character 字符集] [collate 排序规则];
  • 不允许同一系统中存在两个相同名称的数据库 if not exists 可以先判断后创建

  • 常用排序规则:utf8_bin区分大小写; utf8_general_ci不区分大小写

  • 若该数据库中的表不指定字符集和校对规则,将默认按照数据库的格式(即my.ini文件中default-character-set变量的值)

  • 若创建数据库或表时,为了规避关键字,可以使用 ` 将其引起来

查看当前服务器中所有数据库

show databases;
  • 将返回一个数据库名列表

查看前面创建的数据库的定义信息

 show create database 库名;
  • 将返回之前所创建该数据库时的完整语句,包含最低支持版本,且库名会被反引号(`)引起来

选择数据库

use 数据库名;

修改数据库

 alter database [数据库名] 
 			{[default] character set 字符集|[default] collate 校对规则}
  • 在进行alter database时,用户必须具有对数据库进行修改的权限

删除数据库

drop database 库名;
  • 须谨慎!一旦操作,该数据库的所有结构和数据都将删除,无法恢复,除非有备份

备份数据库

 mysqldump -u 用户名 -p密码 -B 数据库名列表 >路径+文件名.sql 
  • 在命令窗口执行

恢复数据库

source 路径+需要恢复的备份文件名.sql  
  • 尽可能保证是纯英文路径、也可以直接扩展名为sql的文件直接复制粘贴到编辑器执行

创建表

create [temporary] table [if not exists] 表名
   			(字段名 类型[(长度) [check(约束条件)] [auto_increment]],…)
               	[character set 字符集] [collate 校对规则] [engine 存储引擎类型];
  • temporary 该关键字表示当前创建表为临时表

  • 字段名列表参数说明:

    • 表至少要有一列,即至少要有一个字段名

    • 字段名 类型 (长度) [NOT NULL] [primary key] [check(约束条件)]

      • (长度) 根据字段类型决定属性,给定长度

      • check(约束条件) 约束条件为一个SQL表达式

        • 在MySQL5.7中还不支持check,只做语法校验,但不会生效
      • auto_increment 为该字段设置自增,每加一条记录,该字段自动加1

        • 只适用于整数序列,小数也可以但极少使用

        • 一般来说自增长是和primary key或unique一起出现搭配使用

        • 自增长的默认值是从1开始,也可以使用命令自行更改起始值:

          ​ alter table 表名 auto_increment = 新的起始值;

      • NOT NULL 指定某字段是否可以为空,默认为允许为空

      • primary key(字段名) 为某个字段指定一个主键

  • 若不设定字符集和校对规则,将跟随所在数据库的设定

复制表结构

 create table [if not exists] 表名 like 源数据表名;
	或
 create table [if not exists] 表名 as select语句;
  • 将会把源数据表的表结构复制到新表中,但不会复制表数据

  • 若想把源数据表的表数据也复制到新表中,可用as select 按照第二种语句,但该表不包括源数据表的主键等属性信息

  • 若要将源表中的数据及结构、属性信息都复制出来 ,可选择

     create table [if not exists] 表名 like 源数据表名;
     insert into 表名 select * from 源数据表名;
    

修改表结构

 alter [ignore] table 表名 
				add 字段名 类型(长度) [not null] [default] [first|after 已存在字段名], add 索引名 (字段名), add primary key (字段名), 
				modify 字段名 类型(长度) [not null] [default],  
				change 旧字段名 新字段名 类型(长度) [not null] [default], 
				alter 字段名 set default| drop default,
				drop 已存在字段名, drop primary key, drop index 字段名, 
				character set|charset 字符集, collate 校对规则, engine 存储引擎类型;
				rename 新表名;
  • alter table 语句允许指定多个动作,之间用逗号分隔

  • **add: **可以添加新字段,还可以指定是否为空、默认值等,且可以确定其位置添加在什么字段后; 为已存在字段增加索引; 为已存在字段设定主键

  • **modify: **可以更改已存在字段的类型、是否为空、默认值等

  • **change: **可以更改原字段名,且重新指定是否为空、默认值等;若新旧字段名相同,可以充当modify来使用,更改已有字段的类型、是否为空、默认值等

  • **alter: **可以为已存在字段设定默认值

  • **drop: **删除已存在的字段名;删除主键;删除某个字段的索引

  • 重新为表定义新的字符集、校对规则、存储引擎类型

删除表

drop table [if exists] 表名;
  • 若删除一个不存在的表将会报错,表名前+if exists 将不会出错

插入表记录

insert into 表名 [(字段名列表)] values (值列表) | select 结果集 ;
  • 当字段名列表省去时,须向表中所有列插入数据,否则必须字段名列表与值列表一一对应(字段名可以不同)

  • 字符和日期型的数据应该用单引号引起来

  • 当字段允许为空时,可以直接插入null

  • 当插入多条数据时,每条数据的值列表间用逗号(,)隔开

  • select 结果集,是将select语句得到的查询结果插入到与该表的结构完全一致的后边 点击跳转至模板

    replace into 表名 [(字段名列表)] values (值列表) | select 结果集 ;

  • 操作与insert into相似,但当插入数据因主键重复时,insert将会报错,replace会覆盖掉主键重复的原数据

修改表记录

 update 表名 set 字段名1 = '新值' ,字段名2 = '新值',… [where 条件表达式];
  • set 子句指出要修改的列和其对应的值,where子句为可选项,若没有给出,将对所有记录进行更新

删除表记录

delete from 表名 [where 条件表达式];
  • 若不给出where子句,将删除所有的记录

    • 删除所有记录亦可用 truncate table 表名;
  • delete语句和truncate table语句的区别:

    • 使用truncate table语句后,表中的auto_increment计数器将重置
    • 参与了索引和视图的表,应使用delete语句操作
    • truncate table操作要比delete操作使用的系统和事务日志资源要少,delete语句每删除一行都会在事务日志中添加一行记录,而truncate table只在事务日志中记录页的释放

表记录的检索

 select [distinct] *|字段列表 from 表名
					[where 条件表达式] [group by 分组字段] [having 二次条件字段]
                    [order by 排序字段 [asc|desc]] [limit m,n];
  • distinct 为可选项,指显示结果时,将去掉查出来的完全重复的数据
  • *表示所有列,给定字段名列表可以只显示特定列;其中字段名列表可以是简单运算,可以指定别名: 字段名简单表达式 as 别名
  • where子句常用运算符
    • 比较运算符
      • < > <= >= = <> 或 !=
        • <> 或 != 均表示不等于
      • between…and…
        • 字段名 between 下限 and 上限 范围:[下限,上限]
      • [not] in( 值列表|select语句 )
        • 可以直接给定值,亦可按select结果集
        • 加not则刚好相反
      • [not] like '值' 或 not like '值'
        • 模糊比较:字段名 like '值';可以使用占位符 (_)表示一个字符 (%)表示0或多个字符
        • 加not则刚好相反
      • is [not] null
    • 逻辑运算符
      • and 多个条件并列成立
      • or 多个条件任一成立
      • not 条件不成立
  • order by 字段名 asc|desc
    • 默认按照升序asc排序
    • 如果对含有null值得列进行排序,升序将把null放在最前面,降序将把null放在最后边
  • group by 字段名 [having 条件表达式]
    • 对记录进行分组查询,查询结果只显示每组的一条记录
    • 所查询的列必须包含在分组的列中,以保证数据没有矛盾
      • 当group by 后有多个字段时,将按照字段顺序 依次进行分组
      • 若想要对分组后的结果再次进行条件筛选,选用having 表达式,进行二次条件筛选
  • limit [m,]n 限制查询结果的数量
    • m 表示起始行,n 表示显示的行数,当m省去时,将从第一行开始显示n行
    • 第一条记录的行号是0
聚合函数

count(*|字段名 )

  • 当参数为*时,将返回选择集合中的所有行的数目(包括null值)
  • 当参数为字段名时,将返回该列非null值得行数目,null不参与统计

sum( )

  • 可以求出表中某个数值类型字段或字段简单运算得总和

avg( )

  • 可以求出表中某个数值类型字段或字段简单运算得平均值

max( )

  • 可以求出表中某个某个数值类型字段取值得最大值

min( )

  • 可以求出表中某个某个数值类型字段取值得最小值
字符串相关函数

charset( str ) 返回字串的字符集

concat( str1,[str…]) 连接各字符串,各字符串间( , )隔开

inster(字符串1,字符串2) 返回字符串2再字符串1中第一次出现的位置

ucase( str ) 转换成大写

lcase( str ) 转换成小写

left( str, n ) 从字串的左边截出n个字符

right( str, n ) 从字串的右边截出n个字符

substring( str,m,[n] ) 从字串的第m个位置开始取出n个字符,当n省去,便从第m个位置开始截取到最后

length( str ) 返回字串的长度

replace( 字段名, 旧串, 新串) 将某字段的旧串找出替换成新串

strcmp( 字符串1,字符串2 ) 逐字符比较两字串的大小(字串1小于字串2返回-1;字串1大于字串2返回1;两字串相等返回0)

ltrim( str ) 将字串左侧的空格去掉并返回

rtrim( str ) 将字串右侧的空格去掉并返回

trim( str ) 将字串两侧的空格都去掉并返回

数学相关函数

abs( num ) 返回绝对值

bin( num ) 将十进制转二进制返回

ceiling( num ) 向上取整,返回一个比num大的最小整数

floor( num ) 向下取整,返回一个比num小的最大整数

conv( num,进制A,进制B ) 把num当作A进制数,并转换成B进制数返回

format( num, 位数 ) 四舍五入保留小数位数

least( num1,num2,num… ) 返回列表中最小的值

mod( num1,num2 ) 取余,返回num1%num2的值

rand( seed ) 返回随机数,每次返回不同的随机数,若使用种子,则随机数不变 范围:[0,1]

时间日期相关函数

current_date( ) 返回当前日期

current_time( ) 返回当前时间

current_timestamp( ) 返回当前时间戳

now( ) 返回当前时间(包含日期 时间)

date( 日期时间 ) 返回参数中的日期部分

last_day( 日期 ) 返回参数中的月份中的最后一天的日期

date_add( 日期时间, interval n 单位 ) 返回参数中的日期时间加上单位个n的日期时间 eg: date_add(now(), interval 10 hour) 返回当前时间加上十个小时的日期时间

date_sub( 日期时间, interval n 单位 ) 返回参数中的日期时间减去单位个n的日期时间 eg: date_sub(now(), interval 45 minute) 返回当前时间减去45分钟的日期时间

datediff(日期1,日期2) 返回两个日期所差的天数(日期1-日期2)

timediff(日期1,日期2) 返回两个日期所差的时间(返回时分秒)

year|month|day (datetime) 返回参数中的年|月|日

unix_timestamp( ) 返回1970年1月1日到现在的秒数,等同于Java中的System.currentTimeMillis( )

from_unixtime(时间戳秒数, '%Y-%m-%d %H:%i:%s'|'%Y-%m-%d') 将时间戳按照格式转换,该格式是已定义好的

加密函数和系统函数

user( ) 查询当前登录mysql的用户及ip地址

database( ) 查询当前使用的数据库名称

md5( str ) 为字串算出一个MD5 32的字符串,(用户密码)加密

password( str ) 从原文密码str计算并返回密码字符串,通常用于对mysql数据库的用户密码加密

流程控制函数

if(表达式, 值1, 值2) 如果表达式的值位true,则返回值1,否则返回值2

ifnull(expr1, expr2) 如果expr1非null,则返回expr1,否则返回expr2

select case when expr1 then expr2 when expr3 then expr4 else expr5 end 如果expr1为true,则返回expr2,如果expr3为true,则返回expr4,否则返回expr5.类似于多重分支结构

连接查询

  • 合并查询

     select 字段列表 from 表名
     union|union all
     select 字段列表 from 表名;
    
    • union all 用于取得两个结果集的并集。使用该操作符时,不会取消重复行

    • union 会将结果合并同时去重

  • 外连接

    • 左外连接 将左侧的表完全显示,与右侧不匹配的也会显示
    • 右外连接 将右侧的表完全显示,与左侧不匹配的数据也会显示
      • 匹配不到的数据会自动填补NULL
     select 字段列表 from 表名1
    			 left|right join 表名2 on 表名1.字段名 = 表名2.字段名
    

MySQL约束

约束用于确保数据库的数据满足特定的商业规则

  • 主键 primary key

    • 主键不能重复而且不能为NULL
    • 一张表最多只能有一个主键,但可以有复合主键
      • 复合主键:在所有字段名后用primary key(字段列表)指定的主键为复合主键
    • 拥有主键的列不允许有重复值
      • 复合主键其中一个字段有相同值不会有影响,只有当复合主键中的字段同时满足时,才会违反主键规则
    • 主键的两种指定方式:
      • 建表时,在字段名后跟 primary key
      • 建表时,在字段列表最后,逗号隔开跟 primary key(字段名…)
    • 使用desc 表名可查看表结构,看到primary key的情况
  • 非空 not null

    • 当某字段指定了not null 非空时,那么插入数据时,必须为该列提供数据
  • 唯一索引 unique

    • 当某字段定义了唯一索引后,该字段的值不能重复,但可以为NULL
    • 可以为多个字段指定唯一 unique
  • 外键 foreign key

    用于定义主表和从表之间的关系

    • 外键约束要定义在从表上,主表则必须具有主键约束或是unique约束 即外键指向的表的字段,要求必须是primary key或者unique

    • 创建外键的表的存储引擎类型必须为innodb

    • 外键字段的类型要和主键的字段类型一致 (长度可以不同)

    • 外键列数据必须在主表的主键列存在或是为NULL (前提是外键字段允许为NULL)

  • 条件 check

    用于强制行数据必须满足的条件

    • 用法: 建表时,字段名 类型(长度) check(条件)
    • 在MySQL5.7中还不支持check,只做语法校验,但不会生效

MySQL索引

索引是一种将数据库中单列或者多列的值进行排序的结构。创建索引的目的是为了优化数据库的查询速度。不同的存储引擎定义每个表的最大索引数和最大索引长度不同。索引有两种存储类型B型树哈希索引 。其中,B型树是系统默认索引方法。

索引分类
  • 普通索引

    不应用任何限制条件的索引,可以在任何数据类型中创建

  • 唯一索引 UNIQUE

    创建该索引,须保证索引的值唯一,主键是一种特殊的唯一索引

  • 全文索引 FULLTEXT

    该索引只能创建在char、varchar或者text类型的字段上,默认情况下,对大小写不敏感;一般开发,不适用MySQL自带的全文索引,而是使用全文搜索框架Solr和ElasticSearch( ES )

创建索引
  • 建表时创建:

     create table 表名(字段名 类型(长度) [unique|primary key],字段名…类型);
     或
     create table 表名(字段名列表, index|unique index|fulltext key|primary key(索引字段));
    
  • 在已存在表中创建:

     create [unique|fulltext] index 索引名 on 表名(索引字段);
    注:普通索引直接index 索引名
    
  • 修改表结构时创建:

     alter table 表名 add [unique|fulltext] index 索引名(索引字段);
    注:普通索引直接index 索引名(索引字段)
    
查询表是否有索引
 show index[es] from 表名;
 或
 show keys from 表名;
删除索引
 drop index 索引名 on 表名;
注意事项
  • 创建索引后,只有索引字段对应的列的查询速度会提高,其它普通字段的查询速度不变
  • 索引的原理是二叉树结构进行查询,中值依次做节点,查找时进行左右子叶快速定位,比较n次,可查找的的覆盖范围为:2^n
  • 创建索引后,表的磁盘占用会变大,会在底层形成一个二叉树索引占一定的磁盘空间
  • 索引会对dml(增删改)语句有一定的影响,当对表进行操作后,就需要对表的索引进行维护,对速度有影响,可先删除索引再进行dml操作
  • 如果某列的值是不重复的,则优先考虑使用unique索引
  • 较频繁的作为查询条件字段应该创建索引;唯一性差的字段不适合创建索引;更新非常频繁的字段不适合创建索引;不会出现在where子句中字段不应该创建缩影

MySQL事务

​ 事务用于保证数据的一致性,它由一组相关dml语句组成,该组的dml语句要么全部成功,要么全部失败。当执行事务操作(dml语句)时,MySQL会在表上加,防止其它用户改表的数据。

数据库控制台事务的基本操作
  • start transaction或set autocommit = off 开始一个事务
  • savepoint 保存点名 设置一个保存点
  • rollback to 保存点名 回退事务
  • rollback 回退全部事务
  • commit 提交事务,所有的操作生效,不能回退
注意事项
  • 事务机制适用于存储引擎为InnoDB,其它不好使
  • 若回退的保存点之间还有其它保存点,在回退之后将失效无法到达之间的保存点
  • 当结束事务时,会自动删除所定义的所有保存点
  • 使用了commit语句后,将会确认事务的变化、结束事务、删除保存点、释放锁,数据生效
  • 如果只是开始了一个事务,但是没有创建保存点,那么可以执行rollback,会回退到事务开始的状态
MySQL事务隔离级别

​ 多个连接开启各自事务操作数据库中数据时,数据库系统要负责隔离操作,以保证各个连接在获取数据时的准确性。

  • 事务隔离级别

    脏读(dirty read): 当一个事务读取另一个事务尚未提交的修改时,产生脏读

    不可重复读(nonrepeatable read): 同一查询在同一事务中多次进行,由于他提交事务所做的修改或删除,每次返回不同的结果集,此事发生不可重复读

    幻读(phantom read): 同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻读。

    MySQL隔离级别定义了事务与事务之间的隔离程度

    MySQL隔离级别(四种) 脏读 不可重复 幻读 加锁读
    读未提交(Read Uncommitted) 不加锁
    读已提交(Read Committed) × 不加锁
    可重复读(Repeatable Read) * 默认 × × × 不加锁
    串行化(serializable) × × × 加锁
    • 查看当前MySQL会话的隔离级别

       select @@tx_isolation;
      
    • 查看系统当前隔离级别

       select @@global.tx_isolation;
      
    • 设置事务的当前会话隔离级别

       set session transaction isolation level 具体级别;
      
    • 设置系统当前隔离级别

       set global transaction isolation level 具体级别;
      
  • 事务的ACID特性

    • 原子性(Atomicity): 指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生
    • 一致性(Consistency): 事务必须使数据库从一个一致性状态变换到另外一个一致性状态
    • 隔离性(Isolation): 事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要 相互隔离
    • 持久性(Durability): 一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即时数据库发生故障也不应该对其有任何影响

MySQL表类型和存储引擎

​ MySQL的表类型由存储引擎(Storage Engines)决定

​ MySQL数据表主要支持六种类型,分别是:CSV、Memory、ARCHIVE、MRG_MYISAM、MYSIM、InnoDB

​ InnoDB属于事务安全型 ,其它属于非事务安全型

常用引擎:

  • MyISAM不支持事务、也不支持外键,但其访问速度快,对事务完整性没有要求
    • 添加速度快;不支持外键和事务;支持表级锁
  • InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是比起MyISAM存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引
    • 支持事务;支持外键;支持行级锁
  • MEMORY存储引擎使用存在内存中的内容来创建表。每个MEMORY表只实际对应一个磁盘文件。MEMORY类型的表访问非常的快,因为他的数据是放在内存中的,并且默认使用HASH索引。但是一旦服务关闭,表中的数据就会丢失掉,表的结构还在。
    • 数据存储在内存中[关闭mysql服务,数据丢失,但表结构还在];执行速度很快(没有IO读写);默认支持索引(hash表)
  • 查看所有存储引擎

     show engines;
    
  • 如何选择表的搜索引擎

    1. 如果应用是不需要事务,处理的只是基本的CRUD(增删改查)操作,那么MyISAM是不二选择,速度快!
    2. 如果需要支持事务,选择InnoDB
    3. MEMORY存储引擎就是将数据存储在内存中,由于没有磁盘I/O等待,速度极快。但由于是内存存储引擎,所做的任何修改在服务器重启后都将消失(经典用法:用户的在线状态)
  • 修改存储引擎

     alter table 表名 engine 存储引擎
    

视图

视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含列,其数据来自对应的真实表(基表)。通过视图可以修改基表的数据,基表的改变,也会影响到使徒的数据

  • 查询创建视图的权限

     select Select_priv,Create_view_priv from mysql.user where user = '用户名';
    
  • 创建视图

     create view 视图名 [(字段列表)] as select 语句;
    
  • 修改视图

     alter view 视图名 as select 语句;
    
  • 查看创建视图的指令

     show create view 视图名;
    
  • 删除视图

     drop view 视图名;
    
  • 视图特点

    安全: 一些数据表有着重要的信息。有些字段是保密的,不能让用户直接看到 。通过视图只保留一部分字段,达到只让用户看不到保密的字段的目的

    性能: 关系数据库的数据常常会份表存储,使用外键建立这些表的之间关系。通过视图可以将相关的表和字段组合在一起,就可以避免使用 join 查询数据

    灵活: 如果系统中有一张旧的表,这张表由于设计的问题,即将被废弃。但很多应用都是基于这张表,不易修改。通过视图,将数据映射到新建的表。便可以做很少的改动达到升级数据表的目的

  • 注意事项

    创建视图前,应确保用户具有创建视图(create view)的权限

    创建视图后,数据库中,对应视图只有一个视图结构文件(视图名.frm)

    视图的数据变化会影响到基表,基表的数据变化也会影响到视图(insert update delete)

    视图中可以再使用视图,数据仍然来自基表

MySQL管理

  • 创建用户,并指定密码

    create user '用户名'@'允许登录位置' identified by 密码
    
    • 存储在mysql.user表中的密码是被password加密过的
    • 若创建用户时,不指定Host (即允许登录位置),则默认为%, %表示所有IP都有连接权限;也可以直接指定IP地址段 (eg:192.168.%.%,表示192.168..这一IP段的都可以访问登录)
  • 删除用户

     drop user '用户名'@'允许登录位置';
    
    • 如果Host不是%,则删除时需要明确指出允许登录位置
  • 修改密码

    修改自己的密码

     set password = password('新密码');
    

    修改他人的密码 (需要有修改用户密码的权限)

     set password for '用户名'@'登录位置' = password('新密码');
    
  • 给用户授权

     grant 权限列表 on *.*|库.对象名 to '用户名'@'登录位置' [identified by 密码];
    
    • 权限列表,多个权限间用逗号隔开;若是授予其全部权限,则选择关键词 all

    • *. 代表本系统中的所有数据库的所有对象(表、视图、存储过程)

      库.* 代表某个数据库中的所有数据对象

    • identified by 可以省略

      如果用户存在,就是修改用户的密码;如果该用户不存在,就是创建该用户

  • 回收用户权限

     revoke 权限列表 on 库.对象名 from '用户名'@'登录位置';
    

    权限生效指令 (一般5.7以上的版本不需要刷新权限)

     flush privileges;
    
posted @   城南花已开。  阅读(61)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示