MySQL 笔记5 -- 多表查询
生活随笔
收集整理的這篇文章主要介紹了
MySQL 笔记5 -- 多表查询
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
MySQL 筆記5 – 多表查詢
MySQL 系列筆記是筆者學習、實踐MySQL數據庫的筆記
課程鏈接: 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!
與50位技術專家面對面20年技術見證,附贈技術全景圖
總結
以上是生活随笔為你收集整理的MySQL 笔记5 -- 多表查询的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL 笔记4 -- 数据完整性
- 下一篇: linux cmake编译源码,linu