MySQL-多表關系、多表查詢

一. 一對多(多對一)

? ? ? ? 1. 例如;一個部門下有多個員工

? ? ? ? ????????在數據庫表中多的一方(員工表)、添加字段,來關聯一的一方(部門表)的主鍵

二. 外鍵約束

? ? ? ? 1.如將部門表的部門直接刪除,然而員工表還存在其部門下的員工,出現了數據的不一致問題,是因為在數據庫層面,員工表與部門表并未建立關聯,所以無法保證數據的一致性和完整性。此時就需要外鍵約束

? ? ? ?可以在創建表時 或 表結構創建完成后,為字段添加外鍵約束:

? ? ? ? 例如:

????????????????ALTER TABLE EMP ADD CONSTRAINT FK_EMP_DEPT_id foreign key (dept_id) references dept(id);

-- 創建表時指定
create table 表名(字段名 數據類型,...[constraint] [外鍵名稱] foreign key (外鍵字段名) references 主表 (字段名));-- 建表完成后,添加外鍵
alter table 表名 add constraint 外鍵名稱 foreign key (外鍵字段名) references 主表 (字段名);

? ? ? ? ?物理外鍵

????????????????使用foreign key 定義外鍵關聯另外一張表(已經被邏輯外鍵取代

? ? ? ? ? ? ? ? 缺點:① 影響增、刪、改的效率(需要檢查外鍵關系)

? ? ? ? ? ? ? ? ? ? ? ? ② 僅用于單節點數據庫,不適用與分布式、集群場景。

? ? ? ? ? ? ? ? ? ? ? ? ③ 容易引發數據庫的死鎖問題,消耗性能

? ? ? ? 邏輯外鍵:

????????????????在業務層邏輯中,解決外鍵關聯,通過邏輯外鍵,就可以很方便的解決上述問題-----推薦使用

三.一對一

? ? ? ? 1. 關系:一對一關系,多用于單表拆分,將一張表的基礎字段放在一張表中,其他字段放在另一張表中,以提升操作效率。

? ? ? ? 2. 在任意一方加入外鍵,關聯另外一方的主鍵,并且設置外鍵為唯一的(UNIQUE)

四.多對多

? ? ? ? 1. 例如;學生與課程之間的關系,一個學生可以選擇多門課程,一門課程也可以供多個學生選擇

? ? ? ? 2. 建立第三張中間表,中間表至少包含兩個外鍵,分別關聯兩方主鍵

五. 多表查詢

? ? ? ? 從多張表中查詢數據

? ? ? ? 1. 笛卡爾積

????????????????指在數學中,兩個集合(A集合和B集合)的所有組合情況--

????????????????select * from emp, dept;

????????????????在多表查詢時,需要消除無效的笛卡爾積。

????????????????select * from emp, dept where emp.dept_id = dept.id;

? ? ? ? 2. 連接查詢

? ? ? ? ? ? ? ? 內連接

? ? ? ? ? ? ? ? ? ? ? ? 相當于查詢A、B兩表交集的部分數據。

-- 1. 隱式內連接 (常用)
select 字段列表 from 表1, 表2 where 連接條件...;-- 2. 顯示內連接
select 字段列表 from 表1 [inner] join 表2 on 連接條件 ..;-- 給表起別名
select 字段列表 from 表1 [as] 別名1, 表2 [as] 別名2 where 條件...;
-- 例如
select emp.id, emp.name,dept.name from emp, dept where emp.dept_id = dept.id;
select emp.id, emp.name,dept.name from emp inner join  dept on emp.dept_id = dept.id;
select emp.id, emp.name,dept.name from emp  join  dept on emp.dept_id = dept.id;select e.id, e.name,d.name from emp e, dept d where e.dept_id = d.id and e.salary > 5000;
select e.id, e.name,d.name from emp e inner join  dept d on e.dept_id = d.id where e.salary > 5000;
? ? ? ? ? ? ? ? 外連接
? ? ? ? ? ? ? ? ? ? ? ? 左外連接

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 查詢左表所有數據(包括兩張表交集部分的數據)

? ? ? ? ? ? ? ? ? ? ? ? 右外連接

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 查詢右表所有數據(包括兩張表交集部分的數據)

-- 左外連接 (常見)
select 字段列表 from 表1 left [outer] join 表2 on 連接條件...;-- 右外連接
select 字段列表 from 表1 right [outer] join  表2 on 連接條件...;
-- 左外連接 包含左表所有數據
select e.name,d.name from emp e left join dept d on e.dept_id = d.id;
select e.name,d.name,e.salary from emp e left join dept d on e.dept_id = d.id where e.salary > 5000;-- 右外連接 包含右表表所有數據
select d.name,e.name from emp e right join dept d on d.id = e.dept_id

? ? ? ? ? ? ? ? ? ? ? ? ?對于外連接,常用的是左外連接,因為右外連接的SQL也可以改造成左外連接(兩張表換個順序)

? ? ? ? 3. 子查詢

? ? ? ? ? ? ? ? (1) SQL語句中嵌套select語句,稱為嵌套查詢,又稱子查詢

? ? ? ? ? ? ? ? (2) 格式:select * from 表1 where 字段 = (select 字段 for 表2...)

-- 子查詢
select * from emp where emp.entry_date = (select min(e.entry_date) from emp e) ;

? ? ? ? ? ? ? ? (3) 說明:子查詢外部的語句可以是insert / update /delete /select 的任何一個,常見的是select

? ? ? ? ? ? ? ? (4) 分類:

? ? ? ? ? ? ? ? ? ? ? ? ① 標量子查詢:子查詢返回的結果為單個值

? ? ? ? ? ? ? ? ? ? ? ? ② 列子查詢:子查詢返回的結果為一列

? ? ? ? ? ? ? ? ? ? ? ? ③ 行子查詢:子查詢返回的結果為一行

? ? ? ? ? ? ? ? ? ? ? ? ④ 表子查詢:子查詢返回的結果為多行多列

-- 例如-- 標量子查詢
select * from emp where emp.entry_date = (select min(e.entry_date) from emp e) ;
select * from emp where emp.entry_date > (select e.entry_date from emp e where e.name = '武松' ) ;-- 列子查詢
select e.* from emp e where e.dept_id in (select d.id from dept d where d.name in ('人事部','就業部'));-- 行子查詢
select * from emp where (salary, job) = (select salary, job from emp where emp.name = '武松');-- 表子查詢
select e.* from emp e, (select dept_id, max(salary) maxSa from emp group by dept_id) e2where e.dept_id = e2.dept_id and e.salary = e2.maxSa;

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

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

相關文章

【 HarmonyOS 5 入門系列 】鴻蒙HarmonyOS示例項目講解

【 HarmonyOS 5 入門系列 】鴻蒙HarmonyOS示例項目講解 一、前言:移動開發聲明式 UI 框架的技術變革 在移動操作系統的發展歷程中,UI 開發模式經歷了從命令式到聲明式的重大變革。 根據華為開發者聯盟 2024 年數據報告顯示,HarmonyOS 設備…

【SSM】SpringMVC學習筆記7:前后端數據傳輸協議和異常處理

這篇學習筆記是Spring系列筆記的第7篇,該筆記是筆者在學習黑馬程序員SSM框架教程課程期間的筆記,供自己和他人參考。 Spring學習筆記目錄 筆記1:【SSM】Spring基礎: IoC配置學習筆記-CSDN博客 對應黑馬課程P1~P20的內容。 筆記2…

借助 Spring AI 和 LM Studio 為業務系統引入本地 AI 能力

Spring AI 1.0.0-SNAPSHOTLM Studio 0.3.16qwen3-4b 參考 Unable to use spring ai with LMStudio using spring-ai openai module Issue #2441 spring-projects/spring-ai GitHub LM Studio 下載安裝 LM Studio下載 qwen3-4b 模型。對于 qwen3 系列模型,測試…

C++學習-入門到精通【13】標準庫的容器和迭代器

C學習-入門到精通【13】標準庫的容器和迭代器 目錄 C學習-入門到精通【13】標準庫的容器和迭代器一、標準模板庫簡介1.容器簡介2.STL容器總覽3.近容器4.STL容器的通用函數5.首類容器的通用typedef6.對容器元素的要求 二、迭代器簡介1.使用istream_iterator輸入,使用…

Vue Router的核心實現原理深度解析

1. Vue Router的基本架構 Vue Router的核心功能是實現前端路由,即在不重新加載頁面的情況下更改應用的視圖。它的基本架構包括: 路由配置:定義路徑與組件的映射關系路由實例:管理路由狀態和提供導航方法路由視圖:渲染…

設計模式——狀態設計模式(行為型)

摘要 狀態設計模式是一種行為型設計模式,核心在于允許對象在內部狀態改變時改變行為。它通過狀態對象封裝不同行為,使狀態切換靈活清晰。該模式包含環境類、抽象狀態類和具體狀態類等角色,具有避免大量分支判斷、符合單一職責和開閉原則等特…

C++ 觀察者模式:設計與實現詳解

一、引言 在現代軟件開發中,組件間的交互與通信是系統設計的核心挑戰之一。觀察者模式(Observer Pattern)作為一種行為設計模式,提供了一種優雅的解決方案,用于實現對象間的一對多依賴關系。本文將深入探討 C++ 中觀察者模式的設計理念、實現方式及其應用場景。 二、觀察…

Windows 賬號管理與安全指南

Windows 賬號管理與安全指南 概述 Windows 賬號管理是系統安全的基礎,了解如何正確創建、管理和保護用戶賬戶對于系統管理員和安全專業人員至關重要。本文詳細介紹 Windows 系統中的賬戶管理命令、隱藏賬戶創建方法以及安全防護措施。 基礎賬戶管理命令 net use…

[藍橋杯]擺動序列

擺動序列 題目描述 如果一個序列的奇數項都比前一項大&#xff0c;偶數項都比前一項小&#xff0c;則稱為一個擺動序列。即 a2i<a2i?1,a2i1 >a2ia2i?<a2i?1?,a2i1? >a2i?。 小明想知道&#xff0c;長度為 mm&#xff0c;每個數都是 1 到 nn 之間的正整數的…

Python 網絡編程 -- WebSocket編程

作者主要是為了用python構建實時網絡通信程序。 概念性的東西越簡單越好理解,因此,下面我從晚上摘抄的概念 我的理解。 什么是網絡通信? 更確切地說&#xff0c;網絡通信是兩臺計算機上的兩個進程之間的通信。比如&#xff0c;瀏覽器進程和新浪服務器上的某個Web服務進程在通…

GM DC Monitor如何實現TCP端口狀態監控-操作分享

本節講解如何通過現有指標提取監控腳本制作自定義的TCP端口監控指標 一、功能介紹 通過提取已有的監控指標的監控命令&#xff0c;來自定義TCP端口的監控指標。 二、配置端口監控 1&#xff09;定位監控腳本 確定腳本及參數如下&#xff1a; check_protocol_tcp.pl --plug…

LabVIEW與Modbus/TCP溫濕度監控系統

基于LabVIEW 開發平臺與 Modbus/TCP 通信協議&#xff0c;設計一套適用于實驗室環境的溫濕度數據采集監控系統。通過上位機與高精度溫濕度采集設備的遠程通信&#xff0c;實現多設備溫濕度數據的實時采集、存儲、分析及報警功能&#xff0c;解決傳統人工采集效率低、環境適應性…

Ntfs!ReadIndexBuffer函數分析之nt!CcGetVirtualAddress函數之nt!CcGetVacbMiss

第一部分&#xff1a; NtfsMapStream( IrpContext, Scb, LlBytesFromIndexBlocks( IndexBlock, Scb->ScbType.Index.IndexBlockByteShift ), Scb->ScbType.Index.BytesPerIndexBuffer, &am…

vite+vue3項目中,單個組件中使用 @use報錯

報錯信息&#xff1a; [plugin:vite:css] [sass] use rules must be written before any other rules.use 官方說明 注意事項&#xff1a; https://sass-lang.com/documentation/at-rules/use/ 樣式表中的 use 規則必須位于所有其他規則&#xff08;除 forward 外&#xff0…

基于VMD-LSTM融合方法的F10.7指數預報

F10.7 Daily Forecast Using LSTM Combined With VMD Method ??F10.7?? solar radiation flux is a well-known parameter that is closely linked to ??solar activity??, serving as a key index for measuring the level of solar activity. In this study, the ??…

React 新項目

使用git bash 創建一個新項目 建議一開始就創建TS項目 原因在Webpack中改配置麻煩 編譯方法:ts compiler 另一種 bable 最好都配置 $ create-react-app cloundmusic --template typescript 早期react項目 yarn 居多 目前npm包管理居多 目前pnpm不通用 icon 在public文件夾中…

2025年- H65-Lc173--347.前k個高頻元素(小根堆,堆頂元素是當前堆元素里面最小的)--Java版

1.題目描述 2.思路 &#xff08;1&#xff09;這里定義了一個小根堆&#xff08;最小堆&#xff09;&#xff0c;根據元素的頻率從小到大排序。小根堆原理&#xff1a;堆頂是最小值&#xff0c;每次插入或刪除操作會保持堆的有序結構&#xff08;常用二叉堆實現&#xff09;。 …

VR/AR 顯示瓶頸將破!鐵電液晶技術迎來關鍵突破

在 VR/AR 設備逐漸走進大眾生活的今天&#xff0c;顯示效果卻始終是制約其發展的一大痛點。紗窗效應、畫面拖影、眩暈感…… 傳統液晶技術的瓶頸讓用戶體驗大打折扣。不過&#xff0c;隨著鐵電液晶技術的重大突破&#xff0c;這一局面有望得到徹底改變。 一、傳統液晶技術瓶頸…

【bug】Error: /undefinedfilename in (/tmp/ocrmypdf.io.9xfn1e3b/origin.pdf)

在使用ocrmypdf的時候&#xff0c;需要Ghostscript9.55及以上的版本&#xff0c;但是ubuntu自帶為9.50 然后使用ocrmypdf報錯了 sudo apt update sudo apt install ghostscript gs --version 9.50 #版本不夠安裝的版本為9.50不夠&#xff0c;因此去官網https://ghostscript.c…

【TinyWebServer】線程同步封裝

目錄 POSIX信號量 int sem_init(sem_t* sem,int pshared,unsingned int value); int sem_destroy(sem_t* sem); int sem_wait(sem_t* sem); int sem_post(sem_t* sem); 互斥量 條件變量 為了對多線程程序實現同步問題&#xff0c;可以用信號量POSIX信號量、互斥量、條件變…