`
wangjian1000096
  • 浏览: 2103 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

not in关键字替换

    博客分类:
  • SQL
阅读更多

      在一般情况下,能够不使用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。性能上还是有很大的差异的。

 

分享到:
评论

相关推荐

    SQL.Server范例开发大全培训第63~76课

    6. **NOT IN**:实例069讨论了`NOT IN`子句,它是`IN`的否定形式,用于排除指定列表中的值。例如,`SELECT * FROM table WHERE column NOT IN (value1, value2)`将返回不包含value1和value2的行。 7. **IN**:与`...

    通用高效的分页存储过程(适合Asp.net分页用)效率很高

    虽然可以尝试使用`NOT EXISTS`替换`NOT IN`,但它们在执行效率上的差异并不明显。尽管如此,结合`TOP`关键字可以有效地限制返回的记录数,从而提高查询效率。 在分页算法中,关键在于如何平衡`TOP`和`NOT IN`的影响...

    PHP如何匹配不包含某些关键词正则写法

    在PHP中,正则表达式是一种强大的文本处理工具,它能帮助我们匹配、查找、替换或提取特定模式的字符串。当我们需要匹配不包含某些特定关键词的字符串时,我们需要使用否定前瞻(Negative Lookahead)或者否定后瞻...

    SQL查询语句大全

    "in"可以用多个"="操作符等效替换,而"not in"则用"!="组合实现。 最后,模糊查询利用"like"关键字,允许使用通配符匹配部分字符串。例如,"select Sname from Student where Sname like 'J%' "将找到所有以字母'J'...

    在Python中实现替换字符串中的子串的示例

    在Python中实现字符串替换的方法有很多种,本示例通过使用内置的`string.Template`类来实现字符串中子串的替换,同时结合了`locals()`函数以及关键字参数的语法来传递参数。 首先,让我们理解`string.Template`类的...

    数据库分页查询.doc

    不过,`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关键字可以检查某个表达式是否为空值。例如,...

    Oracle SQL优化.pdf

    与使用`NOT IN`相比,`NOT EXISTS`同样可以在找到第一个非匹配项后立即停止,提高查询效率。 **17. 用表连接替换EXISTS** 在某些情况下,使用表连接代替`EXISTS`子查询可以避免额外的上下文切换,从而提高性能。 *...

    SQL性能调优

    最后,需要注意常用关键字优先级,使用EXISTS替代IN,使用NOT EXISTS替代NOT IN,使用表连接替换EXISTS,使用 EXISTS替换DISTINCT,避免在索引列上使用IS NULL和IS NOT NULL等。 SQL性能调优是一项非常重要的技术,...

    MySQL初级教程.pdf,适合MySQL初学者

    此外,教程还提到了一些高级概念,例如如何处理日期和时间范围的查询,以及如何使用NOT BETWEEN和NOT IN进行否定条件筛选。在实际应用中,这些技巧对于高效地从数据库中提取所需信息至关重要。 总的来说,这份MySQL...

    oracle严禁的语句

    - **NOT EXISTS与NOT IN的对比**:NOT EXISTS通常比NOT IN更高效,因为它只需要检查单个行是否存在匹配,而不是构建和比较整个子查询结果集。 2. **SQL语句的可重用性和解析**: - **大小写一致性**:为了确保SQL...

    经常要用的DB2优化

    - **优化建议**:在查询中使用EXISTS替代IN、NOT EXISTS替代NOT IN可以提高查询效率,特别是涉及到多个表的联接查询时。 - **例子**: - **低效**: `SELECT * FROM EMP WHERE EMPNO > 0 AND DEPTNO IN (SELECT ...

    海量数据库的查询优化及分页算法方案集合2/2

    然而,文章指出NOT IN可以被优化,用EXISTS替换,尽管在效率上两者差别不大: ```sql SELECT TOP 页大小 * FROM Table1 WHERE NOT EXISTS (SELECT * FROM (SELECT TOP (页大小*页数) * FROM table1 ORDER...

    SQL文查询语句

    10. **`IN`和`NOT IN`**:`IN`用于检查值是否在指定的列表中,`NOT IN`则相反。例如,`SELECT * FROM student WHERE id IN (1, 2)`将返回id为1或2的学生。 11. **`IS NULL`和`IS NOT NULL`**:这些操作符用于判断列...

    SQL编程规范 SQL编程规范

    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, ...

Global site tag (gtag.js) - Google Analytics