MySql學習筆記二 3.6.連接查詢 又稱多表查詢,當查詢的欄位來自於多個表時,就會用到連接查詢 連接查詢分類標準: 按年代分類:sql92標準(僅支持內連接), sql99標準(支持內連接,外連接中的左外連接和右外連接,交叉連接) sql99語法 按功能分類: 內連接:等值連接,非等值連接, ...
MySql學習筆記二
3.6.連接查詢
又稱多表查詢,當查詢的欄位來自於多個表時,就會用到連接查詢
連接查詢分類標準:
按年代分類:sql92標準(僅支持內連接), sql99標準(支持內連接,外連接中的左外連接和右外連接,交叉連接)
sql99語法
Select 查詢列表
from 表一(別名) 連接類型
join 表二(別名)
on 連接條件
(where 篩選條件)
(group by 分組)
(having 篩選條件)
(order by 排序列表)
按功能分類:
內連接:等值連接,非等值連接,自連接
外連接:左外連接,右外連接,全外連接
交叉連接
表一
A | B | C |
---|---|---|
A1 | B1 | C1 |
A2 | B2 | C2 |
A3 | B3 | C3 |
表二
A | D | E |
---|---|---|
A2 | D2 | E2 |
A3 | D3 | E3 |
A4 | D4 | E4 |
3.6.1.內連接
在sql99中內連接為 inner
內連接中的示例語法都是sql92語法
A | B | C | A | D | E |
---|---|---|---|---|---|
A1 | B1 | C1 | A2 | D2 | E2 |
A1 | B1 | C1 | A3 | D3 | E3 |
A1 | B1 | C1 | A4 | D4 | E4 |
A2 | B2 | C2 | A2 | D2 | E2 |
A2 | B2 | C2 | A3 | D3 | E3 |
A2 | B2 | C2 | A4 | D4 | E4 |
A3 | B3 | C3 | A2 | D2 | E2 |
A3 | B3 | C3 | A3 | D3 | E3 |
A3 | B3 | C3 | A4 | D4 | E4 |
3.6.1.1.等值連接
Select 查詢列表 from 表1, 表2.... where 連接條件 AND 篩選條件
這裡的連接條件是A表的欄位和B表的欄位相等的條件
先經過笛卡爾連接,再把符合連接條件的條目篩選出來
如果根據兩個表中的A位篩選條件的話,結果如下:
1.A | B | C | 2.A | D | E |
---|---|---|---|---|---|
A2 | B2 | C2 | A2 | D2 | E2 |
A3 | B3 | C3 | A3 | D3 | E3 |
3.6.1.2.非等值連接
Select 查詢列表 from 表1, 表2.... where 連接條件 AND 篩選條件
這裡的連接條件是A表的欄位和B表的除了相等外的別的條件,比如說>, < 等
3.6.1.3.內連接
就是上面表一和表二換成兩張相同的表,然後進行笛卡爾連接
再根據連接條件篩選出來合適的條目
3.6.2.外連接
一般用於查詢一個表中有,而另一個表中沒有的數據
3.6.2.1.左外連接
以一個表為基準,然後基準表中的每一條數據去匹配另一張表中的每一條數據。
當基準表的一條數據與另一張表的一條數據符合連接條件時,保存下來,之後接著向下匹配另一張表的數據。
如果沒有找到像匹配的數據,則該條數據連接後的另一張表的欄位值都為空。
連接類型:left (outer)
表一 left jion 表二 on 1.A = 2.A
1.A | B | C | 2.A | B | C |
---|---|---|---|---|---|
A1 | B1 | C1 | NULL | NULL | NULL |
A2 | B2 | C2 | A2 | D2 | E2 |
A3 | B3 | C3 | A3 | D3 | E3 |
3.6.2.2.右外連接
原理跟左外連接相似
連接類型:right (outer)
表一 rightjion 表二 on 1.A = 2.A
1.A | B | C | 2.A | B | C |
---|---|---|---|---|---|
A2 | B2 | C2 | A2 | D2 | E2 |
A3 | B3 | C3 | A3 | D3 | E3 |
NULL | NULL | NULL | A4 | D4 | E4 |
3.6.2.3.全外連接
mysql語言不支持 FULL (outer)
兩個表相互用映射,然後可以把兩個表沒有匹配到的數據都輸出出來,相當於左連接加右連接
具體效果如下表:
1.A | B | C | 2.A | B | C |
---|---|---|---|---|---|
A1 | B1 | C1 | NULL | NULL | NULL |
A2 | B2 | C2 | A2 | D2 | E2 |
A3 | B3 | C3 | A3 | D3 | E3 |
NULL | NULL | NULL | A4 | D4 | E4 |
3.6.3.交叉連接
Cross Join 相當於使用sql99標準實現笛卡爾連接
3.7.子查詢
出現在其他語句中的select語句,稱為子查詢或內查詢,外部的查詢語句成為外查詢或主查詢
出現位置:select後,from後,where或having後,exists後(相關子查詢)
按結果集的行數不同分為:標量子查詢(結果只有一列一行),列子查詢(結果集只有一列多行),
行子查詢(結果集有一行多列) 表子查詢(結果集一般為多行多列)
3.7.1.where或having後
- 標量子查詢(單行子查詢)
- 列子查詢(多行子查詢)
- 行子查詢(多列多行)
特點:
- 子查詢放在小括弧內
- 子查詢一般放在條件的右側
- 標量子查詢一般搭配著單行操作符使用:> < >= <= = <>
- 列子查詢一般搭配著多行操作符使用 IN, NOT IN, ANY/SOME, ALL
- 子查詢的執行優先於主查詢執行,主查詢的條件用到了子查詢的結果
標量子查詢部分示例
where (或 having) (判斷條件 AND) 與子查詢比較的篩選內容 單行操作符 (標量子查詢)
列自查詢部分示例
where (或 having) (判斷條件 AND) 與子查詢比較的篩選內容 多行操作符 (標量子查詢)
行子查詢部分示例
where (或 having) (判斷條件 AND)
(與子查詢比較的篩選內容1, 與子查詢比較的篩選內容2, ...) 操作符
(Select 與子查詢比較的篩選內容1, 與子查詢比較的篩選內容2, ...
from ......
where .....
)
3.7.2.Select後
select 後面的子查詢只返回一個欄位一條數據,結果具有唯一性,即標量子查詢
示例
select 查詢列表, (標量子查詢)......
這裡的標量子查詢將的結果將添加在主查詢的每行數據中
其中標量子查詢可以用於解決:聚合函數無法和分組後沒有出現的欄位
一起使用的問題
3.7.3.From後
From後面可以放各種類型的結果集,但是要符合題意的要求,在這裡就是把結果集當成一張新表進行查詢
示例
select 查詢列表 from (子查詢) ......
3.7.4.exists後
exists又叫相關子查詢,它不關心後面子查詢的類型,只關心子查詢是否存在內容,如果存在返回1,不存在返回0
示例
exists(完整子查詢語句)
相關子查詢先查詢外查詢再執行子查詢
3.8.分頁查詢
當顯示的數據,一頁顯示不全,需要分頁提交sql請求
語法
Select 查詢列表
from 表名 (連接查詢....)
(where 篩選條件)
(group by 分組欄位)
(having 篩選條件)
(order by 排序的欄位)
limit (offset,) size
offset:要顯示條目的起始索引 ,這裡的索引是從0開始
size:表示要顯示的條目個數
limit是放在查詢語句的最後,實際應用傳參時一般是 limit (page - 1) * size, size
3.9.聯合查詢
union 聯合,合併:將多條查詢語句的結果合併成一個結果
通常用於要查詢的內容來自多個表,並且表之間沒有直接的連接關係,但查詢的信息一致
查詢語句1
union
查詢語句2
union
查詢語句3
....
查詢語句n;
等價於
select 查詢列表 from 表名 where 篩選條件1 or 篩選條件2 .... 篩選條件n
各個查詢語句的結果中,列數必須相同,列名與第一條查詢語句設置的列名相同
聯合查詢會去掉重覆的數據,如果不想去重可以用 union all 來保留重覆項