MySQL基礎:多表查詢
多表關系
- 概述
? 專案開發中,在進行資料庫表結構設計時,會根據業務需求及模塊之間的關系,分析并設計表結構,由于業務之間相互關聯,所以各個表結構之間也存在著各種聯系,基本上分為三種:
- 一對多(多對一)
- 多對多
- 一對一
-
一對多(多對一)
- 案例:部門與員工的關系
- 關系:一個部門對應多個員工,一個員工對應一個部門
- 實作:在多(N)的一方建立外鍵,指向一的一方的主鍵
-
多對多
- 案例:學生與課程的關系
- 關系:一個學生可以選修多門課程,一門課程也可以供多個學生選擇
- 實作:建立第三張中間表,中間表至少包含兩個外鍵,分別關聯兩方主鍵
-
一對一
- 案例:用戶與用戶詳情的關系
- 關系:一對一關系,多用于單表拆分,將一張表的基礎欄位放在一張表中,其他詳情欄位放在另一張表中,以提升操作效率
- 實作:在任意一方加入外鍵,關聯另外一方的主鍵,并且設定外鍵為唯一的(UNIQUE)
多表查詢概述
- 概述:指從多張表中查詢資料,
- 笛卡爾積:笛卡爾乘積是指在數學中,兩個集合A集合和B集合的所有組合情況(在多表查詢時,需要消除無效的笛卡爾積)
例子:
select * from emp,dept where emp.dept_id = dept.id;
-
多表查詢分類
-
子查詢
-
連接查詢
-
自連接:當前表與自身的連接查詢,自連接必須使用表別名
-
內連接:相當于查詢A、B交集部分資料
-
外連接:
- 左外連接:查詢左表所有資料,以及兩張表交集部分資料
- 右外連接:查詢右表所有資料,以及兩張表交集部分資料
-
-
連接查詢--內連接
內連接查詢的是兩張表交集的部分,
- 內連接查詢語法
- 隱式內連接
SELECT 欄位串列 FROM 表1,表2 WHERE 條件...;
- 顯式內連接
SELECT 欄位串列 FROM 表1 [INNER] JOIN 表2 ON 連接條件...;
連接查詢-外連接
- 外連接查詢語法:
- 左外連接
SELECT 欄位串列 FROM 表1 LEFT [OUTER] JOIN 表2 ON 條件...;
相當于查詢表1(左表)的所有資料,包含表1和表2交集部分的資料,
- 右外連接
SELECT 欄位串列 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 條件...;
相當于查詢表2(右表)的所有資料,包含表1和表2交集部分的資料,
連接查詢-自連接
自連接查詢語法:
SELECT 欄位串列 FROM 表A 別名A JOIN 表A 別名B ON 條件...;
自連接查詢,可以是內連接查詢,也可以是外連接查詢,
聯合查詢-union,uinon all
對于union查詢,就是把多次查詢的結果合并起來,形成一個新的查詢結果集,
SELECT 欄位串列 FROM 表A ...
UNION [ALL]
SELECT 欄位串列 FROM 表B ...;
注意:
-
union all是直接將查詢的結果合并,union會對合并之后的結果去重,
-
對于聯合查詢的多張表的列數必須保持一致,欄位型別也需要保持一致,
子查詢
- 概念:SQL陳述句中嵌套SELECT陳述句,稱為嵌套查詢,又稱子查詢,
SELECT * FROM 表1 WHERE column1 = (SELECT column1 FROM 表2);
子查詢外部的陳述句可以是INSERT/UPDATE/DELETE/SELECT的任何一個,
-
根據子查詢結果不同,分為:
- 標量子查詢(子查詢結果為單個值)
- 列子查詢(子查詢結果為一列)
- 行子查詢(子查詢結果為一行)
- 表子查詢(子查詢結果為多行多列)
-
根據子查詢的位置,分為:WHERE之后、FROM之后、SELECT之后,
標量子查詢
子查詢回傳的結果是單個值(數字、字串、日期等),最簡單的形式,這種子查詢稱為標量子查詢,
常用的運算子:= <> > >= < <=
列子查詢
子查詢回傳的結果是一列(可以是多行),這種子查詢稱為列子查詢,
常用的運算子:IN、NOT IN、ANY、SOME、ALL
| 運算子 | 描述 |
|---|---|
| IN | 在指定的集合范圍之內,多選一 |
| NOT IN | 不在指定的集合范圍之內 |
| ANY | 子查詢回傳串列中,有任意一個滿足即可 |
| SOME | 與ANY等同,使用SOME的地方都可以使用ANY |
| ALL | 子查詢回傳串列的所有值都必須滿足 |
行子查詢
子查詢回傳的結果是一行(可以是多列),這種子查詢稱為行子查詢,
常用的運算子:=、<>、NOT、NOT IN
例子:
-- 查詢單行資料
select * from emp where (salary,managerid) = (select salary,managerid from emp where name='張無忌');
表子查詢
子查詢回傳的結果是多行多列,這種子查詢稱為表子查詢,
常用的運算子:IN
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/547855.html
標籤:其他
上一篇:MongoDB基礎
