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