sql 条件判断 if / case when then / ifnull

这篇博客介绍了SQL中的条件判断和流程控制,包括IF函数与IFNULL的区别,CASE WHEN THEN的用法,以及NOT IN、NOT EXISTS的使用场景。此外,还探讨了OR运算在复杂查询中的性能问题,并提出了使用UNION或UNION ALL作为替代方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 if 和 ifnull

  • if 类似三元运算符,if(?=?,a,b) 为true等于a,false等于b,类似三元表达式

  • ifnull函数用于在MySQL中将NULL值替换为另外一个值

2 case 流程控制

简单case函数

枚举某个字段 或者 某个字段函数的所有值
如:

CASE country
	WHEN '中国' THEN
		'亚洲'
	WHEN '美国' THEN
		'北美洲'
	WHEN '日本' THEN
		'亚洲'
	ELSE
		'其他'
END
case搜索函数

类似if,case搜索函数可以写判断,找到第一个符合条件的case即结束

CASE
WHEN population > 80 THEN
	'大'
ELSE
	'小'
END
  • 配合count(), sum()实现分段统计

3 not in 和 not exists

  • null值代表未知的数据,比较运算符,比如=、< 或 <>,无法用来测试null值,必须使用 IS NULL 和 IS NOT NULL 操作符
  • not in 子查询在有null的情况下,则均返回null
in 和 exist
  • in 将内表和外表作hash连接。hash连接:一个表作为hash表,去扫描另一个表的每行数据,用得出来的行数据建立新的hash表,hash表存放在内存
  • exist 对外表作loop循环,分为内外表,每扫描外表的一行数据都要在内表中查找与之相匹配的行,没有索引的复杂度是O(N*M)
  • 效率对比:两个表中一个较小一个较大,则子查询表大的用exists,子查询表小的用in;
not in 和 not exist
  • not in,对内外表都进行全表扫描,没有用到索引
  • not exists的子查询依然能用到表上的索引

4 or 运算并集

  • 复杂的查询【包含运算等】将使or、in放弃索引而全表扫描
  • 可使用union, union all代替
  • union得到两个查询结果的并集,自动去重
  • union all 与union相同,但不去重
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值