2013-05-29 3 views
1

У меня есть один стол ABC с EMPLID, GRADE, SALARY и DATE в качестве своих полей.Почему не учитывается использование «LIKE» в SQL-совпадении?

Я выполнить следующие 3 заявления:

select count(*) from ABC; 

Результат: - 458

select count(*) from ABC where GRADE LIKE '%def%'; 

Результат: - 0

select count(*) from ABC where GRADE NOT LIKE '%def%'; 

Результат: - 428

Мои пункт здесь: resu lt второго запроса плюс результат третьего запроса должен быть равен результату первого запроса, не так ли?

+3

Кажется, у вас есть нулевые значения в столбце 'GRADE' в вашей таблице. – Yaroslav

ответ

7

Похоже, у вас есть 30 записей, где GRADE is null.

null значения неизвестны, поэтому не соответствуют ни условию.

+3

Попробуйте выполнить этот запрос:' select * from ABC, где grade is null. –

+0

Спасибо, что .. –

3

Sql использует трехзначную логику: true, false & неизвестно. Если вы сравниваете NULL с любым другим значением, результат неизвестен. НЕ (неизвестно) до сих пор неизвестно.

Предложение WHERE возвращает только строки, которые оцениваются как истинные. Таким образом, отсутствующие 30 строк в вашем примере имеют NULL в столбце Grade.

+0

Спасибо, я получил 3-значную логику здесь, но точка, которую я хочу здесь понять, заключается в том, что почему НЕ (Неизвестно) до сих пор неизвестно? –

2

Обратите внимание, что помимо очевидного случая, когда в вашей таблице могут быть значения NULL (как указывали другие), вы также можете иметь пустые строки.

В Oracle:

-- Returns nothing 
select 1 from dual where '' like '%' 

В MySQL:

-- Returns 1 
select 1 from dual where '' like '%' 

Поскольку вы помечено на ваш вопрос как и , вы можете быть запущен в несовместимости здесь, как и в оракула '' IS NULL справедливо !

+0

Спасибо за такой полезный момент здесь. Я считал, что здесь я использую Oracle, поэтому, должно быть, упомянул .. –

Смежные вопросы