国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Mysql join加多條件與where的區(qū)別

這篇具有很好參考價(jià)值的文章主要介紹了Mysql join加多條件與where的區(qū)別。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

最近在項(xiàng)目中遇到一個問題,感覺有點(diǎn)意思,在解決問題及查閱了相關(guān)資料后,打算寫篇文章給朋友們分享一下。

問題現(xiàn)象:

問題是很常見的空指針問題,后端查詢數(shù)據(jù)庫數(shù)據(jù),遍歷進(jìn)行相關(guān)業(yè)務(wù)處理時報(bào)空指針。通過斷點(diǎn)調(diào)試發(fā)現(xiàn)問題就出在查詢回來的數(shù)據(jù)上,返回的List集合中有一條空數(shù)據(jù)導(dǎo)致的。
Mysql join加多條件與where的區(qū)別,MySQL,mysql,android,數(shù)據(jù)庫
就很納悶,怎么會返回空數(shù)據(jù)?

繼續(xù)排查

發(fā)現(xiàn)sql執(zhí)行完確實(shí)有一行空數(shù)據(jù),先給兄弟們看一下sql(業(yè)務(wù)代碼不便透露這里進(jìn)行了簡化,主要復(fù)現(xiàn)問題):

SELECT
	o.order_id,
	o.order_no,
	o.detail_id,
	o.product_id,
	o.batch,
	o.comp_brand_id,
	o.supplier_id,
	o.buyer
FROM
	tr_production_purchase_contract_and_order contractOrder
	LEFT JOIN t_daily_purchase_order o ON contractOrder.order_id = o.order_id 
	AND contractOrder.contract_id = '1585249657636917248' 
	AND contractOrder.del_flag = '0'

大概意思就是關(guān)聯(lián)搜索contract_id = '1585249657636917248’的數(shù)據(jù),執(zhí)行結(jié)果顯示contractOrder.contract_id = ‘1585249657636917248’ AND contractOrder.del_flag = '0’條件沒有生效。
Mysql join加多條件與where的區(qū)別,MySQL,mysql,android,數(shù)據(jù)庫
為啥不生效?第一反應(yīng)寫錯了,仔細(xì)檢查沒有問題。于是懷疑left join on后面加條件是不是有什么特殊的,查完資料,還確實(shí)非常特殊。join on后面加條件與where條件是不一樣的。

先給結(jié)論:

  • left join
    on后面條件篩選是對2張表生成的全連接(笛卡爾積)臨時表進(jìn)行的篩選,無論on后面的條件是否滿足都會返回左表的所有數(shù)據(jù),不符合條件的右表的值都為null

  • right join
    同上,只不過是最終返回右表的所有數(shù)據(jù),不符合條件的左表的值都為null

  • inner join
    inner join有點(diǎn)不一樣,它是兩張表取交集,最終的結(jié)果是符合所有條件的值,所以on后面的條件可以生效

  • where
    查詢出來的結(jié)果最后都會再經(jīng)過where條件進(jìn)行過濾,滿足條件才會返回

由此可見left join 的時候,on后面對左表的數(shù)據(jù)加篩選條件是沒有用的。上面問題的原因也找到了因?yàn)橹徊樵兞擞冶淼闹?,因?yàn)椴粷M足條件,所以查詢回來的數(shù)據(jù)為空。

為了驗(yàn)證這個觀點(diǎn),我們進(jìn)行一下測試:
員工表
Mysql join加多條件與where的區(qū)別,MySQL,mysql,android,數(shù)據(jù)庫
部門表
Mysql join加多條件與where的區(qū)別,MySQL,mysql,android,數(shù)據(jù)庫
left join 單條件查詢

select 
t.emp_id,
t.name,
t.age,
d.dept_id,
d.dept_name
from t_emp t
left join t_dept d on t.dept_id = d.dept_id

Mysql join加多條件與where的區(qū)別,MySQL,mysql,android,數(shù)據(jù)庫
on 后面加條件

select 
t.emp_id,
t.name,
t.age,
d.dept_id,
d.dept_name
from t_emp t
left join t_dept d on t.dept_id = d.dept_id and t.emp_id = '4';

Mysql join加多條件與where的區(qū)別,MySQL,mysql,android,數(shù)據(jù)庫
把on的所有條件作為匹配條件,不符合的右表都為null

where 后面加條件

select 
t.emp_id,
t.name,
t.age,
d.dept_id,
d.dept_name
from t_emp t
left join t_dept d on t.dept_id = d.dept_id where t.emp_id = '4';

Mysql join加多條件與where的區(qū)別,MySQL,mysql,android,數(shù)據(jù)庫
匹配完再篩選,結(jié)果只有一條記錄。

inner join 多條件查詢

select 
t.emp_id,
t.name,
t.age,
d.dept_id,
d.dept_name
from t_emp t
inner join t_dept d on t.dept_id = d.dept_id where t.emp_id = '4';

Mysql join加多條件與where的區(qū)別,MySQL,mysql,android,數(shù)據(jù)庫
總結(jié):

在連表操作的時候,其實(shí)是先進(jìn)行了2表的全連接(笛卡爾積,也就是所有能組合的情況a.rowCount*b.rowCount),然后根據(jù)on后面的條件進(jìn)行篩選,最后如果是左連接或者右連接,再補(bǔ)全左表或者右表的數(shù)據(jù)。

個人理解不一定正確,歡迎指正

參考文章:
join on多個條件的理解文章來源地址http://www.zghlxwxcb.cn/news/detail-673004.html

到了這里,關(guān)于Mysql join加多條件與where的區(qū)別的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • mysql根據(jù)條件導(dǎo)出表數(shù)據(jù)(`--where=“文本“`)

    本文只講導(dǎo)出,導(dǎo)入可以參考不同MySQL服務(wù)的表以及庫的數(shù)據(jù)遷移(/備份)-CSDN博客 現(xiàn)在先查下 migration_one.table_11 里有什么: 管理員終端打開輸入: 得到結(jié)果: 執(zhí)行結(jié)果: 得到: 如果只想要 name 以’he’開頭的字段數(shù)據(jù)那么就只需要修改where文本里面的數(shù)據(jù): 執(zhí)行結(jié)果 t

    2024年02月05日
    瀏覽(27)
  • Mysql Join 多條件的小坑

    一般情況我們可能只在join on 后面添加唯一的關(guān)聯(lián)條件,但是如果在on后面添加多個條件會發(fā)生什么呢? 對于inner join 表現(xiàn)與在where后面添加條件一致 但是對于left join,情況就比較微妙了。 對于左表添加條件,沒有任何效果。表a的其他id數(shù)據(jù)仍然查詢出來了 對于右表添加條件

    2024年02月07日
    瀏覽(20)
  • 2023-06-25 mysql-包含內(nèi)連接的嵌套外連接-JOIN_condition_to_WHERE-分析

    對mysql的join的條件優(yōu)化中的JOIN_condition_to_WHERE做分析, 分析該條件優(yōu)化規(guī)則為什么要這么做, 要達(dá)到什么樣的目的, 對查詢執(zhí)行的代價(jià)的改變。 上下文: 2023-06-02 stonedb-修改包含內(nèi)連接的嵌套外連接-問題反思_財(cái)閥悟世的博客-CSDN博客 2023-05-29 monetdb-多表連接-分析_財(cái)閥悟世的博客

    2024年02月11日
    瀏覽(15)
  • MySQL中使用IF子查詢實(shí)現(xiàn)條件判斷(where之后用if)

    廢話不多說,直接上代碼

    2023年04月23日
    瀏覽(33)
  • 北京地區(qū)MySQL培訓(xùn)課程:深度解析查詢語句中的WHERE條件設(shè)置

    北京地區(qū)MySQL培訓(xùn)課程:深度解析查詢語句中的WHERE條件設(shè)置

    MySQL如果在查詢時想要獲取滿足的條件的記錄,就需要使用WHERE子句,WHERE子句用于在 MySQL 中過濾查詢結(jié)果,只返回滿足條件的數(shù)據(jù)記錄。 語法格式: SELECT column1, column2, ...FROM table_name WHERE condition; SELECT 列名, ...FROM 那個表 WHERE 條件; 下圖為示例表格 示例1:查詢等級是“A”的

    2024年02月19日
    瀏覽(18)
  • MySQL中的having和where的區(qū)別

    HAVING 和 WHERE 是 SQL 查詢中用于篩選數(shù)據(jù)的兩個,但它們在使用時有一些區(qū)別: WHERE 子句: 1用于在查詢執(zhí)行之前對原始數(shù)據(jù)進(jìn)行篩選。 2作用于單行數(shù)據(jù),過濾不滿足條件的數(shù)據(jù)行。 3在對單個行進(jìn)行判斷和過濾時使用,例如基于行的條件篩選。 HAVING 子句: 1用于在數(shù)

    2024年02月12日
    瀏覽(21)
  • MySQL having關(guān)鍵字詳解、與where的區(qū)別

    MySQL having關(guān)鍵字詳解、與where的區(qū)別

    1.1、作用 對查詢的數(shù)據(jù)進(jìn)行篩選 1.2、having產(chǎn)生的原因 使用where對查詢的數(shù)據(jù)進(jìn)行篩選時,where子句中無法使用聚合函數(shù),所以引出having 1.3、having使用語法 having單獨(dú)使用(不與group by一起使用,在Oracle中會報(bào)錯),單獨(dú)使用時,大部分場合與where相同 having與grou

    2023年04月21日
    瀏覽(22)
  • MySQL left join 和 left outer join 區(qū)別

    MySQL left join 和 left outer join 區(qū)別

    先說結(jié)論: left join 和 left outer join 的結(jié)果是一致的。 我不知道各位大神是怎么測試的,網(wǎng)上面就說兩個不一樣,我A、B表都是有重復(fù)數(shù)據(jù)的,為啥結(jié)果是一樣的。 表A 表B 左連接 左外連接 以下MySQL官方文檔的說明(2664頁),outer join是為了某些第三方程序的兼容性而存在的。 微軟

    2024年02月10日
    瀏覽(18)
  • SQL 語句中 left join 后用 on 還是 where,區(qū)別大了!

    SQL 語句中 left join 后用 on 還是 where,區(qū)別大了!

    目錄 情況 小結(jié) 舉例 ????????前天寫SQL時本想通過 A left B join on and 后面的條件來使查出的兩條記錄變成一條,奈何發(fā)現(xiàn)還是有兩條。 ????????后來發(fā)現(xiàn) join on and 不會過濾結(jié)果記錄條數(shù),只會根據(jù)and后的條件是否顯示 B表的記錄,A表的記錄一定會顯示。 ????????不

    2024年02月14日
    瀏覽(21)
  • mysql執(zhí)行計(jì)劃之Extra列-Using where

    mysql執(zhí)行計(jì)劃之Extra列-Using where

    顧名思義, Extra 列是用來說明一些額外信息的, 我們可以通過這些額外信息來更準(zhǔn)確的理解 MySQL 到底將如何執(zhí)行給定的查詢語句。 MySQL 提供的額外信息很多。這里單說 Using where。 Using where 只是表示 MySQL 使用 where 子句中的條件對記錄進(jìn)行了過濾。與是否全表掃描或讀取了索

    2024年02月04日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包