簡體   English   中英

了解此SQL LEFT JOIN(具有IS NULL)示例

[英]Understanding this SQL LEFT JOIN (with IS NULL) example

在數據庫中,有一個名為category的表:

CREATE TABLE category(
        category_id INT AUTO_INCREMENT PRIMARY KEY,
        name VARCHAR(20) NOT NULL,
        parent INT DEFAULT NULL
);

創建它是為了創建相鄰列表模型樹。 這是當前表格內的內容:

在此處輸入圖片說明

在此示例中(您可以在底部找到源鏈接),以下sql代碼用於獲取表中的“葉子”元素,其中“葉子”元素是表中沒有其他任何行的行行在“父級”列中使用其“ category_id”。 運行以下代碼:

SELECT t1.name FROM
category AS t1 LEFT JOIN category as t2
ON t1.category_id = t2.parent
WHERE t2.category_id IS NULL;

先前的SQL代碼的結果給出了以下結果:

在此處輸入圖片說明

例如,表中沒有行在父列內部具有值為3,因此TUBE(category_id == 3)是“葉”元素。

問題:為什么該sql代碼在邏輯上給出此結果? 我很高興這樣做,因為它是我所需要的,但我無法將其背后的理由包扎起來。


示例的來源: http : //mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

每當您看到此模式時:

SELECT    ...
FROM      TableA
LEFT JOIN TableB ON TableA.column = TableB.column
WHERE     TableB.id is null

認為:“在TableA中查找TableB中不存在的行。

您的查詢的意思是“查找沒有子級的類別”。 如果刪除WHERE子句並向查詢中添加更多列,則更容易理解:

SELECT      t1.category_id,
            t1.name,
            t2.name  AS ChildName
FROM        category AS t1
LEFT JOIN   category as t2 ON t1.category_id = t2.parent

這是您的查詢中發生的事情:

  1. category表開始,將其別名為t1t2 從現在開始,我將參考別名。
  2. 對於t1每一行,找到t2中將該t1行標識為其父級的所有記錄
  3. 如果t1行中沒有子行,則t2.category_id將為null
  4. 我們只想過濾沒有子項的t1

我認為如果重命名表別名會更容易看到發生了什么:

    SELECT tparent.name 
      FROM category AS tparent 
      LEFT JOIN category as tchild
        ON tparent.category_id = tchild.parent
     WHERE tchild.category_id IS NULL;

現在可能更容易看到您要查找的是沒有子項的所有父類別名稱的列表[tchild.category_id IS NULL]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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