簡體   English   中英

MySQL LEFT JOIN和WHERE子句

[英]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

還有兩個查詢:

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;

2

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.valueNULL 畢竟,條件讀取為!= '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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM