---------------------------------------
---------------------------------------
-- DQL - IN、NOT IN、EXISTS、NOT EXISTS
---------------------------------------
---------------------------------------
-- IN 查询某个范围内的数据
-- NOT IN 查询不在某个范围内的数据
-- EXISTS 子查询结果判断
-- NOT EXISTS 子查询结果判断
-- IN
-- 1、如果是对索引字段进行操作,使用 OR 效率高于 IN,但对于列表项不确定的时候(如需要子查询得到结果),就必须使用 IN 运算符。另外,对于子查询表数据小于主查询的时候,也是适用 IN 运算符的。
-- 2、in或or在字段没有添加索引的情况下,所连接的字段越多(1 or 2 or 3 or 4 or…),or比in的查询效率低很多。
-- IN普通用法
SELECT * FROM users WHERE id IN(1, 2, 4, 5, 7);
SELECT * FROM users WHERE id NOT IN(1, 2, 4, 5, 7);
-- IN子查询
SELECT * FROM users WHERE type_id IN(SELECT id FROM user_types WHERE status = 1);
SELECT * FROM users WHERE type_id IN(SELECT id FROM user_types WHERE status = 2);
-- EXISTS
-- EXISTS执行顺序:
-- 1、首先执行一次外部查询,并缓存结果集,如 SELECT * FROM A WHERE EXISTS(....) 先执行SELECT * FROM A
-- 2、遍历外部查询结果集的每一行记录R,代入子查询中作为条件进行查询,如 SELECT 1 FROM B WHERE B.id = A.id
-- 3、如果子查询有返回结果,则EXISTS子句返回TRUE,这一行R可作为外部查询的结果行,否则不能作为结果
-- 4、先执行一次外部查询,然后为外部查询返回的每一行执行一次子查询,如果外部查询返回100行记录,sql就将执行101次查询。
SELECT * FROM users WHERE EXISTS(SELECT id FROM user_types WHERE user_types.id = users.type_id);
SELECT * FROM users WHERE NOT EXISTS(SELECT id FROM user_types WHERE user_types.id = users.type_id);
-- 外表大而子表小时,IN的效率更高,而外表小,子表大时,EXISTS的效率更高,若两表差不多大,则差不多。
MySql - DQL[IN、NOT IN、EXISTS、NOT EXISTS]
于 2023-02-24 16:24:36 首次发布
本文探讨了SQL中的IN,NOTIN,EXISTS和NOTEXISTS四种查询方式的用法和性能差异。IN用于查询特定范围的数据,当子查询表数据小于主查询时适用。NOTIN与其相反,用于排除范围。EXISTS和NOTEXISTS关注于子查询是否存在匹配记录,前者在外表大而子表小时效率更高,后者则在子表大时更优。优化查询时应考虑字段是否加索引以及查询数据量的相对大小。
4415

被折叠的 条评论
为什么被折叠?



