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的效率更高,若两表差不多大,则差不多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值