在一般情况下,能够不使用not in 关键字的地方,尽量不要使用,因为使用not in关键字比较影响执行的效率问题。一般采用的是左连接和右连接的方式来替换。
如一个公司内部的订餐系统,有两张表,一张为Users表。存放用户的基本信息,如姓名,充值的金额等等,一般不做大的改动。另一张表为User_Order表。存放用户的订单信息,如订单号,订单时间等等。
Users(uid,uname)
User_Order(order_id,account_id,order_time)
那么如何查询出今日没有订单的用户呢?
有两种方法:
1. 使用Not in关键字
这样的SQL语句应该这么写:
SELECT uid from Users WHERE uid NOT IN (SELECT account_id FORM Users_Order where Order_time=’XXXX-XX-XX’)
原理是先查询出当前已有订单的用户集合,然后再从Users表中使用NOT IN关键字进行筛选,剔除掉已经有订单的用户即可。
2. 使用表连接的JOIN ON关键字
SELECT uid FROM Users LEFT JOIN User_Orders ON Users.uid=User_Orders.account_id and User_Orders.order_time = 'XXXX-XX-XX' where User_Orders.order_time is null
原理是使用左连接的方式。左表搜索出所有的数据,与右表进行拼接而无论右表是不是符合条件,设置时间条件以后,能够搜索出所有的用户的数据,而那些今日没有订单的用户在order_time字段的值会是null,根据这个条件就很容易地得出想要的结果
两种方式性能的简单比较
使用GUI工具查看,第一种方式,查询的结果为0.016ms-0.032ms。第二种方式,查询的结果为0.000ms-0.016ms。性能上还是有很大的差异的。
分享到:
相关推荐
6. **NOT IN**:实例069讨论了`NOT IN`子句,它是`IN`的否定形式,用于排除指定列表中的值。例如,`SELECT * FROM table WHERE column NOT IN (value1, value2)`将返回不包含value1和value2的行。 7. **IN**:与`...
虽然可以尝试使用`NOT EXISTS`替换`NOT IN`,但它们在执行效率上的差异并不明显。尽管如此,结合`TOP`关键字可以有效地限制返回的记录数,从而提高查询效率。 在分页算法中,关键在于如何平衡`TOP`和`NOT IN`的影响...
在PHP中,正则表达式是一种强大的文本处理工具,它能帮助我们匹配、查找、替换或提取特定模式的字符串。当我们需要匹配不包含某些特定关键词的字符串时,我们需要使用否定前瞻(Negative Lookahead)或者否定后瞻...
"in"可以用多个"="操作符等效替换,而"not in"则用"!="组合实现。 最后,模糊查询利用"like"关键字,允许使用通配符匹配部分字符串。例如,"select Sname from Student where Sname like 'J%' "将找到所有以字母'J'...
在Python中实现字符串替换的方法有很多种,本示例通过使用内置的`string.Template`类来实现字符串中子串的替换,同时结合了`locals()`函数以及关键字参数的语法来传递参数。 首先,让我们理解`string.Template`类的...
不过,`NOT IN`可能会导致性能下降,可以用`NOT EXISTS`替换。SQLServer2005引入了`ROW_NUMBER()`函数,可以更高效地进行分页: ```sql SELECT TOP 10 * FROM ( SELECT top 10 ROW_NUMBER() OVER (ORDER BY ...
带IN关键字的查询 除了上面介绍的`ALTER TABLE`命令外,给定内容中还提到了带`IN`关键字的查询。`IN`关键字用于测试一个表达式值是否在一个指定的集合内。其基本语法为: ```sql SELECT * FROM table_name WHERE ...
BETWEEN和IN关键字则用于范围比较,BETWEEN用于指定两个值之间的范围,而IN可以指定一个包含多个可能值的列表。 最后,空值比较是查询中不可或缺的一部分。使用IS NULL关键字可以检查某个表达式是否为空值。例如,...
与使用`NOT IN`相比,`NOT EXISTS`同样可以在找到第一个非匹配项后立即停止,提高查询效率。 **17. 用表连接替换EXISTS** 在某些情况下,使用表连接代替`EXISTS`子查询可以避免额外的上下文切换,从而提高性能。 *...
最后,需要注意常用关键字优先级,使用EXISTS替代IN,使用NOT EXISTS替代NOT IN,使用表连接替换EXISTS,使用 EXISTS替换DISTINCT,避免在索引列上使用IS NULL和IS NOT NULL等。 SQL性能调优是一项非常重要的技术,...
此外,教程还提到了一些高级概念,例如如何处理日期和时间范围的查询,以及如何使用NOT BETWEEN和NOT IN进行否定条件筛选。在实际应用中,这些技巧对于高效地从数据库中提取所需信息至关重要。 总的来说,这份MySQL...
- **NOT EXISTS与NOT IN的对比**:NOT EXISTS通常比NOT IN更高效,因为它只需要检查单个行是否存在匹配,而不是构建和比较整个子查询结果集。 2. **SQL语句的可重用性和解析**: - **大小写一致性**:为了确保SQL...
- **优化建议**:在查询中使用EXISTS替代IN、NOT EXISTS替代NOT IN可以提高查询效率,特别是涉及到多个表的联接查询时。 - **例子**: - **低效**: `SELECT * FROM EMP WHERE EMPNO > 0 AND DEPTNO IN (SELECT ...
然而,文章指出NOT IN可以被优化,用EXISTS替换,尽管在效率上两者差别不大: ```sql SELECT TOP 页大小 * FROM Table1 WHERE NOT EXISTS (SELECT * FROM (SELECT TOP (页大小*页数) * FROM table1 ORDER...
10. **`IN`和`NOT IN`**:`IN`用于检查值是否在指定的列表中,`NOT IN`则相反。例如,`SELECT * FROM student WHERE id IN (1, 2)`将返回id为1或2的学生。 11. **`IS NULL`和`IS NOT NULL`**:这些操作符用于判断列...
6. **替换NOT IN**:用`NOT EXISTS`替代`NOT IN`,以获得更好的性能。 7. **避免UNION**:禁止使用`UNION`,若必须,应拆分为两个独立查询。 8. **嵌套查询限制**:避免超过三层的嵌套查询,考虑使用临时表或子...
- **IN 与 NOT IN**: `IN` 用于指定一个值列表,而 `NOT IN` 则排除这些值。例如,`SELECT * FROM emp WHERE sal IN (1500, 3000);` 返回薪资为 1500 或 3000 的记录;`SELECT * FROM emp WHERE sal NOT IN (1500, ...