摘要:本文介绍数据库中的函数与约束函数字符串、数值、日期、流程四类,可实现字符串处理、数值计算等需求。约束分六类,重点讲外键约束的语法、删除更新行为,保证数据正确完整。

思维导图

1. 函数

函数是指一段可以直接被另一段程序调用的程序或代码。这意味着,在 MySQL 中已经为我们提供了这一段程序或代码,我们只需在合适的业务场景调用对应的函数,即可完成对应的业务需求。

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

1.1 字符串函数

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

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

使用方法:select  函数


演示如下:

A. concat:字符串拼接  ⭐⭐⭐

select concat('Hello' , ' MySQL');

B. lower:全部转小写

select lower('Hello');

C. upper:全部转大写

select upper('Hello');

D. lpad:左填充

select lpad('01', 5, '-');

E. rpad:右填充

select rpad('01', 5, '-');

F. trim:去除空格

select trim(' Hello MySQL ');

G. substring:截取子字符串 

select substring('Hello MySQL',1,5);

案例

由于业务需求变更,企业员工的工号统一改为 5 位数,目前不足 5 位数的需在前面补 0(例如:1 号员工的工号应改为 00001)。

update emp set workno = lpad(workno, 5, '0');

处理完毕后,具体的数据如下:

idworknonamegenderageidcardworkaddressentrydate
100001抖音号:133240285220123456789012345678北京2000-01-01
200002张无忌18123456789012345670北京2005-09-01
300003韦一笑38123456789712345670上海2005-08-01
400004赵敏18123456757123845670北京2009-12-01
500005小昭16123456769012345678上海2007-07-01
600006杨逍2812345678931234567X北京2006-01-01
700007抖音号:123240285640123456789212345678北京2005-05-01
800008黛绮丝38123456157123645670天津2015-05-01
900009范凉凉45123156789012345678北京2010-04-01
1000010陈友谅53123456789012345670上海2011-01-01
1100011张士诚55123567897123465670江苏2015-05-01
1200012常遇奇32123446757152345678北京2004-02-01
1300013张三丰88123656789012345678江苏2020-11-01
1400014灭绝65123456719012345670西安2019-05-01
1500015胡青牛7012345674971234567X西安2018-04-01
1600016周芷若18null北京2012-06-01

1.2 数值函数

常见的数值函数如下:

函数功能
CEIL(x)向上取整
FLOOR(x)向下取整
MOD(x,y)返回 x 除以 y 的余数(模)
RAND() ⭐返回 0~1 范围内的随机数
ROUND(x,y) ⭐对参数 x 进行四舍五入,保留 y 位小数

演示如下:

A. ceil:向上取整

select ceil(1.1);

B. floor:向下取整

select floor(1.9);

C. mod:取模

select mod(7,4);

D. rand:获取随机数

select rand();

E. round:四舍五入

select round(2.344,2);

案例  ⭐⭐⭐

通过数据库的函数,生成一个六位数的随机验证码。

思路:通过 rand() 函数可获取 0~1 之间的随机数,将其乘以 1000000 后,舍弃小数部分,若结果长度不足 6 位,则在前面补 0。

select lpad(round(rand()*1000000 , 0), 6, '0');

1.3 日期函数

常见的日期函数如下:

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

演示如下:

A. curdate:当前日期

select curdate();

B. curtime:当前时间

select curtime();

C. now:当前日期和时间

select now();

D. YEAR、MONTH、DAY:获取当前年、月、日

select YEAR(now());select MONTH(now());select DAY(now());

E. date_add:增加指定的时间间隔

select date_add(now(), INTERVAL 70 YEAR );

F. datediff:获取两个日期相差的天数

select datediff('2021-10-01', '2021-12-01');

案例

查询所有员工的入职天数,并根据入职天数倒序排序。

思路:入职天数 = 当前日期 - 入职日期,可通过 datediff 函数实现。

select name, datediff(curdate(), entrydate) as 'entrydays' from emp order by entrydays desc;

1.4 流程函数

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

函数功能
IF(value, t, f)若 value 为 true,则返回 t;否则返回 f
IFNULL(value1, value2)若 value1 不为空,则返回 value1;否则返回 value2
CASE WHEN [val1] THEN [res1] ... ELSE [default] END若 val1 为 true,则返回 res1;... 若所有条件都不满足,则返回 default 默认值
CASE [expr] WHEN [val1] THEN [res1] ... ELSE [default] END若 expr 的值等于 val1,则返回 res1;... 若所有条件都不满足,则返回 default 默认值

演示如下:

A. if

select if(false, 'Ok', 'Error');

B. ifnull

select ifnull('Ok','Default');select ifnull('','Default');select ifnull(null,'Default');

C. case when then else end

需求:查询 emp 表的员工姓名和工作地址(北京 / 上海 → 一线城市,其他 → 二线城市)

select
name,
( case workaddress when '北京' then '一线城市' when '上海' then '一线城市' else '二线城市' end ) as '工作地址'
from emp;

案例

先创建并插入数据到学员成绩表 score

create table score(id int comment 'ID',name varchar(20) comment '姓名',math int comment '数学',english int comment '英语',chinese int comment '语文') comment '学员成绩表';insert into score(id, name, math, english, chinese) VALUES (1, 'Tom', 67, 88, 95), (2, 'Rose' , 23, 66, 90),(3, 'Jack', 56, 98, 76);

查询学员成绩,并显示各科成绩等级(≥85 为优秀,≥60 为及格,否则为不及格):

select id,name,(case when math >= 85 then '优秀' when math >=60 then '及格' else '不及格' end ) '数学',(case when english >= 85 then '优秀' when english >=60 then '及格' else '不及格' end ) '英语',(case when chinese >= 85 then '优秀' when chinese >=60 then '及格' else '不及格' end ) '语文'from score;

函数场景回顾

  1. 数据库中存储入职日期(如 2000-01-01),如何快速计算出入职天数?

    答案:datediff 函数。

  2. 数据库中存储学生分数值(如 98、75),如何快速判定分数等级?

    答案:case ... when ... 流程函数。

2. 约束

2.1 概述

  • 概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。

  • 目的:保证数据库中数据的正确、有效性和完整性。

分类

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

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

2.2 外键约束

2.2.1 介绍

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

2.2.2 语法

1). 添加外键

-- 方式1:创建表时添加
​
CREATE TABLE 表名(
​
字段名 数据类型,
​
[CONSTRAINT] [外键名称] FOREIGN KEY (外键字段名) REFERENCES 主表 (主表列名)
​
);
​
-- 方式2:修改表时添加
​
ALTER TABLE 表名 ADD CONSTRAINT [外键名称] FOREIGN KEY (外键字段名) REFERENCES 主表 (主表列名);

            多了一个蓝色小钥匙 

2). 删除外键

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

案例:删除 emp 表的外键 fk_emp_dept_id

alter table emp drop foreign key fk_emp_dept_id;

2.3.3 删除 / 更新

添加外键后,删除 / 更新父表数据时产生的约束行为,称为删除 / 更新行为,具体如下:

行为说明
NO ACTION当在父表中删除 / 更新对应记录时,先检查该记录是否有对应外键,若有则不允许删除 / 更新(与 RESTRICT 一致),默认行为
RESTRICT当在父表中删除 / 更新对应记录时,先检查该记录是否有对应外键,若有则不允许删除 / 更新(与 NO ACTION 一致),默认行为
CASCADE当在父表中删除 / 更新对应记录时,先检查该记录是否有对应外键,若有则同步删除 / 更新子表中关联的外键记录
SET NULL当在父表中删除对应记录时,先检查该记录是否有对应外键,若有则将子表中该外键值设为 null(需外键允许取 null)
SET DEFAULT父表有变更时,子表将外键列设为默认值(Innodb 不支持)

具体语法

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

演示

NO ACTION 是默认行为,已通过前面语法测试,此处演示 CASCADE 和 SET NULL 两种行为:

1). CASCADE

alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id) on update cascade on delete cascade ;

A. 修改父表数据:将 dept 表中 id 为 1 的记录修改为 6。

结果:子表 emp 中 dept_id 值为 1 的记录,同步变为 6,体现 CASCADE 级联更新效果。

B. 删除父表数据:删除 dept 表中 id 为 6 的记录。

结果:父表数据删除成功,子表中关联的记录也被级联删除,体现 CASCADE 级联删除效果。
注意:一般业务系统中,不会修改表的主键值。

2). SET NULL

先删除已建立的外键 fk_emp_dept_id,再恢复 emp、dept 表数据。

执行以下语句添加外键并设置 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 ;

大功告成!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/94859.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/94859.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/94859.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle 数据库性能调优:从瓶颈诊断到精准优化之道

引言:性能优化的本质在当今数据驱动的时代,数据库性能直接关系到企业的运营效率和用户体验。Oracle 作为全球领先的关系型数据库管理系统,承载着众多企业的核心业务。然而,随着数据量的增长和业务复杂度的提升,数据库性…

杨校老师竞赛课堂之C++语言GESP一级笔记

考试大纲 GESP一级考试大纲 计算机基础与编程环境 计算机历史 变量的定义与使用 基本数据类型(整型、浮点型、字符型、布尔型) 输入与输出(cin与cout、scanf与printf) 基本运算(算术运算、关系运算、逻辑运算&am…

操作系统-管程

1. 为什么需要管程?—— 信号量 (Semaphore) 的困境在理解管程之前,你必须先知道它要解决什么问题。之前,我们使用信号量 (Semaphore) 来实现进程/线程间的同步与互斥。虽然信号量功能强大,但它存在两个主要问题:编程复…

日志的实现

目录 日志与策略模式 Log.hpp class LogStrategy基类 class ConsoleLogStrategy派生类 classFileLogStrategy派生类 日志等级 获得时间戳 localtime_r函数详解 函数原型 struct tm结构的指针 Logger类(重点) class LogMessage 日志信息类 std::stringstream 用法 重…

【论文阅读】Sparse4D v2:Recurrent Temporal Fusion with Sparse Model

标题: Sparse4D v2:Recurrent Temporal Fusion with Sparse Model 作者: Xuewu Lin, Tianwei Lin, Zixiang Pei, Lichao Huang, Zhizhong Su motivation 在v1的基础上,作者发现长时序有更好的效果,但v1的计算量太大&am…

构建免费的音视频转文字工具:支持多语言的语音识别项目

在当今数字时代,音视频内容越来越多,但如何快速将其转换为文字一直是一个挑战。本项目提供了一个免费的解决方案,支持将视频和音频文件转换为文字,并且支持多语言识别。 一个支持中英文的音视频转文字工具,集成了 Vos…

【开题答辩全过程】以 基于SpringBootVue的智能敬老院管理系统为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人,语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

Linux 830 shell:expect,ss -ant ,while IFS=read -r line,

[rootsamba caozx26]# scp /home/caozx26/pub root192.168.235.3:~/ root192.168.235.3s password: /home/caozx26/pub: not a regular file [rootsamba caozx26]# ls app km nntp.sh ntp.sh until1.sh 公共 图片 音乐 find.sh l2 ntp1.sh pub u…

​​​​​​​GPT-5发布引爆争议,奥特曼连夜回应!付费充值的Plus用户成最大赢家?

摘要: GPT-5发布后,社区口碑两极分化,从“强无敌”到“还我4o”的呼声并存。面对技术故障和用户质疑,OpenAI CEO萨姆奥尔特曼及团队火速回应,公布了一系列补救措施和未来计划。本文将带你速览这场风波始末,…

Python 操作 Redis 的客户端 - Redis Stream

Python 操作 Redis 的客户端 - Redis Stream1. Redis Stream2. Redis Commands2.1. CoreCommands.xadd() (生产端)2.2. CoreCommands.xlen() (生产端)2.3. CoreCommands.xdel() (生产端)2.4. CoreCommands.xrange() (生产端)2.5. RedisClusterCommands.delete()3. Redis Stream…

【Qt开发】按钮类控件(一)-> QPushButton

目录 1 -> 什么是 PushButton? 2 -> 相关属性 3 -> 代码示例 3.1 -> 带有图标的按钮 3.2 -> 带有快捷键的按钮 4 -> 总结 1 -> 什么是 PushButton? 在 Qt 框架中,QPushButton 是最基础且最常用的按钮控件之一&am…

Citrix 零日漏洞自五月起遭积极利用

安全研究员 Kevin Beaumont 披露了有关 CVE-2025-6543 的惊人细节,这是一个严重的 Citrix NetScaler 漏洞,在该公司发布补丁之前的几个月里,该漏洞被积极利用作为零日攻击。 Citrix 最初将其轻描淡写为简单的“拒绝服务”漏洞,但…

【系列08】端侧AI:构建与部署高效的本地化AI模型 第7章:架构设计与高效算子

第7章:架构设计与高效算子 要将AI模型成功部署到端侧,除了对现有模型进行压缩和优化,更根本的方法是在设计之初就考虑其在资源受限环境下的运行效率。本章将深入探讨如何设计高效的网络架构,以及如何理解并优化常用的核心算子。高…

42-Ansible-Inventory

文章目录Ansible基本概述手动运维时代(原始社会)自动化运维时代自动化运维工具的优势Ansible的功能及优点Ansible的架构Ansible的执行流程安装AnsibleAnsible配置文件生效顺序Ansible inventory主机清单Ansible基于免秘钥方式管理客户端小结Ansible-Adho…

Go语言runtime/trace工具全面解析

基本概念与功能 Go语言的runtime/trace是Go标准库中内置的性能分析工具,主要用于追踪和可视化Go程序的运行时行为。它能够记录程序执行期间的各种事件,包括goroutine调度、系统调用、垃圾回收(GC)、网络I/O、锁等待等关键信息。 trace工具的核心功能包括: goroutine生命周期…

Docker(自写)

Docker程序是跑在操作系统上的,而操作系统上又装了各种不同版本的依赖库和配置程序依赖环境,环境不同,程序就可能跑不起来,如果我们能将环境和程序一起打包docker就是可以将程序和环境一起打包并运行的工具软件基础镜像DockerFile…

深度拆解 OpenHarmony 位置服务子系统:从 GNSS 到分布式协同定位的全链路实战

1. 系统概述 OpenHarmony 的“定位子系统”就是硬件服务子系统集里的 “位置服务子系统”(Location SubSystem)。它向下对接 GNSS/GPS、基站、Wi-Fi 等定位模组,向上以 标准位置 API 形式为应用提供 实时位置、轨迹、地理围栏 等能力,并可与分布式软总线联动,实现 跨设备…

React Native基本用法

1,index调用registerComponent,把appName注入到React Native的根节点。 2,package.json是全局大管家,package-lock.json锁定版本,不会手动编辑,通过install安装 3, bebal.config.json bebal.config.json是翻…

LoraConfig target modules加入embed_tokens(64)

LoraConfig target modules加入embed_tokens 更好且成本更低的方法 嵌入层(embedding layer)的 lora_embedding_A 和 lora_embedding_B 头部(head)是否需加入目标模块列表 用户警告 解除权重绑定 解绑以后是随机权重,怎么办 更好且成本更低的方法 “有没有一种更好且成本…

笔记共享平台|基于Java+vue的读书笔记共享平台系统(源码+数据库+文档)

笔记共享平台|读书笔记共享平台系统 目录 基于Javavue的读书笔记共享平台系统 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取 博主介绍:✌️大厂码农|毕设布道师&#xff…