多表查詢
多表關系
項目開發(fā)中,在進行數(shù)據(jù)庫表結構設計時,會根據(jù)業(yè)務需求及業(yè)務模塊之間的關系,分析并設計表結構,由于業(yè)務之間相互關聯(lián),所以各個表結構之間也存在則會各種聯(lián)系。
一對多/多對一
- 案例:部門與員工的關系
- 關系:一個部門對應多個員工,一個員工對應一個部門
- 實現(xiàn):在多的一方建立外鍵,指向一的一方的主鍵
多對多
- 案例:學生與課程的關系
- 關系:一個學生可以選修多門課程,一門課程也可以供多個學生選擇
- 實現(xiàn):建立第三張中間表,中間表至少包含兩個外鍵,分別關聯(lián)兩方主鍵
一對一
- 案例:用戶與用戶詳情的關系
- 關系:一對一關系,多用于單表拆分,將一份表的基礎字段放在一張表中,其他詳情字段放在另一張表中,以提升操作效率
- 實現(xiàn):在任意一方加入外鍵,關聯(lián)另外一方的主鍵,并且設置外鍵為唯一UNIQUE
笛卡爾積
A集合和B集合的所有組合情況;在多表查詢中,需要消除無效的笛卡爾積,只保留兩張表關聯(lián)部分的數(shù)據(jù)。
select * from tableA , tableB where tableA.字段 = tableB.字段
內連接
查詢兩張表交集部分的數(shù)據(jù),即下圖中綠色部分的數(shù)據(jù)
//隱式內連接
select 字段列表 from tableA , tableB where 條件列表;
//顯式內連接
select 字段列表 from tableA [inner] join tableB on 連接條件;
左外連接
查詢左表的所有數(shù)據(jù)和兩張表交集部分的數(shù)據(jù)。
右外連接
查詢右表的所有數(shù)據(jù)和兩張表交集部分的數(shù)據(jù)。
//左外連接
select 字段列表 from tableA left [outner] join tableB on 連接條件;
//右外連接
select 字段列表 from tableA right [outner] join tableB on 連接條件
-- 左外連接和右外連接是可以相互替換的,在需要在SQL語句中調整表結構的先后順序即可。在日常開發(fā)中更偏向于左外連接。
自連接
自己連接自己,把一張表連接查詢多次。
select 字段列表 from tableA 別名A join tableA 別名B on 連接條件 ... ;
-- 自連接查詢中,必須要為表起別名,要不然不清楚所指定的的條件、返回的字段屬于哪一張表的字段
聯(lián)合查詢
把多次查詢的結果合并起來,形成一個新的查詢結果集
select 字段列表 from 表A ...
union [all]
select 字段列表 from 表B ... ;
--! 如果多條查詢語句查詢出來的結果、字段數(shù)量不一致,在進行union [all]聯(lián)合查詢時,將會報錯。
# union 可以去除重復記錄結果
# union all 合并操作效率更高
子查詢
在SQL語句中嵌套SELECT語句,稱為嵌套查詢/子查詢。SQL中允許多重嵌套。文章來源:http://www.zghlxwxcb.cn/news/detail-718598.html
標量子查詢
- 子查詢返回的結果是單個值(數(shù)字、字符串、日期等)
- 常用操作符:
==
、<>
、>
、>=
、<
、<=
列子查詢
- 子查詢返回的結果是一列,可以是多行。
- 常用操作符:
IN
、NOT IN
、ANY
、SOME
、ALL
操作符 | 描述 |
---|---|
IN | 在指定的集合范圍之內,多選一 |
NOT IN | 不在指定的集合范圍之內 |
ANY/SOME | 子查詢返回列表中,有任意一個滿足即可 |
ALL | 子查詢返回列表的所有值都必須滿足 |
行子查詢
- 子查詢返回的結果是一行,可以是多列
- 常用操作符:
==
、<>
、>
、>=
、<
、<=
- 把返回的一行記錄中的多個字段的組合看作一個結果,等同于標量子查詢
表子查詢
- 子查詢返回的結果是多行多列。
- 常用操作符:
IN
代碼示例
select * from emp where dept_id = (select id from dept where name = '銷售部');
select * from emp
where dept_id = (select id from dept where name = '銷售部' or name ='市場部');
select * from emp
where (salary, managerid) = (select salary, managerid from emp where name = '張無忌');
select * from emp
where (job, salary) in (select job, salary from emp where name='鹿仗客' or name = '宋遠橋');
select e.*, d.*
from (select * from emp where entrydate > '2006-01-01') e
left join dept d on e.dept_id = d_id;
數(shù)據(jù)庫MySQL(一):基礎知識
數(shù)據(jù)庫MySQL(二):DDL數(shù)據(jù)定義語言
數(shù)據(jù)庫MySQL(三):DML、DQL、DCL
數(shù)據(jù)庫MySQL(四):表中字段約束和外鍵約束
數(shù)據(jù)庫MySQL(五):多表查詢
數(shù)據(jù)庫MySQL(六):事務文章來源地址http://www.zghlxwxcb.cn/news/detail-718598.html
到了這里,關于數(shù)據(jù)庫MySQL(五):多表查詢的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!