【教程】MySQL數據庫學習筆記(七)——多表操作(持續更新)

文首標志
寫在前面:
如果文章對你有幫助,記得點贊關注加收藏一波,利于以后需要的時候復習,多謝支持!


【MySQL數據庫學習】系列文章

第一章 《認識與環境搭建》
第二章 《數據類型》
第三章 《數據定義語言DDL》
第四章 《數據操作語言DML》
第五章 《約束》
第六章 《數據查詢語言DQL》
第七章 《多表操作》


文章目錄

  • 【MySQL數據庫學習】系列文章
    • 一、多表關系
      • (一)多表關系概念
      • (二)外鍵約束
        • 1.一對多關系
        • 2.多對多關系
    • 二、多表聯合查詢
      • (一)交叉連接查詢
      • (二)內連接查詢


一、多表關系

(一)多表關系概念

在實際的項目中,往往需要進行處理多表數據,而多表的關系通常可以概括為以下幾種。

  • 一對一關系:例如一個學生只有一個身份證號,表現為一張表的一行對應另一張表的一行。但這種關系使用較少,因為通常一對一關系可以合成為一張表。
  • 一對多關系:例如一個部門有著多個員工,表現為一張表的一行對應另一張表的多行。
  • 多對多關系:例如學生和選課之間,一個學生可以選多節課,而一節課也可以被多個學生所選,表現在一張表對應另一張表的多行的同時,另一張表的一行也對應這張表的多行。通常多對多的關系需要中間表將其分割為一對多的關系。

(二)外鍵約束

外鍵約束會在表中建立一種關系,這種關系使得從表(子表)中的列(外鍵)引用主表(父表)中的列(主鍵或唯一鍵)。通過這種方式,可以確保子表中的數據在父表中有對應的條目。

這用于確保數據的一致性和完整性,具體而言,則是用于維護表與表之間的關系,確保在一個表中引用的值在另一個表中存在。

外鍵約束有著以下特點。

  • 主表必須已經存在于數據庫,或者是當前正在創建的表。
  • 必須為主表定義主鍵。
  • 主鍵不能包含空值,但允許在外鍵中出現空值。
  • 在主表的表名后面指定列名或列名的組合,而這個列或者列組合必須是主表的主鍵或者候選鍵。
  • 外鍵中列的數目必須和主鍵中列的數目相同。
  • 外鍵中列的數據類型必須和主鍵中列的數據類型相同。

如果想要創建外鍵約束,有兩種方式。

方式1:在創建表時設置外鍵約束。

CREATE TABLE語句中,通過FOREIGN KEY關鍵字來指定外鍵,具體的語法格式如下。

CONSTRAINT 外鍵名 FOREIGN KEY 字段名1,字段名2,... REFERENCES 主表名 主鍵列1,主鍵列2,...

下面是簡單的示例。

USE mydb1;-- 創建主表(部門表)
CREATE TABLE IF NOT EXISTS dept (did VARCHAR(20) PRIMARY KEY, -- 部門編號,設置主鍵name VARCHAR(20) -- 部門名字
);-- 創建從表(員工表)
CREATE TABLE IF NOT EXISTS emp (eid VARCHAR(20) PRIMARY KEY, -- 員工編號,設置主鍵ename VARCHAR(20), -- 員工名字age INT, -- 員工年齡dept_id VARCHAR(20), -- 員工所屬部門編號CONSTRAINT emp_fk FOREIGN KEY (dept_id) REFERENCES dept(did) -- 外鍵約束
);

創建完外鍵約束后,可以通過模型查看外鍵約束關系。點擊表,選中兩個表,右鍵選擇“逆向表到模型”即可查看。
在這里插入圖片描述
可以看到,兩張表之間的外鍵約束已經建立。
在這里插入圖片描述
除此之外,還有另一種創建外鍵約束的方式。

方式2:在修改表時設置外鍵約束。

ALTER TABLE語句中,通過FOREIGN KEY關鍵字來指定外鍵,具體的語法格式如下。

ALTER TABLE 表名 ADD CONSTRAINT 外鍵名 FOREIGN KEY 字段名1,字段名2,... REFERENCES 主表名 主鍵列1,主鍵列2,...

下面是簡單的示例。

-- 創建主表(部門表)
CREATE TABLE IF NOT EXISTS dept (did VARCHAR(20) PRIMARY KEY, -- 部門編號,設置主鍵name VARCHAR(20) -- 部門名字
);-- 創建從表(員工表)
CREATE TABLE IF NOT EXISTS emp (eid VARCHAR(20) PRIMARY KEY, -- 員工編號,設置主鍵ename VARCHAR(20), -- 員工名字age INT, -- 員工年齡dept_id VARCHAR(20), -- 員工所屬部門編號
);-- 創建外鍵約束
ALTER TABLE emp ADD CONSTRAINT emp_fk FOREIGN KEY (dept_id) REFERENCES dept(did);
1.一對多關系

為了驗證外鍵約束的作用,首先應該將上面創建的兩張空表,進行一對多關系的數據填充。

-- 1.添加主表數據
INSERT INTO dept VALUES ('1001','研發部');
INSERT INTO dept VALUES ('1002','銷售部');
INSERT INTO dept VALUES ('1003','財務部');
INSERT INTO dept VALUES ('1004','人事部');-- 2.添加從表數據
INSERT INTO emp VALUES ('1','劉邦',25,'1001');
INSERT INTO emp VALUES ('2','樊噲',24,'1001');
INSERT INTO emp VALUES ('3','張良',26,'1001');
INSERT INTO emp VALUES ('4','韓信',25,'1002');
INSERT INTO emp VALUES ('5','蕭何',27,'1002');
INSERT INTO emp VALUES ('6','曹參',23,'1003');
INSERT INTO emp VALUES ('7','陳平',26,'1003');
INSERT INTO emp VALUES ('8','周勃',28,'1004');

注意,當刪除數據的時候,有外鍵依賴的主表數據是不能刪除的,除非先清除從表中依賴主表的外鍵,否則會報錯。但反之,從表中的外鍵都是可以隨意刪除的。

而如果希望刪除外鍵約束時,需要在ALTER TABLE語句中使用DROP關鍵字來刪除外鍵約束。具體語法如下所示。

ALTER TABLE 表名 DROP FOREIGN KEY 外鍵約束名

簡單的實現示例則如下所示。

ALTER TABLE emp DROP FOREIGN KEY emp_fk;

這樣就能夠刪除剛才在上面的示例中在從表emp中創建的emp_fk外鍵約束。

2.多對多關系

對于多對多關系,比如之前提到的學生和選課的關系,此時學生表和選課表都是主表,而簡化其關系的中間表則是從表,其中的外鍵列依賴于學生表和選課表兩個主表。

具體的實現示例如下。

-- 創建學生表(主表)
CREATE TABLE IF NOT EXISTS student (sid INT PRIMARY KEY auto_increment, -- 學生編號name VARCHAR(20), -- 學生姓名age INT, -- 學生年齡gender VARCHAR(20) -- 學生性別
);
-- 創建課程表(主表)
CREATE TABLE IF NOT EXISTS course (cid INT PRIMARY KEY auto_increment, -- 課程編號cname VARCHAR(20) -- 課程名
);
-- 創建中間表(從表)
CREATE TABLE IF NOT EXISTS score (sid INT,cid INT,score DOUBLE
);-- 創建外鍵約束
ALTER TABLE score ADD FOREIGN KEY (sid) REFERENCES student(sid);
ALTER TABLE score ADD FOREIGN KEY (cid) REFERENCES course(cid);-- 學生表數據填充
INSERT INTO student VALUES (1,'劉邦',21,'男'),(2,'呂雉',19,'女'),(3,'項羽',20,'男');
-- 課程表數據填充
INSERT INTO course VALUES (1,'語文'),(2,'數學'),(3,'英語');
-- 中間表數據填充
INSERT INTO score VALUES (1,1,78),(1,2,75),(2,1,88),(2,3,90),(3,2,80),(3,3,65);

查看表的模型即可看到外鍵約束已創建完畢。
在這里插入圖片描述

二、多表聯合查詢

多表聯合查詢(也稱為聯接查詢)用于從多個表中檢索相關數據,因為在實際項目需要時,可能需要顯示的查詢結果來自于兩個或兩個以上的表。

多表查詢有以下分類。

  • 交叉連接查詢
  • 內連接查詢
  • 外連接查詢
  • 子查詢
  • 表自關聯

作為使用的數據,仍然主要沿用上面的部門和員工表示例,只不過不加入外鍵約束。

CREATE TABLE IF NOT EXISTS dept (did VARCHAR(20) PRIMARY KEY, -- 部門編號,設置主鍵name VARCHAR(20) -- 部門名字
);
CREATE TABLE IF NOT EXISTS emp (eid VARCHAR(20) PRIMARY KEY, -- 員工編號,設置主鍵ename VARCHAR(20), -- 員工名字age INT, -- 員工年齡dept_id VARCHAR(20) -- 員工所屬部門編號
);
INSERT INTO dept VALUES
('1001','研發部'),
('1002','銷售部'),
('1003','財務部'),
('1004','人事部');
INSERT INTO emp VALUES 
('01','劉邦',25,'1001'),
('02','樊噲',24,'1001'),
('03','張良',26,'1001'),
('04','韓信',25,'1001'),
('05','蕭何',27,'1002'),
('06','曹參',23,'1002'),
('07','陳平',26,'1002'),
('08','周勃',28,'1003'),
('09','彭越',27,'1003'),
('10','呂雉',24,'1005');

(一)交叉連接查詢

交叉連接(Cross Join) 是 SQL 中的一種連接類型,它返回兩個表的笛卡爾積,可以理解為一張表的每一行都和另一張表的任意一行進行匹配(假如A表有m行數據,B表有n行數據,則返回m*n行數據)。笛卡爾積會產生很多冗余的數據,后期的其他查詢可以在該集合的基礎上進行條件篩選。

其語法格式為以下所示。

SELECT * FROM1,2,...

具體實現示例如下所示。

SELECT * FROM dept,emp;

返回結果如下。
在這里插入圖片描述

(二)內連接查詢

內連接(INNER JOIN) 是 SQL 中最常用的連接類型之一,用于從兩個或多個表中提取符合條件的記錄。內連接只返回滿足連接條件的記錄,實際上是求的兩張表的交集,可以將表中的相關數據組合在一起,從而進行更加復雜的查詢和分析。

其具體語法格式如下所示。

-- 隱式內連接
SELECT * FROM A表,B表 WHERE 條件; -- 可以理解為從笛卡爾積中篩選出符合條件的值
-- 顯式內連接
SELECT * FROM A表 INNER JOIN B表 ON 條件; -- INNER可省略

具體示例如下所示。

-- 查詢每個部門的所屬員工
SELECT * FROM dept,emp WHERE dept.did = emp.dept_id;
SELECT * FROM dept INNER JOIN emp ON dept.did = emp.dept_id;-- 查詢研發部和銷售部的所屬員工
SELECT * FROM dept,emp WHERE dept.did = emp.dept_id AND name IN ('研發部','銷售部');
SELECT * FROM dept INNER JOIN emp ON dept.did = emp.dept_id AND name IN ('研發部','銷售部');-- 查詢每個部門的員工數,并升序排序
SELECT a.name,count(*) FROM dept a JOIN emp b ON a.did = b.dept_id GROUP BY a.did;-- 查詢人數大于3的部門,并按照人數降序排序
SELECT a.name,count(*) AS count FROM dept a JOIN emp b ON a.did = b.dept_id GROUP BY a.did HAVING count >= 3 ORDER BY count DESC;

我是EC,一個永遠在學習中的探索者,關注我,讓我們一起進步!

文末標志

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/70139.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/70139.shtml
英文地址,請注明出處:http://en.pswp.cn/web/70139.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

膠囊網絡動態路由算法:突破CNN空間局限性的數學原理與工程實踐

一、CNN的空間局限性痛點解析 傳統CNN的瓶頸: 池化操作導致空間信息丟失(最大池化丟棄85%激活值)無法建模層次空間關系(旋轉/平移等變換不敏感)局部感受野限制全局特征整合 示例對比: # CNN最大池化示例…

#滲透測試#批量漏洞挖掘#Apache Log4j反序列化命令執行漏洞

免責聲明 本教程僅為合法的教學目的而準備,嚴禁用于任何形式的違法犯罪活動及其他商業行為,在使用本教程前,您應確保該行為符合當地的法律法規,繼續閱讀即表示您需自行承擔所有操作的后果,如有異議,請立即停止本文章讀。 目錄 Apache Log4j反序列化命令執行漏洞 一、…

深入剖析Spring MVC

一、Spring MVC 概述 1. 什么是 Spring MVC? Spring MVC 是基于 Spring 框架的 Web 框架,它實現了 MVC 設計模式,將應用程序分為三個核心部分: Model:封裝應用程序的數據和業務邏輯。 View:負責渲染數據…

機器學習入門-讀書摘要

先看了《深度學習入門:基于python的理論和實踐》這本電子書,早上因為入迷還坐過站了。。 因為里面的反向傳播和鏈式法則特別難懂,又網上搜了相關內容進行進一步理解,參考的以下文章(個人認為都講的都非常好&#xff0…

【AI】mac 本地部署 Dify 實現智能體

下載 Ollama 訪問 Ollama 下載頁,下載對應系統 Ollama 客戶端。或者參考文章【實戰AI】macbook M1 本地ollama運行deepseek_m1 max可以跑deepseek嗎-CSDN博客 dify 開源的 LLM 應用開發平臺。提供從 Agent 構建到 AI workflow 編排、RAG 檢索、模型管理等能力&am…

[實現Rpc] 消息抽象層的具體實現

目錄 具象層 _ 消息抽象的實現 信息的抽象類 實現 JsonMessage JsonRequest & JsonResponse 消息-不同消息分裝實現 實現 Request RpcRequest TopicRequest ServiceRequest Response RpcResponse TopicResponse ServiceResponse 實現 生產工廠 本篇文章繼 …

計算機考研之數據結構:深入解析最大公約數與歐幾里得算法

一、生活中的公約數應用 在日常生活中,經常需要處理"均分分配"問題。例如:要將24塊巧克力和18塊餅干平均分給小朋友,最多能分給幾個小朋友?這就是典型的求最大公約數問題。 二、基本概念詳解 約數與公約數 約數&…

NCHAR_CS和CHAR_CS,導致UNION ALL 時,提示SQL 錯誤 [12704] [72000]: ORA-12704: 字符集不匹配

檢查涉及的數據表和列的字符集設置 -- 查詢表的字符集 SELECT parameter, value FROM nls_database_parameters WHERE parameter LIKE NLS_CHARACTERSET;-- 查詢列的字符集(對于特定表) SELECT column_name, character_set_name FROM all_tab_columns W…

算法之 跳躍游戲

文章目錄 55.跳躍游戲思路參考:56.合并區間 55.跳躍游戲 55.跳躍游戲 靈神思路 思路分析: 兩種思路,思路1是我們可以直接維護當前到達i的時候所能到達的最右的邊界mr,如果i>mr就說明無法到達i,否則就是可以到達;…

在C#中動態訪問對象屬性時,用表達式樹可以獲得高效性能

在C#中如何用表達式樹動態訪問對象屬性的問題。用戶可能已經知道反射的基本用法,但想用表達式樹來提高性能,因為表達式樹編譯后的委托執行速度比反射快。 首先,表達式樹的基本概念。表達式樹允許在運行時構建代碼,并編譯成可執行的…

深入解析 Flutter 性能優化:從原理到實踐

深入解析 Flutter 性能優化:從原理到實踐的全面指南 Flutter 是一個高性能的跨平臺框架,但在開發復雜應用時,性能問題仍然可能出現。性能優化是開發高質量 Flutter 應用的關鍵。本篇博客將從 Flutter 的渲染原理出發,結合實際場景…

使用 Python 爬蟲獲取微店快遞費用 item_fee API 接口數據

在電商運營中,快遞費用是影響商家利潤和用戶體驗的重要因素之一。微店作為國內知名的電商平臺,提供了豐富的 API 接口供開發者使用,其中也包括查詢商品快遞費用的接口。通過調用微店的 item_fee 接口,開發者可以獲取指定商品的快遞…

MySQL基本操作——包含增刪查改(環境為Ubuntu20.04,MySQL5.7.42)

1.庫的操作 1.1 創建數據庫 語法: 說明: 大寫的表示關鍵字 [] 是可選項 CHARACTER SET: 指定數據庫采用的字符集 COLLATE: 指定數據庫字符集的校驗規則 1.2 創建案例 創建一個使用utf8字符集的db1數據庫 create database db1 charsetutf8; …

Spring Boot 定時任務:輕松實現任務自動化

在現代應用開發中,定時任務是一個常見的需求。比如,我們可能需要定時清理過期數據、定時發送郵件通知等。 操作流程 開啟定時任務注解 在啟動類添加注解EnableScheduling 設置時間(固定時間間隔) 使用 Scheduled 注解創建定時…

七星棋牌全開源修復版源碼解析:6端兼容,200種玩法全面支持

本篇文章將詳細講解 七星棋牌修復版源碼 的 技術架構、功能實現、二次開發思路、搭建教程 等內容,助您快速掌握該棋牌系統的開發技巧。 1. 七星棋牌源碼概述 七星棋牌修復版源碼是一款高度自由的 開源棋牌項目,該版本修復了原版中的多個 系統漏洞&#…

【Rust中級教程】1.12. 生命周期(進階) Pt.2:生命周期變型、協變、不變、逆變

喜歡的話別忘了點贊、收藏加關注哦(加關注即可閱讀全文),對接下來的教程有興趣的可以關注專欄。謝謝喵!(・ω・) 這篇文章在Rust初級教程的基礎上對生命周期這一概念進行了補充,建議先看【Rust自…

Vue 項目登錄的基本流程

Vue 用戶登錄的基本流程包括以下6個步驟&#xff1a; 步驟&#xff1a; 1. 創建登錄表單 在前端&#xff0c;首先要創建一個登錄表單&#xff0c;用戶輸入賬號&#xff08;用戶名、郵箱、手機號等&#xff09;和密碼。 示例&#xff1a;Login.vue <template><div…

【算法】回溯算法

回溯算法 什么是回溯 人生無時不在選擇。在選擇的路口&#xff0c;你該如何抉擇 ..... 回溯&#xff1a; 是一種選優搜索法&#xff0c;又稱為試探法&#xff0c;按選優條件向前搜索&#xff0c;以達到目標。但當探索到某一步時&#xff0c;發現原先選擇并不優或達不到目標&am…

SpringAI系列 - RAG篇(三) - ETL

目錄 一、引言二、組件說明三、集成示例一、引言 接下來我們介紹ETL框架,該框架對應我們之前提到的階段1:ETL,主要負責知識的提取和管理。ETL 框架是檢索增強生成(RAG)數據處理的核心,其將原始數據源轉換為結構化向量并進行存儲,確保數據以最佳格式供 AI 模型檢索。 …

2025 docker可視化管理面板DPanel的安裝

1.什么是 DPanel &#xff1f; DPanel 是一款 Docker 可視化管理面板&#xff0c;旨在簡化 Docker 容器、鏡像和文件的管理。它提供了一系列功能&#xff0c;使用戶能夠更輕松地管理和部署 Docker 環境。 軟件特點&#xff1a; 可視化管理&#xff1a;提供直觀的用戶界面&#…