1. 程式人生 > >Mysql中的關聯查詢(內連線,外連線,自連線)

Mysql中的關聯查詢(內連線,外連線,自連線)

在使用資料庫查詢語句時,單表的查詢有時候不能滿足專案的業務需求,在專案開發過程中,有很多需求都是要涉及到多表的連線查詢,總結一下mysql中的多表關聯查詢

一,內連線查詢

是指所有查詢出的結果都是能夠在連線的表中有對應記錄的。

以t_employee(員工表)和t_dept(部門表)為例:

t_employee表中的記錄如下:dept代表該員工所在的部門


t_dept表中記錄如下:


可以發現,其中人力資源部裡沒有員工(這裡只是舉例,可能與實際不符,但主要在於邏輯關係),而趙七沒有對應的部門,現在想要查詢出員工姓名以及其對應的部門名稱:

此時,就要使用內連線查詢,關鍵字(inner join)

在這裡說一下關聯查詢sql編寫的思路,1,先確定所連線的表,2,再確定所要查詢的欄位,3,確定連線條件以及連線方式

select 
e.empName,d.deptName
from t_employee e
INNER JOIN t_dept d
ON e.dept = d.id;
查詢的結果如下:


其中,沒有部門的人員和部門沒有員工的部門都沒有被查詢出來,這就是內連線的特點,只查詢在連線的表中能夠有對應的記錄,其中e.dept = d.id是連線條件

二,左外連線查詢

是指以左邊的表的資料為基準,去匹配右邊的表的資料,如果匹配到就顯示,匹配不到就顯示為null。例如:

查詢所有員工姓名以及他所在的部門名稱:在內連線中趙七沒有被查出來,因為他沒有對應的部門,現在想要把趙七也查出來,就要使用左外連線:

SELECT e.empName,d.deptName
from t_employee e
LEFT OUTER JOIN t_dept d 
on d.id = e.dept;
在這裡,t_employee就是左表,也就是基準表,用基準表的資料去匹配右表的資料,所以左表的記錄是全部會查詢出來的,如果右表沒有記錄對應的話就顯示null

查詢結果:


關鍵字是left outer join,等效於left join,在關聯查詢中,做外連線查詢就是左連線查詢,兩者是一個概念

三,右外連線是同理的,只是基準表的位置變化了而已

比如:查詢所有的部門和對應的員工:

SELECT e.empName,d.deptName
from t_employee e
RIGHT OUTER JOIN t_dept d 
on d.id = e.dept;
這裡只是把left修改成了right,但是基準表變化了,是以右表的資料去匹配左表,所以左外連線能做到的查詢,右外連線也能做到
查詢結果:


四,全外連線

顧名思義,把兩張表的欄位都查出來,沒有對應的值就顯示null,但是注意:mysql是沒有全外連線的(mysql中沒有full outer join關鍵字),想要達到全外連線的效果,可以使用union關鍵字連線左外連線和右外連線。例如:

select e.empName,d.deptName
     FROM t_employee e 
     left JOIN t_dept d
     ON e.dept = d.id
UNION
select e.empName,d.deptName
     FROM t_employee e 
     RIGHT JOIN t_dept d
     ON e.dept = d.id;
查詢結果:


如果在oracle中,直接就使用full outer join關鍵字連線兩表就行了

五,自連線查詢

自連線查詢就是當前表與自身的連線查詢,關鍵點在於虛擬化出一張表給一個別名

例如:查詢員工以及他的上司的名稱,由於上司也是員工,所以這裡虛擬化出一張上司表

SELECT e.empName,b.empName
     from t_employee e
     LEFT JOIN t_employee b
     ON e.bossId = b.id;
查詢結果:

在這裡,b表是虛擬化出的表,我們可以通過查詢瞭解b表的記錄:

SELECT e.empName,b.empName,b.*
     from t_employee e
     LEFT JOIN t_employee b
     ON e.bossId = b.id;
查詢結果:


後面的四個欄位就是虛擬化出的b表的所有記錄,但看這四個欄位其實就是記錄所有是上司的員工的資訊

所以,自連線查詢一般用作表中的某個欄位的值是引用另一個欄位的值,比如許可權表中,父許可權也屬於許可權。

相關推薦

Mysql關聯查詢(連線連線連線)

在使用資料庫查詢語句時,單表的查詢有時候不能滿足專案的業務需求,在專案開發過程中,有很多需求都是要涉及到多表的連線查詢,總結一下mysql中的多表關聯查詢 一,內連線查詢 是指所有查詢出的結果都是能夠在連線的表中有對應記錄的。 以t_employee(員工表)和t_dept

Mysql關聯查詢(連接連接連接)

總結 lin 很多 內連接 rfi union 項目 nbsp 技術 Mysql中的關聯查詢(內連接,外連接,自連接) 在使用數據庫查詢語句時,單表的查詢有時候不能滿足項目的業務需求,在項目開發過程中,有很多需求都是要涉及到多表的連接查詢,總結一下mysql中的多表

mysql怎麼查詢出昨天明天五天一週,三個月,半年的數

SELECT * FROM table where inputtime>DATE_SUB(CURDATE(), INTERVAL 1 WEEK) --一週 where inputtime>DATE_SUB(CURDATE(), I

MySQL 關聯查詢 連接

sele 記錄 組合 part lec 例子 進行 拼接 交叉連接 內連接 [INNER| CROSS] JOIN無條件內連接:無條件內連接,又名交叉連接/笛卡爾連接第一張表種的每一項會和另一張表的每一項依次組合#例:mysql> select * fro

連線連結(左連線、右連線、全連線交叉連線大總結

1.什麼是連線查詢呢?     概念:根據兩個表或多個表的列之間的關係,從這些表中查詢資料。     目的:實現多個表查詢操作。 2.分類: 首先劃分一下,連線分為三種:內連線、外連線、交叉連線  內連線(INNER JOIN):     分為三種:等

mysql怎麼查詢出一週,三個月,半年的資料

SELECT * FROM table where inputtime>DATE_SUB(CURDATE(), INTERVAL 1 WEEK) --一週 where inputtime>DATE_SUB(CURDATE(), INTERVAL 3 MONTH)

mysql高效查詢(left join 和 group by)前提是加了索引

mysql犧牲了group by來增加left join的速度(前提是加了索引)。 user表:10萬資料 例項1: 200秒左右 SELECT U.id, A.favorite_count FR

mysql模糊查詢的四種用法介紹

包含 如果 正則 搜索 name 模糊查詢 長度 use mysql 下面介紹mysql中模糊查詢的四種用法: 1,%:表示任意0個或多個字符。可匹配任意類型和長度的字符,有些情況下若是中文,請使用兩個百分號(%%)表示。 比如 SELECT * FROM [user] W

mysql利用sql語句修改字段名稱字段長度等操作

HA change 是我 重構 不為 ble 技術 網站重構 add 在網站重構中,通常會進行數據結構的修改,所以添加,刪除,增加mysql表的字段是難免的,有時為了方便,還會增加修改表或字段的註釋,把同字段屬性調整到一塊兒。這些操作可以在phpmyadmin或者別的mys

mysql查詢結果新增序號列

 生成一個欄位(非表中欄位)用以記錄排序   【類比為oracle資料庫中的rownum】     MySQL中一個表(表名:stuscore)     欄位有:id(主鍵)、stuid(學號)、sname(學生姓名)、subject(課程名稱)、score(分

Mysql 使用 FIND_IN_SET 建函式 的情景

有這樣的一個場景,商品與類別,一個商品可能可以分類到幾個類別中,假設商品數量比較大,所有類別的種類也比較多, 那麼建立商品與類別的關聯關係如果是中間表建立關係的話,可能的表資料據時最大可能是 商品總數量*總類別數量的笛卡兒積。或者另一種方式就是在商品表中增加一個類別的欄位,這個欄位可以儲存逗號分隔

java關於類(部類部類匿名類)的相關面試題

一個“.java”原始檔中是否可以包含多個類(不是內部類)?有什麼限制? 答:可以,但一個原始檔中最多隻能有一個公開類(public class)而且檔名必須和公開類的類名完全保持一 致。 Anonymous Inner Class(匿名內部類)是否可以繼承其它類?是否可以實現介面

Python四種建資料型別(listtuplesetdict)的區別

List     list是一種有序集合,能隨時新增或刪除其中的元素,元素型別可以不一樣,也可以定義一個空list     構造list直接用[ ]將list的所有元素括起來,用逗號分割;通常把list賦值給

mysql分組查詢和分組篩選(講義)

----分組查詢&篩選學習: --關鍵字:group by 分組欄位名,分組欄位名.... --注意1:使用了分組後,在select語句中只允許出現分組欄位和多行函式。 --注意2:如果是多欄位分組,則先按照第一欄位分組,

【數據庫】主鍵主表從表關聯父表子表

了解 identity 得到 信息 自動刪除 upload aid 時也 聽說 轉自:https://www.2cto.com/database/201707/662425.html 一、前言 在數據庫設計中,hibernate,iBatis等ORM框架的使用中經常聽說主鍵

網與廣域網與區域網

關於內網和外網 網上經常看到有人問內網和外網的區別,其實外網和內網的概念很模糊,全看你怎麼理解。希望這篇文章能幫助大家明確一些概念 簡單的說,自己的單位或者家庭、小區內部有區域網;單位、家庭之外有覆蓋範圍極大的網路,比如internet,這個大網路延伸到了我們的單位、家庭(通過光纖、網線、電話線等)

表的連線連結(左連線和右連線

表的內連線 內連線是利用where子句對兩種表形成的笛卡爾積進行篩選。 select 欄位 from 表1 inner join 表2 on 連線條件 and 其他條件; inner可以省略 and可以換成where 例:顯示SMITH的名字和部門名稱 emp表: dept表:

mysql模糊查詢用instr

在mysql中使用內部函式instr,可代替傳統的like方式查詢,並且速度更快。 instr函式,第一個引數是欄位,第二個引數是要查詢的串,返回串的位置,第一個是1,如果沒找到就是0. 例如,查詢欄位name中帶”軍”的名字,傳統的方法是: select name

mysql使用聚合函式結果集為空仍顯示size為1所有元素為Null問題的解決

1.不使用聚合函式sql:select * from sys_role_data a left JOIN sys_office b  ON a.office_id = b.id  LEFT JOIN sys_role c   on a.role_id = c.id   WHE

mysql的COUNT()組函式、IFNULL()函式顯示引擎檢視資料庫版本等等

#COUNT()函式,或者說組函式/聚合函式/統計函式會忽略null值,即不把null值算進來 SELECT COUNT(commission_pct), COUNT(department_id), COUNT(*)FROM employees; /* MySQL中的IFNULL函式類似於Ora