鏈接查詢中用來鏈接連個表的條件稱爲鏈接條件或鏈接謂詞。其形式爲:數據庫
[<表1>].<列名1><鏈接運算符>[<表2>].<列2>
常見的鏈接運算符包括測試
一、比較運算符:=、>、<、>=、<=、!=、between和and。3d
二、邏輯運算符:not、and、or。code
三、使用between和and鏈接查詢形式爲[<表1>].<列名1><between>[<表2>].<列名2>and[<表2>].<列名3>。blog
一、內鏈接:表中的行互相鏈接。結果集的行數等於每一個表知足條件的行數的乘積,參與鏈接的表示平等的。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。也就是說,無論第二個表有沒有記錄都會第一個表的全部字段都會返回,這就是外鏈接與內鏈接的區別。
一、右外鏈接查詢的語法結構以下:
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。
一、全外鏈接查詢的語法結構以下:
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。
交叉鏈接Corss join,用於將第一張表的全部記錄與第二張表的全部記錄組合一次並返回,這個東西在生成測試數據庫時頗有用,例如,你定義7個姓,7個名,再交叉鏈接就可以產生49條記錄。
若有以下表:姓氏表
名字表:
執行以下SQL語句:
select LastName + firstname from name2 cross join name1
結果以下:
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
輸出結果爲: