Mysql聯合,連接查詢

一、 聯合查詢    UNION, INTERSECT, EXCEPT

 

UNION運算符可以將兩個或兩個以上Select語句的查詢結果集合合並成一個結果集合顯示,即執行聯合查詢。UNION的語法格式為:    

  select_statement 

  UNION [ALL] selectstatement   [UNION [ALL] selectstatement][…n]   

 

其中selectstatement為待聯合的Select查詢語句。    

ALL選項表示將所有行合並到結果集合中。不指定該項時,被聯合查詢結果集合中的重復行將隻保留一行。    

聯合查詢時,查詢結果的列標題為第一個查詢語句的列標題。因此,要設定列標題必須在第一個查詢語句中設定。要對聯合查詢結果排序時,也必須使用第一查詢語句中的列名、列標題或者列序號。 在使用UNION 運算符時,應保證每個聯合查詢語句的選擇列表中有相同數量的表達式,並且每個查詢選擇表達式應具有相同的數據類型,或是可以自動將它們轉換為相同的數據類型。在自動轉換時,對於數值類型,系統將低精度的數據類型轉換為高精度的數據類型。    

 

在包括多個查詢的UNION語句中,其執行順序是自左至右,使用括號可以改變這一執行順序。例如:    

查詢1 UNION (查詢2 UNION 查詢3) 

 

INTERSECT,EXCEPT

 

INTERSECT是交集. EXCEPT是差集的意思

 

select user_id from user intersect select user_id from toy; 

//就是返回這兩個select查詢相同的部分.(這裡就是有玩具的孩子的user_id)

 

select user_id from user except select user_id from toy; 

//就是返回第一個select 減去第二個select 結果的部分。(這裡就是沒有玩具的孩子的user_id)

 

二、連接查詢 

 

通過連接運算符可以實現多個表查詢。連接是關系資料庫模型的主要特點,也是它區別於其它類型資料庫管理系統的一個標志。

 

在標準SQL中的UNION語句如下:

 

SELECT column_name(s) FROM table_name1

UNION

SELECT column_name(s) FROM table_name2

其中有前提:每個SELECT的內容(表項)必須是相同的結構。詳細的說,鏈接的表的列數必須互相相同,同時相對的列屬性也必須相同。而列名可以不同(結構相同)

 

首先交叉連接:cross join

select u.username, t.toyname from user as u cross join toy as t; 

//交叉連接就是把所有第一個表和第二個表的值一一對應 

//例如:假如第一個表格有5個值,第二個表有4個值,這個結果就應該有20條記錄。

 

內聯接:inner join

相等連接:(equal join)

select u.username, t.toyname from user as u inner join toy as t on(也可以用where) u.user_id = t.user_id; 

//這個的結果就是各自擁有的玩具瞭。

 

不等連接:(non-equal join)

select u.username, t.toyname from user as u inner join toy as t on(也可以用where) u.user_id <> t.user_id order by u.username; 

//這個的結果是各自沒有的玩具

 

自然連接:(natural join)

 

這個是有在連接的兩個表格中的列名稱相等的時候才能用。

 

<code class=" hljs sql">select u.username, t.toyname from user as u natural join toy as t; //和上面的相等連接的結果是一樣的。</code>

外連接:outer join

 

左外聯接、右外聯接比較相似:left outer join ; right outer join;

 

<code class=" hljs sql">select u.usrename, t.toyname from user u inner join toy t on (這裡不能用where) u.user_id = t.user_id;

//這個是查詢用戶姓名和他所擁有的玩具名字</code>

select u.username, t.toyname from user u left outer join toy t on u.user_id = t.user_id; 

//這個是以左表(user)為基準,來查詢所有用戶姓名和他所擁有的玩具名字。

 

select u.username, t.toyname from user u right outer join toy t on u.user_id = t.user_id; 

//這個是以右表(toy)為基準,來查詢所有玩具的擁有者姓名,對於沒有擁有者的為NULL

You May Also Like