MySql - DQL[IN、NOT IN、EXISTS、NOT EXISTS] 原创
---------------------------------------
---------------------------------------
-- 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的效率更高,若两表差不多大,则差不多。