Re <>
& null
x<>y
равно true
, когда x
не равно (в обычном смысле) y
and x is not null and y is not null
. Это false
, когда x
равно (в обычном смысле) y
and x is not null and y is not null
. В противном случае это технически unknown
, но это обрабатывается так, как если бы оно было null
операторами / синтаксисом вроде is
.
Большинство операторов SQL такие - они возвращают свои нормальные результаты, когда каждый аргумент is not null
и unknown
(обрабатываются как null
) в противном случае.
Операторы SQL не являются обычными реляционными или математическими операторами с одинаковыми именами; они относятся (значения) unknown
& null
специально. (Сказать, что null
не является значением, - нечеткая бесполезная риторика культуры SQL.)
Re "нормальное чувство равенства" из Справочного руководства по MySQL 8.0
12.3.2 Функции сравнения и операторы :
Операции сравнения приводят к значению 1
(TRUE
), 0
(FALSE
) или NULL
.
<=>
NULL
-безопасно равно. Этот оператор выполняет сравнение на равенство, как оператор =
, но возвращает 1
вместо NULL
, если оба операнда NULL
, и 0
вместо NULL, если один операнд NULL
. Оператор <=>
эквивалентен стандартному оператору SQL IS NOT DISTINCT FROM
.
Примечание on
& where
возвращает строки, для которых условие оценивается как true
. Ограничения удовлетворяются, когда они не оцениваются в false
.
Re left join
on
& where
Узнайте, что возвращает LEFT / RIGHT JOIN: строки INNER JOIN плюс несопоставленные строки таблицы слева / справа, расширенные значениями NULL. FULL JOIN возвращает строки INNER JOIN UNION ВСЕ несоответствующие строки таблицы слева и справа, расширенные значениями NULL. Всегда знайте, какое ВНУТРЕННЕЕ СОЕДИНЕНИЕ вы хотите как часть ВНЕШНЕГО СОЕДИНЕНИЯ WHERE или ON, которые требуют, чтобы столбец, возможно расширенный NULL, не был NULL после того, как OUTER JOIN ON удаляет все строки, расширенные NULL, т.е. оставляет только строки INNER JOIN, т.е. «превращает OUTER JOIN в INNER JOIN». У вас есть это.
Прочитайте документацию по СУБД SQL.