mysql的left join使用on與where篩選的差異

来源:http://www.cnblogs.com/ontheway365/archive/2016/11/13/6058268.html
-Advertisement-
Play Games

舉例進行說明,我們現在有兩個表,即商品表(products)與sales_detail(銷售記錄表)。我們主要是通過這兩個表來對MySQL關聯left join 條件on與where 條件的不同之處進行講述。 1、數據準備 創建products表並插入數據 創建sales_detail表並插入數據 ...


    舉例進行說明,我們現在有兩個表,即商品表(products)與sales_detail(銷售記錄表)。我們主要是通過這兩個表來對MySQL關聯left join 條件on與where 條件的不同之處進行講述。

 1、數據準備

創建products表並插入數據

drop table if exists products;   
CREATE TABLE `products` (
    `pid` INT (3) NOT NULL auto_increment,
    `pname` VARCHAR (20) NOT NULL,
    `pcode` VARCHAR (20) NOT NULL,
    PRIMARY KEY (`pid`)
) ENGINE = MyISAM AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8;

INSERT INTO `products` (`pid`, `pname`, `pcode`)
VALUES
    (1, '商品1', 'AC90'),
    (2, '商品2', 'DE78'),
    (3, '商品3', 'XXXX');

 創建sales_detail表並插入數據

drop table if exists sales_detail;
CREATE TABLE `sales_detail` (
    `aid` INT (3) NOT NULL auto_increment,
    `pcode` VARCHAR (20) NOT NULL,
    `saletime` date NOT NULL,
    PRIMARY KEY (`aid`)
) ENGINE = MyISAM DEFAULT CHARSET = utf8 AUTO_INCREMENT = 1;

INSERT INTO `sales_detail` (`aid`, `pcode`, `saletime`)
VALUES
    (1, 'AC90', '2008-09-22'),
    (2, 'DE78', '2008-09-22'),
    (3, 'AC90', '2008-09-23'),
    (4, 'AC90', '2008-09-24');

 

 資料庫中的數據如下:

products表
pid pname pcode
1 商品1 AC90
2 商品2 DE78
3 商品3 XXXX
sales_detail表
aid pcode saletime
1 AC90 2008-09-22
2 DE78 2008-09-22
3 AC90 2008-09-23
4 AC90 2008-09-24

2、測試

現在有個場景,按商品在某個時間段內的銷售量來排行,比如我想統計23-24號這兩天的銷售數量併排行。(註:DE78這個商品在這兩天沒有銷售,但是也要顯示出來,只是數量為0)

使用where條件查詢:

SELECT
    p.pname,
    p.pcode,
    s.saletime,
    count(s.aid) AS total
FROM
    products AS p
LEFT JOIN sales_detail AS s ON (s.pcode = p.pcode)
WHERE
    s.saletime IN ('2008-09-23', '2008-09-24')
GROUP BY
    p.pcode
ORDER BY
    total DESC,
    p.pid ASC

結果:

pname pcode saletime total
商品1 AC90 2008-09-23 2

 

 

這裡的查詢過程可以分成兩部,首先通過on條件生成中間表(總共有3條數據),然後用where條件過濾中間表得到最後的結果。

使用on條件查詢:

SELECT
    p.pname,
    p.pcode,
    s.saletime,
    count(s.aid) AS total
FROM
    products AS p
LEFT JOIN sales_detail AS s ON (
    (s.pcode = p.pcode)
    AND s.saletime IN ('2008-09-23', '2008-09-24')
)
GROUP BY
    p.pcode
ORDER BY
    total DESC,
    p.pid ASC

結果:

pname pcode saletime total
商品1 AC90 2009-09-23 2
商品2 DE78 NULL 0
商品3 XXXX NULL 0

 

 

 

 

這裡直接通過on條件得到結果,不管on上的條件是否為真都會返回left表中的記錄,如果需要不滿足連接條件的行也出現在查詢結果中,必須把連接條件放在on上。以上查詢等價於:

SELECT
    p.pname,
    p.pcode,
    s.saletime,
    count(s.aid) AS total
FROM
    products AS p
LEFT JOIN  (select * from sales_detail s where s.saletime IN ('2008-09-23', '2008-09-24')) as s ON 
    (s.pcode = p.pcode)
GROUP BY
    p.pcode
ORDER BY
    total DESC,
    p.pid ASC

 

 3、結論

  資料庫在通過連接兩張或多張表來返回記錄時,都會生成一張中間的臨時表,然後再將這張臨時表返回給用戶。

  在使用left jion時,on和where條件的區別如下:

1、 on條件是在生成臨時表時使用的條件,它不管on中的條件是否為真,都會返回左邊表中的記錄。

2、where條件是在臨時表生成好後,再對臨時表進行過濾的條件。這時已經沒有left join的含義(必須返回左邊表的記錄)了,條件不為真的就全部過濾掉。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 時間過的很快,從在博客園寫第一篇文章當現在剛好一年,而自己在資料庫這條路上已經走過五年。回想下這五年感覺總是在【迷茫-激動-充實-迷茫-激動-充實】的迴圈中。本篇也分享一下這些迷茫激動充實和美好的願景。 古有大詩仙懷才不遇,詩書縱情於山水,今有小人物藍瘦香菇,博文感悟與園友。 成長 IT民工,程式猿 ...
  • 文章淺談演算法和數據結構: 十 平衡查找樹之B樹MySQL索引背後的數據結構及演算法原理Query Planning(這篇是sqlite關於索引的文檔)EXPLAIN QUERY PLAN MySQL單表百萬數據記錄分頁性能優化 ...
  • ACID,指資料庫事務正確執行的四個基本要素的縮寫。包含:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)。 ...
  • 在Ubuntu 16.10系統中,安裝mysql workbench時候,提示未安裝軟體包 libpng12-0錯誤,使用sudo apt-get -f install後還是報錯,後來找到一個下載安裝libpng12-0包的方法來解決。 ...
  • 在SQL Server 中,master 資料庫記錄系統級別的元數據,例如,logon accounts, endpoints, linked servers, and system configuration settings,同時,master 資料庫記錄其他資料庫及其文件的位置,因此,在啟動S ...
  • 資料庫還原的操作,分兩步進行:第一步,驗證(verify)備份文件;第二步,根據備份策略還原資料庫; 參考《backup1:開始資料庫備份》,備份策略是: 一周一次完整備份,一天一次差異備份,一小時一次事務日誌備份 數據/日誌的每次備份都使用一個單獨的備份文件,數據備份的擴展名是 .bak,日誌備份 ...
  • 根據上一篇《MySql下載》下載的程式進行安裝 如果系統已經安裝了MySql產品,將會有彈窗告訴你將要更新信息 如果系統已經安裝了MySql產品,將會有彈窗告訴你將要更新信息 可以選擇更新,也可以Cancel然後到安裝的主界面 點擊上圖右方的Add... 然後選載Available Products ...
  • No1. Mysql 安裝 sudo apt-get install mysql-server mysql-client 記得root密碼別忘了。 No2. 驗證Mysql安裝 sudo service mysql restart No3. 設置Mysql遠程IP訪問 /etc/MySQL/my.c... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...