從入門到精通【MySQL】 聯合查詢

文章目錄

    • 📕摘要
    • 📕1. 多表聯合查詢時MySQL內部原理
        • ??1.1 實例:一個完整的聯合查詢過程
    • 📕2. 內連接
    • 📕3. 外連接
    • 📕4. 自連接
    • 📕5. 子查詢
        • ??5.1 單行子查詢
        • ??5.2 多行子查詢
        • ??5.3 多列子查詢
        • ??5.4 在from子句中使用子查詢
    • 📕6. 合并查詢
        • ??6.1 union
        • ??6.2 union all
    • 📕7. 插入查詢結果

📕摘要

前面我們學習了數據庫設計時要滿足三大范式,也就意味著數據會被拆分到許多張表中,當我們想查詢一個學生的基本信息與成績時,此時就會涉及到學生表,班級表,成績表等多張數據表,但我們給用戶展示信息時并不會把冗余的數據也展示給用戶,所以我們就需要用到聯合查詢從多張表中查詢出有用的數據。此時的‘聯合’,就是指多張數據表的組合。

📕1. 多表聯合查詢時MySQL內部原理

當我們進行多表聯合查詢時,MySQL內部會進行以下操作:

  1. 參與查詢的所有表取笛卡爾積,結果集在臨時表中
    在這里插入圖片描述
  2. 觀察哪些記錄是有效數據,根據兩個表的關聯關系過濾掉無效數據
    在這里插入圖片描述
    =======================================================================
    首先我們要構造一個練習數據
create database if not exists test; -- 創建庫use test;-- 課程表
create table if not exists course(id bigint primary key auto_increment,`name` varchar(20) not null
);insert into course (name) values ('Java'), ('C++'), ('MySQL'), ('操作系統'), ('計
算機網絡'), ('數據結構');-- 學生表
create table if not exists student(id bigint primary key auto_increment,`name` varchar(20),sno varchar(20),age bigint,gender bigint,enroll_date varchar(20),class_id bigint
);insert into student (name, sno, age, gender, enroll_date, class_id) values
('唐三藏', '100001', 18, 1, '1986-09-01', 1),
('孫悟空', '100002', 18, 1, '1986-09-01', 1),
('豬悟能', '100003', 18, 1, '1986-09-01', 1),
('沙悟凈', '100004', 18, 1, '1986-09-01', 1),
('宋江', '200001', 18, 1, '2000-09-01', 2),
('武松', '200002', 18, 1, '2000-09-01', 2),
('李逹', '200003', 18, 1, '2000-09-01', 2),
('不想畢業', '200004', 18, 1, '2000-09-01', 2);-- 班級表
create table if not exists class(id bigint primary key auto_increment,`name` varchar(20)
);insert into class(name) values ('Java001班'), ('C++001班'), ('前端001班');-- 分數表
create table if not exists score(id bigint primary key auto_increment,score bigint,student_id bigint,course_id bigint
);insert into score (score, student_id, course_id) values
(70.5, 1, 1),(98.5, 1, 3),(33, 1, 5),(98, 1, 6),
(60, 2, 1),(59.5, 2, 5),
(33, 3, 1),(68, 3, 3),(99, 3, 5),
(67, 4, 1),(23, 4, 3),(56, 4, 5),(72, 4, 6),
(81, 5, 1),(37, 5, 5),
(56, 6, 2),(43, 6, 4),(79, 6, 6),
(80, 7, 2),(92, 7, 6);

Navicat可視化圖:

  1. 班級表
    在這里插入圖片描述
  2. 課程表
    在這里插入圖片描述
  3. 分數表
    在這里插入圖片描述
  4. 學生表
    在這里插入圖片描述
??1.1 實例:一個完整的聯合查詢過程

查詢學生姓名為孫悟空的詳細信息,包括學生個人信息和班級信息

  1. 首先確定參與查詢的表,分別是student表與class表
select * from student,class;

在這里插入圖片描述

  1. 確定連接條件,條件為student表中的class_id要與class表中的id相等
select * from student,class where student.class_id = class.id;

在這里插入圖片描述

  1. 加入查詢條件
select * from student,class where student.class_id = class.id and student.`name` = '孫悟空';

在這里插入圖片描述

  1. 精減查詢結果字段
selectstudent.id,student.name,class.name
from student,class 
wherestudent.class_id = class.id 
and student.`name` = '孫悟空';

在這里插入圖片描述

  1. 可以為表名指定別名
selectstu.id,stu.name,c.name
from student as stu,class as c
wherestu.class_id =c.id 
and stu.`name` = '孫悟空';

📕2. 內連接

select * from 表名1 as 別名1 , 表名2 as 別名2 where 連接條件 and 其他條件;
  1. 查詢"唐三藏"同學的成績
-- 查詢唐三藏同學的成績
selectstudent.`name`,score.score,course.`name` fromstudent,score,course wherestudent.id = score.student_id andscore.course_id = course.id andstudent.`name` = '唐三藏';

在這里插入圖片描述

  1. 查詢所有同學的總成績,及同學的個人信息
  select student.`name`,sum(score.score) as '總分'from student,scorewherestudent.id = score.student_idgroup by `name`;

在這里插入圖片描述

  1. 查詢所有同學每門課的成績,及同學的個人信息
selectstudent.`name`,score.score,course.`name`fromstudent,score,course where student.id = score.student_id and score.course_id = course.id;

在這里插入圖片描述

📕3. 外連接

外連接分為左外連接、右外連接和全外連接三種類型,因為MySQL不支持全外連接,所以本文不再介紹外連接部分。
? 左外連接:返回左表的所有記錄和右表中匹配的記錄。如果右表中沒有匹配的記錄,則結果集中對
應字段會顯示為NULL。
? 右外連接:與左外連接相反,返回右表的所有記錄和左表中匹配的記錄。如果左表中沒有匹配的記
錄,則結果集中對應字段會顯示為NULL。

-- 左外連接,表1完全顯?
select 字段名 from 表名1 left join 表名2 on 連接條件;
-- 右外連接,表2完全顯?
select 字段 from 表名1 right join 表名2 on 連接條件;
  1. 查詢沒有參加考試的同學信息
select * from student left join score on student.id = score.student_id where score.score is null;

在這里插入圖片描述

  1. 查詢沒有學生的班級
select * from student right join class on class.id = student.class_id where student.id is null;

在這里插入圖片描述

📕4. 自連接

自連接是自己與自己取笛卡爾積,可以把行轉化成列,在查詢的時候可以使用where條件對結果進行過濾,以至于實現行與行之間的比較,在做自連接時要為表起別名(否則報錯)。

--不為表指定別名
mysql> select * from score, score;
ERROR 1066 (42000): Not unique table/alias: 'score'--指定別名
mysql> select * from score s1, score s2;
  1. 顯示所有"MySQL"成績比"JAVA"成績高的成績信息
select s1.student_id as '學生',s1.score as 'MySQL',s2.score as 'JAVA' from (select * from score where  course_id = 3) as s1 ,(select * from score where course_id = 1 ) as s2 where s1.student_id = s2.student_id and s1.score > s2.score;

思路:先查出JAVA的成績,在查出MYSQL的成績,兩張表分別各自包含JAVA和MYSQL成績,然后進行連接,連接條件為表一與表二學生id相同,限制條件為MYSQL成績大于JAVA成績
在這里插入圖片描述

📕5. 子查詢

子查詢是把?個SELECT語句的結果當做別一個SELECT語句的條件,也叫嵌套查詢。

select * from table1 where condition [= |in]select * from where (......)
??5.1 單行子查詢

示例: 查詢與"不想畢業"同學的同班同學

select student.`name`,student.class_id from student  where class_id   = (select class_id from student where `name` = '不想畢業' ) and `name` != '不想畢業';

在這里插入圖片描述

??5.2 多行子查詢

示例:查詢"MySQL"或"Java"課程的成績信息

    select * from score where course_id in (select course.id from course where `name` = 'Java' or `name` = 'MySQL');

在這里插入圖片描述
使用 not in 可以查詢除了"MySQL"或"Java"課程的成績

??5.3 多列子查詢

單行子查詢和多行子查詢都只返回一列數據,多列子查詢中可以返回多個列的數據,外層查詢與嵌套的內層查詢的列要匹配

示例:查詢重復錄入的分數

select *  from score where (score,student_id,course_id) in (select score,student_id,course_id from score group by score,student_id,course_id having count(*)>1);

在這里插入圖片描述

??5.4 在from子句中使用子查詢

當?個查詢產生結果時,MySQL自動創建一個臨時表,然后把結果集放在這個臨時表中,最終返回
給用戶,在from子句中也可以使用臨時表進行子查詢或表連接操作

示例:查詢所有比"Java001班"平均分高的成績信息

select * from score as s ,(select avg(score) as avg_score from score where student_id in ( select student_id from student where class_id = 1))  as tmp where s.score > tmp.avg_score;

在這里插入圖片描述

📕6. 合并查詢

為了合并多個select操作返回的結果,可以使?集合操作符 union,union all

-- 創建?個新表并初始化數據create table student1 like student;insert into student1 (name, sno, age, gender, enroll_date, class_id) values
('唐三藏', '100001', 18, 1, '1986-09-01', 1),
('劉備', '300001', 18, 1, '1993-09-01', 3),
('張?', '300002', 18, 1, '1993-09-01', 3),
('關?', '300003', 18, 1, '1993-09-01', 3);
??6.1 union

該操作符用于取得兩個結果集的并集。當使用該操作符時,會自動去掉結果集中的重復行。

示例:查詢student表中 id < 3 的同學和student1表中的所有同學

select * from student where id<3 union select * from student1;

在這里插入圖片描述

??6.2 union all

該操作符?于取得兩個結果集的并集。當使用該操作符時,不會去掉結果集中的重復行。

示例:查詢student表中 id < 3 的同學和student1表中的所有同學

select * from student where id<3 union all select * from student1;

在這里插入圖片描述

📕7. 插入查詢結果

insert into 表名(列名1,列名2) select .....

示例:將student表中C++001班的學生復制到student1表中

insert into student1 (name, sno, age, gender, enroll_date, class_id)
select s.name, s.sno, s.age, s.gender, s.enroll_date, s.class_id
from student s, class c where s.class_id = c.id and c.name = 'C++001班';

在這里插入圖片描述

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

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

相關文章

高可用之戰:Redis Sentinal(哨兵模式)

參考&#xff1a;Redis系列24&#xff1a;Redis使用規范 - Hello-Brand - 博客園 1 背景 在我們的《Redis高可用之戰&#xff1a;主從架構》篇章中&#xff0c;介紹了Redis的主從架構模式&#xff0c;可以有效的提升Redis服務的可用性&#xff0c;減少甚至避免Redis服務發生完…

加密≠安全:文件夾密碼遺忘背后的數據丟失風險與應對

在數字化時代&#xff0c;保護個人隱私和數據安全變得尤為重要。許多人選擇對重要文件夾進行加密&#xff0c;以防止未經授權的訪問。然而&#xff0c;一個常見且令人頭疼的問題也隨之而來——文件夾加密密碼遺忘。當你突然發現自己無法訪問那些加密的文件夾時&#xff0c;那種…

WPS宏開發手冊——附錄

目錄 系列文章7、附錄 系列文章 使用、工程、模塊介紹 JSA語法 JSA語法練習題 Excel常用Api Excel實戰 常見問題 附錄 7、附錄 顏色序列&#xff1a;在excel中設置顏色&#xff0c;只能設置顏色序號&#xff0c;不能直接設置rgb顏色 1、黑色 (Black)…

C++基礎精講-02

文章目錄 1.C/C申請、釋放堆空間的方式對比1.1C語言申請、釋放堆空間1.2C申請、釋放堆空間1.2.1 new表達式申請數組空間 1.3回收空間時的注意事項1.4malloc/free 和 new/delete 的區別 2.引用2.1 引用的概念2.2 引用的本質2.3 引用與指針的聯系與區別2.4 引用的使用場景2.4.1 引…

Spring Boot MongoDB 分頁工具類封裝 (新手指南)

Spring Boot MongoDB 分頁工具類封裝 (新手指南) 目錄 引言&#xff1a;為何需要分頁工具類&#xff1f;工具類一&#xff1a;PaginationUtils - 簡化 Pageable 創建 設計目標代碼實現 (PaginationUtils.java)如何使用 PaginationUtils 工具類二&#xff1a;PageResponse<…

MyBatis的緩存、逆向工程、使用PageHelper、使用PageHelper

一、MyBatis的緩存 緩存&#xff1a;cache 緩存的作用&#xff1a;通過減少IO的方式&#xff0c;來提高程序的執行效率。 mybatis的緩存&#xff1a;將select語句的查詢結果放到緩存&#xff08;內存&#xff09;當中&#xff0c;下一次還是這條select語句的話&#xff0c;直…

java中的JNI調用c庫

1. 簡單demo 如果是在某個項目中有包名就需要自己找ai問問去改寫下cmd命令去編譯執行等 java文件&#xff08;HelloJNI.java&#xff09; public class HelloJNI {// 聲明 native 方法public native void sayHello();// 加載本地庫static {System.loadLibrary("hello&quo…

人工智能:GPT技術應用與未來展望

GPT(Generative Pre-trained Transformer)作為自然語言處理領域的代表性技術,近年來在各行業的實際應用中展現出廣泛潛力。結合其技術特性與行業需求,以下是GPT的主要應用場景、案例分析及未來挑戰的總結: 一、核心應用領域與案例 文本生成與內容創作 自動化內容生產:GPT…

前端筆記-ECMAScript語法概覽

更多詳細可以查看1.1 ES6 教程 | 菜鳥教程 這里我將大概記錄ES與JS大概不一樣的部分&#xff0c;方便聯合記憶。 歷史與關系 ECMAScript&#xff1a;是一種由 Ecma 國際組織制定的腳本語言規范&#xff0c;它是 JavaScript 的標準化版本。ECMAScript 為 JavaScript 提供了語…

操作主機的管理

1.在AD林范圍內&#xff0c;有哪幾個操作主機角色 架構主機&#xff08;Schema Master&#xff09; 功能&#xff1a;負責整個AD林中所有對象和屬性的定義&#xff0c;是唯一可以更新目錄架構的DC。架構更新會從架構主機復制到目錄林中的所有其他域控制器。 作用范圍&#xf…

【Linux】網絡編程

目錄 端口號 網絡字節序 socket編程 接口 sockaddr結構 udp網絡程序 創建套接字 綁定 接收 發送 客戶端需要綁定嗎&#xff1f; 客戶端執行方法 本地環回地址 終端文件 代碼 tcp網絡程序 SOCK_STREAM 監聽 查詢網絡信息 獲取新連接 地址轉換函數 客戶端綁…

Go 語言中的select是做什么的

Go 語言中的 select 是做什么的 在 Go 語言中&#xff0c;select 語句是用于處理多個通道&#xff08;channel&#xff09;操作的一種控制結構。它類似于 switch 語句&#xff0c;但專門用于并發編程&#xff0c;允許 Goroutine 在多個通道上等待操作&#xff08;發送或接收&a…

智慧班牌系統解決方案,SaaS智慧電子班牌云平臺

智慧班牌系統解決方案 系統概述 智慧班牌是智慧校園建設不斷發展的產物&#xff0c;是教育信息化改革的載體。通過智慧班牌可以高效便捷傳遞各種知識信息和通知信息、及時反饋課堂信息、實現班級的透明化管理。智慧班牌將學生平安考勤、異常出勤情況及時反饋至家長、老師&…

利用大模型和聚類算法找出 Excel 文件中重復或相似度高的數據,并使用 FastAPI 進行封裝的詳細方案

以下是一個利用大模型和聚類算法找出 Excel 文件中重復或相似度高的數據,并使用 FastAPI 進行封裝的詳細方案: 方案流程 數據讀取:從 Excel 文件中讀取數據。文本向量化:使用大模型將文本數據轉換為向量表示。聚類分析:運用聚類算法對向量進行分組,將相似度高的數據歸為…

【Docker基礎】容器技術詳解:生命周期、命令與實戰案例

文章目錄 一、什么是容器&#xff1f;二、為什么需要容器三、容器的生命周期容器狀態容器OOM容器異常退出容器異常退出容器暫停 四、容器命令命令清單詳細介紹 五、容器操作案例容器的狀態遷移容器批量操作容器交互模式attached 模式detached 模式interactive 模式 容器 與 宿主…

Laravel 實現 隊列 發送郵件功能

一. 什么是隊列 在構建 Web 應用程序時&#xff0c;你可能需要執行一些任務&#xff0c;例如解析文件&#xff0c;發送郵件&#xff0c;大量的數據計算等等&#xff0c;這些任務在典型的 Web 請求期間需要很長時間才能執行。 慶幸的是&#xff0c;Laravel 可以創建在后臺運行…

flink Shuffle的總結

關于 ** ?5 種 Shuffle 類型** 的區別、使用場景及 Flink 版本支持的總結&#xff1a; * 注意:下面是問AI具體細節與整理學習 1. 核心區別 Shuffle 類型核心特點使用場景Flink 版本支持Pipelined Shuffle流式調度&#xff0c;純內存交換&#xff0c;低延遲&#xff08;毫秒級…

Git使用與管理

一.基本操作 1.創建本地倉庫 在對應文件目錄下進行&#xff1a; git init 輸入完上面的代碼&#xff0c;所在文件目錄下就會多一個名為 .git 的隱藏文件&#xff0c;該文件是Git用來跟蹤和管理倉庫的。 我們可以使用 tree 命令&#xff08;注意要先下載tree插件&#xff09…

計算機視覺——深度學習圖像處理中目標檢測平均精度均值(mAP)與其他常用評估指標

概述 平均精度均值&#xff08;mAP&#xff09;是目標檢測領域中最為流行且復雜的重要評估指標之一。它廣泛用于綜合總結目標檢測器的性能。許多目標檢測模型會輸出類似以下的參數結果&#xff1a; Average Precision (AP) [ IoU0.50:0.95 | area all | maxDets100 ] 0.3…

C語言中單鏈表操作:查找節點與刪除節點

一. 簡介 前面學習了C語言中創建鏈表節點&#xff0c;向鏈表中插入節點等操作&#xff0c;文章如下&#xff1a; C語言中單向鏈表&#xff1a;創建節點與插入新節點-CSDN博客 本文繼續學習c語言中對鏈表的其他操作&#xff0c;例如在鏈表中查找某個節點&#xff0c;刪除鏈表…