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