MySQL 筆記5 -- 多表查詢
阿新 • • 發佈:2018-12-20
MySQL 筆記5 – 多表查詢
MySQL 系列筆記是筆者學習、實踐MySQL資料庫的筆記
一、表之間關係
1、一對一
- 單獨的一張表
- 與其它表沒有關係
2、一對多
- 一條資訊和其它多條資訊有關係
- 一張個人資訊表可以和另一張表關聯,比如:資產表,人際關係表
- 通過新增主鍵和外來鍵實現
3、多對多
- 多條資訊和其它多條資訊有關係
- 學生的資訊表和可選課表,一個學生可選多門課,一門課可以被多個學生選
- 需要一張中間表,在兩張表中各新增一個主鍵,在中間表新增兩個外來鍵
二、多表查詢
1、合併結果集
**合併結果集:**把兩個select語句的查詢結果按照行堆疊合併到一起,被合併的兩個表的列數、列型別必須相同
合併結果集的兩種方式:
- UNION:合併時去除重複記錄
- UNION ALL:合併時不去除重複記錄
格式:
格式 | 說明 |
---|---|
SELECT * FROM 表1 UNION SELECT * FROM 表2; | 合併表且去重 |
SELECT * FROM 表1 UNION ALL SELECT * FROM 表2; | 合併表且不去重 |
示例:
# 建立兩個表,表頭一樣 CREATE TABLE a(name VARCHAR(5),score INT); CREATE TABLE b(name VARCHAR(5),score INT); INSERT INTO a VALUES('a', 10), ('b', 20), ('c', 30); INSERT INTO b VALUES('a', 10), ('b', 20), ('d', 40); # 去重合並 SELECT * FROM a UNION SELECT * FROM b; # 不去重合並 SELECT * FROM a UNION ALL SELECT * FROM b;
2、連線查詢
連線查詢: 也可以叫跨表查詢,需要關聯多個表進行查詢
笛卡爾集:
- 每個集合的所有元素和其它集合的每個元素組合,可以擴充套件到多個集合的情況。設A={a,b},B={0,1,2},則兩個集合的笛卡爾集為{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}
- 同時查詢兩個表,出現的就是笛卡爾集結果
- 格式:SELECT * FROM 表1,表2
查詢時給表起別名:
- 直接在表名後面新增別名
- 格式:SELECT * FROM 表1 表1別名,表2 表2別名
多表聯查,如何保證資料正確:
- 在查詢時要把主鍵和外來鍵保持一致:SELECT * FROM 表1 表1別名,表2 表2別名 WHERE 表1別名.主鍵名 = 表2別名.外來鍵鍵名
- 這裡的主鍵和外來鍵是名義上的,不需要設定
內連線:
連線型別 | 格式 | 說明 |
---|---|---|
等值連線 | SELECT * FROM 表1 表1別名 INNER JOIN 表2 表2別名 ON 表1別名.列名=表2別名.列名; | 後面還可以有WHERE語句 |
多表連線 | SELECT * FROM 表1 表1別名 INNER JOIN 表2 表2別名 ON 表1別名.列名=表2別名.列名 INNER JOIN 表3 表3別名 ON 表2別名.列名=表3別名.列名; | INNER JOIN … ON 語句可以並列有多個 |
非等值連線 | SELECT * FROM 表1 表1別名 INNER JOIN 表2 表2別名 ON 條件語句; | 可以為任意的條件語句 |
外連線:
- 左連線:左邊表當中的資料全部查出,右邊表當中只查出滿足條件的內容
- 右連線:右邊表當中的資料全部查出,左邊表當中只查出滿足條件的內容
連線型別 | 格式 |
---|---|
左連線 | SELECT * FROM 表1 表1別名 LEFT OUTER JOIN 表2 表2別名 ON 表1別名.列名=表2別名.列名; |
右連線 | SELECT * FROM 表1 表1別名 RIGHT JOIN 表2 表2別名 ON 表1別名.列名=表2別名.列名; |
自然連線:
- 連線查詢會產生無用笛卡爾集,我們通常使用主外來鍵關係等式來去除它
- 自然連線無需你去給出主外來鍵等式,它會自動找到這一等式
- 要求:兩張連線的表中列名稱和型別完全一致的列作為條件,會去除相同的列
3、子查詢
子查詢: 一條語句中有一個 SELECT 語句中包含另一個完整的 SELECT 語句,或兩個以上 SELECT 語句
子查詢出現的位置:
- WHERE後,把 SELECT 查詢出的結果當作另一個 SELECT 的條件值
- FROM後,把查詢出的結果當作一個新表
格式:
位置 | 格式 |
---|---|
WHERE後 | SELECT * FROM 表1 WHERE (欄位s) IN (SELECT 欄位s FROM 表2 WHERE 條件) |
FROM後 | SELECT * FROM (SELECT 欄位s FROM 表2 WHERE 條件) WHERE 條件 |
4、自連線
- 從表中查詢,根據查詢結果再到該表中查詢
格式 |
---|
SELECT * FROM 表 表別名1 表 表別名2 WHERE 表別名1.列名=表別名2.列名 AND 條件2; |
GOOD LUCK!