最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL 篩選條件放 ON后 vs 放 WHERE 后的區(qū)別解析

 更新時(shí)間:2025年12月10日 11:59:16   作者:煙沙九洲  
文章解釋了在MySQL中,將篩選條件放在ON和WHERE中的區(qū)別,文章通過幾個(gè)場(chǎng)景說明了ON和WHERE的區(qū)別,并總結(jié)了ON用于關(guān)聯(lián),WHERE用于過濾,以及在LEFT JOIN中ON用于保行,在INNER JOIN中用于提效,本文介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧

今天我們來講講數(shù)據(jù)庫篩選條件放 ON 后和放 WHERE 后的區(qū)別。

ON 決定如何 "連接" 表,WHERE 決定連接后 "顯示" 哪些行。 這個(gè)根本區(qū)別導(dǎo)致了在 LEFT JOIN / RIGHT JOIN 外連接中,條件放置位置會(huì)產(chǎn)生巨大影響;而在 INNER JOIN 中,效果通常 等價(jià)。

ON 條件匹配 被驅(qū)動(dòng)表 的行,生成 "臨時(shí)關(guān)聯(lián)結(jié)果集"。LEFT JOIN 會(huì)保留 驅(qū)動(dòng)表 所有行,匹配不上的 被驅(qū)動(dòng)表 字段填充為 NULL。

WHERE 會(huì)對(duì) "臨時(shí)關(guān)聯(lián)結(jié)果集" 進(jìn)行條件過濾,刪除不滿足的行。

接下來我們搞兩張測(cè)試表,一目了然。

-- 用戶表(驅(qū)動(dòng)表,左表)
CREATE TABLE `ysjz_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `ysjz_user` VALUES (1,'張三',18),(2,'李四',25),(3,'王五',30);
-- 訂單表(被驅(qū)動(dòng)表,右表)
CREATE TABLE `ysjz_order` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) DEFAULT NULL,
  `amount` decimal(10,2) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `ysjz_order` VALUES (1,1,100),(2,2,200),(3,2,300),(4,4,500); -- 注:user_id=4無對(duì)應(yīng)用戶

場(chǎng)景一:使用 INNER JOIN,查詢 年齡 > 20 的用戶及其訂單。

寫法1:條件放 ON

SELECT u.*, o.* 
FROM `ysjz_user` u
INNER JOIN `ysjz_order` o ON u.id = o.user_id AND u.age > 20;

寫法2:條件放 WHERE

SELECT u.*, o.* 
FROM `ysjz_user` u
INNER JOIN `ysjz_order` o ON u.id = o.user_id 
WHERE u.age > 20;

兩種寫法的 結(jié)果一致寫法1 更高效,因少關(guān)聯(lián)了 年齡 ≤ 20 的用戶。

場(chǎng)景二:使用 LEFT JOIN,保留所有用戶,同時(shí)顯示 年齡 > 20 的用戶及其訂單(≤ 20 的用戶訂單顯示為 NULL)。

寫法1:條件放 ON 后(符合要求)

SELECT u.*, o.* 
FROM `ysjz_user` u
LEFT JOIN `ysjz_order` o ON u.id = o.user_id AND u.age > 20;

寫法2:條件放 WHERE 后(跟要求不符)

SELECT u.*, o.* 
FROM `ysjz_user` u
LEFT JOIN `ysjz_order` o ON u.id = o.user_id
WHERE u.age > 20;

寫法2 將 張三 過濾了,并沒有 保留所有用戶。

場(chǎng)景三:使用 LEFT JOIN,保留所有用戶,同時(shí)顯示 訂單金額 > 200 的訂單(無符合條件訂單的用戶填充為 NULL)。

寫法1:條件放 ON 后(符合要求)

SELECT u.*, o.* 
FROM `ysjz_user` u
LEFT JOIN `ysjz_order` o ON u.id = o.user_id AND o.amount > 200;

寫法2:條件放 WHERE 后(跟要求不符)

SELECT u.*, o.* 
FROM `ysjz_user` u
LEFT JOIN `ysjz_order` o ON u.id = o.user_id 
WHERE o.amount > 200;

寫法2 過濾了 無符合條件訂單的用戶。

場(chǎng)景二 和 場(chǎng)景三 其實(shí)相差不大,只是條件作用的表不一樣。

ON 后面優(yōu)先放 "表之間的關(guān)聯(lián)鍵"(如 u.id = o.user_id),非關(guān)聯(lián)的篩選條件(如 u.age > 20)是否放 ON 后,取決于是否要保留驅(qū)動(dòng)表的行。

總結(jié):ON 管關(guān)聯(lián),WHERE 管過濾;LEFT JOIN 用 ON 保行,INNER JOIN 用 ON 提效

別人的嘴你堵不住,但自己的心卻任由自己掌控。-- 煙沙九洲

到此這篇關(guān)于MySQL 篩選條件放 ON后 vs 放 WHERE 后的區(qū)別解析的文章就介紹到這了,更多相關(guān)mysql on where篩選內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SQLyog ultimate 13.1.1版本附注冊(cè)碼

    SQLyog ultimate 13.1.1版本附注冊(cè)碼

    SQLyog是一款圖形化MySQL數(shù)據(jù)庫管理工具,支持MySQL、MariaDB和PerconaServer的管理與開發(fā)工作,文章詳細(xì)介紹了SQLyog的安裝步驟,針對(duì)安裝過程中遇到的問題提供了解決方法,最后強(qiáng)調(diào)了成功連接MySQL數(shù)據(jù)庫的操作步驟
    2026-04-04
  • MySQL中文漢字轉(zhuǎn)拼音的自定義函數(shù)和使用實(shí)例(首字的首字母)

    MySQL中文漢字轉(zhuǎn)拼音的自定義函數(shù)和使用實(shí)例(首字的首字母)

    這篇文章主要介紹了MySQL中文漢字轉(zhuǎn)拼音的自定義函數(shù)和使用實(shí)例,需要的朋友可以參考下
    2014-06-06
  • mysql服務(wù)器無法啟動(dòng)的解決方法

    mysql服務(wù)器無法啟動(dòng)的解決方法

    本文主要介紹了mysql服務(wù)器無法啟動(dòng)的解決方法,mysql服務(wù)器無法啟動(dòng)時(shí),一般時(shí)配置文件和路徑的問題,下面就來介紹一下解決方法,感興趣的可以了解一下
    2023-09-09
  • MySQL存儲(chǔ)過程、游標(biāo)與觸發(fā)器示例詳解

    MySQL存儲(chǔ)過程、游標(biāo)與觸發(fā)器示例詳解

    文章介紹了存儲(chǔ)過程、變量、SQL編程、游標(biāo)、存儲(chǔ)函數(shù)和觸發(fā)器的概念、使用方法和優(yōu)缺點(diǎn),本文通過實(shí)例代碼對(duì)MySQL存儲(chǔ)過程、游標(biāo)與觸發(fā)器相關(guān)知識(shí)介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2025-11-11
  • MySQL查看、創(chuàng)建和刪除索引的方法

    MySQL查看、創(chuàng)建和刪除索引的方法

    這篇文章主要介紹了MySQL查看、創(chuàng)建和刪除索引的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了MySQL中索引的作用,以及查看、創(chuàng)建及刪除索引的相關(guān)實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-10-10
  • MySQL時(shí)間差8小時(shí)的解決方案

    MySQL時(shí)間差8小時(shí)的解決方案

    本文介紹了在開發(fā)中遇到的時(shí)間問題,包括MySQL時(shí)間與系統(tǒng)時(shí)間不符、JDBC連接時(shí)區(qū)設(shè)置以及使用Jackson時(shí)可能出現(xiàn)的JSON時(shí)區(qū)問題,重點(diǎn)講解了如何修改MySQL時(shí)區(qū)、設(shè)置JDBC連接參數(shù)和調(diào)整JSON日期格式的時(shí)區(qū),需要的朋友可以參考下
    2024-07-07
  • MYSQL METADATA LOCK(MDL LOCK)MDL鎖問題分析

    MYSQL METADATA LOCK(MDL LOCK)MDL鎖問題分析

    這篇文章主要介紹了MYSQL METADATA LOCK(MDL LOCK)MDL鎖問題分析,并通過實(shí)例給大家例句的問題處理辦法,需要的朋友參考學(xué)習(xí)下。
    2017-12-12
  • mysql 復(fù)制原理與實(shí)踐應(yīng)用詳解

    mysql 復(fù)制原理與實(shí)踐應(yīng)用詳解

    這篇文章主要介紹了mysql 復(fù)制原理與實(shí)踐應(yīng)用,結(jié)合實(shí)例形式詳細(xì)分析了MySQL數(shù)據(jù)庫復(fù)制功能的原理、操作技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2020-02-02
  • mysql一鍵安裝教程 mysql5.1.45全自動(dòng)安裝(編譯安裝)

    mysql一鍵安裝教程 mysql5.1.45全自動(dòng)安裝(編譯安裝)

    這篇文章主要介紹了mysql一鍵安裝教程,一鍵安裝MySQL5.1.45,全自動(dòng)安裝MySQL SHELL程序,實(shí)現(xiàn)編譯安裝,感興趣的
    2016-06-06
  • mysql登錄時(shí)報(bào)socket找不到的問題及解決

    mysql登錄時(shí)報(bào)socket找不到的問題及解決

    這篇文章主要介紹了mysql登錄時(shí)報(bào)socket找不到的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07

最新評(píng)論

化德县| 三亚市| 阜南县| 翁源县| 淮滨县| 平果县| 全椒县| 乌苏市| 新邵县| 海门市| 临城县| 无棣县| 秦皇岛市| 北京市| 东乡族自治县| 台中县| 内黄县| 怀仁县| 衡山县| 安远县| 防城港市| 庄浪县| 漳浦县| 贵港市| 贵德县| 西贡区| 满洲里市| 永春县| 枣庄市| 赤壁市| 遂平县| 宜章县| 五指山市| 江阴市| 五大连池市| 合阳县| 大埔区| 荣成市| 嘉兴市| 东海县| 桂阳县|