mysql中in的用法详解

你好,说实话,我在处理客户的数据库查询需求时,对MySQL中IN的使用有了深刻的了解。
当时客户需要在Users表中过滤特定日期范围内的用户信息。
我一开始就用IN,但发现效率很低,因为数据量太大,查询时间又太长。

我记得是我们公司2 01 8 年的一个客户项目,他们有一个用户表,里面存储了很多用户数据。
客户必须过滤2 01 8 年1 月1 日到2 01 8 年1 月3 1 日之间注册的用户。
当时我用了IN,写了一条查询语句。

Registration_Date IN('2 01 8 -01 -01 ', '2 01 8 -01 -02 ', ..., '2 01 8 -01 -3 1 ');
结果,在运行这个查询时,系统需要很长时间才能返回结果,效率明显很低。
后来想了想,发现这个日期范围其实可以通过子查询来优化。
我把它改为:
SELECT FROM users WHERE Registration_date IN (SELECT date FROM date WHERE date BETWEEN '2 01 8 -01 -01 ' AND '2 01 8 -01 -3 1 ');
这样查询效率就大大提高了。
但需要注意的是,子查询返回的大量数据仍然可能会影响其效率。

另一位同事问如何使用IN排除MySQL中的特定数据。
我告诉他我可以使用 NOT IN 来实现这一点。
例如,您有一个包含许多产品 ID 的产品表,并且您的客户想要过滤掉不在特定 ID 列表中的产品。
我教他如何写:
从 Product_id(1 , 2 , 3 , 4 , 5 ) 以外的产品中选择;
IN和OR的比较要根据具体情况而定。
如果您确定列表项,使用 OR 实际上可以很好地替代 IN,但如果字段没有索引,则使用多个 OR 的效率可能低于 IN。
我记得使用 OR 而不是 IN,因为我有一个项目,我正在过滤订单状态为“已付款”、“已发货”或“已收到”的订单。

从订单中选择状态 IN('付款', '已交付', '已收到');
结果,当我运行这个查询时,我发现它的效率低于我的预期。
后来我改成了:
从订单中选择状态=“已付款”或状态=“已交付”或状态=“已收到”;
这样就提高了查询效率。

总之,IN是MySQL中非常实用的运算符,但是使用时需要注意效率和数据类型问题。
这就是我要分享的全部内容。
如果还有其他问题,我们稍后再讨论。

MySQL中EXISTS和IN的用法

EXISTS直接表示子查询至少需要一行,查询小表会比查询大表快。
IN用于检查列表中的值,少量数据或策略对效率可以很高。
EXISTS很快,IN取决于情况,表和索引的大小是关键。
选择哪一个?根据数据大小、条件、指标并测试后决定。