1. 程式人生 > >MySql語句中Union和join的用法

MySql語句中Union和join的用法

一直以來,對於資料庫SQL方面都是半吊子水平,能寫一些基本的增刪改查的語句,大部分時間都是用下Where,偶爾用用Order By、Limit,Like什麼的。連表查詢也是一些很簡單的使用。至於那些高階用法,都還給老師了。最近接騰訊的IDIP的SDK,需要查詢一些遊戲資料,發現自己的SQL水平不夠用,溫習了一些以前忘記的語法,順便記錄一下,方便以後偶爾來查查。

Union

UNION 操作符用於合併兩個或多個 SELECT 語句的結果集。 
請注意,UNION 內部的 SELECT 語句必須擁有相同數量的列。列也必須擁有相似的資料型別。同時,每條 SELECT 語句中的列的順序必須相同。

//聯合兩個表,沒有重複
SELECT E_Name FROM Employees_China UNION SELECT E_Name FROM Employees_USA
  • 1
  • 2
  • 3
  • 4

資料來源: 
這裡寫圖片描述 
結果: 
這裡寫圖片描述

預設地,UNION 操作符選取不同的值。如果允許重複的值,請使用 UNION ALL。 
另外,UNION 結果集中的列名總是等於 UNION 中第一個 SELECT 語句中的列名。

//聯合兩個表,允許重複
SELECT E_Name FROM Employees_China
UNION ALL
SELECT E_Name FROM Employees_USA
  • 1
  • 2
  • 3
  • 4

結果: 
這裡寫圖片描述

JOIN

有時為了得到完整的結果,我們需要從兩個或更多的表中獲取結果。我們就需要執行 join。 
資料庫中的表可通過鍵將彼此聯絡起來。主鍵(Primary Key)是一個列,在這個列中的每一行的值都是唯一的。在表中,每個主鍵的值都是唯一的。這樣做的目的是在不重複每個表中的所有資料的情況下,把表間的資料交叉捆綁在一起。

資料來源: 
Persion表: 
這裡寫圖片描述 
Orders表: 
這裡寫圖片描述

//使用連表查詢
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons, Orders
WHERE Persons.Id_P = Orders.Id_P 

//使用join查詢
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.Id_P = Orders.Id_P
ORDER BY Persons.LastName
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

結果: 
這裡寫圖片描述

不同的 SQL JOIN 
除了我們在上面的例子中使用的 INNER JOIN(內連線),JOIN預設使用內連線,可以省略INNER。 我們還可以使用其他幾種連線。 
下面列出了您可以使用的 JOIN 型別,以及它們之間的差異。

  • JOIN: 如果表中有至少一個匹配,則返回行(INNER JOIN 與 JOIN)
  • LEFT JOIN: 即使右表中沒有匹配,也從左表返回所有的行
  • RIGHT JOIN: 即使左表中沒有匹配,也從右表返回所有的行
  • FULL JOIN: 只要其中一個表中存在匹配,就返回行

LEFT JOIN

//使用left join查詢,只要左表有匹配的條件,就會生成一行,右表的列值為空。
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
LEFT JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

結果: 
這裡寫圖片描述

RIGHT JOIN

//使用right join查詢,只要右表有匹配的條件,就會生成一行,左表的列值為空。
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
RIGHT JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

結果: 
這裡寫圖片描述

FULL JOIN

//使用full join查詢,只要其中一個表中存在匹配,就會生成一行,另一個表的列值為空。
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
FULL JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

結果: 
這裡寫圖片描述

多表連線

有時候會遇到需要多個表連線的情況,只要遵守以下規則就可以輕鬆的應對多表連線的情況了。

  • 在可以指定一個表名的任何地方,都可以指定一個括號括起來的join子句。
  • 在兩個表的一個完整join語句出現的任何一個地方,我們都可以只用一個表名來代替它。所謂“兩個表的一個完整join語句”也即“join子句”,就是指如“A join B on A.a= B.b”這樣一個完整的句子。

比如:欲連線ABCDE五個表

//A: 可以這樣:
Select * from A inner join(((
B inner join C on B.b = C.c)
inner join D on B.b = D.d)
inner join E on D.d = E.e)
on A.a = E.e

//B: 也可以這樣:
select * from (((
A inner join B on A.a = B.b)
inner join C on C.c = A.a)
inner join D on D.d = C.c)
inner join E
on E.e = D.d

//C: 也可以這樣:
select * from
A inner join B on A.a = B.b
inner join C on C.c = A.a
inner join D on D.d = C.c
inner join E on E.e = D.d
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

我們可以先把A和B連線起來,然後將結果與C連線,當然,如果C只和B相關而不和A相關的話,我們也可以先把B和C連線起來,結果再與A連線,只要保持關係是正確的,你可以以任意方式來定義巢狀的join。

相關推薦

MySql語句Unionjoin用法

一直以來,對於資料庫SQL方面都是半吊子水平,能寫一些基本的增刪改查的語句,大部分時間都是用下Where,偶爾用用Order By、Limit,Like什麼的。連表查詢也是一些很簡單的使用。至於那些高階用法,都還給老師了。最近接騰訊的IDIP的SDK,需要查詢一些遊戲資料,發

關於SQLUnionJoin用法

一直以來,對於資料庫SQL方面都是半吊子水平,能寫一些基本的增刪改查的語句,大部分時間都是用下Where,偶爾用用Order By、Limit,Like什麼的。連表查詢也是一些很簡單的使用。至於那些高階用法,都還給老師了。最近接騰訊的IDIP的SDK,需要查

Mysqlunionunion all的用法及區別

employee rom 最終 sel 推薦 china carte 區別 column UNION 用於合並兩個或多個 SELECT 語句的結果集,並消去表中任何重復行。UNION 內部的 SELECT 語句必須擁有相同數量的列,列也必須擁有相似的數據類型。同時,每條 S

資料庫mysqlunionjoin語句的例子

MySQL中的連線有內連線,外連線,以及交叉連線(笛卡爾積)1.cross join(交叉連線):指如果不帶WHERE條件子句,將會返回被連線的兩個表的笛卡爾積,返回結果的行數等於兩個錶行數的乘積2.inner join(內連線):通常有2中情況:a、等值連線(=號應用於連線

MYSQL:alter語句changemodify的區別

inf sql ima field 區別 當前 index 索引 索引 employees 您可以使用CHANGE old_col_namecolumn_definition子句對列進行重命名。重命名時,需給定舊的和新的列名稱和列當前的類型。例如:要把一個INTEGER列的

面試被問之-----sql優化in與exists的區別 Mysql in or exists not exists not in區別 (網路整理) Sql語句INexists的區別及應用 [筆記] SQL效能優化 - 避免使用 IN NOT IN

曾經一次去面試,被問及in與exists的區別,記得當時是這麼回答的:''in後面接子查詢或者(xx,xx,xx,,,),exists後面需要一個true或者false的結果",當然這麼說也不算錯,但別人想聽的是sql優化相關,肯定是效率的問題,只是那個時候確實不知道它們在sql優化上的區別,只知道用in會進

MySQL語句 LEFT JOIN 、INNER JOIN 、RIGHT JOIN 區別

今天遇見一個吭,許是我沒有理解清楚三者之間的聯絡。 不多說,直接上程式碼: MySQL查詢語句: SELECT u.* FROM tb_active_user AS u LEFT JOIN tb_active_team AS t ON t.user_id = #{use

SQLUNIONUNION ALL的詳細用法

在開發中,有些資料的儲存可能涉及到分庫分表,查詢的時候,可能需要查詢所有的分表,這個時候,就需要用到UNION或者UNION ALL,下面介紹一下UNION的用法以及與UNION ALL的區別: UNION操作符用於合併兩個或多個SELECT語句的結果集,這裡需要注意的是:

odoo系統name_searchname_get用法

打印 per sequence not 添加 product xpath ret 領料單 自動帶出工序和工序序號,兩個條件都能搜索,並且兩個都帶出來顯示在前端: # 輸入工序序號會自動帶出工序名// def name_search(self, cr,user,name=

hibernatehql語句listiterate區別

每次 hibernate 寫入 所有 讀取 條件 iter 查詢 hql 1.使用list()方法獲取查詢結果,每次發出一條語句,獲取全部數據。2.使用iterate()方法獲取查詢結果,先發出一條SQL語句用來查詢滿足條件數據的id,然後依次按照這些id查詢記錄,也就是要

Mysql聯合查詢UNIONUNION ALL的使用介紹

組合 ans per ext 輸入 and nbsp 理解 des 一、UNION和UNION ALL的作用和語法 UNION 用於合並兩個或多個 SELECT 語句的結果集,並消去表中任何重復行。UNION 內部的 SELECT 語句必須擁有相同數量的列,列也必須擁有

Sql語句INexists的區別及應用

應用場景 將不 集中 pre 代碼 根據 gif 效率 .cn   表展示     首先,查詢中涉及到的兩個表,一個user和一個order表,具體表的內容如下:     user表:          order表:        in     確定給定的值是否與子查

MySql語句select可以嵌套麽,字段的重命名可以用中文麽

ply 描述 查詢 select get targe http 查詢語句 字段 今天文檔中看到的查詢語句,SELECT後面又跟了一個SELECT嵌套,而且把字段重命名為中文,請問可以這樣做麽

SQLServerexistsexcept用法

sqlserver sql 一、exists1.1 說明EXISTS(包括 NOT EXISTS)子句的返回值是一個BOOL值。EXISTS內部有一個子查詢語句(SELECT ... FROM...),我將其稱為EXIST的內查詢語句。其內查詢語句返回一個結果集。EXISTS子句根據其內查詢語句的結果

SQL語句existsin的區別

splay 比較 server for target 空值 不存在 依次 第一個 轉自https://www.cnblogs.com/liyasong/p/sql_in_exists.html 和 http://blog.csdn.net/lick4050312/artic

Python3x: setunionupdate的區別

多個 影響 叠代 但是 nio 新的 style pytho bsp set中union和update方法都是將多個可叠代的對象合並,但是返回的結果和對初始對象的影響卻不一樣 # union() 方法 - a.union(b) 將集合a和集合b取並集,並將並集作為一個新的對

JAVAthissuper用法

出現 子句 package code rgs lean 眼睛 都是 java對象   參考網上資料和自行理解總結java中this和super中各自用法及其差異   <一>. this的用法   構造方法是創建java對象的重要途徑,通過new關鍵字調用構造器

sql查詢語句onwhere的區別

運算 www span 多表 速度 分享 執行 最終 .com   數據庫在通過連接兩張或多張表來返回記錄時,都會生成一張中間的臨時表,然後再將這張臨時表返回給用戶。 在使用left jion時,on和where條件的區別如下: on條件是在生成臨時表時使用的條件,它不管

sql語句select……as的用法

inf 語句 技術分享 png info select lec src ima sql語句中select……as的用法

PostgreSQLUNIONUNION ALL

在SQL中,UNION和UNION ALL運算子可以用來幫助我們獲取多個表,並將結果放入一個表中,其中包含所有匹配的列。如果希望結果作為單個記錄集返回,則使用此運算子會非常有幫助。 何時應該使用Union? 當多個表具有相同的結構但由於某種原因(通常出於效能考慮或存檔目的)而被拆分時,通