Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jaka jest różnica między wartościami nie jest zerem a nie jest zerem?

Nie ma różnicy.

Wszystkie główne silniki (czyli MySQL , SQL Server , Oracle i PostgreSQL ) połączy te predykaty na etapie analizowania, tworząc z nich identyczne plany.

Obsługa tych warunków jest bardziej złożona niż zwykłe stosowanie operatorów w takiej czy innej kolejności.

Na przykład w Oracle , IS NOT NULL (lub IS NOT NULL ) warunek implikuje możliwość użycia indeksu, więc zapytanie takie jak:

SELECT  column
FROM    mytable
WHERE   column IS NOT NULL

najprawdopodobniej zostanie wykonane z index fast full scan , bez dodatkowych kontroli wykonywanych w czasie wykonywania (ponieważ NULL wartości po prostu nie trafią do indeksu, więc nie ma sensu ich sprawdzać).

Nawet jeśli każdy rekord wymagałby sprawdzenia, kolejność sprawdzeń zostanie zdefiniowana przez optymalizator (a nie przez kolejność, w jakiej predykaty i operatory pojawiają się w WHERE klauzula).

Na przykład, oto plan dla Oracle zapytanie:

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)

Jak widać, filter zostało przetłumaczone wewnętrznie na IS NOT NULL (który Oracle wraz z większością komentatorów wydaje się, że jest to bardziej odpowiednia forma)

Aktualizacja:

Jak zauważył Jonathan Leffler, jest to różnica przy ocenie krotek (w przeciwieństwie do pojedynczych kolumn).

Krotka składająca się z mieszanych NULL i inne niż NULL wartości nie są wartościami NULL ani NOT NULL .

W PostgreSQL (który obsługuje ten predykat w stosunku do krotek), oba te wyrażenia:

SELECT  (1, NULL) IS NULL
SELECT  (1, NULL) IS NOT NULL

oceniać na fałsz.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wyszukiwanie PHP Mysql między dwiema datami

  2. Grupa Mysql DateTime o 15 minut

  3. Data i godzina MySQL nie zwraca czasu

  4. Eksportuj bazę danych MySQL/MariaDB

  5. Jak pobrać dane z bazy danych za pomocą usług internetowych (JAX - RS) w eclipse za pomocą Javy?