1:COALESCE()
2:dinstinct()
3;nullIF(expression1,expression2)
数据库计算
expression1和expression2的值。如果这两个值相等 ,则函数返回
NULL。如果这两个值不相等 ,则函数返回
expression1的值。
1: 与coalesca()组合
应该强调这两个函数的互补关系------
COALESCE是用默认值替换NULL,而NULLIF是主动创造NULL。它们经常一起使用来构建完整的数据清理逻辑。2:
expression1和expression2应该是可以比较的数据类型。如果类型不兼容,数据库会尝试隐式转换,这可能引发错误(比如你之前遇到的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 NULL和DEFAULT,插入时不填值,结果就是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()