搜尋
首頁資料庫mysql教程MySQL多表關聯查詢實例分析

MySQL多表關聯查詢實例分析

May 28, 2023 pm 01:32 PM
mysql

資料庫設計範式

目前資料庫設計有五種範式, 一般我們資料庫只需要滿足前三項即可

第一範式: 確保每列都保持原子性

什麼是原子性? 意思就是不可再分的,例如下

MySQL多表關聯查詢實例分析

聯繫方式有QQ,微信, 電話等等, 顯然此列不滿足原子性, 如果是單獨的QQ或電話等,則只有一個, 滿足第一範式

第二範式: 要有主鍵,要求其他欄位都依賴於主鍵

為什麼主鍵這麼重要?我們可以這樣理解, 如果把錶當作一個隊伍, 那麼主鍵就是這個隊伍的隊旗

• 沒有主鍵就沒有唯一性,沒有唯一性在集合中就定位不到這行記錄,所以要主鍵。

其他欄位為什麼需要依賴主鍵呢?因為如果不依賴主鍵,就無法確定它們的位置。更重要的是,其他字段組成的這行記錄和主鍵表示的是同一個東西,而主鍵是唯一的,它們只需要依賴於主鍵,也就成了唯一的。

第三範式: 第三範式就是要消除傳遞依賴,方便理解,可以看做是「消除冗餘」

這個要怎麼理解呢? 看下述例子 

MySQL多表關聯查詢實例分析

如果我們一張表設計成上面這樣, 大致看很正常, 但我們把這張表拆分開來

MySQL多表關聯查詢實例分析

如果這樣做的話, 是不是條理清晰了很多, 我們直接通過商品編號來關聯這兩張表, 無論在哪方面,都比全部擠在一張表要優於很多

外鍵

 我們知道有主鍵, 主鍵相當於表的標識, 那麼外鍵呢? 

● 外鍵:引用另外一個資料表的某筆記錄。

● 外鍵列型別與主鍵列型別一致,資料表之間的關聯/ 引用關係是依靠特定的主鍵( primary key )與外鍵(foreign key)建立起來的

語法:

新增外鍵限制
ALTER TABLE 表名ADD [CONSTRAINT 約束名稱] FOREIGN KEY( 外鍵列)
#ALTER TABLE 表名ADD [CONSTRAINT 約束名] FOREIGN KEY( 外鍵列)
         REFERENCES 關聯表( 主鍵);

#刪除外檢鍵   ALTER TABLE 表名DROP FOREIGN KEY 外鍵約束名

我們在上面第三範式的例子中說到, 消除冗餘, 透過某一列來關聯兩個表, 那麼這一個連接起兩個表的列我們一般就會設定為外鍵

但是, 如果我們需要兩個表關聯查詢, 也是不一定去使用外鍵約束的
  • 如果兩個表關聯查詢, 我們並沒有去添加外鍵約束, 我們把這種稱為弱引用
  • 如果添加了外鍵約束,那麼它就是強引用

那麼這兩種引用區別在哪呢?

我們知道, 當我們使用外鍵後, 外鍵所在的是從表, 外鍵指向主表的主鍵, 那麼此時就在這兩張表之間建立起了約束, 這時我們就不能隨意的去修改主表或者從表裡關聯的值, 這就是強引用

#1、當主表中沒有對應的記錄時,不能將記錄加入從表

2、不能更改主表中的值而導致從表中的記錄孤立

3 、從表存在與主表對應的記錄,不能從主表中刪除該行

4、刪除主表前,先刪從表

弱引用我們則可以隨意修改關聯之間的值

-- 创建学生表
CREATE TABLE student(
    id INT PRIMARY KEY AUTO_INCREMENT,
    num INT,
    NAME VARCHAR(20),
    sex CHAR(1),
    gradeId INT   -- 从表外键列
)
-- 创建年级表
CREATE TABLE grade(
    -- 主表主键列
    id INT PRIMARY KEY AUTO_INCREMENT,
    NAME VARCHAR(20)
)     
-- 添加外键约束
ALTER TABLE student ADD CONSTRAINT fk_grade 
      FOREIGN KEY(gradeId) REFERENCES grade(id)

主表建立並新增資料:

MySQL多表關聯查詢實例分析

#從表格建立並新增資料: 

MySQL多表關聯查詢實例分析

可以看到, gradeId欄位加入了外鍵約束 

這時我們試著去刪除主表的一列: 

MySQL多表關聯查詢實例分析

可以看到, 是不能去隨意改變主表的, 如果一旦改變,就會使得從表中的資料孤立 

#內連接 

MySQL多表關聯查詢實例分析

● 把滿足了條件的兩個表中的交集資料查詢出來

語法:

#Select 結果from 表1 ,表2 where 表1.column1 = 表2.column2

內連接有等值連接, 非等值連接, 自連接, 這裡我們主要討論自連接

笛卡爾乘積現象:表1有m行,表2有n行,結果=m*n

什麼是自連結呢, 就是自己關聯自己, 自己和自己做笛卡爾積,  這麼說可能不好理解, 舉例說明如下:###

我们平时在淘宝网购填地址的时候, 都是采用选择的方式, 先选择省,然后是省下面的市, 接着是市下面的区(县) ,它们都是在数据库中存着, 如何去实现这个功能呢 ? 

有人可能会说, 建三张表相互关联即可 , 但实际是 , 我们采用自连接的方式 , 一张表即可实现

CREATE TABLE demo(     -- 建立demo表
    id INT PRIMARY KEY,
    NAME VARCHAR(50),
    pid INT    
 )

往表中填入数据, pid为关联上一级的id

MySQL多表關聯查詢實例分析

-- 自连接 
-- 在多表关系中我们需要定义别名来区分
SELECT d1.name,d2.name,d3.name FROM demo d1 
            INNER JOIN demo d2 ON d1.id=d2.pid  --自连接条件
            INNER JOIN demo d3 ON d2.id=d3.pid  --自连接条件
  WHERE d3.id=6101011   -- 查询条件

结果 : 

MySQL多表關聯查詢實例分析

外连接

外连接又分为左外连接与右外连接

先看左外连接 : 

MySQL多表關聯查詢實例分析

语法 

select 结果 from 表1 left join 表 2 on 表1.column1 = 表 2.column2 

左连接和内连接有什么不同呢?  通过两幅图我们就可以看出 ,内连接是取了两张表的共同部分 , 而左连接是取了左边表的全部(包括两张表的共同部分)

也就是说, 不仅查询两张表的共同部分, 并且左边表会被全部查询出来

我们通过上面外键所建的表来演示 , 为了演示方便,我们为student表再添加一列数据

MySQL多表關聯查詢實例分析

可以看到, 此时第五列并没有去关联grade表

-- 左外连接查询
SELECT * FROM student s 
     LEFT JOIN grade g ON s.gradeId= g.id

查询结果如下 : 

MySQL多表關聯查詢實例分析

 那么说到这, 右外连接也就不难理解了 , 每次都会完整的查询右边的表

MySQL多表關聯查詢實例分析

同样我们再为grade添加一条无关联的数据

MySQL多表關聯查詢實例分析

语法 :

 select 结果 from 表1 right join 表2 on 表1.column1 = 表2.column2 

-- 右外连接查询
SELECT * FROM student s 
     RIGHT JOIN grade g ON s.gradeId= g.id

查询结果 : 

MySQL多表關聯查詢實例分析

可以看到, 右表被完全查询

以上是MySQL多表關聯查詢實例分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:亿速云。如有侵權,請聯絡admin@php.cn刪除
MySQL:世界上最受歡迎的數據庫的簡介MySQL:世界上最受歡迎的數據庫的簡介Apr 12, 2025 am 12:18 AM

MySQL是一種開源的關係型數據庫管理系統,主要用於快速、可靠地存儲和檢索數據。其工作原理包括客戶端請求、查詢解析、執行查詢和返回結果。使用示例包括創建表、插入和查詢數據,以及高級功能如JOIN操作。常見錯誤涉及SQL語法、數據類型和權限問題,優化建議包括使用索引、優化查詢和分錶分區。

MySQL的重要性:數據存儲和管理MySQL的重要性:數據存儲和管理Apr 12, 2025 am 12:18 AM

MySQL是一個開源的關係型數據庫管理系統,適用於數據存儲、管理、查詢和安全。 1.它支持多種操作系統,廣泛應用於Web應用等領域。 2.通過客戶端-服務器架構和不同存儲引擎,MySQL高效處理數據。 3.基本用法包括創建數據庫和表,插入、查詢和更新數據。 4.高級用法涉及復雜查詢和存儲過程。 5.常見錯誤可通過EXPLAIN語句調試。 6.性能優化包括合理使用索引和優化查詢語句。

為什麼要使用mysql?利益和優勢為什麼要使用mysql?利益和優勢Apr 12, 2025 am 12:17 AM

選擇MySQL的原因是其性能、可靠性、易用性和社區支持。 1.MySQL提供高效的數據存儲和檢索功能,支持多種數據類型和高級查詢操作。 2.採用客戶端-服務器架構和多種存儲引擎,支持事務和查詢優化。 3.易於使用,支持多種操作系統和編程語言。 4.擁有強大的社區支持,提供豐富的資源和解決方案。

描述InnoDB鎖定機制(共享鎖,獨家鎖,意向鎖,記錄鎖,間隙鎖,下一鍵鎖)。描述InnoDB鎖定機制(共享鎖,獨家鎖,意向鎖,記錄鎖,間隙鎖,下一鍵鎖)。Apr 12, 2025 am 12:16 AM

InnoDB的鎖機制包括共享鎖、排他鎖、意向鎖、記錄鎖、間隙鎖和下一個鍵鎖。 1.共享鎖允許事務讀取數據而不阻止其他事務讀取。 2.排他鎖阻止其他事務讀取和修改數據。 3.意向鎖優化鎖效率。 4.記錄鎖鎖定索引記錄。 5.間隙鎖鎖定索引記錄間隙。 6.下一個鍵鎖是記錄鎖和間隙鎖的組合,確保數據一致性。

MySQL查詢性能差的常見原因是什麼?MySQL查詢性能差的常見原因是什麼?Apr 12, 2025 am 12:11 AM

MySQL查询性能不佳的原因主要包括没有使用索引、查询优化器选择错误的执行计划、表设计不合理、数据量过大和锁竞争。1.没有索引导致查询缓慢,添加索引后可显著提升性能。2.使用EXPLAIN命令可以分析查询计划,找出优化器错误。3.重构表结构和优化JOIN条件可改善表设计问题。4.数据量大时,采用分区和分表策略。5.高并发环境下,优化事务和锁策略可减少锁竞争。

您什麼時候應該使用複合索引與多個單列索引?您什麼時候應該使用複合索引與多個單列索引?Apr 11, 2025 am 12:06 AM

在數據庫優化中,應根據查詢需求選擇索引策略:1.當查詢涉及多個列且條件順序固定時,使用複合索引;2.當查詢涉及多個列但條件順序不固定時,使用多個單列索引。複合索引適用於優化多列查詢,單列索引則適合單列查詢。

如何識別和優化MySQL中的慢速查詢? (慢查詢日誌,performance_schema)如何識別和優化MySQL中的慢速查詢? (慢查詢日誌,performance_schema)Apr 10, 2025 am 09:36 AM

要優化MySQL慢查詢,需使用slowquerylog和performance_schema:1.啟用slowquerylog並設置閾值,記錄慢查詢;2.利用performance_schema分析查詢執行細節,找出性能瓶頸並優化。

MySQL和SQL:開發人員的基本技能MySQL和SQL:開發人員的基本技能Apr 10, 2025 am 09:30 AM

MySQL和SQL是開發者必備技能。 1.MySQL是開源的關係型數據庫管理系統,SQL是用於管理和操作數據庫的標準語言。 2.MySQL通過高效的數據存儲和檢索功能支持多種存儲引擎,SQL通過簡單語句完成複雜數據操作。 3.使用示例包括基本查詢和高級查詢,如按條件過濾和排序。 4.常見錯誤包括語法錯誤和性能問題,可通過檢查SQL語句和使用EXPLAIN命令優化。 5.性能優化技巧包括使用索引、避免全表掃描、優化JOIN操作和提升代碼可讀性。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用