¿Cuál es la diferencia entre "No es nulo" y "No es nulo"?

2022-05-05 11:36:56

SELECT id FROM customers WHERE type IS NOT Null;

En contra:

SELECT id FROM customers WHERE NOT type IS NULL;

Los datos que devolverá cualquiera de los anteriores serán exactamente los mismos.

¿Cuál es la diferencia y por qué sería preferible uno de ellos?

Editar:
Me parece que podría haber una diferencia en lo que respecta al rendimiento. ¿Alguien quiere dar más detalles sobre esto?

- Icode4food

Source
zh
Responder


31
  • No hay diferencia.

    Me parece que podría haber una diferencia en lo que respecta al rendimiento. ¿Alguien quiere dar más detalles sobre esto?

    Todos los motores principales (es decir, MySQL, SQL Server, Oracle y }^{) combinará estos predicados en la etapa de análisis, haciendo planes idénticos a partir de ellos.

    El manejo de estas condiciones es más complejo que la mera aplicación de operadores en uno u otro orden.

    Por ejemplo, en PostgreSQL, una condición Oracle (o IS NOT NULL) implica la posibilidad de usar un índice , por lo que una consulta como esta:

    NOT IS NULL

    probablemente se ejecutará con un SELECT column FROM mytable WHERE column IS NOT NULL , sin comprobaciones adicionales realizadas en tiempo de ejecución (ya que los valores de index fast full scan simplemente no llegarán al index, por lo que no sirve de nada revisarlos).

    Incluso si fuera necesario comprobar cada registro, el optimizador definirá el orden de las comprobaciones (y no el orden en que aparecen los predicados y operadores en la cláusula NULL).< /p>

    Por ejemplo, aquí hay un plan para una consulta WHERE:

    Oracle

    Como puede ver, el SQL> EXPLAIN PLAN FOR 2 2 SELECT * 3 FROM t_test 4 WHERE NOT column IS NULL 5 / Explained SQL> SELECT * 2 FROM TABLE(DBMS_XPLAN.display()) 3 / PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- Plan hash value: 958699830 ---------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ---------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 30 | 1260 | 3 (0)| 00:00:01 | |* 1 | TABLE ACCESS FULL| T_TEST | 30 | 1260 | 3 (0)| 00:00:01 | ---------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("COLUMN" IS NOT NULL) se tradujo internamente a un filter (que IS NOT NULL junto con la mayoría de los comentaristas parece creer que es una forma más apropiada)

    Actualización:

    Como señaló Jonathan Leffler, esta es la diferencia al evaluar tuplas (a diferencia de las columnas individuales).

    Una tupla que consta de valores mixtos Oracle y no NULL no es ni NULL ni }^{.

    En NULL (que admite este predicado contra tuplas), ambas expresiones:

    NOT NULL

    evaluar a falso.