1. 程式人生 > >MySQL 筆記5 -- 多表查詢

MySQL 筆記5 -- 多表查詢

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!