SQL难点对比分析:IN 和 EXISTS 的用法对比

1. IN 和 EXISTS的区别

1.1 IN 的用法

语法:SELECT * FROM table_name WHERE col_name in (value1, value2, ...);
其一般形态是:SELECT * FROM table_a WHERE col_name IN (SELECT col_name FROM table_b)

IN 查询相当于多个 OR 条件的叠加;

IN 的内部工作原理:
IN 只执行一次,它查出内表table_b中的所有col_name 字段缓存起来;
之后,遍历循环外表table_a,将符合条件的外表的记录加入结果集中,直至循环结束。

其本质,就是双层循环,外层循环是外表table_a
当内表数据比较大时,不再适用IN,因为他会将内表的数据全部遍历一次。
IN适合内表比外表数据小的情况

result_lst = []
table_a = (SELECT * FROM tale_a)
table_b = (SELECT col_name FROM table_b)

for i in table_a:
	for j in table_b:
		if table_a[i].col_name = table_b[j].col_name:
			result_lst.append(table_a[i])

使用例子:

# 使用IN
SELECT * 
FROM employees e 
WHERE e.emp_no IN (SELECT emp_no 
                       FROM dept_emp)  

1.2 EXISTS 的用法

EXISTS 语法SELECT * FROM table_a a WHERE EXISTS (SELECT 1 FROM table_b WHERE a.col_name = b.col_name )

EXISTS 的执行原理
EXISTS 会执行 外表的长度(table_a.length)次,即遍历循环外表 table_a,在内表中寻找与外表匹配的项(一般是相等)然后将满足条件的结果(TRUE)放进结果集;
EXISTS 并不缓存EXISTS的结果集,因为结果集的内容并不重要,重要的是其内查询语句的结果集空或者非空,空则返回FALSE,非空则返回TRUE

其本质是单层循环,循环的是外表 table_a
因此,在内表数据比外表数据大的时候使用EXISTS会更高效。

result_lst = []
table_a = {
   SELECT * FROM table_a)

for i in table_a:
	if table_a[i].col_name:
		result_lst.a
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值