日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL 笔记5 -- 多表查询

發布時間:2025/3/12 数据库 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 -- 多表查询的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。