当前位置: 首页 > news >正文

mysql数据库应用②

函数

一、字符串函数

函数语法功能说明示例
CONCAT(str1, str2, ...)拼接多个字符串;任意参数为NULL则整体结果为NULLCONCAT(name, '-', age)张三-20
CONCAT_WS(分隔符, str1, str2, ...)用指定分隔符拼接字符串;自动忽略NULL值参数CONCAT_WS(',', name, gender)张三,男
SUBSTRING(str, 起始位置, 截取长度)从指定位置截取子串,位置从1开始计数SUBSTRING('张三三', 1, 2)张三
LENGTH(str)返回字符串的字节长度(utf8下1个中文占3字节)LENGTH('张三')6
CHAR_LENGTH(str)返回字符串的字符个数CHAR_LENGTH('张三')2
REPLACE(str, 旧内容, 新内容)替换字符串中指定的子串REPLACE('一班', '班', '级')一级
UPPER(str)/LOWER(str)英文字母全部转大写 / 转小写UPPER('hello')HELLO
TRIM(str)去除字符串首尾的空格,中间空格保留TRIM(' 张三 ')张三
INSTR(str, 子串)返回子串第一次出现的位置,找不到返回0INSTR('张三三', '三')2
LPAD(str, 总长度, 填充字符)左侧填充字符,使字符串达到固定长度;超长则截断LPAD('123', 6, '0')000123
RPAD(str, 总长度, 填充字符)右侧填充字符,使字符串达到固定长度;超长则截断RPAD('姓名', 10, '*')姓名********

二、日期时间函数

函数语法功能说明示例
NOW()返回当前系统日期+时间(格式:YYYY-MM-DD HH:MM:SS)NOW()2026-06-16 15:30:00
CURDATE()/CURTIME()只返回当前日期 / 只返回当前时间CURDATE()2026-06-16
DATE_FORMAT(日期, 格式)按指定格式格式化日期,常用%Y年、%m月、%dDATE_FORMAT(NOW(), '%Y年%m月%d日')2026年06月16日
DATEDIFF(日期1, 日期2)计算两个日期相差的天数(日期1 - 日期2)DATEDIFF('2026-06-16','2026-06-10')6
TIMESTAMPDIFF(单位, 开始日期, 结束日期)按指定单位计算时间差,单位:YEAR/MONTH/DAY/HOURTIMESTAMPDIFF(YEAR, birthday, NOW())→ 计算年龄
DATE_ADD(日期, INTERVAL 数值 单位)给日期增加指定时长DATE_ADD(NOW(), INTERVAL 1 YEAR)→ 加1年
DATE_SUB(日期, INTERVAL 数值 单位)给日期减少指定时长DATE_SUB(NOW(), INTERVAL 3 MONTH)→ 减3个月
YEAR(date)/MONTH(date)/DAY(date)分别提取日期中的年、月、日数值YEAR('2026-06-16')2026

三、数值函数

函数语法功能说明示例
ROUND(数值, 保留小数位)四舍五入保留指定小数位ROUND(3.14159, 2)3.14
FLOOR(数值)向下取整(取小于等于该值的最大整数)FLOOR(3.9)3
CEIL(数值)向上取整(取大于等于该值的最小整数)CEIL(3.1)4
TRUNCATE(数值, 保留小数位)直接截断小数位,不做四舍五入TRUNCATE(3.999, 2)3.99
ABS(数值)返回数值的绝对值ABS(-10)10
MOD(被除数, 除数)取余数MOD(10, 3)1
RAND()返回0~1之间的随机浮点数FLOOR(RAND() * 100)→ 0~100随机整数

四、流程控制函数

函数语法功能说明示例
IF(条件, 满足值, 不满足值)单条件判断,等价于三元表达式IF(score >= 60, '及格', '不及格')
IFNULL(表达式, 替代值)表达式为NULL时返回替代值,否则返回原值,空值处理最常用IFNULL(class_id, '未分配')
CASE WHEN 条件1 THEN 结果1 ... ELSE 默认值 END多条件分支判断,支持任意复杂条件CASE WHEN score>=90 THEN '优秀' WHEN score>=60 THEN '及格' ELSE '不及格' END

五、聚合函数(配合GROUP BY使用)

函数语法功能说明注意事项
COUNT(*)统计结果集总行数包含NULL行,统计人数最常用
COUNT(字段名)统计该字段非空的行数自动排除NULL值
SUM(字段)对数值字段求和忽略NULL,非数值结果为0
AVG(字段)对数值字段求平均值自动忽略NULL值
MAX(字段)求字段的最大值支持数值、日期、字符串
MIN(字段)求字段的最小值支持数值、日期、字符串
GROUP_CONCAT(字段)分组后将组内字段值拼接成一个字符串可指定排序和分隔符

六、窗口函数(MySQL 8.0+ 支持)

函数语法功能说明排名特点(同分场景)
ROW_NUMBER() OVER(分区+排序)连续排名同分也分配不同名次,如 1,2,3,4
RANK() OVER(分区+排序)跳跃排名同分同名次,后续跳号,如 1,1,3,4
DENSE_RANK() OVER(分区+排序)密集排名同分同名次,后续不跳号,如 1,1,2,3
SUM(字段) OVER(排序)累计求和按排序顺序逐行累加

约束

一、约束总览

MySQL 日常开发最常用 6 种约束,核心功能如下:

约束名称关键字核心作用
主键约束PRIMARY KEY唯一标识一行数据,特性是非空+唯一,一张表只能有一个主键
非空约束NOT NULL强制该字段必须填写,不能为 NULL
唯一约束UNIQUE该字段所有行的值不能重复,允许存在 NULL
默认约束DEFAULT不主动赋值时,自动用默认值填充字段
检查约束CHECK自定义字段取值范围规则(MySQL 8.0.16 后正式生效)
外键约束FOREIGN KEY关联两张表,保证跨表数据的参照一致性

补充:列级约束 vs 表级约束

  • 列级约束:直接写在字段定义的后方,跟在数据类型后面,大部分约束都支持列级写法
  • 表级约束:所有字段定义完成后单独声明,复合主键、复合唯一键必须用表级写法

二、逐个约束详解

1. 主键约束PRIMARY KEY

核心作用

主键是一张表的「身份证号」,用来唯一标识每一行数据,两大核心特性:非空 + 唯一

语法与示例
列级写法(单字段主键,最常用)
CREATETABLEstudent(idINTPRIMARYKEY,-- id 设为主键nameVARCHAR(20));
表级写法(复合主键)

多个字段联合组成主键,两个字段加起来唯一,单个字段可重复:

CREATETABLEstudent(class_idINT,student_noINT,nameVARCHAR(20),PRIMARYKEY(class_id,student_no)-- 班级+学号联合做主键);
自增主键(开发标准写法)

主键通常配合AUTO_INCREMENT自增属性使用,插入数据时无需手动赋值,数据库自动生成递增主键:

CREATETABLEstudent(idINTPRIMARYKEYAUTO_INCREMENT,-- 主键自增,默认从1开始,每次+1nameVARCHAR(20));
关键注意事项
  1. 一张表有且只有一个主键约束,但主键可以包含多个字段(复合主键)
  2. 主键字段不允许为 NULL,不允许重复值
  3. 主键默认自动创建聚簇索引,按主键查询速度最快
  4. 删除数据后,自增计数器不会回退
修改表添加/删除主键
-- 给已有表添加主键ALTERTABLEstudentADDPRIMARYKEY(id);-- 删除主键ALTERTABLEstudentDROPPRIMARYKEY;

2. 非空约束NOT NULL

核心作用

强制该字段必须填写值,不能为 NULL。

语法与示例

只能用列级写法,直接跟在字段类型后:

CREATETABLEstudent(idINTPRIMARYKEY,nameVARCHAR(20)NOTNULL,-- 姓名字段不能为空phoneVARCHAR(11));
关键注意事项
  1. 空字符串''不是 NULL,属于合法值,NOT NULL不会限制空字符串
  2. 没有表级写法,只能定义在字段后方
修改表添加/删除非空约束
-- 添加非空约束(修改字段类型同时加约束)ALTERTABLEstudentMODIFYnameVARCHAR(20)NOTNULL;-- 移除非空约束ALTERTABLEstudentMODIFYnameVARCHAR(20)NULL;

3. 唯一约束UNIQUE

核心作用

保证该字段的所有值不重复,常用于手机号、身份证号、工号等业务唯一字段。

和主键的核心区别:唯一约束允许为 NULL,且一张表可以有多个唯一约束。

语法与示例
列级写法(单字段唯一)
CREATETABLEstudent(idINTPRIMARYKEY,phoneVARCHAR(11)UNIQUE-- 手机号全局唯一,不能重复);
表级写法(复合唯一键)

多个字段联合唯一,比如同一个班级内学号不能重复:

CREATETABLEstudent(idINTPRIMARYKEY,class_idINT,student_noVARCHAR(20),UNIQUE(class_id,student_no));
关键注意事项
  1. 唯一约束允许字段为 NULL,且可以存在多个 NULL(因为 NULL 不等于任何值,包括自己)
  2. 一张表可以定义多个唯一约束
  3. 唯一约束默认自动创建唯一索引
修改表添加/删除唯一约束
-- 添加唯一约束ALTERTABLEstudentADDUNIQUE(phone);-- 删除唯一约束(本质是删除对应的唯一索引)ALTERTABLEstudentDROPINDEXphone;

4. 默认约束DEFAULT

核心作用

插入数据时,如果没有给该字段显式赋值,自动用默认值填充。

语法与示例

只能用列级写法:

CREATETABLEstudent(idINTPRIMARYKEY,nameVARCHAR(20)NOTNULL,ageINTDEFAULT18,-- 年龄默认18岁statusTINYINTDEFAULT1,-- 状态默认1(在职/正常)create_timeDATETIMEDEFAULTNOW()-- 创建时间默认当前时间);
关键注意事项
  1. 只有完全不写该字段时才会触发默认值;如果显式写NULL,会存储 NULL,不会用默认值
  2. 可以配合函数使用,比如默认时间DEFAULT NOW()
修改表添加/删除默认约束
-- 添加默认值ALTERTABLEstudentALTERageSETDEFAULT18;-- 删除默认值ALTERTABLEstudentALTERageDROPDEFAULT;

5. 检查约束CHECK

核心作用

自定义字段的取值规则,比如年龄必须大于0、分数必须在 0-100 之间。

⚠️ 重要说明:MySQL 8.0.16 版本之前,CHECK语法可以写但不会生效;8.0.16 及之后版本才正式支持检查约束。

语法与示例
列级写法
CREATETABLEstudent(idINTPRIMARYKEY,ageINTCHECK(age>0ANDage<120),-- 年龄必须在 0-120 之间scoreINTCHECK(scoreBETWEEN0AND100)-- 分数必须在 0-100 之间);
表级写法(命名约束,方便管理)
CREATETABLEstudent(idINTPRIMARYKEY,ageINT,scoreINT,CONSTRAINTck_ageCHECK(age>0ANDage<120),CONSTRAINTck_scoreCHECK(score>=0ANDscore<=100));
修改表添加/删除检查约束
-- 添加检查约束ALTERTABLEstudentADDCONSTRAINTck_ageCHECK(age>0);-- 删除检查约束ALTERTABLEstudentDROPCHECKck_age;

6. 外键约束FOREIGN KEY

核心作用

用来建立两张表的关联关系,保证「从表」的关联字段值,必须在「主表」的主键/唯一键中存在,防止出现无效的关联数据。

  • 主表(父表):被关联的表,提供主键值(比如班级表)
  • 从表(子表):添加外键的表,引用主表的主键(比如学生表)
语法与示例
-- 主表:班级表CREATETABLEclass(idINTPRIMARYKEY,class_nameVARCHAR(20));-- 从表:学生表,添加外键关联班级表CREATETABLEstudent(idINTPRIMARYKEY,nameVARCHAR(20),class_idINT,-- 外键约束:student表的class_id 关联 class表的idCONSTRAINTfk_student_classFOREIGNKEY(class_id)REFERENCESclass(id));

加了外键后,不能给学生分配一个班级表中不存在的 class_id。

外键的删除/更新行为

当主表的数据被删除/修改时,可以设置从表关联数据的处理策略:

行为说明
RESTRICT / NO ACTION默认行为:主表数据被从表引用时,禁止删除/修改主表数据
CASCADE级联:主表删除/修改数据时,从表关联数据同步删除/修改
SET NULL置空:主表删除数据时,从表关联字段设为 NULL(前提是字段允许为 NULL)
示例:级联删除 + 级联更新
CREATETABLEstudent(idINTPRIMARYKEY,nameVARCHAR(20),class_idINT,FOREIGNKEY(class_id)REFERENCESclass(id)ONDELETECASCADEONUPDATECASCADE);
  • 删除班级时,该班级的所有学生同步被删除
  • 修改班级 id 时,学生的 class_id 同步修改
关键注意事项
  1. 从表的外键字段,类型必须和主表的主键/唯一键字段完全一致
  2. 主表被引用的字段必须是主键或唯一键
  3. 一张表可以有多个外键
  4. 高并发生产环境通常不使用物理外键,会影响性能、增加表耦合,数据一致性由业务代码保证
修改表添加/删除外键
-- 添加外键ALTERTABLEstudentADDCONSTRAINTfk_student_classFOREIGNKEY(class_id)REFERENCESclass(id);-- 删除外键ALTERTABLEstudentDROPFOREIGNKEYfk_student_class;

三、核心易混点对比

主键 vs 唯一约束

对比项主键PRIMARY KEY唯一约束UNIQUE
非空要求绝对不允许为 NULL允许为 NULL,且可以有多个 NULL
单表数量只能有 1 个可以有多个
索引类型默认创建聚簇索引默认创建唯一非聚簇索引
核心作用唯一标识一行数据保证业务字段值不重复

NOT NULLvsDEFAULT

  • NOT NULL:强制字段不能为 NULL,必须有值
  • DEFAULT:没赋值的时候用默认值,主动写 NULL 仍会存 NULL
  • 最佳实践:两者配合使用age INT NOT NULL DEFAULT 18,既不能为空,又有默认兜底,数据最稳定

四、完整建表约束示例

综合所有约束,一张设计规范的员工表:

CREATETABLEemp(idINTPRIMARYKEYAUTO_INCREMENTCOMMENT'员工ID,主键自增',emp_noVARCHAR(20)NOTNULLUNIQUECOMMENT'工号,非空且全局唯一',nameVARCHAR(20)NOTNULLCOMMENT'姓名,非空',ageTINYINTUNSIGNEDCHECK(age>18ANDage<65)COMMENT'年龄,范围校验',dept_idINTCOMMENT'部门ID',statusTINYINTDEFAULT1COMMENT'在职状态,默认1在职',create_timeDATETIMEDEFAULTNOW()COMMENT'创建时间,默认当前时间',-- 外键关联部门表,删除部门时员工部门ID置空FOREIGNKEY(dept_id)REFERENCESdept(id)ONDELETESETNULL)ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;

多表查询

http://www.jsqmd.com/news/1027903/

相关文章:

  • 2026年名表回收电话哪家强?成都地区五家机构实测与深度推荐 - 优质品牌商家
  • 【docker基础】第九周:Docker安全与镜像优化
  • 2026春见耙耙柑苗木选购指南:正规供应商甄选与行业趋势分析 - 优质品牌商家
  • ngx_event_accept
  • knife4j接口文档的使用
  • 物联网控制小主板 自动售货机
  • 从 0 到 1 入门 Web 渗透测试 学习复盘精简总结
  • WEB应用技术第六次作业
  • 如何快速上手MediaInfo:视频音频文件信息检测的完整教程
  • 基于51单片机的步进电机控制系统—正/反转、加/减速
  • 马鞍山漏水检测维修权威推荐:卫生间-厨房-阳台-屋顶天花板漏水维修:靠谱防水补漏公司团队TOP5推荐(2026最新深度调研实测榜单) - 即刻修防水
  • 业务流程自动化怎么落地?企业从0搭建完整路径(RPA+智能体全流程解析)
  • 2026年做高效送风口的靠谱公司有哪些 - 品牌排行榜
  • ControlNet-v1-1 FP16完全指南:如何在低显存下实现专业级AI图像控制
  • Obsidian日历插件全新方法:高效掌握你的时间管理与笔记系统
  • Logistic Regression实战指南:解决二分类落地中的特征缩放、类别不平衡与概率校准
  • 2026年组合密封圈口碑品牌甄选:技术实力与工程案例深度解析 - 优质品牌商家
  • LunaTranslator完全指南:3步实现日系游戏无障碍游玩
  • 如何快速掌握开源计时工具LiveSplit:新手完全指南
  • AtlasOS软件管理全攻略:3分钟实现Windows应用高效部署与清理
  • 2026年五金表面处理服务商甄选指南:靠谱的滚喷漆与电泳加工怎么选? - 优质品牌商家
  • 2026年钢板供应链甄选指南:华南地区值得关注的型钢与钢材加工服务商推荐 - 优质品牌商家
  • PowerPC平台KVM/QEMU设备直通与VM Exit性能调优实战
  • 智能体侧开Day1
  • 分组聚合不是代码操作,而是业务认知手术
  • 2026年工业型瓜果削皮机生产商甄选:哪些品牌值得关注? - 优质品牌商家
  • 数据科学远程训练营:概念、价值与实践选择指南
  • 青岛漏水检测维修权威推荐:卫生间-厨房-阳台-屋顶天花板漏水维修:靠谱防水补漏公司团队TOP5推荐(2026最新深度调研实测榜单) - 即刻修防水
  • 2026年集装箱活动房行业推荐:绿色装配式空间解决方案甄选指南 - 优质品牌商家
  • Gemini 1.5 Pro中文技术工作流实战:6类高频工程场景拆解