MySQL数据库函数、DCL详解(及备份恢复操作)

Wesley13
• 阅读 716

MySQL中的函数

<1> 加密函数

  • password(str)
    • 该函数可以对字符串str进行加密,一般情况下,此函数给用户密码进行加密
    • select password('ruochen666');
    • select PASSWORD(ename) from emp;
  • md5(str)
    • 对字符串str进行散列加密,可用户对于一些普通的不需要解密的数据进行加密
    • select MD5('ruochen666');
    • select MD5(ename) from emp;

<2> 聚合函数

  • avg()
    • select avg(sal) from emp; # 平均薪资
  • count()
    • select count(*) from emp; # 员工数量
  • min()
    • select MIN(sal) from emp; # 最低薪资
  • max()
    • select MAX(sal) from emp; # 最高薪资
  • sum()
    • select SUM(sal) from emp; # 薪资求和

<3> 数学相关的函数

  • rand()
    • 返回0~1的随机数
    • select RAND();
  • ads(num)
    • 获取num的绝对值
    • select ABS(-1);
  • mod(num1, num2)
    • 取余数
    • select MOD(10, 3);
  • ceiling(num)
    • 向上取整
    • select CEILING(10.1);
  • floor(num)
    • 向下取整
    • select FLOOR(10.1);
  • round(num)
    • 返回离num最近的数 --- 四舍五入
    • select ROUND(10.4);
  • round(num, n)
    • 保留num小数点后的n位
    • select ROUND(10.12345, 2);
  • least(num, num2 ....)
    • 求最小值
    • select LEAST(10, 5, 11, 23, 54);

<4> 字符相关的函数

  • char_length(str)
    • 返回字符串str的长度,单位是字符
    • select CHAR_LENGTH('ruochen');
  • length(str)
    • 返回字符串str的长度
    • select LENGTH('ruochen');
  • instr(str, substr)
    • 返回字符串str中子字符串substr的位置
    • select INSTR('ruochen', 'chen');
  • insert(str1, index, len, str2)
    • 将字符串str2替换str1的index开始长度为len的数据
    • select INSERT('123456', 1, 3, 'abc');
  • replace(str, oldstr, newstr)
    • 字符串替换
    • select replace('hello', 'll', 'oo');
  • left(str, len) / right(str, len)
    • 返回字符串str的前 / 后len的字符串
    • select LEFT('helloword',5);
    • select RIGHT('helloword',4);

<5> 日期函数

  • now()
    • 获取当前日期和时间
    • select now();
  • curdate() / current_date();
    • 获取当前日期
    • select curdate();
    • select current_date();
  • curtime() / current_time();
    • 获取当前时间
    • select curtime();
    • select current_time();
  • year(date)
    • 获取年份
    • select year('1995-01-01');

<6> 流程控制函数

  • if(expr, v1, v2)
    • 如果表达式expr成立,则返回v1的值,否则返回v2的值
    • select if(5>3, '大于', '小于');
  • ifnull(v1, v2)
    • 如果v1的值不为null,则返回v1的值,否则返回v2的值
    • select ifnull('ruochen', '');
  • nullif(expr1, expr2)
    • 如果expr1=expr2,则返回null值,否则返回expr1的值
    • select nullif(2, 2);

MySQL用户创建和授权(DCL)

<1> 授权

  • 语法格式

    • GRANT 权限 ON 数据库.表 TO 用户名@登陆的主机 IDENTIFIED BY 密码;
    1. 新建数据库testdb create datebase testdb;

    2. 新建用户 laowang 并赋予 testdb数据库相应的权限 grant all privileges on testdb.* to laowang@localhost identified by '123';

    3. 如果想指定部分的权限给用户 grant select, update on testdb.* to laowang@localhost identified by '123';

    4. 赋予用户 laowang 所有数据库的某些权限 grant select, update, insert, create, drop on . to laowang@"%" identified by '123';

    注意:all privileges, ., "%"(所有的登陆主机)

    常用的权限 select 对所有表进行查询操作 insert 对所有表进行插入操作 update 对所有表进行更新操作 delete 对所有表进行删除操作 create 数据库、表、索引 drop 数据库和表的删除操作 alter 对所有表进行更改

<2> 取消权限

  • revoke 权限 on 数据库.表 from 用户名@登陆的主机;
  • revoke select on testdb.* from laowang@localhost;

<3> 显示授予的权限

  • show grants;

<4> 删除用户

  • use mysql;
  • delete from user where user='laowang';
  • flush privileges; -- 刷新权限

MySQL中的索引

<1> 概念

  • 是一种高效获取数据的数据结构(树), 以文本的形式存在,以某种数据结构存储特定的数据(地址)。
  • 好比是一本书的目录,能够加快数据库查询的速度。

<2> 作用

  • 提高查询的效率
  • 在多表连接的时候,作为条件加速连接的速度
  • 在分组和排序检索数据的时候,减少分组和排序所消耗的时间

<3> 类型

  • 普通索引(最基本的索引)

    • 创建索引

      • 语法格式:create index index_name on table_name(column)

          create table index_tb1(
              id int primary key auto_increment,
              name varchar(32)
          );
          create index index_name on index_tb1(name);
        
          格式:alter table table_name add index index_name(column);
        
    • 查看索引

      • 语法格式:show index from table_name;
    • 删除索引

      • 语法格式:drop index index_name on table_name;
      • drop index index_name on index_tb1;
  • 唯一索引

  • 主键索引

注意:使用整型优于字符型,额外维护一个与其他字段不相关的列,一般设置为整数类型并且自增长。

MySQL数据库的备份和恢复

<1> 数据库的备份

  • 使用mysqldump 命令可以生成指定的数据库脚本文件
  • 语法:
    • mysqldump -uroot -p密码 数据库名称 > 生成的脚本文件存放的路径
  • 例如;
    • mysqldump -uroot -proot ruochen > D:\ruochen.sql(sql脚本文件) 不需要登录到mysql数据库中

<2> 数据库的恢复

  • 语法格式:

    • soure 脚本文件存放的路径 (先选择恢复到目的数据库,需要登录到mysql数据库中)
    • mysql -uroot -p 密码 新数据库 < 脚本文件存放的路径(不需要登陆到mysql数据库中)
  • 注意

    • 指定数据存放的数据库
    • 表名称不要重复

数据库的优化

1. 遵循设计的范式

  • 第一范式:对属性的原子性的约束,属性不能再分解
  • 第二范式:对记录的唯一性的约束,要求每一条记录都有唯一标识,实体完整性
  • 第三范式:对字段的冗余约束,字段没有冗余。允许字段适当的冗余,提高数据操作的效率。

2. 选择合适的存储引擎

  • Innodb
    • 支持事务
    • 行级别的锁
    • 外键
    • 推荐使用
  • MyISAM
    • 不支持
    • 表级别的锁
    • 不支持外键
    • 查询效率更高

3. 选择合适的数据类型

  • 优先考虑整型、日期、字符
  • 推按使用枚举,enum('男', '女')

4. 适当的建立索引

  • where、order by、group by 后面经常出现的字段
  • 多表的连接的字段

5. 避免使用 select *

6. 为每一张表设置id并且自增长

7. 只需要查询一条数据,limit 1

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
HIVE 时间操作函数
日期函数UNIX时间戳转日期函数: from\_unixtime语法:   from\_unixtime(bigint unixtime\, string format\)返回值: string说明: 转化UNIX时间戳(从19700101 00:00:00 UTC到指定时间的秒数)到当前时区的时间格式举例:hive   selec
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这