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

sql連接查詢語句中on、where篩選的區(qū)別總結

 更新時間:2017年07月10日 09:38:03   作者:陳宏鴻  
接觸Sql語句時間挺長時間了,聽他人說過sql語句的連接查詢,但一直沒有認真研究和使用過!下面這篇文章主要給大家介紹了關于sql連接查詢語句中on、where篩選兩者之間區(qū)別的相關資料,文中通過圖文介紹的非常詳細,需要的朋友們下面來一起看看吧。

前言

相信對于每位程序員來說,sql查詢這個東西, 要說它簡單, 可以很簡單, 通常情況下只需使用增刪查改配合編程語言的邏輯表達能力,就能實現所有功能。 但是增刪查改并不能代表sql語句的所有, 完整的sql功能會另人望而生畏。 就拿比普通增刪查改稍微復雜一個層次的連接查詢來說, 盲目使用, 也會出現意料之外的危險結果,導致程序出現莫名其妙的BUG。

在連接查詢語法中,另人迷惑首當其沖的就要屬on篩選和where篩選的區(qū)別了, 在我們編寫查詢的時候, 篩選條件的放置不管是在on后面還是where后面, 查出來的結果總是一樣的, 既然如此,那為什么還要多此一舉的讓sql查詢支持兩種篩選器呢? 事實上, 這兩種篩選器是存在差別的,只是如果不深挖不容易發(fā)現而已。

sql中的連接查詢分為3種, cross join,inner join,和outer join , 在 cross join和inner join中,篩選條件放在on后面還是where后面是沒區(qū)別的,極端一點,在編寫這兩種連接查詢的時候,只用on不使用where也沒有什么問題。因此,on篩選和where篩選的差別只是針對outer join,也就是平時最常使用的left join和right join。

下面話不多說,來一起看看詳細的介紹:

來看一個示例,有兩張數據表,結構和數據如圖所示

表main

表ext

可以把這兩張表看作是用來存放用戶信息的, main放置主要信息,ext表放置附加信息,兩張表的關系是1對1的,以id字符作為對應關系鍵?,F在我們需要將地址不為杭州的所有用戶信息篩選出來,結果中需要包含main表和ext表的所有字段數據。

select * from main left JOIN exton main.id = ext.id and address <> '杭州'

閉上眼睛, 請用大腦人肉運行一下這段SQL, 想象一下是什么結果。

當把address <> '杭州'這個篩選條件放在on之后,查詢得到的結果似乎跟我們預料中的不同,從結果中能看出,這個篩選條件好像只過濾掉了ext表中對應的記錄,而main表中的記錄并沒有被過濾掉,也就是上圖中標記為紅色的那條記錄。outer join相對于inner join的一個主要特性就是以一側的表為基礎,但是在這里以左表為基這一點卻可以無視篩選條件,這未免也太霸道了一些。

把查詢語句稍微改動一下,將地址的篩選條件從on轉移至where

select * from main left JOIN ext on main.id = ext.id where address <> '杭州'

結果就如我們預期的那樣了

造成這種結果上的差異要從outer join查詢的邏輯查詢的各個階段說起。

總的來說,outer join 的執(zhí)行過程分為4步

      1、先對兩個表執(zhí)行交叉連接(笛卡爾積)

      2、應用on篩選器

      3、添加外部行

      4、應用where篩選器

就拿上面不使用where篩選器的sql來說,執(zhí)行的整個詳細過程如下

第一步,對兩個表執(zhí)行交叉連接,結果如下,這一步會產生36條記錄(此圖顯示不全)

第二步,應用on篩選器。篩選器中有兩個條件,main.id = ext.id and address<> '杭州',符合要求的記錄如下

這似乎正是我們期望中查詢的結果,然而在接下來的步驟中這個結果會被打亂

第三步,添加外部行。outer join有一個特點就是以一側的表為基,假如另一側的表沒有符合on篩選條件的記錄,則以null替代。在這次的查詢中,這一步的作用就是將那條原本應該被過濾掉的記錄給添加了回來

是不是不種畫蛇添足的感覺, 結果就成了這樣

第四步,應用where篩選器

在這條問題sql中,因為沒有where篩選器,所以上一步的結果就是最終的結果了。

而對于那條地址篩選在where條件中的sql,這一步便起到了作用,將所有地址不屬于杭州的記錄篩選了出來

通過上面的講解,已經能反應出在outer join中的篩選條件在on中和where中的區(qū)別,開發(fā)人員如能詳細了解之中差別,能規(guī)避很多在編寫sql過程中出現的莫名其妙的錯誤。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關文章

  • 一條慢SQL導致購物車服務無法使用的解決方案

    一條慢SQL導致購物車服務無法使用的解決方案

    今天小編就為大家分享一篇關于一條慢SQL導致購物車服務無法使用的解決方案,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • 數據庫索引并不是萬能藥

    數據庫索引并不是萬能藥

    幾乎所有的業(yè)務項目都會涉及數據存儲,今天,我們就以MySQL為例來深入理解下索引的原理,以及相關誤區(qū),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Apache?Hudi集成Spark?SQL操作hide表

    Apache?Hudi集成Spark?SQL操作hide表

    這篇文章主要為大家介紹了Apache?Hudi集成Spark?SQL操作hide表,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-03-03
  • 8種主流NoSQL數據庫系統(tǒng)特性對比和最佳應用場景

    8種主流NoSQL數據庫系統(tǒng)特性對比和最佳應用場景

    這篇文章主要介紹了8種主流NoSQL數據庫系統(tǒng)特性對比和最佳應用場景,對選擇一個NoSQL數據庫來說是一個不錯的參考文章,需要的朋友可以參考下
    2014-06-06
  • 比較實用SQL語句總結

    比較實用SQL語句總結

    sql語句查詢,比較實用的技巧
    2008-04-04
  • iwms access與sql版的安裝與轉換

    iwms access與sql版的安裝與轉換

    iwms access與sql版的安裝與轉換...
    2007-01-01
  • Hive?HQL支持2種查詢語句風格

    Hive?HQL支持2種查詢語句風格

    這篇文章主要為大家介紹了Hive?HQL支持2種查詢語句風格示例語法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • jdbc 數據庫的連接(sqlserver oracle)

    jdbc 數據庫的連接(sqlserver oracle)

    sql Server 和oracle 數據庫的連接,供大家參考!
    2009-08-08
  • [轉載]讓SQL運行得更快

    [轉載]讓SQL運行得更快

    筆者在工作實踐中發(fā)現,不良的SQL往往來自于不恰當的索引設計、不充份的連接條件和不可優(yōu)化的where子句。在對它們進行適當的優(yōu)化后,其運行速度有了明顯地提高!下面我將從這三個方面分別進行總結
    2007-02-02
  • 關系型數據庫和非關系型數據庫概述與優(yōu)缺點對比

    關系型數據庫和非關系型數據庫概述與優(yōu)缺點對比

    這篇文章介紹了關系型數據庫和非關系型數據庫概述與優(yōu)缺點對比,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-03-03

最新評論

元阳县| 象山县| 郧西县| 白城市| 和顺县| 黔江区| 丰城市| 五台县| 彝良县| 岳池县| 陈巴尔虎旗| 淅川县| 深水埗区| 嘉义县| 兴业县| 周口市| 古田县| 东宁县| 绥宁县| 清水县| 宜城市| 平山县| 旬阳县| 偃师市| 呼图壁县| 沁源县| 沂源县| 封丘县| 神农架林区| 汤阴县| 唐河县| 民县| 盐池县| 浦江县| 东台市| 乌拉特后旗| 于都县| 怀宁县| 闵行区| 河东区| 府谷县|