What's the difference between NOT EXISTS vs. NOT IN vs. LEFT JOIN WHERE IS NULL?

前端 未结 5 851
独厮守ぢ
独厮守ぢ 2020-11-22 00:56

It seems to me that you can do the same thing in a SQL query using either NOT EXISTS, NOT IN, or LEFT JOIN WHERE IS NULL. For example:

SELECT a FROM table1          


        
相关标签:
5条回答
  • 2020-11-22 01:08
    • NOT IN vs. NOT EXISTS vs. LEFT JOIN / IS NULL: SQL Server

    • NOT IN vs. NOT EXISTS vs. LEFT JOIN / IS NULL: PostgreSQL

    • NOT IN vs. NOT EXISTS vs. LEFT JOIN / IS NULL: Oracle

    • NOT IN vs. NOT EXISTS vs. LEFT JOIN / IS NULL: MySQL

    In a nutshell:

    NOT IN is a little bit different: it never matches if there is but a single NULL in the list.

    • In MySQL, NOT EXISTS is a little bit less efficient

    • In SQL Server, LEFT JOIN / IS NULL is less efficient

    • In PostgreSQL, NOT IN is less efficient

    • In Oracle, all three methods are the same.

    0 讨论(0)
  • 2020-11-22 01:09

    If the database is good at optimising the query, the two first will be transformed to something close to the third.

    For simple situations like the ones in you question, there should be little or no difference, as they all will be executed as joins. In more complex queries, the database might not be able to make a join out of the not in and not exists queryes. In that case the queries will get a lot slower. On the other hand, a join may also perform badly if there is no index that can be used, so just because you use a join doesn't mean that you are safe. You would have to examine the execution plan of the query to tell if there may be any performance problems.

    0 讨论(0)
  • 2020-11-22 01:10

    Assuming you are avoiding nulls, they are all ways of writing an anti-join using Standard SQL.

    An obvious omission is the equivalent using EXCEPT:

    SELECT a FROM table1
    EXCEPT
    SELECT a FROM table2
    

    Note in Oracle you need to use the MINUS operator (arguably a better name):

    SELECT a FROM table1
    MINUS
    SELECT a FROM table2
    

    Speaking of proprietary syntax, there may also be non-Standard equivalents worth investigating depending on the product you are using e.g. OUTER APPLY in SQL Server (something like):

    SELECT t1.a
      FROM table1 t1
           OUTER APPLY 
           (
            SELECT t2.a
              FROM table2 t2
             WHERE t2.a = t1.a
           ) AS dt1
     WHERE dt1.a IS NULL;
    
    0 讨论(0)
  • 2020-11-22 01:26

    Performance perspective always avoid using inverse keywords like NOT IN, NOT EXISTS, ... Because to check the inverse items DBMS need to runs through all the available and drop the inverse selection.

    0 讨论(0)
  • 2020-11-22 01:28

    When need to insert data in table with multi-field primary key, consider that it will be much faster (I tried in Access but I think in any Database) not to check that "not exists records with 'such' values in table", - rather just insert into table, and excess records (by the key) will not be inserted twice.

    0 讨论(0)
提交回复
热议问题