2015-03-16 9 views
3

Я недавно начал изучать оракул и sql. Во время обучения я встретил пару запросов, которые мой друг спросил в интервью.SELECT * FROM Employees WHERE NULL NULL; SELECT * FROM Employees WHERE NULL = NULL;

SELECT * 
FROM Employees 
WHERE NULL IS NULL; 

Этот запрос дает все строки в таблице Employees. Как я понял, Oracle ищет данные в столбцах, так что NULL обрабатывается здесь как имя столбца? Правильно ли я говорю, что Oracle ищет данные в столбцах? Почему Oracle дает все строки в этом запросе? В разделе WHERE не должно быть, чтобы левая сторона условия была COLUMN NAME? Не должно ли это ошибка?

SELECT * 
FROM Employees 
WHERE NULL = NULL; 

ОТДЫХ.

Ну, я понимаю, что я не могу сравнивать значение NULL с использованием операторов, кроме IS NULL и IS NOT NULL. Но почему он должен давать результат, а не ошибку. Может ли кто-нибудь объяснить мне это. Охватывает ли Oracle NULL как столбца, так и пустые ячейки?

+0

'NULL = NULL' синтаксически действителен, поэтому он не должен вызывать ошибки. –

ответ

5

A where Предложение состоит из условных выражений. Нет требования, чтобы условное выражение состояло из имени столбца с обеих сторон. На самом деле, хотя обычно одна или обе стороны колонны, это не редкость, чтобы иметь выражения, которые включают в себя:

  • подзапросов
  • параметры
  • константы
  • скалярные функции

Один общий пример:

WHERE 1 = 1 AND . . . 

Это признак автоматически сгенерированного кода. Некоторым программистам проще объединить условия, включив в них AND <condition>, но для этого предложения нужен якорь. Следовательно, 1 = 1.

То, как работает раздел WHEREконцептуально является то, что положение оценивается для каждой строки создаваемого FROM. Если предложение оценивается как TRUE, то строка сохраняется в результирующем наборе (или для дальнейшей обработки). Если это FALSE или NULL, то строка отфильтровывается.

Итак, NULL IS NULL оценивает значение ИСТИНА, поэтому все строки сохранены. NULL = NULL оценивает значение NULL, поэтому строки не сохраняются.

3

NULL is NULL является всегдаtrue, NULL = NULL является всегдаfalse. Кроме того, вы не тестируете ни одного столбца в запросе (таким образом, вы получите только все или ничего).

+0

У вас также может быть 1 = 1 в предложении WHERE ... Некоторые ребята любят спрашивать, почему иногда вы можете увидеть запрос стиля '... WHERE 1 = 1 ...'.Это еще один хороший вопрос :) –

+0

Большое спасибо. Ну, NULL NULL, означает, что я ищу все строки, в которых действительно присутствует NULL в таблице. Итак, другими словами, если я хочу искать строки, которые имеют значение NULL, я могу использовать NULL NULL. Также вы могли бы объяснить, почему иногда я вижу запрос стиля WHERE 1 = 1. Я был бы очень признателен. Благодарю. –

+0

Нет. Он ничего не испытывает против стола. Он проверяет литерал против буквального. –

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