[英]MySQL LEFT JOIN and WHERE clause
有結構:
CREATE TABLE `contents` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`title` VARCHAR(45) NULL,
PRIMARY KEY (`id`));
CREATE TABLE `content_values` (
`content_id` INT UNSIGNED NOT NULL,
`field_id` INT UNSIGNED NOT NULL,
`value` VARCHAR(45) NULL,
PRIMARY KEY (`content_id`, `field_id`));
INSERT INTO `contents` VALUES (1,'test-title-1'),(2,'test-title-2');
INSERT INTO `content_values` VALUES (1,4,'test-value');
http://sqlfiddle.com/#!9/028d0/5
還有兩個查詢:
select contents.*, content_values.value
from contents
left join content_values on content_values.content_id=contents.id and
content_values.field_id = 4;
select contents.*, content_values.value
from contents
left join content_values on content_values.content_id=contents.id and
content_values.field_id = 4
where content_values.value != '123';
我想知道為什么作為第二個查詢的結果,沒有一行,其中content_value.value
為NULL
。 畢竟,條件讀取為!= '123'
。
誰會向我解釋這種行為。
提前致謝。
在#2中,如果更改where-> and,則其結果與#1相同。
select contents.*, content_values.value
from contents
left join content_values on content_values.content_id=contents.id and content_values.field_id=4
**and** content_values.value != '123'
這意味着在數據庫引擎評估您的where ..子句中的select ..之后,將應用聯接。
WHERE子句進一步限制了聯接查詢返回的行。
更多詳細信息-SQL連接:where子句與on子句
使用IS NOT NULL比較NULL值,因為它們只是未知的。
select contents.*, content_values.value
from contents
LEFT join content_values
on content_values.content_id=contents.id and content_values.field_id=4
where content_values.value IS NULL OR content_values.value != '123';
NULL
值永遠不會“等於”或“不等於”非NULL值。 SQL提供了特殊的“ IS NULL”和“ IS NOT NULL”運算符,用於與NULL值進行比較。
通過要求content_value.value具有非NULL值,第二個查詢的WHERE子句中的條件使聯接的“外部性”無效。 這使結果等同於INNER JOIN。 (對於找不到匹配行時返回的行, content_value
所有列都將為NULL。)
您似乎希望該條件的評估方式像這樣編寫:
where ( content_values.value IS NULL OR content_values.value != '123' )
如果不必考慮可移植到其他DBMS的問題,那么我們可以使用MySQL特定的NULL安全比較<=>
(spaceship)運算符,例如:
where NOT ( content_values.value <=> '123' )
我假設有一個原因在WHERE子句而不是外部聯接的ON子句中指定此條件。 如果將條件從WHERE子句移到外部聯接的ON子句,則可以生成不同的結果。
ON content_values.content_id = contents.id
AND content_values.field_id = 4
AND content_values.value != '123'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.