• MySQL学习(二)——MySQL内置函数


    1. 函数

    和其他编程语言一样,MySQL也有函数的定义。函数 是指一段可以直接被另一段程序调用的程序或代码。 也就意味着,这一段程序或代码在MySQL中已经给我们提供了,我们要做的就是在合适的业务场景调用对应的函数完成对应的业务需求即可。这里的函数既指MySQL中内置的函数,也指自己定义的函数。

    MySQL中的函数主要分为以下四类: 字符串函数、数值函数、日期函数、流程函数。

    1.1 字符串函数

    MySQL中内置了很多字符串函数,常用的几个如下:

    函数功能
    CONCAT(S1,S2,...,Sn)字符串拼接,将S1,S2,... Sn拼接成一个字符串
    LOWER(str)将字符串str全部转为小写
    UPPER(str)将字符串str全部转为大写
    LPAD(str,n,pad)左填充,用字符串padstr的左边进行填充,达到n个字符串长度
    RPAD(str,n,pad)右填充,用字符串padstr的右边进行填充,达到n个字符串长度
    TRIM(str)去掉字符串头部和尾部的空格
    SUBSTRING(str,start,len)返回从字符串strstart位置起的len个长度的字符串,MySQL中索引从1 开始

    演示如下:

    # concat : 字符串拼接
    select concat('Hello', ' MySQL');
    
    # lower : 全部转小写
    select lower('Hello');
    
    # lpad : 左填充
    select lpad('01', 5, '-');
    
    # trim : 去除空格
    select trim(' Hello MySQL ');
    
    # substring : 截取子字符串
    select substring('Hello MySQL',1,5);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    1.2 数值函数

    常见的数值函数如下:

    函数功能
    CEIL(x)向上取整
    FLOOR(x)向下取整
    MOD(x,y)返回x/y的模
    RAND()返回0~1内的随机数
    ROUND(x,y)求参数x的四舍五入的值,保留y位小数

    演示如下:

    # ceil:向上取整
    select ceil(1.1);
    
    # mod:取模
    select mod(7,4);
    
    # rand:获取随机数
    select rand();
    
    # round:四舍五入
    select round(2.344,2);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    1.3 日期函数

    常见的日期函数如下:

    函数功能
    CURDATE()返回当前日期
    CURTIME()返回当前时间
    NOW()返回当前日期和时间
    YEAR(date)获取指定date的年份
    MONTH(date)获取指定date的月份
    DAY(date)获取指定date的日期
    DATE_ADD(date, INTERVAL expr type)返回一个日期/时间值加上一个时间间隔expr后的时间值
    DATEDIFF(date1,date2)返回起始时间date1 和 结束时间date2之间的天数

    演示如下:

    # curdate:当前日期
    select curdate();
    
    # curtime:当前时间
    select curtime();
    
    # YEAR , MONTH , DAY:当前年、月、日
    select YEAR(now());
    select MONTH(now());
    select DAY(now());
    
    # now:当前日期和时间
    select now();
    
    # date_add:增加指定的时间间隔
    select date_add(now(), INTERVAL 70 YEAR );
    
    # datediff:获取两个日期相差的天数
    select datediff('2021-10-01', '2021-12-01');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    1.4 流程函数

    流程函数也是很常用的一类函数,可以在SQL语句中实现条件筛选,从而提高语句的效率。

    函数功能
    IF(value , t , f)如果valuetrue,则返回t,否则返回f
    IFNULL(value1 , value2)如果value1不为空,返回value1,否则返回value2
    CASE WHEN [ val1 ] THEN [res1] ... ELSE [ default ] END如果val1true,返回res1,… 否则返回default默认值
    CASE [ expr ] WHEN [ val1 ] THEN [res1] ... ELSE [ default ] END如果expr的值等于val1,返回res1,… 否则返回default默认值

    演示如下:

    # if
    select if(false, 'Ok', 'Error');
    
    # ifnull
    select ifnull('Ok','Default');
    select ifnull('','Default');
    select ifnull(null,'Default');
    
    # case when then else end
    # 需求: 查询emp表的员工姓名和工作地址 (北京/上海 ----> 一线城市 , 其他 ----> 二线城市)
    select
    	name,
    	( case workaddress when '北京' then '一线城市' when '上海' then '一线城市' else
    '二线城市' end ) as '工作地址'
    from emp;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    2. 约束

    2.1 概述

    约束是作用于表中字段上的规则,用于限制存储在表中的数据。目的是为了保证数据库中数据的正确、有效性和完整性。约束的分类如下:

    约束描述关键字
    非空约束限制该字段的数据不能为nullNOT NULL
    唯一约束保证该字段的所有数据都是唯一、不重复的UNIQUE
    主键约束主键是一行数据的唯一标识,要求非空且唯一PRIMARY KEY
    默认约束保存数据时,如果未指定该字段的值,则采用默认值DEFAULT
    检查约束保证字段值满足某一个条件CHECK
    外键约束用来让两张表的数据之间建立连接,保证数据的一致性和完整性FOREIGN KEY

    **注意:**约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束。

    2.2 外键约束

    2.2.1 外键使用

    外键:用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性。

    外键约束示例如下,加入我们有两张表,员工表和部门表。左侧的emp表是员工表,里面存储员工的基本信息,包含员工的ID、姓名、年龄、职位、薪资、入职日期、上级主管ID、部门ID,在员工的信息中存储的是部门的ID dept_id,而这个部门的ID是关联的部门表dept的主键id,那emp表的dept_id就是外键,关联的是另一张表的主键。

    在这里插入图片描述

    对外键操作的语法如下。

    • 创建表时添加

      CREATE TABLE 表名(
      	字段名 数据类型,
      	...
      	[CONSTRAINT] [外键名称] FOREIGN KEY (外键字段名) REFERENCES 主表 (主表列名)
      );
      
      • 1
      • 2
      • 3
      • 4
      • 5
    • 创建表后添加

      ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名) REFERENCES 主表 (主表列名) ;
      
      • 1
    • 删除外键

      ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
      
      • 1

    代码演示如下:

    # 为emp表的dept_id字段添加外键约束,关联dept表的主键id
    alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id);
    
    # 删除emp表的外键fk_emp_dept_id
    alter table emp drop foreign key fk_emp_dept_id;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2.2.2 删除/更新行为

    添加了外键之后,再删除父表数据时产生的约束行为,我们就称为删除/更新行为。具体的删除/更新行为有以下几种:

    行为说明
    NO ACTION当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。 (与 RESTRICT 一致) 默认行为
    RESTRICT当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。 (与 NO ACTION 一致) 默认行为
    CASCADE当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有,则也删除/更新外键在子表中的记录
    SET NULL当在父表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(这就要求该外键允许取null)
    SET DEFAULT父表有变更时,子表将外键列设置成一个默认的值 (Innodb引擎不支持)

    默认的外键删除/更新行为是 NO ACTION ,如果想要有其他的行为,那么其语法为:

    ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段) REFERENCES
    主表名 (主表字段名) ON UPDATE CASCADE ON DELETE CASCADE;
    
    • 1
    • 2

    语法演示如下:

    # CASCADE
    alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references 
    dept(id) on update cascade on delete cascade ;
    
    # SET NULL
    alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references
    dept(id) on update set null on delete set null ;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 相关阅读:
    【Java技巧】如何在HashMap中插入重复的key?
    [01]Web前端进阶—浅谈Web前端兼容性
    macOS上实现「灵动岛」效果
    [英雄星球六月集训LeetCode解题日报] 第27日 图
    LabVIEW网络数据传输&远程控制编程与验证测试
    字节面试题——计算机网络,附答案
    java基于SpringBoot+Vue的大学生体质健康测试管理系统 element
    代码随想录算法训练营二十四期第十三天|LeetCode239. 滑动窗口最大值、LeetCode347. 前 K 个高频元素
    把setting.xml放在conf和.m2目录的区别
    C++算法:给表达式添加运算符
  • 原文地址:https://blog.csdn.net/ifhuke/article/details/133863256