自由飛翔

          我在仰望,java之上

          導航

          <2011年10月>
          2526272829301
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          公告

          離職進行中

          隨筆分類

          隨筆檔案

          文章檔案

          統計

          留言簿(2)

          我關注的blog

          閱讀排行榜

          評論排行榜

          轉載:mysql表連接總結

          文章來源:http://blog.sina.com.cn/s/blog_3d48dbb70100hyz4.html
          作者:濤濤
          首先my sql 不支持oracle的(+) 
          內連接: 只連接匹配的行
          左外連接: 包含左邊表的全部行(不管右邊的表中是否存在與它們匹配的行),以及右邊表中全部匹配的行
          右外連接: 包含右邊表的全部行(不管左邊的表中是否存在與它們匹配的行),以及左邊表中全部匹配的行
          全外連接: 包含左、右兩個表的全部行,不管另外一邊的表中是否存在與它們匹配的行。
          交叉連接  生成笛卡爾積-它不使用任何匹配或者選取條件,而是直接將一個數據源中的每個行與另一個數據源的每個
          行都一一匹配
          舉個例子吧。
          表A
          id   name 
          1    張
          2    李
          3    王
          表B
          id   address   A_id
          1    北京      1
          2    上海      3
          3    南京      10
          包容性:A表包容B表,左連接左表是全的.(left join 或 left outer join )
          SQL語句如下:
          SELECT A.name, B.address
          FROM A
          LEFT JOIN B ON A.id = B.A_id
          查詢結果為:
          name     address
          張     北京
          李     NULL
          王     上海
          包容性:B表包容A表,右連接右表是全的.(right join 或 right outer join )
          SQL語句如下:
          SELECT A.name, B.address
          FROM A
          RIGHT JOIN B ON A.id = B.A_id
          查詢結果為:
          name     address
          張     北京
          王     上海
          NULL     南京
          排他性:A,B表中至少有1個匹配時,才返回行。兩表的交集
          SQL語句如下:
          select A.name,B.address from A
          inner join B
          on A.id = B.A_id
          查詢結果為:
          name     address
          張     北京
          王     上海
          inner join  內連接等價于下面的sql:
          SELECT A.name, B.address
          FROM A, B
          WHERE A.id = B.A_id
          注釋:全外連接返回參與連接的兩個數據集合中的全部數據,無論它們是否具有與之相匹配的行。在功能上,它等價于
          對這兩個數據集合分別進行左外連接和右外連接,然后再使用消去重復行的并操作將上述兩個結果集合并為一個結果集
          。(full join 或 full outer join )
          SQL語句如下:
          select * from A
          full join B
          查詢結果為:
          id     name     id     address A_id
          1     張     1     北京     1
          2     李     1     北京     1
          3     王     1     北京     1
          1     張     2     上海     3
          2     李     2     上海     3
          3     王     2     上海     3
          1     張     3     南京     10
          2     李     3     南京     10
          3     王     3     南京     10
          注釋:返回3*3=9條記錄,即笛卡爾積
          SQL語句如下:
          SELECT * FROM A
          CROSS JOIN B
          查詢結果為:
          id     name     id     address A_id
          1     張     1     北京     1
          2     李     1     北京     1
          3     王     1     北京     1
          1     張     2     上海     3
          2     李     2     上海     3
          3     王     2     上海     3
          1     張     3     南京     10
          2     李     3     南京     10
          3     王     3     南京     10
          CROSS JOIN等價于:
          select * from A,B
          注意:
          1. on A.id = B.id 等同于 using(id)//這里字段名要相同
          2. 當 MySQL 在從一個表中檢索信息時,你可以提示它選擇了哪一個索引。  
          如果 EXPLAIN 顯示 MySQL 使用了可能的索引列表中錯誤的索引,這個特性將是很有用的。  
          通過指定 USE INDEX (key_list),你可以告訴 MySQL 使用可能的索引中最合適的一個索引在表中查找記錄行。  
          可選的二選一句法 IGNORE INDEX (key_list) 可被用于告訴 MySQL 不使用特定的索引。    
          效率問題:
          1.inner join比left join快
          注:inner join  內連接等價于下面的sql: SELECT A.name, B.address FROM A, B WHERE A.id = B.A_id
          所以一般要用一般的連接就可以了.
          2.連接字段建索引
          多表外連接
          select   A.*,B.f1,B.f2,B.fn,C.f1,C.f2,C.fn   from   A    
            left   join   B   on   A.id=B.id    
            left   join   C   on   C.id=A.id  
            where .......



          Gavin

          posted on 2011-10-20 11:24 GavinMiao 閱讀(6497) 評論(1)  編輯  收藏 所屬分類: mysql

          評論

          # re: 轉載:mysql表連接總結 2013-12-04 23:20 ewr

          ardfdf  回復  更多評論   

          主站蜘蛛池模板: 威宁| 错那县| 平谷区| 镇平县| 南康市| 安顺市| 清徐县| 文昌市| 竹北市| 灵丘县| 张北县| 林口县| 荆门市| 旺苍县| 隆回县| 莲花县| 安吉县| 颍上县| 黄山市| 河津市| 永宁县| 盐津县| 庆云县| 陈巴尔虎旗| 南阳市| 应用必备| 昆明市| 青浦区| 丰镇市| 遂川县| 湄潭县| 综艺| 杭州市| 冷水江市| 冀州市| 罗田县| 郁南县| 马关县| 铜川市| 贵德县| 陵水|