Mysql

  • 什么是数据库?
    • 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。
  • 数据存储的几种方式:
    • 内存:效率高,但是数据会丢失。
    • 硬盘:数据可以永久保存,但是读取效率非常低。
    • 数据库:数据最终还是保存在硬盘,会通过SQL语句来读取或者操作数据。
  • mysql(关系型数据库)
    • 什么是关系型数据库?
      • 建立在关系模型上的数据库系统。
    • 常用的关系型数据库
      • Oracle:甲骨文公司—专门的数据库厂商,oracle是收费,大型数据库,几乎可以用于任何系统任何平台。
      • MySQL:早期开源免费数据库产品,被oralce收购,从6.0开始出现收费版本。LAMP组合Linux+Apache+MySQL+PHP完全开源免费,自从mysql被oracle收购后,从6.0开始出现收费版本。
      • DB2:IBM数据库产品,大型收费数据库。
      • SYBASE:中等规模数据库,收费(很少用了)。SYBASE公司的另外一款产品,PowerDesigner—数据库建模工具。
      • *SQL Server:微软公司数据库产品(收费)中等规模数据库,操作系统要求是windows结合.net一起使用。
      • Java开发者主要使用MySQL、Oracle、DB2三种数据库。
  • Mysql安装
  • mysql的存储结构:

    • 当一台电脑安装了mysql数据库服务,就可以把这台电脑称之为数据库服务器
  • 一个数据库服务器可以有多个数据库,一个数据库中可以有多个表(就是一个二维表),一个表中可以有多条数据记录。

    SQL语言

  • 概述:

    • SQL是Structured Query Language(结构化查询语言)的缩写。
    • SQL是专为数据库而建立的操作命令集。
    • SQL功能强大、简单易学、使用方便,已经成为了数据库操作的基础,并且现在几乎所有的关系型数据库均支持SQL。
  • 特点:

    • 非过程性语言。一条语句一个结果。多条语句之间没有影响。(过程性语言:例如java)
  • SQL是用来操作关系数据库的语言,具有查询、操纵、定义和控制关系型数据库的四方面功能:

    • DDL(数据定义语言-Data Definition Language)
      • 用来定义数据库的对象,如数据表、视图、索引等,数据库。
      • 如:create drop alter truncate
    • DML (数据操作语言-Data Manipulation Language)
      • 操作在数据库表中的记录:修改,更新,删除。
      • 如:update,insert,delete(不包含查询)
    • DCL (数据控制语言-Data Control Language)
      • 指用于设置用户权限控制事务语句。
      • 如:grant,revoke,begin transaction等
    • DQL (数据查询语言-Data Query Language)——不是标准
      • 数据表记录的查询。
      • select
  • SQL能做些什么?

    • 操作数据
    • 操作数据库中的
    • 操作数据库中的表记录

      数据库操作语句

  • 创建数据库:create database 数据库名 (PS:数据库名称不要用中文)

  • 查看数据库:show databases;

    • information_schema数据库:其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等。
    • performance_schema数据库:存储引擎,主要用于收集数据库服务器性能参数。
    • mysql数据库:mysql库是系统库,里面保存有账户信息,权限信息,存储过程,event,时区等信息。
    • test数据库:这个是安装时候创建的一个测试数据库,和它的名字一样,是一个完全的空数据库,没有任何表,可以删除。
  • 设置数据库编码表(了解即可)

    • 此时的db1数据库的编码格式 mysql的默认编码格式。(安装数据库时候指定的,UTF8)
    • 设置数据库编码格式:create database 数据库名 character set ‘字符集’
      创建数据库的同时指定字符集。
    • 指定字符集是utf8,utf-8是错误的(mysql不认识UTF-8)。
    • 查看数据库信息:show create database 数据库名
  • 设置数据库校对规则(了解即可)

    • create database 数据库名 character set ‘字符集‘ collate ‘校对规则’
    • 校对规则:数据内的比较方式。某一个字符的比较规则是有mysql已经设定好了。可以查看mysql的文档。确定某个字符集有那些比较规则。
  • 数据库的修改操作(了解即可)

    • 修改数据库,实际上是修改数据库的字符集。
    • alter database 数据库名 character set ‘字符集’
    • 没有修改数据库名称的命令。
  • 删除数据库:drop database 数据库名

  • 切换到某一个数据库:use 数据库名

    • 在操作某个数据库或者数据库中的表或者表中的数据库时,首先要切换到这个数据库。
  • 查看当前数据名:select database()

    • 有时如果切换数据库多了,忘了在使用哪个数据库,可以使用查看语句(如果是’NULL’表示没选中数据库)。

      数据表结构的SQL语句

  • 建表语句:

    1
    2
    3
    4
    5
    6
    create table 表名(
    列名 数据类型, ----某一列,存放的数据是什么类型
    列名 数据类型,
    ......
    列名 数据类型 ---最后一个列不需要逗号。
    );
    • 数据类型:

      • 字符类型:

        • varchar:长度可变
          • name varchar(20):设置name字段的长度为20,name的储存长度在20以内都可以,并且会自动适应长短。
        • char:长度固定
          • name char(20):设置name字段的长度为20,name的存储长度在20以内,如果不满20,用空格补足。
        • char的性能好,varchar可以节省空间。通常时候,如果长度不固定,我们使用varchar。
        • 使用char的情况:当某个字段的长度固定的时候,可以采用char。例如身份证号或者手机号。
      • 数值型:

        • 整形:TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT

          类型 字节 带符号(最小值~最大值) 不带符号(最小值~最大值)
          TINYINT 1 -128~127 0~255
          SMALLINT 2 -32768~32767 0~65535
          MEDIUMINT 3 -8388608~8388607 0~16777215
          INT 4 -2147483648~2147483647 0~4294967295
          BIGINT 8 -9223372036854775808~9223372036854775807 0~18446744073709551615
        • 小数:FLOAT(单精度)、DOUBLE(双精度)

          • 在定义类型的时候可以设置两个参数,如sal float(5,2):sal字段总共5位长度,可以有两位小数,如果 插入12345或者1234,默认为999.99,因为要保证小数点前三位和小数点后两位的格式。
      • 位数据类型 –了解

        • BIT: 1或者0组成的数据
          • 其数据有两种取值:0和1,长度为1位。在输入0以外的其他值时,系统均把它们当1看待。这种数据类型常作为逻辑变量使用,用来表示真、假或是、否等。
      • 日期型

        • date :日期—-只有日期,年月日“yyyy-MM-dd”
        • time:时间—–时分秒,”HH:mm:ss”
        • dateTime:日期和时间都包含,“yyyy-MM-dd HH:mm:ss”
        • timestamp:日期和时间都包含,“yyyy-MM-dd HH:mm:ss”
          • 当其他数据发生改变的时候,这个字段会自己修改为当前时间。
      • 大数据类型–了解

        • BLOB-字节:存放二进制内容,一般可以存放视频、音频、图片等。
          • tinyblob:255字节
          • blob:64KB
          • mediumblob:16MB
          • longblob:4GB
        • TEXT-字符:存放大文本,存放txt。
          • tinytext:255字节
          • text:64KB
          • mediumtext:16MB
          • longtext:4GB
        • 通常我们不会把文件存储到数据库。(占用资源,操作速度慢)
        • 我们会把文件的路径(通常存放在本地磁盘)存到数据库中。
  • 查看表

    • show tables: 查看该数据库的所有的表
    • show create table 表名:查看建表语句以及字符集
    • desc 表名:查看表的列的信息(查看表结构)
  • 约束

    • 概述:
      • 约束:规定,限制。
      • 限制表中列的内容。需要满足一定的规则。
      • 数据库中的约束:限制列的内容。
      • 作用(目的):保证数据的有效性和完整性
    • **主键约束(PK primary key)**:
      • 作用:设置某一个字段为主键,主键的特性是唯一(不能重复),并且不能为空。
      • 一般使用一个没有任何意义的字段,比如id作为一个主键(没有意义就不需要修改)。
      • 如果主键是一个int类型,还可以设置主键自增长。(即在插入记录的时候可以不用设置主键,让其自动以递增的形式添加)
      • 一张表中只能有一个主键。
        1
        2
        3
        4
        5
        create table 表名 (
        id int primary key auto_increment,
        name varchar(20),
        ...
        );
    • 唯一约束(unique)
      • 内容不允许重复,可以为null(null不算重复)。
      • 一个表里可以添加**多个((唯一约束。
        1
        2
        3
        4
        5
        create table 表名 (
        id int primary key auto_increment,
        name varchar(20) unique,
        ...
        );
      • 唯一约束和主键约束的区别:
        • 唯一约束可以是空(null)。 但是主键约束不能为空
        • 一张表中只能有一个主键,但是唯一约束可以有多个
    • 非空约束(not null)
      • 不允许为空。 表示该列的内容不允许为空。
        1
        2
        3
        4
        5
        6
        create table 表名(
        id int primary key auto_increment,
        name varchar(20) unique,
        age int not null,
        ...
        );
  • 数据表结构的修改

    • 增加列:alter table 表名 add 列名 类型(长度) 约束;
    • 添加主键:alter table 表名 add primary key (列名);–几乎不用,主键一般都是在建表的时候直接设置。
    • 修改现有列的类型或者长度:alter table 表名 modify 列名 类型(长度);–注意:通常我们不会修改列的类型。
    • 修改现有列的名称:alter table 表名 change 旧列名 新列名 类型(长度);–注意:通常我们不会修改列的名称。
    • 删除一个现有列:alter table 表名 drop 列名;–注意:通常我们不会删除列。
    • 修改表名:rename table 旧表名 to 新表名;–注意:通常我们不会重命名数据库表名。
    • 修改表的字符集–表的字符集:在创建数据库时默认和数据库一致。通常不会去修改,使其与数据库的编码集相同。
      • 查看表的字符集:show create table 表名;
      • 修改表的字符集:alter table 表名 character set 字符集
  • 数据表的删除:drop table 表名;

    数据记录的增删查改(重点)

  • 概述:

    • 在java代码中对数据库操作最频繁的就是对表中数据的CRUD操作:create read update delete
    • 数据记录存储位置:表。
  • –增加数据记录:insert语句

    • 方式一:全写
      • insert into 表名(列名1,列名2,列名3...)values(值1,值2,值3...);
      • 注意事项:
        • 值与列一一对应。有多少个列,就需要写多少个值。如果某一个列没有值。可以使用null。表示插入空。
        • 值的数据类型,与列被定义的数据类型要相匹配。并且值的长度不能够超过定义的列长度。
        • 字符串:插入字符类型的数据,必须写单引号。在mysql中,使用单引号表示字符串。
        • date:时间类型的数据可以直接使用单引号表示:’yyyyMMdd’,’yyyy-MM-dd’,’yyyy/MM/dd’。
    • 方式二:省略部分列
      • insert into 表名(列名1,列名3,列名5...)values(值1,值3,值5...);
      • 注意事项:
        • 可以省略部分列名。某一列有默认值,或者允许为空,才可以省略。
        • 主键是自增长的认为是有默认值的。也可以省略
    • 方式三:省略所有的列
      • insert into 表名 values(值,值,值,值);
      • 注意事项:
        • 表中有多少列,就有多个值。
        • 按照表的结构,列和值去对应。通过desc 表名得到列的顺序。从上到下,对应的值,从左到右
  • –修改数据记录:update语句

    • update 表名 set 列名=值,列名=值...where 条件;
    • 条件:将满足指定条件的某一行进行修改。
    • 注意事项:
      • 如果没有where条件,则会把表中的所有行的对应的列全部修改。
      • 如果有条件,则只有满足条件的数据才会被修改。
  • –删除数据:delete&truncate语句

    • delete语句:
      • delete from 表名 where 条件;
      • 删除满足条件的行的数据。delete是删除行的数据
      • 注意:如果没有where条件,则删除表中的所有记录。
    • truncate语句:
      • truncate table 表名;—删除表的所有记录
      • 先删除表,再创建表,就等于将数据全部删除了。
      • 性能问题:truncate table的性能更好
    • 如果使用delete删除表中所有记录和使用truncate table删除表中所有记录有何不同 ?
      • 删除过程不同:
        • truncate删除数据,过程先将整个表删除,再重新创建
        • delete删除数据,逐行删除记录
        • truncate效率要好于delete
      • 语言定义不同:truncate属于DDL,delete属于DML。
    • 事务管理只能对**DML(数据操作语言)**有效,被事务管理的SQL语句可以回滚到SQL执行前状态。
      • 事务:逻辑上的一组(一条或者多条sql语句)操作。这组sql语句,要么都成功,要么都失败。
      • start transaction;–开启事务
      • 失败:rollback; 事务的回滚–事务的结束,把修改的内容恢复到之前的状态。
      • 成功:commit; 提交–事务的结束。把修改的内容进行永久保存。
  • (重点)–查询数据:select语句
    • 查询所有信息:select * from 表名;–会把表的所有的列,所有的行都列出来。
    • 查询指定列的信息:select 列名,列名,列名 from 表名;–显示指定列数据,列出所有行信息。
    • 查询符合条件的信息:select * from 表名 where 条件;–只有符合条件的,才去列出相应的信息。
    • 运算符:
      • 比较运算符:
        • > < <= >= = <>:大于、小于、小于/大于等于、不等于。
        • between 1 and 10:显示某一区间的值–[1,10]。
        • in(1,2,3):显示在in列表中的值–1、2、3任意一个。
        • Like ‘张_’:模糊查询–’_’表示一个字符。
        • Like ‘张%’:模糊查询–’%’表示零或任意多个字符。
        • is null、is not null:是否为空
      • 逻辑运算符:
        • and:多个条件同时成立
        • or:多个条件任意一个成立
        • not:不成立,例如:where not(age>18)
    • 去重(滤重)
      • select distinct 列名,列名,列名 from 表名;–显示distinct后面列的内容,并且去重。
    • 别名
      • select 列名 as 别名 from 表名;
      • select 列名 别名 from 表名;–as也可以省略
    • 列运算
      • 可以为列或者列进行运算后的结果起一个别名。
      • 在select语句中可使用表达式对查询的列进行运算
      • select 列名+-*/列名,列名+-*/ 列名 from 表名;–如果是多个运算使用逗号隔开。
      • 注意:
        • 数据库表中的原始数据不会改变。
        • (需要重点注意的):如果使用null来进行表达式运算,那么计算的结果也会是null。如:a=null,b=10那么a+b=null。
      • mysql提供了一个函数:ifnull(列名,默认值) –判断该列是否为null,如果为null,返回默认值,如果不为null,返回实际的值
    • 排序:order by
      • 统计的时候使用。
      • select * from 表名 order by 列名1(desc|asc),列名2(desc|asc),列名3(desc|asc)...–按照列名1,列名2,列名3进行排序输出。
      • 注意:
        • select语句关键字的顺序:select..from..where..order by..
        • 按照第一列进行排序,如果第一列相同,按照第二列再进行排序。
        • desc:表示的降序
        • asc:表示的升序
        • 默认是asc升序。
    • 聚合函数
      • 多个数据进行运算,运算出一个结果。例如,求和,平均值,最大值,最小值。
      • 作用(目的):用于统计使用。
      • count(数目)–统计记录数(统计行数)
        • select count(列名) from 表名 where 条件;:统计该列有多少行。如果该列中有值为null的行,该行不做统计。
        • select count(*) from 表名 where 条件;: 统计表中的行数。
      • sum(和)–求和
        • select sum(列名) from 表名 where 条件;–统计该列的所有的值的和。sum 也可排除null
        • sum仅对数值类型的列起作用,否则会报错。
      • avg(均值)–平均值
        • select avg(列名) from 表名 where 条件;–求该列的平均值,avg里面的null不作为统计
        • 注意:如果有null值则会导致求平均值不正确,建议添加ifnull(列名,默认值);函数,即select avg(ifnull(列名,默认值)) from 表名 where 条件;
        • 不能和sum一起使用,并且要对每一列先进行ifnull的判断
      • max(最大值)/min(最小值)–统计该列的最大值或者最小值
        • select max(列名),min(列名) from 表名;
        • null 排除在外。
        • 不能和sum一起使用
    • 分组查询:group by
      • 按照某一列或者某几列。把相同的数据,进行合并输出。
      • select ... from ... group by 列名,列名;
      • 目的:仍然是统计使用。
      • 其实就是按列进行分类,然后可以对分类完的数据使用聚集函数进行运算。
      • 注意:聚集函数在分组之后进行计算。
      • 通常select的内容,被分组的列,以及聚集函数。
      • 如果分组之后,需要一些条件。则使用having条件,表示分组之后的条件。可以书写聚合函数。
        • group by 列名 having 条件;–分组之后加过滤条件。
        • where和having的区别:
          • having通常与group by分组结合使用;where和分组无关。
          • where后面的条件可以写在having中,但是having中的条件不一定能写在where中。
          • having可以书写聚合函数 (聚合函数出现的位置: select之后,having之后),例如having中的聚合函数(count,sum,avg,max,min),是不可以出现where条件中的。
          • where是在分组之前进行过滤的。having是在分组之后进行过滤的。
          • select ... from ... where 条件1 ... gropu by ... having 条件2;–条件1 会先执行过滤,然后进行分组,然后条件2再进行过滤。
    • 总结:
      • 查询关键字的出现的顺序是固定的:
        • select 要显示的内容 from 表名 where 条件 group by 分组的列 having 分组后的条件 order by 排序
      • 查询的执行顺序:
        • select 5 from 1 where 2 group by 3 having 4 order by 6

          数据库的备份和恢复

  • 备份:把数据库里面的内容进行备份放到硬盘或者其他位置。如果数据库出现问题之后,可以进行数据的恢复。
  • 数据库备份
    • 将某个数据库备份到指定的路径进行保存:mysqldump -u 用户名 -p 数据库名 > 备份文件的路径和名称
  • 数据库恢复
    • 方式一:
      • 步骤一:创建数据库
        • 注意:备份的时候,没有备份创建数据库的语句。当需要恢复某个具体的数据库时候,需要手动的创建数据库。
        • 手动创建数据库create database 数据库名;,并切换到该数据库use 数据库名;
      • 步骤二:导入数据
        • source 备份文件的路径和名称;
    • 方式二:
      • 步骤一:创建数据库
        • 注意:备份的时候,没有备份创建数据库的语句。当需要恢复某个具体的数据库时候,需要手动的创建数据库。
        • 手动创建数据库create database 数据库名;
      • 步骤二:导入数据
        • mysql –u 用户名 -p 数据库名 < 备份文件的路径和名称
        • 注意:在命令行下使用,不是登录mysql后使用,和备份比较类似,只不过mysql后面不带dump,并且箭头是<,指向需要导入数据的新的数据库。
        • 这种恢复的方式,也需要数据库提前存在。

          多表设计

  • 表与表之间可以总结出如下关系:
    • 1:1(一对一)
      • 单表,一方设置外键即可。
    • 1:N(一对多)
      • 主从表,从表设置外键。
    • M:N(多对多)
      • 一般添加第三张关系表。
  • 外键约束(FK Foreign Key)
    • 主表: 被引用字段的那个表—(一方)
    • 从表: 引入字段的表 — (多方)
    • 建表之后添加外键约束:
      • alter table 从表名称 add foreign key (外键列的名称) references 主表名称(主键)
    • 建表的时候添加外键约束:
      1
      2
      3
      4
      5
      6
      7
      8
      create table 从表(
      id int primary key auto_increment,
      name varchar(20),
      age int,
      salary double,
      dept_id int,
      foreign key (dept_id) references 主表(id)
      );
      • 注意:在建表时,必须先创建主表,再创建从表,因为在从表中设置外键约束时引用了主表中的主键,如果主表都还没创建的话,结果肯定是外键约束添加失败。

多表查询

  • 在实际的工作中,我们所需要的数据,通常会来自多张表。那么就涉及到多表关联查询的问题。也就是指,如何使用sql语句一次性查询多张表的数据。
  • 笛卡尔积
    • 需求:查询两张表中关于水果的信息,要显示水果名称和水果价格。
    • 多表查询语法:select * from a,b;
    • 问题分析:
      • 这样查询得到的结果存在冗余,变成了排列组合,即a表中的每一条记录,都和b表中的每一条进行匹配连接。所得到的最终结果是,a表中的条目数乘以b表中的数据的条目数。
      • 解决方案:在查询两张表的同时添加条件进行过滤,比如a表的id和必须和b表的id相同:select * from a,b where a.id=b.id;
  • 内连接查询:
    • 隐式内连接查询:select * from a,b where a.列名 = b.列名;–在产生两张表的笛卡尔积的数据后,通过条件筛选出正确的结果。
    • 显式内连接查询:select * from a inner join b on a.id = b.id where 其他条件;–查询到的数据为两个表经过ON条件过滤后的笛卡尔积然后在通过where条件进行筛选,inner可以省略
  • 外连接查询:
    • 左外连接查询:select * from a left outer join b on a.id = b.id;
      • 查询的内容,以关键字左侧数据为主。不管右侧的数据是否有对应,都把左侧的数据显示出来
      • 把left关键字之前的表,是定义为左侧。left关键字之后的表,定义右侧。
      • outer可以省略
    • 右外连接查询:select * from a right outer join b on a.id = b.id;
      • 查询的内容,以关键字右侧数据为主,不管左侧有没有数据对应。都把右侧的数据进行显示。
      • right之前的是左侧,right之后的是右侧。
      • outer可以省略
    • 全外连接查询:select * from a full outer join b on a.id = b.id;
      • 查询的内容,就是左外连接和右外连接之和,将左右两表中的数据全部显示出来
      • mysql不支持全外连接。
        • 可以使用union来达到全外连接的查询效果。
        • union :可以将左外连接查询和右外连接查询两条sql语句使用union合并起来进行查询,去掉重复的数据。
        • select * from a left outer join b on a.id = b.id union select * from a right outer join b on a.id = b.id;
        • union all:不去掉重复进行合并,相当于查询一次左外连接,然后再查询一次右外连接,然后将两次的查询结果合并。
  • 多表查询总结:
    多表查询总结图.png
    • 内连接:
      • 隐式内连接
        • select * from a,b where a.id = b.id;
        • 结果:C
      • 显式内连接:
        • select * from a inner join b on a.id = b.id;
        • 结果:C
    • 外连接:
      • 左外连接
        • select * from a left outer join b on a.id = b.id
        • 结果:A+C
      • 右外连接
        • select * from a right outer join b on a.id = b.id
        • 结果:B+C
      • union:相当于全外连接
        1
        2
        3
        select * from a left outer join b on a.id = b.id
        union
        select * from a right outer join b on a.id = b.id
        • 结果:A+B+C,会自动虑重
          1
          2
          3
          select * from a left outer join b on a.id = b.id
          union all
          select * from a right outer join b on a.id = b.id
        • 结果:A+B+C,有重复数据
  • 关联子查询:将一个查询作为另一个查询的一部分。
    • 子查询:select * from student where age=(select max(age) from student);
    • in的用法:in (20,30):表示条件是20或者30,类似于添加条件select * from student where age = 20 or age = 30;
      • select * from student where id in (select student_id from student_course where score<60);
    • exists的用法:(了解)
      • exists的意思是表示存在,如果子查询有返回数据行,就认为是true,否则就认为是false,关注的是子查询是否有数据。只要有数据就认为匹配成功
      • select * from 表名 where exists (select ... from 表名 where 条件); –将外表中的查询结果拿到内表中去逐行判断条件是否成立,如果成立,取出该行结果,如果不成立,则丢弃改行数据。
    • in在外表大而内表小的情况下效率高,exist在外表小而内表大的情况下效率高
    • all的用法-了解
      • all:表示所有,和union一起使用。
      • 左连接和右连接查询结果的合集。
        1
        2
        3
        select * from iphone_memory left join iphone_color on iphone_memory.id = iphone_color.id 
        union all
        select * from iphone_memory right join iphone_color on iphone_memory.memory = iphone_color.color;
      • a>all(1,2,3,4) 相当于a>1 and a>2 and a>3 and a>4 或者相当于 a>max(1,2,3,4);
    • any和some以及as的用法:
      • any:表示任何一个
      • a>any(1,3,5,6) 相当于a>1相当于a>min(1,3,5,6);
      • a=any(1,3,5,6) 相当于 a in(1,3,5,6) 或者 a=1 or a=3 or a=5 or a=6。
      • 注意:any的后面需要跟语句,不能直接放值。
      • some:表示任何一个和any的作用相同。
      • as:不仅可以用来做表的别名,还可以将查询结果通过as作为一张表来使用。

        mysql自带函数

        字符串相关函数:
        mysql自带函数-字符串相关函数.png
        数学相关函数:
        mysql自带函数-数学相关函数.png
        日期相关函数:
        mysql自带函数-日期相关函数.png

        用户管理

  • 创建用户
    • 语法:create user '用户名'@'host' identified by '密码';
    • 上述sql语句中的’host’可以有如下三种设置方式:
      • 1、localhost:本机连接,并且主机地址只能填写localhost
      • 2、ip地址:指定一个ip来连接数据库
      • 3、%:本机和远程ip都可以连接数据库
  • 修改用户的密码
    • 1、切换数据库:use lxy;
    • 2、修改密码:update user set password=password('123') where user='zhangsan';
    • 3、使操作生效:flush privileges;
    • 注意:设置密码时必须加密,更改密码后需用flush privileges刷新MySQL的系统权限相关表
  • 删除用户
    • 语法:drop user '用户名'@'host';
  • 用户授权
    • 语法:grant privileges on 数据库名.表名 to '用户名'@'hoost';
      • priveleges(权限列表):可以是all priveleges, 表示所有权限,也可以是select、update等权限,多个权限的名词,相互之间用逗号分开。
      • on:用来指定权限针对哪些库和表。
      • .:前面的*号用来指定数据库名,后面的*号用来指定表名,*可表示全部。
  • 查看用户权限
    • 查看当前用户(自己)权限:show grants;
    • 查看其他MySQL用户权限:show grants for 'zhangsan'@'%';
  • 撤销用户的权限
    • 语法:revoke privileges on 数据库.表 from '用户名'@'host';
      • priveleges(权限列表):可以是all priveleges, 表示所有权限,也可以是select、update等权限,多个权限的名词,相互之间用逗号分开。
  • grant和revoke用户权限的注意事项:
      1. grant, revoke用户权限后,该用户只有重新连接MySQL数据库,权限才能生效。
      1. 如果想让授权的用户,也可以将这些权限grant给其他用户,需要选项 “grant option“
      • grant select on testdb.* to dba@localhost with grant option;
      • 这个特性一般用不到。实际中,数据库权限最好由DBA来统一管理。
    • 注意:用户本身有多少权限就能赋予别人多少权限,如果一个用户a只有查询权限,那么就只能赋予其他人查询权限,不能赋予删除等权限。