網站首頁 編程語言 正文
前言
連接查詢是關系數據中最主要的查詢,包括內連接、外連接等。通過連接運算符可以實現多個表查詢。
正文
連接查詢主要分為三種:內連接、外連接、交叉連接。
內連接
使用比較運算符(包括=
、>
、<
、<>
、>=
、<=
、!>
和!<
)進行表間的比較操作,查詢與連接條件相匹配的數據。根據所使用的比較方式不同,內連接分為等值連接、自然連接和自連接三種。
關鍵字 INNER JOIN
等值連接/相等連接
使用”=”關系將表連接起來的查詢,其查詢結果中列出被連接表中的所有列,包括其中的重復列
SELECT PM_ACT_JOB_RLS.*, PM_ACT_RLS.* FROM PM_ACT_JOB_RLS INNER JOIN PM_ACT_RLS ON PM_ACT_JOB_RLS.RlsPK = PM_ACT_RLS.RlsPK
自然連接
等值連接中去掉重復的列,形成的連接
SELECT PM_ACT_JOB_RLS.JobPK, PM_ACT_RLS.RlsPK, RlsName FROM PM_ACT_JOB_RLS INNER JOIN PM_ACT_RLS ON PM_ACT_JOB_RLS.RlsPK = PM_ACT_RLS.RlsPK
自連接
如果在一個連接查詢中,設計到的兩個表都是同一個表,這種查詢稱為自連接查詢。
--c1、c2邏輯上是兩張表,物理上是一張表 SELECT c1.CategoryID, c1.CategoryName FROM [dbo].[Category] c1 INNER JOIN [dbo].[Category] c2 ON c1.[CategoryID] = c2.[ParentID]
外連接
內連接只返回滿足連接條件的數據行,外連接不只列出與連接條件相匹配的行,而是列出左表(左外連接時)、右表(右外連接時)或兩個表(全外連接時)中所有符合搜索條件的數據行。外連接分為左外連接、右外鏈接、全外連接三種。
左外連接
返回左表中的所有行,如果左表中行在右表中沒有匹配行,則在相關聯的結果集中右表的所選擇字段均為NULL。
關鍵字 LEFT [OUTER] JOIN
--左外連接 --1679條數據 SELECT me.*, mo.* FROM MM_LOTS_EXT AS me LEFT OUTER JOIN MM_LOT_OPERATIONS AS mo ON me.LotID = mo.SerialNumber
注意:
left join中關于where和on條件的幾個知識點:
- 多表left join是會生成一張臨時表,并返回給用戶
- where條件是針對最后生成的這張臨時表進行過濾,過濾掉不符合where條件的記錄
- on條件是對left join的右表進行條件過濾,但依然返回左表的所有行,右表中沒有的補為NULL
- on條件中如果有對左表的限制條件,
無論條件真假,依然返回左表的所有行
,但是會影響右表的匹配值
。也就是說on中左表的限制條件只影響右表的匹配內容,不影響返回行數
。
實例:
SELECT g.*,f.* FROM groups g LEFT JOIN factor f ON f.groupId = g.id and f.isDel=0 where g.isDel=0
結論:
1.對左表添加條件限制需在where條件中添加,不能放到on后面
2.對右表添加條件限制需放到on后面,在where條件中添加會有數據行數差異出現問題。
右外連接
返回右表中的所有行,如果右表中行在左表中沒有匹配行,則在左表中相關字段返回NULL值。
關鍵字 RIGHT [OUTER] JOIN
--右外連接 --209條數據 SELECT me.*, mo.* FROM MM_LOTS_EXT AS me RIGHT OUTER JOIN MM_LOT_OPERATIONS AS mo ON me.LotID = mo.SerialNumber
全外連接/完全外連接
返回兩個連接中所有的記錄數據,是左外連接和右外連接的并集。
關鍵字 FULL [OUTER] JOIN
--全外連接 --1816條數據 SELECT me.*, mo.* FROM MM_LOTS_EXT AS me FULL OUTER JOIN MM_LOT_OPERATIONS AS mo ON me.LotID = mo.SerialNumber
交叉連接/笛卡爾積
兩個表做笛卡爾積,得到的結果集的行數是兩個表的行數的乘積。
關鍵字 CROSS JOIN
--笛卡爾積 (cross join后加條件只能用where,不能用on) --45條數據(9*5) SELECT * FROM PM_ACT_JOB_RLS CROSS JOIN PM_ACT_RLS
注意:帶有where條件的子句,往往會先生成兩個表行數乘積的數據表,然后從根據where條件從中選擇。
當數據量比價大的時候,笛卡爾積操作會很消耗數據庫的性能
總結
連接查詢是關系型數據庫中的一個重要標志,這次和大家一起復習多表查詢的幾種操作,希望給您帶來幫助!
原文鏈接:https://blog.csdn.net/weixin_43847283/article/details/123952505
相關推薦
- 2022-10-26 Go?REFLECT?Library反射類型詳解_Golang
- 2022-05-09 Go語言context上下文管理的使用_Golang
- 2022-09-07 Go編寫定時器與定時任務詳解(附第三方庫gocron用法)_Golang
- 2022-08-29 Python如何利用pandas讀取csv數據并繪圖_python
- 2022-07-13 rsync下行同步+inotify實時同步部署
- 2022-03-15 Docker run App的時候 WARNING: IPv4 forwarding is dis
- 2022-06-24 Python+matplotlib實現簡單曲線的繪制_python
- 2023-07-28 select 框添加樹結構(todu)
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支