MySQL 笔记5 -- 多表查询
生活随笔
收集整理的這篇文章主要介紹了
MySQL 笔记5 -- 多表查询
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
MySQL 筆記5 – 多表查詢
MySQL 系列筆記是筆者學(xué)習(xí)、實(shí)踐MySQL數(shù)據(jù)庫(kù)的筆記
課程鏈接: MySQL 數(shù)據(jù)庫(kù)基礎(chǔ)入門教程
參考文檔:
MySQL 官方文檔
一、表之間關(guān)系
1、一對(duì)一
- 單獨(dú)的一張表
- 與其它表沒(méi)有關(guān)系
2、一對(duì)多
- 一條信息和其它多條信息有關(guān)系
- 一張個(gè)人信息表可以和另一張表關(guān)聯(lián),比如:資產(chǎn)表,人際關(guān)系表
- 通過(guò)添加主鍵和外鍵實(shí)現(xiàn)
3、多對(duì)多
- 多條信息和其它多條信息有關(guān)系
- 學(xué)生的信息表和可選課表,一個(gè)學(xué)生可選多門課,一門課可以被多個(gè)學(xué)生選
- 需要一張中間表,在兩張表中各添加一個(gè)主鍵,在中間表添加兩個(gè)外鍵
二、多表查詢
1、合并結(jié)果集
合并結(jié)果集: 把兩個(gè)select語(yǔ)句的查詢結(jié)果按照行堆疊合并到一起,被合并的兩個(gè)表的列數(shù)、列類型必須相同
合并結(jié)果集的兩種方式:
- UNION:合并時(shí)去除重復(fù)記錄
- UNION ALL:合并時(shí)不去除重復(fù)記錄
格式:
| SELECT * FROM 表1 UNION SELECT * FROM 表2; | 合并表且去重 |
| SELECT * FROM 表1 UNION ALL SELECT * FROM 表2; | 合并表且不去重 |
示例:
# 創(chuàng)建兩個(gè)表,表頭一樣 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、連接查詢
連接查詢: 也可以叫跨表查詢,需要關(guān)聯(lián)多個(gè)表進(jìn)行查詢
笛卡爾集:
- 每個(gè)集合的所有元素和其它集合的每個(gè)元素組合,可以擴(kuò)展到多個(gè)集合的情況。設(shè)A={a,b},B={0,1,2},則兩個(gè)集合的笛卡爾集為{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}
- 同時(shí)查詢兩個(gè)表,出現(xiàn)的就是笛卡爾集結(jié)果
- 格式:SELECT * FROM 表1,表2
查詢時(shí)給表起別名:
- 直接在表名后面添加別名
- 格式:SELECT * FROM 表1 表1別名,表2 表2別名
多表聯(lián)查,如何保證數(shù)據(jù)正確:
- 在查詢時(shí)要把主鍵和外鍵保持一致:SELECT * FROM 表1 表1別名,表2 表2別名 WHERE 表1別名.主鍵名 = 表2別名.外鍵鍵名
- 這里的主鍵和外鍵是名義上的,不需要設(shè)置
內(nèi)連接:
- 內(nèi)連接表示兩個(gè)表的地位是一樣的
- 同時(shí)查多個(gè)表,每個(gè)表的符合條件的數(shù)據(jù)形成笛卡爾集
| 等值連接 | SELECT * FROM 表1 表1別名 INNER JOIN 表2 表2別名 ON 表1別名.列名=表2別名.列名; | 后面還可以有WHERE語(yǔ)句 |
| 多表連接 | SELECT * FROM 表1 表1別名 INNER JOIN 表2 表2別名 ON 表1別名.列名=表2別名.列名 INNER JOIN 表3 表3別名 ON 表2別名.列名=表3別名.列名; | INNER JOIN … ON 語(yǔ)句可以并列有多個(gè) |
| 非等值連接 | SELECT * FROM 表1 表1別名 INNER JOIN 表2 表2別名 ON 條件語(yǔ)句; | 可以為任意的條件語(yǔ)句 |
外連接:
- 外連接表示兩個(gè)表的地位是不一樣的
- 左連接:左邊表當(dāng)中的數(shù)據(jù)全部查出(即使不符合條件),右邊表當(dāng)中只查出滿足條件的內(nèi)容
- 右連接:右邊表當(dāng)中的數(shù)據(jù)全部查出(即使不符合條件),左邊表當(dāng)中只查出滿足條件的內(nèi)容
| 左連接 | SELECT * FROM 表1 表1別名 LEFT OUTER JOIN 表2 表2別名 ON 表1別名.列名=表2別名.列名; |
| 右連接 | SELECT * FROM 表1 表1別名 RIGHT JOIN 表2 表2別名 ON 表1別名.列名=表2別名.列名; |
自然連接:
- 連接查詢會(huì)產(chǎn)生無(wú)用笛卡爾集,我們通常使用主外鍵關(guān)系等式來(lái)去除它
- 自然連接無(wú)需你去給出主外鍵等式,它會(huì)自動(dòng)找到這一等式
- 要求:兩張連接的表中列名稱和類型完全一致的列作為條件,會(huì)去除相同的列
3、子查詢
子查詢: 一條語(yǔ)句中有一個(gè) SELECT 語(yǔ)句中包含另一個(gè)完整的 SELECT 語(yǔ)句,或兩個(gè)以上 SELECT 語(yǔ)句
子查詢出現(xiàn)的位置:
- WHERE后,把 SELECT 查詢出的結(jié)果當(dāng)作另一個(gè) SELECT 的條件值
- FROM后,把查詢出的結(jié)果當(dāng)作一個(gè)新表
格式:
| WHERE后 | SELECT * FROM 表1 WHERE (字段s) IN (SELECT 字段s FROM 表2 WHERE 條件) |
| FROM后 | SELECT * FROM (SELECT 字段s FROM 表2 WHERE 條件) WHERE 條件 |
4、自連接
- 從表中查詢,根據(jù)查詢結(jié)果再到該表中查詢
| SELECT * FROM 表 表別名1 表 表別名2 WHERE 表別名1.列名=表別名2.列名 AND 條件2; |
GOOD LUCK!
與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖
總結(jié)
以上是生活随笔為你收集整理的MySQL 笔记5 -- 多表查询的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: MySQL 笔记4 -- 数据完整性
- 下一篇: MySQL 笔记6 -- 函数与事务