<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      【轉】MYSQL 表連接 ON AND 和ON WHERE 的區別

      原先一直對SQL左右連接中的on and和on where的區別不是太了解,直到在網上看到了下面這段話才豁然開朗。
      在使用left join時,on and和on where條件的區別如下:  
      1、on條件是在生成臨時表時使用的條件,它不管on中的條件是否為真,都會返回左邊表中的記錄。  
      2、where條件是在臨時表生成好后,再對臨時表進行過濾的條件。這時已經沒有left join的含義(必須返回左邊表的記錄)了,條件不為真的就全部過濾掉,on后的條件用來生成左右表關聯的臨時表,where后的條件對臨時表中的記錄進行過濾。
      先上表結構以及數據:
      SQL> create table A (id int, type int);
      SQL> select * from A;
              ID       TYPE
      ---------- ----------
               1          1
               2          1
               3          2
       
      SQL> create table B(id int ,class int);
      SQL> select * from B;
       
              ID      CLASS
      ---------- ----------
               1          1
               2          2

      SQL> select * from A left join B on A.id = B.id where A.type = 1;
       
              ID       TYPE         ID      CLASS
      ---------- ---------- ---------- ----------
               1          1          1          1
               2          1          2          2

      根據上面那段話的解釋,where字句是在生成臨時表以后再進行過濾的,也就是可以理解為就是一個左連接:select * from A left join B on A.id = B.id;

       其運行結果如下:

      SQL> select * from A left join B on A.id = b.id;
       
              ID       TYPE         ID      CLASS
      ---------- ---------- ---------- ----------
               1          1          1          1
               2          1          2          2
               3          2

      然后加上where A.type = 1對臨時表進行過濾,除掉A.type不為1的,顯然結果正確。

      SQL> select * from A left join B on A.id = B.id and A.type = 1;
       
              ID       TYPE         ID      CLASS
      ---------- ---------- ---------- ----------
               1          1          1          1
               2          1          2          2
               3          2

      SQL> select * from A left join B on A.id = B.id and B.class = 1;
       
              ID       TYPE         ID      CLASS
      ---------- ---------- ---------- ----------
               1          1          1          1
               3          2
               2          1

      根據上面那段話的解釋:on條件是在生成臨時表時使用的條件,它不管on中的條件是否為真,都會返回左邊表中的記錄。顯然左連接再加上新的條件:B.class = 1篩選掉第二行記錄,結果正確。

      SQL> select * from A left join B on A.id = B.id where B.class = 1;
       
              ID       TYPE         ID      CLASS
      ---------- ---------- ---------- ----------
               1          1          1          1

      原因同①。(①,②)和(③,④)就是關鍵詞on and和on where的區別,但結果卻完全不同。綜上三個例子,where是生成臨時表以后再進行過濾,對左右表都進行篩選。而and后面的語句如果是對left join中的左表進行過濾將不起任何作用,對右表進行過濾的話,那么左表還是返回所有行,只是右表會被過濾掉一部分行。

      再來看看內連接inner join  on and和 on where的區別:

      由于剛開始表的數據不是太適合,所以先稍微更新一下,這樣更好觀察inner join和left join在and和where的不同之處。

      SQL> update A set type = 2 where id = 1;
       
      已更新 1 行。
       
      SQL> select * from A;
       
              ID       TYPE
      ---------- ----------
               1          2
               2          1
               3          2
       
      SQL> select * from B;
       
              ID      CLASS
      ---------- ----------
               1          1
               2          2

      先看看and的:

      SQL> select * from A inner join B on A.id = B.id and A.type = 1;
       
              ID       TYPE         ID      CLASS
      ---------- ---------- ---------- ----------
               2          1          2          2

      顯然輸出結果與左連接的不一樣,先與沒有and的內連接比較一下:

      SQL> select * from A inner join B on A.id = B.id;
       
              ID       TYPE         ID      CLASS
      ---------- ---------- ---------- ----------
               1          2          1          1
               2          1          2          2

      顯然如果按左連接的邏輯,這個結果就是錯誤的。但這是Oracle輸出的,而不是我瞎打的,顯然在內連接時與左連接不同了。這里on and條件和on where條件一樣對生成以后的臨時表同樣會被過濾。顯然A表id為1的type不為1,所以它被過濾了。

       

      再上幾組來驗證一下上面這個猜想是否是正確的:

      再來看看內連接的where:

      SQL> select * from A inner join B on A.id = B.id where A.type = 1;
       
              ID       TYPE         ID      CLASS
      ---------- ---------- ---------- ----------
               2          1          2          2

      這個也是和左連接一樣生成臨時表然后進行過濾,不作解釋。

      SQL> select * from A inner join B on A.id = B.id and B.class = 1;
       
              ID       TYPE         ID      CLASS
      ---------- ---------- ---------- ----------
               1          2          1          1

      SQL> select * from A inner join B on A.id = B.id where B.class = 1;
       
              ID       TYPE         ID      CLASS
      ---------- ---------- ---------- ----------
               1          2          1          1

      對比發現:(⑤,⑥)和(⑦,⑧)結果都一樣,也就是說內連接inner join on and 或者on where不管是對左表還是右表進行過濾,實際都是在生成臨時表以后再進行過濾的,而且對左表和右表都起作用,這與左連接left join有本質的區別!!!

      最后上倆沒有使用連接語句的例子:

      SQL> select * from A,B where A.id = B.id and A.type = 1;
       
              ID       TYPE         ID      CLASS
      ---------- ---------- ---------- ----------
               1          1          1          1
               2          1          2          2
       
       
       
      SQL> select * from A,B where A.type = 1 and A.id = B.id;
       
              ID       TYPE         ID      CLASS
      ---------- ---------- ---------- ----------
               1          1          1          1
               2          1          2          2

      比較簡單,不作解釋。 

      總結一下:

      在使用left join時,on和where條件的區別如下:  
      1、on條件是在生成臨時表時使用的條件,它不管on中的條件是否為真,都會返回左邊表中的記錄。(實際上左連接中如果and語句是對左表進行過濾的,那么不管真假都不起任何作用。如果是對右表過濾的,那么左表所有記錄都返回,右表篩選以后再與左表連接返回)  
      2、where條件是在臨時表生成好后,再對臨時表進行過濾的條件。這時已經沒有left join的含義(必須返回左邊表的記錄)了,條件不為真的就全部過濾掉,on后的條件用來生成左右表關聯的臨時表,where后的條件對臨時表中的記錄進行過濾。

           在使用inner join時,不管是對左表還是右表進行篩選,on and和on where都會對生成的臨時表進行過濾。

          不過我自己驗證時發現一個現象,想補充一下,and語句是對左表進行過濾時,如果篩選左表A.id=3時,因為右表B.id沒有等于3的所以會過濾掉右表的所有數據

      posted @ 2023-11-03 16:43  明月鎮魂  閱讀(574)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产亚洲精品综合99久久| 激情内射亚洲一区二区三区| 国产初高中生在线视频| 国产香蕉久久精品综合网| 国产裸体美女视频全黄| 亚洲精品一区国产精品| 精品无码一区在线观看| 99视频30精品视频在线观看| 人妻丝袜无码专区视频网站| 精品精品国产自在97香蕉| 一区二区三区精品不卡| 99精品久久毛片a片| 天堂网在线.www天堂在线资源| 国产精品一区二区三区av| 久操资源站| 成人午夜大片免费看爽爽爽| 亚洲国产欧美在线看片一国产| 欧美午夜小视频| 亚洲第一精品一二三区| 亚洲欧美人成人让影院| 亚洲精品色无码AV试看| 祥云县| 国产精品视频免费一区二区三区| 国产成人精品亚洲精品日日| 91精品91久久久久久| 人妻系列无码专区无码中出| 久热这里只国产精品视频| 鲁丝一区鲁丝二区鲁丝三区| 精品一区二区免费不卡| 国产精品亚洲一区二区z| 国产精品福利自产拍久久| 亚洲国产成人资源在线| 国产精品麻豆成人av网| 2022亚洲男人天堂| 91精品国产免费人成网站| 色综合激情丁香七月色综合| 在线观看亚洲欧美日本| 国产绿帽在线视频看| 99久久精品看国产一区| 玖玖在线精品免费视频| 看亚洲黄色不在线网占|