SQL 方法函数(1)

1:COALESCE()

2:dinstinct()

3;nullIF(expression1,expression2)

  1. 数据库计算 expression1expression2 的值。

  2. 如果这两个值相等 ,则函数返回 NULL

  3. 如果这两个值不相等 ,则函数返回 expression1 的值。

1: 与coalesca()组合

应该强调这两个函数的互补关系------COALESCE是用默认值替换NULL,而NULLIF是主动创造NULL。它们经常一起使用来构建完整的数据清理逻辑。

2:expression1expression2 应该是可以比较的数据类型。如果类型不兼容,数据库会尝试隐式转换,这可能引发错误(比如你之前遇到的 Truncated incorrect DOUBLE value
经典场景:

-- ❌ 危险:如果 monthly_sales 为0,会导致运行时错误"Division by zero"

SELECT total_sales / monthly_sales FROM sales_report;

-- ✅ 安全:如果 monthly_sales 为0,先将其转换为 NULL,整个表达式结果即为 NULL

SELECT total_sales / NULLIF(monthly_sales, 0) AS sales_ratio FROM sales_report;

-- ✅ 更健壮:配合 COALESCE 提供默认值

SELECT

total_sales / COALESCE(NULLIF(monthly_sales, 0), 1) AS safe_ratio

FROM sales_report;

在这个例子中,NULLIF(monthly_sales, 0)monthly_sales 为 0 时返回 NULL,而任何数除以 NULL 的结果是 NULL,从而优雅地避免了程序崩溃

4: MYSQl中表中字段无任何约束,并且不填值的情况下,默认都是NULL;

1:在 MySQL 中,如果创建表时某个字段没有 定义 NOT NULL 约束、DEFAULT 默认值、AUTO_INCREMENT 等任何特殊属性,那么它就是纯粹的"可为 NULL"字段。在这种情况下,如果插入数据时没有为该字段指定值,MySQL 会自动将其填充为 NULL

这是最基础、最核心的默认行为。

2:除TIMESTAMP类型

有一个非常著名的例外情况 :对于 TIMESTAMP 类型的字段,在 MySQL 5.6.5 及之后的版本中,规则有所改变。

  • 旧行为(MySQL 5.6.5 之前) :即使没有定义 DEFAULT,第一个 TIMESTAMP 字段通常也会被自动设置为 CURRENT_TIMESTAMP

  • 新行为(MySQL 5.6.5 及之后) :为了符合 SQL 标准,TIMESTAMP 的行为和其他类型一样了。如果未定义 NOT NULLDEFAULT,插入时不填值,结果就是 NULL

但为了消除歧义,最佳实践是:永远显式地为 TIMESTAMP 字段定义你想要的 DEFAULT ,例如 DEFAULT CURRENT_TIMESTAMP

总结一下 :对于 INT、VARCHAR、DECIMAL、DATE、DATETIME 等绝大多数常规数据类型,你的说法 "字段无任何约束和默认值,不填就是 NULL" 是 100% 正确的 。唯一需要留意历史版本差异的是 TIMESTAMP 类型

5: 2/0 ,会2报错 (Division by zero)

|-------------|-----------------------------|-----------------------------------------------------------------|
| SQL 数据库 | 报错 (Division by zero) | 这是标准行为。数据库会中止查询并返回一个明确的错误。这也是为什么之前我们要用 NULLIF(column, 0) 来预防。 |

SQL 中的正确做法 :使用你学过的 NULLIF()CASE WHEN 进行安全防护。

-- 安全写法:如果除数为0,则结果为NULL(或你指定的其他值)

SELECT 2 / NULLIF(0, 0); -- 结果:NULL

SELECT

CASE

WHEN 0 = 0 THEN NULL -- 或者 0, 或其他默认值

ELSE 2 / 0

END; -- 结果:NULL

6: 窗口函数

复制代码
ROW_NUMBER()over()
相关推荐
qq_124987075324 分钟前
基于JavaWeb的大学生房屋租赁系统(源码+论文+部署+安装)
java·数据库·人工智能·spring boot·计算机视觉·毕业设计·计算机毕业设计
倒流时光三十年1 小时前
SpringBoot 数据库同步 Elasticsearch 性能优化
数据库·spring boot·elasticsearch
码农小卡拉1 小时前
深入解析Spring Boot文件加载顺序与加载方式
java·数据库·spring boot
怣501 小时前
MySQL多表连接:全外连接、交叉连接与结果集合并详解
数据库·sql
wjhx2 小时前
QT中对蓝牙权限的申请,整理一下
java·数据库·qt
冰暮流星2 小时前
javascript之二重循环练习
开发语言·javascript·数据库
万岳科技系统开发2 小时前
食堂采购系统源码库存扣减算法与并发控制实现详解
java·前端·数据库·算法
冉冰学姐3 小时前
SSM智慧社区管理系统jby69(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·管理系统·智慧社区·ssm 框架
杨超越luckly3 小时前
HTML应用指南:利用GET请求获取中国500强企业名单,揭秘企业增长、分化与转型的新常态
前端·数据库·html·可视化·中国500强
Elastic 中国社区官方博客3 小时前
Elasticsearch:Workflows 介绍 - 9.3
大数据·数据库·人工智能·elasticsearch·ai·全文检索