天天看點

SQL 左外連接配接,右外連接配接,全連接配接,内連接配接

    連接配接條件可在FROM或WHERE子句中指定,建議在FROM子句中指定連接配接條件。WHERE和HAVING子句也可以包含搜尋條件,以進一步篩選連接配接條件所選的行。   

      連接配接可分為以下幾類:     

      内連接配接。(典型的連接配接運算,使用像   =   或   <>   之類的比較運算符)。包括相等連接配接和自然連接配接。    

      内連接配接使用比較運算符根據每個表共有的列的值比對兩個表中的行。例如,檢索   students   和   courses   表中學生辨別号相同的所有行。   

      外連接配接。外連接配接可以是左向外連接配接、右向外連接配接或完整外部連接配接。    

      在FROM子句中指定外連接配接時,可以由下列幾組關鍵字中的一組指定:   

      LEFT   JOIN   或   LEFT   OUTER   JOIN。     

      左向外連接配接的結果集包括LEFT  OUTER子句中指定的左表的所有行,而不僅僅是連接配接列所比對的行。如果左表的某行在右表中沒有比對行,則在相關聯的結果集行中右表的所有選擇清單列均為空值。    

      RIGHT  JOIN  或  RIGHT   OUTER   JOIN。    

      右向外連接配接是左向外連接配接的反向連接配接。将傳回右表的所有行。如果右表的某行在左表中沒有比對行,則将為左表傳回空值。   

      FULL   JOIN   或   FULL   OUTER   JOIN。     

      完整外部連接配接傳回左表和右表中的所有行。當某行在另一個表中沒有比對行時,則另一個表的選擇清單列包含空值。如果表之間有比對行,則整個結果集行包含基表的資料值。   

      交叉連接配接。交叉連接配接傳回左表中的所有行,左表中的每一行與右表中的所有行組合。交叉連接配接也稱作笛卡爾積。   

例如,下面的内連接配接檢索與某個出版商居住在相同州和城市的作者:  

  USE   pubs  

  SELECT   a.au_fname,   a.au_lname,   p.pub_name  

  FROM   authors   AS   a   INNER   JOIN   publishers   AS   p  

        ON   a.city   =   p.city  

        AND   a.state   =   p.state  

  ORDER   BY   a.au_lname   ASC,   a.au_fname   ASC   

      FROM   子句中的表或視圖可通過内連接配接或完整外部連接配接按任意順序指定;但是,用左或右向外連接配接指定表或視圖時,表或視圖的順序很重要。有關使用左或右向外連接配接排清單的更多資訊,請參見使用外連接配接。     

例子:  

  a表       id   name     b表     id     job   parent_id  

              1   張3                   1     23     1  

              2   李四                  2     34     2  

              3   王武                  3     34     4  

  a.id同parent_id   存在關系   

  内連接配接   

  select   a.*,b.*   from   a   inner   join   b     on   a.id=b.parent_id  

  結果是    

  1   張3                   1     23     1  

  2   李四                  2     34     2   

  左連接配接   

  select   a.*,b.*   from   a   left   join   b     on   a.id=b.parent_id  

  1   張3                    1     23     1  

  2   李四                  2     34     2  

  3   王武                  null   

  右連接配接   

  select   a.*,b.*   from   a   right   join   b     on   a.id=b.parent_id  

  2   李四                 2     34     2  

  null                       3     34     4   

  完全連接配接   

  select   a.*,b.*   from   a   full   join   b     on   a.id=b.parent_id   

  null                 3     34     4  

  3   王武                 null

SQL code

DECLARE@TATABLE (IDA INT,VA VARCHAR(10)) DECLARE@TBTABLE (IDB INT,VB VARCHAR(10)) INSERTINTO@TASELECT1,'AA'UNIONSELECT2,'BC'UNIONSELECT3,'CCC'INSERTINTO@TBSELECT1,'2'UNIONSELECT3,'58'UNIONSELECT4,'67'--内聯接簡單寫法SELECT A.IDA,A.VA,B.IDB,B.VB FROM@TA A,@TB B WHERE A.IDA=B.IDB --内聯接SELECT A.IDA,A.VA,B.IDB,B.VB FROM@TA A INNERJOIN@TB B ON A.IDA=B.IDB SELECT A.IDA,A.VA,B.IDB,B.VB FROM@TA A JOIN@TB B ON A.IDA=B.IDB --左外聯接SELECT A.IDA,A.VA,B.IDB,B.VB FROM@TA A LEFTJOIN@TB B ON A.IDA=B.IDB SELECT A.IDA,A.VA,B.IDB,B.VB FROM@TA A LEFTOUTERJOIN@TB B ON A.IDA=B.IDB --右外聯接SELECT A.IDA,A.VA,B.IDB,B.VB FROM@TA A RIGHTJOIN@TB B ON A.IDA=B.IDB SELECT A.IDA,A.VA,B.IDB,B.VB FROM@TA A RIGHTOUTERJOIN@TB B ON A.IDA=B.IDB --完整外聯接SELECT A.IDA,A.VA,B.IDB,B.VB FROM@TA A FULLJOIN@TB B ON A.IDA=B.IDB SELECT A.IDA,A.VA,B.IDB,B.VB FROM@TA A FULLOUTERJOIN@TB B ON A.IDA=B.IDB --交叉聯接SELECT A.IDA,A.VA,B.IDB,B.VB FROM@TA A CROSSJOIN@TB B --自聯接SELECT A.IDA,A.VA,B.IDA,B.VA FROM@TA A,@TA B WHERE A.IDA=B.IDA+1 查詢分析器中執行: --建表table1,table2:createtable table1(id int,name varchar(10)) createtable table2(id int,score int) insertinto table1 select1,'lee'insertinto table1 select2,'zhang'insertinto table1 select4,'wang'insertinto table2 select1,90insertinto table2 select2,100insertinto table2 select3,70 如表 -------------------------------------------------table1|table2|-------------------------------------------------idname|idscore| 1lee|190| 2zhang|2100| 4wang|370|------------------------------------------------- 以下均在查詢分析器中執行一、外連接配接 1.概念:包括左向外聯接、右向外聯接或完整外部聯接 2.左連接配接:leftjoin 或 leftouterjoin (1)左向外聯接的結果集包括 LEFTOUTER 子句中指定的左表的所有行,而不僅僅是聯接列所比對的行。如果左表的某行在右表中沒有比對行,則在相關聯的結果集行中右表的所有選擇清單列均為空值(null)。 (2)sql語句 select*from table1 leftjoin table2 on table1.id=table2.id -------------結果-------------idnameidscore ------------------------------1lee190 2zhang2100 4wangNULLNULL ------------------------------注釋:包含table1的所有子句,根據指定條件傳回table2相應的字段,不符合的以null顯示 3.右連接配接:rightjoin 或 rightouterjoin (1)右向外聯接是左向外聯接的反向聯接。将傳回右表的所有行。如果右表的某行在左表中沒有比對行,則将為左表傳回空值。 (2)sql語句 select*from table1 rightjoin table2 on table1.id=table2.id -------------結果-------------idnameidscore ------------------------------1lee190 2zhang2100 NULLNULL370 ------------------------------注釋:包含table2的所有子句,根據指定條件傳回table1相應的字段,不符合的以null顯示 4.完整外部聯接:fulljoin 或 fullouterjoin (1)完整外部聯接傳回左表和右表中的所有行。當某行在另一個表中沒有比對行時,則另一個表的選擇清單列包含空值。如果表之間有比對行,則整個結果集行包含基表的資料值。 (2)sql語句 select*from table1 fulljoin table2 on table1.id=table2.id -------------結果-------------idnameidscore ------------------------------1lee190 2zhang2100 4wangNULLNULL NULLNULL370 ------------------------------注釋:傳回左右連接配接的和(見上左、右連接配接)二、内連接配接 1.概念:内聯接是用比較運算符比較要聯接列的值的聯接 2.内連接配接:join 或 innerjoin3.sql語句 select*from table1 join table2 on table1.id=table2.id -------------結果-------------idnameidscore ------------------------------1lee190 2zhang2100 ------------------------------注釋:隻傳回符合條件的table1和table2的列 4.等價(與下列執行效果相同) A:select a.*,b.*from table1 a,table2 b where a.id=b.id B:select*from table1 crossjoin table2 where table1.id=table2.id (注:cross join後加條件隻能用where,不能用on) 三、交叉連接配接(完全) 1.概念:沒有 WHERE 子句的交叉聯接将産生聯接所涉及的表的笛卡爾積。第一個表的行數乘以第二個表的行數等于笛卡爾積結果集的大小。(table1和table2交叉連接配接産生3*3=9條記錄) 2.交叉連接配接:crossjoin (不帶條件where...) 3.sql語句 select*from table1 crossjoin table2 -------------結果-------------idnameidscore ------------------------------1lee190 2zhang190 4wang190 1lee2100 2zhang2100 4wang2100 1lee370 2zhang370 4wang370 ------------------------------注釋:傳回3*3=9條記錄,即笛卡爾積 4.等價(與下列執行效果相同) A:select*from table1,table2