not in关键字替换

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

 

你可能感兴趣的:(not in join on)