SQL查詢 - 錶鏈接

1、鏈接查詢簡介

  鏈接查詢中用來鏈接連個表的條件稱爲鏈接條件或鏈接謂詞。其形式爲:數據庫

[<表1>].<列名1><鏈接運算符>[<表2>].<列2>  

  常見的鏈接運算符包括測試

  一、比較運算符:=、>、<、>=、<=、!=、between和and。3d

  二、邏輯運算符:not、and、or。code

  三、使用between和and鏈接查詢形式爲[<表1>].<列名1><between>[<表2>].<列名2>and[<表2>].<列名3>。blog

2、鏈接按照結果集分類

  一、內鏈接:表中的行互相鏈接。結果集的行數等於每一個表知足條件的行數的乘積,參與鏈接的表示平等的。io

  二、外鏈接:參與鏈接的表有主次之分,主表的每一行數據去匹配從表的數據列,符合鏈接條件的數據將直接返回到結果集中,不符合鏈接條件的數據列將以null填充後返回到結果集中,其中外鏈接又分左外鏈接、右外鏈接和全鏈接3種。ast

  (一)、等值鏈接查詢class

select p.*,c.* from country as c,person as p where c.countryid = p.countryid

  等上面的等值鏈接中,兩張表都有countryid字段,所以查出來的結果中就會有兩列countryidbfc

  (二)、在等值結果中消除數據就是天然鏈接select

select p.name,c.countryname from country as c,person as p where c.countryid = p.countryid

  (三)、自身鏈接

  一個數據表本身與本身創建鏈接稱爲自身鏈接

、內鏈接查詢

  一、內鏈接查詢的語法結構以下:

      select <屬性或表達式列表>
      from <表名> [inner] join <表名>
      on <鏈接條件>
      [ where <限定條件> ]

  inner能夠省略,當只見到join時就是省略了inner。內鏈接就是傳統的鏈接操做,這裏用on子句指定鏈接條件,用where子句指定其餘限定條件:

  select p.name,c.countryname from country as c inner join person p on p.countryid = c.countryid

、左外鏈接查詢

  一、左外鏈接查詢的語法結構:

    select <屬性或表達式列表>
    from <表名> left outer join <表名>
    on <鏈接條件>
    [ where <限定條件> ]

  如:

  select p.name,c.countryname from country as c left join person p on p.countryid = c.countryid 

  在結果表中包含第一個表中知足條件的全部記錄,若是是在鏈接鏈接上匹配的記錄,則第二個表返回相應值,不然第二個表返回null。也就是說,無論第二個表有沒有記錄都會第一個表的全部字段都會返回,這就是外鏈接與內鏈接的區別。

5、右外鏈接查詢

  一、右外鏈接查詢的語法結構以下:

    select <屬性或表達式列表>
    from <表名> right outer join <表名>
    on <鏈接條件>
    [ where <限定條件> ]

  如:

select p.name,c.countryname from country as c right join person p on p.countryid = c.countryid

  在結果表中包含第二個表中知足條件的全部記錄。若是是在鏈接條件上匹配的記錄,則第一個表返回相應值,不然第一個表返回null。

6、全外鏈接查詢

  一、全外鏈接查詢的語法結構以下:

   select <屬性或表達式列表>
   from <表名> full outer join <表名>
   on <鏈接條件>
   where <限定條件>]

  如:

  select p.name,c.countryname from country as c full join person p on p.countryid = c.countryid

  在結果表中包含兩個表中知足條件的全部記錄。若是是在鏈接條件上匹配的元組,則另外一個表返回相應則,沒有則返回null。

7、交叉鏈接

  交叉鏈接Corss join,用於將第一張表的全部記錄與第二張表的全部記錄組合一次並返回,這個東西在生成測試數據庫時頗有用,例如,你定義7個姓,7個名,再交叉鏈接就可以產生49條記錄。

   若有以下表:姓氏表

    

    名字表:

    

    執行以下SQL語句:

  select LastName + firstname from name2 cross join name1

       結果以下:

      

八、聯合查詢union(union all)

   union是一個特殊的運算符,用於將兩個或兩個以上的查詢產生一個結果集。join將信息水平鏈接(添加更多列),而union將信息垂直鏈接(添加更多行)。

   當使用union處理查詢時,要注意如下幾個關鍵點。

   (1)、全部union的查詢必須在select列表中有相同的列數。即若是第一個查詢有3個列數,第二個查詢也要只有3個列數。

   (2)、union返回結果的標題集僅從第一個查詢中得到,不管第二個查詢如何命名或取別名都不會更改。

   (3)、查詢中對應的列的數據類型必須隱式一致。注意不要求徹底一致,只須要隱式一致。

   (4)、與其餘非union不一樣,union的默認返回選項爲distinct,而不是all。union all語句與union的不一樣點僅僅在於遇到相同的記錄,所有保留而已。

   例如仍是用第7條的例子,執行以下語句:

select * from name1 
union
select * from name2

   返回結果爲:

   

   因爲union默認是distinct查詢,所以想要得到全部的記錄時,能夠用union all,這樣就算上述例子中兩個表都有'王',也會兩條記錄一塊兒返回。

   如今來看一下綜合示例:

   爲了展現一下,建了兩張表,並添加了幾條記錄,以下:

    person表

    

    country表

    

   一、查詢一個列表,該列表要包含國家名稱列表與該國家下的person總數。

select c.countryname,count(p.id) 
from country as c 
inner join person as p on c.countryid = p.countryid 
group by c.countryname

    輸出結果:

    

    如今在來加一個條件,要求人口數按升序排列:

select c.countryname,count(p.id) as co
from country as c 
inner join person as p on c.countryid = p.countryid 
group by c.countryname
order by co asc

    輸出結果:

    

    再加一個條件,要求只輸出person數大於2的記錄:

select c.countryname,count(p.id) as co
from country as c 
inner join person as p on c.countryid = p.countryid 
group by c.countryname
having count(p.id) > 2
order by co asc

    輸出結果爲:

    

相關文章
相關標籤/搜索