mysql数据库应用②

📅 2026/6/17 5:53:01
mysql数据库应用②
函数一、字符串函数函数语法功能说明示例CONCAT(str1, str2, ...)拼接多个字符串任意参数为NULL则整体结果为NULLCONCAT(name, -, age)→张三-20CONCAT_WS(分隔符, str1, str2, ...)用指定分隔符拼接字符串自动忽略NULL值参数CONCAT_WS(,, name, gender)→张三,男SUBSTRING(str, 起始位置, 截取长度)从指定位置截取子串位置从1开始计数SUBSTRING(张三三, 1, 2)→张三LENGTH(str)返回字符串的字节长度utf8下1个中文占3字节LENGTH(张三)→6CHAR_LENGTH(str)返回字符串的字符个数CHAR_LENGTH(张三)→2REPLACE(str, 旧内容, 新内容)替换字符串中指定的子串REPLACE(一班, 班, 级)→一级UPPER(str)/LOWER(str)英文字母全部转大写 / 转小写UPPER(hello)→HELLOTRIM(str)去除字符串首尾的空格中间空格保留TRIM( 张三 )→张三INSTR(str, 子串)返回子串第一次出现的位置找不到返回0INSTR(张三三, 三)→2LPAD(str, 总长度, 填充字符)左侧填充字符使字符串达到固定长度超长则截断LPAD(123, 6, 0)→000123RPAD(str, 总长度, 填充字符)右侧填充字符使字符串达到固定长度超长则截断RPAD(姓名, 10, *)→姓名********二、日期时间函数函数语法功能说明示例NOW()返回当前系统日期时间格式YYYY-MM-DD HH:MM:SSNOW()→2026-06-16 15:30:00CURDATE()/CURTIME()只返回当前日期 / 只返回当前时间CURDATE()→2026-06-16DATE_FORMAT(日期, 格式)按指定格式格式化日期常用%Y年、%m月、%d日DATE_FORMAT(NOW(), %Y年%m月%d日)→2026年06月16日DATEDIFF(日期1, 日期2)计算两个日期相差的天数日期1 - 日期2DATEDIFF(2026-06-16,2026-06-10)→6TIMESTAMPDIFF(单位, 开始日期, 结束日期)按指定单位计算时间差单位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.14FLOOR(数值)向下取整取小于等于该值的最大整数FLOOR(3.9)→3CEIL(数值)向上取整取大于等于该值的最小整数CEIL(3.1)→4TRUNCATE(数值, 保留小数位)直接截断小数位不做四舍五入TRUNCATE(3.999, 2)→3.99ABS(数值)返回数值的绝对值ABS(-10)→10MOD(被除数, 除数)取余数MOD(10, 3)→1RAND()返回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 score90 THEN 优秀 WHEN score60 THEN 及格 ELSE 不及格 END五、聚合函数配合GROUP BY使用函数语法功能说明注意事项COUNT(*)统计结果集总行数包含NULL行统计人数最常用COUNT(字段名)统计该字段非空的行数自动排除NULL值SUM(字段)对数值字段求和忽略NULL非数值结果为0AVG(字段)对数值字段求平均值自动忽略NULL值MAX(字段)求字段的最大值支持数值、日期、字符串MIN(字段)求字段的最小值支持数值、日期、字符串GROUP_CONCAT(字段)分组后将组内字段值拼接成一个字符串可指定排序和分隔符六、窗口函数MySQL 8.0 支持函数语法功能说明排名特点同分场景ROW_NUMBER() OVER(分区排序)连续排名同分也分配不同名次如 1,2,3,4RANK() OVER(分区排序)跳跃排名同分同名次后续跳号如 1,1,3,4DENSE_RANK() OVER(分区排序)密集排名同分同名次后续不跳号如 1,1,2,3SUM(字段) 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));关键注意事项一张表有且只有一个主键约束但主键可以包含多个字段复合主键主键字段不允许为 NULL不允许重复值主键默认自动创建聚簇索引按主键查询速度最快删除数据后自增计数器不会回退修改表添加/删除主键-- 给已有表添加主键ALTERTABLEstudentADDPRIMARYKEY(id);-- 删除主键ALTERTABLEstudentDROPPRIMARYKEY;2. 非空约束NOT NULL核心作用强制该字段必须填写值不能为 NULL。语法与示例只能用列级写法直接跟在字段类型后CREATETABLEstudent(idINTPRIMARYKEY,nameVARCHAR(20)NOTNULL,-- 姓名字段不能为空phoneVARCHAR(11));关键注意事项空字符串不是 NULL属于合法值NOT NULL不会限制空字符串没有表级写法只能定义在字段后方修改表添加/删除非空约束-- 添加非空约束修改字段类型同时加约束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));关键注意事项唯一约束允许字段为 NULL且可以存在多个 NULL因为 NULL 不等于任何值包括自己一张表可以定义多个唯一约束唯一约束默认自动创建唯一索引修改表添加/删除唯一约束-- 添加唯一约束ALTERTABLEstudentADDUNIQUE(phone);-- 删除唯一约束本质是删除对应的唯一索引ALTERTABLEstudentDROPINDEXphone;4. 默认约束DEFAULT核心作用插入数据时如果没有给该字段显式赋值自动用默认值填充。语法与示例只能用列级写法CREATETABLEstudent(idINTPRIMARYKEY,nameVARCHAR(20)NOTNULL,ageINTDEFAULT18,-- 年龄默认18岁statusTINYINTDEFAULT1,-- 状态默认1在职/正常create_timeDATETIMEDEFAULTNOW()-- 创建时间默认当前时间);关键注意事项只有完全不写该字段时才会触发默认值如果显式写NULL会存储 NULL不会用默认值可以配合函数使用比如默认时间DEFAULT NOW()修改表添加/删除默认约束-- 添加默认值ALTERTABLEstudentALTERageSETDEFAULT18;-- 删除默认值ALTERTABLEstudentALTERageDROPDEFAULT;5. 检查约束CHECK核心作用自定义字段的取值规则比如年龄必须大于0、分数必须在 0-100 之间。⚠️ 重要说明MySQL 8.0.16 版本之前CHECK语法可以写但不会生效8.0.16 及之后版本才正式支持检查约束。语法与示例列级写法CREATETABLEstudent(idINTPRIMARYKEY,ageINTCHECK(age0ANDage120),-- 年龄必须在 0-120 之间scoreINTCHECK(scoreBETWEEN0AND100)-- 分数必须在 0-100 之间);表级写法命名约束方便管理CREATETABLEstudent(idINTPRIMARYKEY,ageINT,scoreINT,CONSTRAINTck_ageCHECK(age0ANDage120),CONSTRAINTck_scoreCHECK(score0ANDscore100));修改表添加/删除检查约束-- 添加检查约束ALTERTABLEstudentADDCONSTRAINTck_ageCHECK(age0);-- 删除检查约束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 同步修改关键注意事项从表的外键字段类型必须和主表的主键/唯一键字段完全一致主表被引用的字段必须是主键或唯一键一张表可以有多个外键高并发生产环境通常不使用物理外键会影响性能、增加表耦合数据一致性由业务代码保证修改表添加/删除外键-- 添加外键ALTERTABLEstudentADDCONSTRAINTfk_student_classFOREIGNKEY(class_id)REFERENCESclass(id);-- 删除外键ALTERTABLEstudentDROPFOREIGNKEYfk_student_class;三、核心易混点对比主键 vs 唯一约束对比项主键PRIMARY KEY唯一约束UNIQUE非空要求绝对不允许为 NULL允许为 NULL且可以有多个 NULL单表数量只能有 1 个可以有多个索引类型默认创建聚簇索引默认创建唯一非聚簇索引核心作用唯一标识一行数据保证业务字段值不重复NOT NULLvsDEFAULTNOT NULL强制字段不能为 NULL必须有值DEFAULT没赋值的时候用默认值主动写 NULL 仍会存 NULL最佳实践两者配合使用age INT NOT NULL DEFAULT 18既不能为空又有默认兜底数据最稳定四、完整建表约束示例综合所有约束一张设计规范的员工表CREATETABLEemp(idINTPRIMARYKEYAUTO_INCREMENTCOMMENT员工ID主键自增,emp_noVARCHAR(20)NOTNULLUNIQUECOMMENT工号非空且全局唯一,nameVARCHAR(20)NOTNULLCOMMENT姓名非空,ageTINYINTUNSIGNEDCHECK(age18ANDage65)COMMENT年龄范围校验,dept_idINTCOMMENT部门ID,statusTINYINTDEFAULT1COMMENT在职状态默认1在职,create_timeDATETIMEDEFAULTNOW()COMMENT创建时间默认当前时间,-- 外键关联部门表删除部门时员工部门ID置空FOREIGNKEY(dept_id)REFERENCESdept(id)ONDELETESETNULL)ENGINEInnoDBDEFAULTCHARSETutf8mb4;多表查询