聯合查詢

目錄

1、笛卡爾積

2、聯合查詢

2.1、內連接

2.2、外連接


1、笛卡爾積

笛卡爾積:

笛卡爾積是讓兩個表通過排列組合的方式,得到的一個更大的表。笛卡爾積的列數,是這兩個表的列數相加,笛卡爾積的行數,是這兩個表的行數相乘

觀察發現,其中有一些數據,是無意義的數據,上圖中,當表1的id和表2的student_ID相等時,才是有意義的數據

笛卡爾積,是簡單無腦的排列組合,把所有可能的情況都窮舉了一遍,包含一些合法的數據也包含非法的無意義的數據。進行多表查詢的時候,就需要把有意義的數據篩選出來,無意義的數據過濾掉

2、聯合查詢

設計數據時把表進行拆分,為了消除表中的字段的依賴關系,比如部分函數依賴,傳遞依賴。這時會導致一條SQL查出來的數據,對于業務來說是不完整的,我們就可以使用聯合查詢把關系中的數據全部查出來,在一個數據行中顯示詳細信息

create table class(class_id bigint primary key auto_increment, name varchar(50)
);
create table student (id bigint primary key auto_increment,name varchar(50) not null,class_id bigint
);
insert into class (name) values ('1班'), ('2班'), ('3班');
insert into student (name, class_id) values('張三',1), ('李四',1), ('王五',2), ('趙六',3);

?

聯合查詢時MYSQL是如何執行的?

1. 取多張表的笛卡爾積

語法:

select * from 表名,表名;

兩張表取笛卡爾積之后,有些數據是無效數據

2. 通過連接條件過濾掉無效數據
兩個表之間是有主外鍵關系的,只需要判斷兩個表中主外鍵字段是否相等即可

select * from student, class where student.class_id = class.class_id;

3. 能過指定列查詢,來精減結果集
查詢列表中通過?表名.列名?的方式指定要查詢字段

select student.id, student.name, class.name from student, class
where student.class_id = class.class_id;

通過給表名起別名的方式來簡化SQL語句(建議使用這種方式)

總結:

聯合查詢也叫表連接查詢
1. 首先確定哪幾張表要參與查詢
2. 根據表與表之間的主外鍵關系,確定過濾條件
3. 精減查詢字段,得到想要的結果

2.1、內連接

上述聯合查詢的過程就是內連接

語法:

第一個是標準的內連接的寫法,其中 inner 可以省略

第二個就是上述聯合查詢的案例

上述的幾種寫法,選一個合適的就行,一般 where 這種用得更多

案例:?

DROP TABLE IF EXISTS `score`;
DROP TABLE IF EXISTS `student`;
DROP TABLE IF EXISTS `class`;
DROP TABLE IF EXISTS `course`;-- ----------------------------
-- Table structure for class
-- ----------------------------CREATE TABLE `class`  (`class_id` bigint NOT NULL AUTO_INCREMENT,`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,PRIMARY KEY (`class_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of class
-- ----------------------------
INSERT INTO `class` VALUES (1, '計算機系2019級1班');
INSERT INTO `class` VALUES (2, '中文系2019級3班');
INSERT INTO `class` VALUES (3, '自動化2019級5班');-- ----------------------------
-- Table structure for course
-- ----------------------------CREATE TABLE `course`  (`course_id` bigint NOT NULL AUTO_INCREMENT,`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,PRIMARY KEY (`course_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of course
-- ----------------------------
INSERT INTO `course` VALUES (1, 'Java');
INSERT INTO `course` VALUES (2, '中國傳統文化');
INSERT INTO `course` VALUES (3, '計算機原理');
INSERT INTO `course` VALUES (4, '語文');
INSERT INTO `course` VALUES (5, '高階數學');
INSERT INTO `course` VALUES (6, '英文');-- ----------------------------
-- Table structure for student
-- ----------------------------CREATE TABLE `student`  (`student_id` bigint NOT NULL AUTO_INCREMENT,`sn` varchar(6) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,`mail` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,`class_id` bigint NULL DEFAULT NULL,PRIMARY KEY (`student_id`) USING BTREE,UNIQUE INDEX `sn`(`sn` ASC) USING BTREE,INDEX `class_id`(`class_id` ASC) USING BTREE,CONSTRAINT `student_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `class` (`class_id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 9 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES (1, '09982', '黑旋風李逵', 'xuanfeng@qq.com', 1);
INSERT INTO `student` VALUES (2, '00835', '菩提老祖', NULL, 1);
INSERT INTO `student` VALUES (3, '00391', '白素貞', NULL, 1);
INSERT INTO `student` VALUES (4, '00031', '許仙', 'xuxian@qq.com', 1);
INSERT INTO `student` VALUES (5, '00054', '不想畢業', NULL, 1);
INSERT INTO `student` VALUES (6, '51234', '好好說話', 'say@qq.com', 2);
INSERT INTO `student` VALUES (7, '83223', 'tellme', NULL, 2);
INSERT INTO `student` VALUES (8, '09527', '老外學中文', 'foreigner@qq.com', 2);-- ----------------------------
-- Table structure for score
-- ----------------------------CREATE TABLE `score`  (`score_id` bigint NOT NULL AUTO_INCREMENT,`student_id` bigint NULL DEFAULT NULL,`course_id` bigint NULL DEFAULT NULL,`score` decimal(5, 2) NULL DEFAULT NULL,PRIMARY KEY (`score_id`) USING BTREE,INDEX `student_id`(`student_id` ASC) USING BTREE,INDEX `course_id`(`course_id` ASC) USING BTREE,CONSTRAINT `score_ibfk_1` FOREIGN KEY (`student_id`) REFERENCES `student` (`student_id`) ON DELETE RESTRICT ON UPDATE RESTRICT,CONSTRAINT `score_ibfk_2` FOREIGN KEY (`course_id`) REFERENCES `course` (`course_id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 21 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of score
-- ----------------------------
INSERT INTO `score` VALUES (1, 1, 1, 70.50);
INSERT INTO `score` VALUES (2, 1, 3, 98.50);
INSERT INTO `score` VALUES (3, 1, 5, 33.00);
INSERT INTO `score` VALUES (4, 1, 6, 98.00);
INSERT INTO `score` VALUES (5, 2, 1, 60.00);
INSERT INTO `score` VALUES (6, 2, 5, 59.50);
INSERT INTO `score` VALUES (7, 3, 1, 33.00);
INSERT INTO `score` VALUES (8, 3, 3, 68.00);
INSERT INTO `score` VALUES (9, 3, 5, 99.00);
INSERT INTO `score` VALUES (10, 4, 1, 67.00);
INSERT INTO `score` VALUES (11, 4, 3, 23.00);
INSERT INTO `score` VALUES (12, 4, 5, 56.00);
INSERT INTO `score` VALUES (13, 4, 6, 72.00);
INSERT INTO `score` VALUES (14, 5, 1, 81.00);
INSERT INTO `score` VALUES (15, 5, 5, 37.00);
INSERT INTO `score` VALUES (16, 6, 2, 56.00);
INSERT INTO `score` VALUES (17, 6, 4, 43.00);
INSERT INTO `score` VALUES (18, 6, 6, 79.00);
INSERT INTO `score` VALUES (19, 7, 2, 80.00);
INSERT INTO `score` VALUES (20, 7, 6, 92.00);

?

(1)查詢 “許仙” 同學的 成績

select student.name, score.score from student, score where
student.student_id = score.student_id and student.name = '許仙';

五個步驟:

1. 確定查詢中涉及到哪些表
2. 對目標表取笛卡爾積
3. 確定連接條件
4. 確定對整個結果集的過濾條件
5. 精減查詢字段

(2)查詢所有同學的總成績,及同學的個人信息

1. 確定要參與查詢的表是 學生表成績表

總成績要用分組查詢 group by,搭配聚合函數 sum()

3. 確定兩張表之間關聯關系
student.student_id = score.student_id

4. 按學生的ld進行分組,并在查詢列表中,使用聚合函數sum(分數),計算總分

5. 在查詢列表中精減和確定要查詢的列

selectst.student_id,stu.name,sum(sc.score) as 總分
fromstudent st, score sc where st.student_id = sc.student_id
group bysc.student_id

(3)查詢所有同學的每門課的成績,及同學的個人信息

1. 確定要參與查詢的表
學生表、成績表、課程表

2.3. 取笛卡爾積、確定表與表之間的連接條件(可以通過表結果查看連接條件)

student.student_id = score.student_id

course.course_id = score.course_id

4.?確定查詢的過濾條件where

不需要

5.?精減查詢字段

使用 join on 的方式進行查詢:

2.2、外連接

外連接分為左外連接、右外連接和全外連接三種類型,MySQL不?持全外連接。
? 左外連接:返回左表的所有記錄和右表中匹配的記錄。如果右表中沒有匹配的記錄,則結果集中對應字段會顯示為NULL。
? 右外連接:與左外連接相反,返回右表的所有記錄和左表中匹配的記錄。如果左表中沒有匹配的記錄,則結果集中對應字段會顯示為NULL。
? 全外連接:結合了左外連接和右外連接的特點,返回左右表中的所有記錄。如果某?邊表中沒有匹配的記錄,則結果集中對應字段會顯示為NULL。

以下圖兩張表為例:

使用內連接時沒有4班的數據

使用右外連接,會以 join 右邊的表為基準,這個表中的數據會全部顯示出來。左邊的表沒有與之匹配的記錄全部用NULL去填充

在student表中插入一個class表中沒有的數據,使用左外連接


再用回之前的案例:

“?老外學中文” 在學生表中存在,在成績表中不存在


查詢哪位同學沒有考試成績
1. 在同學表中有記錄
2. 在分數表中沒有該同學對應的記錄

select * from student st left join score sc on st.student_id = sc.student_id;

進一步篩選:

select * from student st left join score sc on st.student_id = sc.student_id where sc.score_id is null;

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

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

相關文章

【HTML5學習筆記2】html標簽(下)

1表格標簽 1.1表格作用 顯示數據 1.2基本語法 <table><tr> 一行<td>單元格1</td></tr> </table> 1.3表頭單元格標簽 表頭單元格會加粗并且居中 <table><tr> 一行<th>單元格1</th></tr> </table&g…

window 顯示驅動開發-分頁視頻內存資源

與 Microsoft Windows 2000 顯示驅動程序模型不同&#xff0c;Windows Vista 顯示驅動程序模型允許創建比可用物理視頻內存總量更多的視頻內存資源&#xff0c;然后根據需要分頁進出視頻內存。 換句話說&#xff0c;并非所有視頻內存資源都同時位于視頻內存中。 GPU 的管道中可…

《C 語言指針高級指南:字符、數組、函數指針的進階攻略》

目錄 一. 字符指針變量 二. 數組指針變量 三. 二維數組傳參 3.1 二維數組的本質 3.2 訪問方式與地址計算 3.3 二維數組的傳參方式 3.4 深入解析 *(*(arri)j) 與 arr[i][j] 的等價性 四. 函數指針變量 4.1 函數指針變量的創建 4.2 函數指針變量的使用 4.3 兩段"…

Unity:場景管理系統 —— SceneManagement 模塊

目錄 &#x1f3ac; 什么是 Scene&#xff08;場景&#xff09;&#xff1f; Unity 項目中的 Scene 通常負責什么&#xff1f; &#x1f30d; 一個 Scene 包含哪些元素&#xff1f; Scene 的切換與管理 &#x1f4c1; 如何創建與管理 Scenes&#xff1f; 什么是Scene Man…

內容中臺重構企業知識管理路徑

智能元數據驅動知識治理 現代企業知識管理的核心挑戰在于海量非結構化數據的有效治理。通過智能元數據分類引擎&#xff0c;系統可自動識別文檔屬性并生成多維標簽體系&#xff0c;例如將技術手冊按產品版本、功能模塊、適用場景進行動態標注。這種動態元數據框架不僅支持跨部…

Vue3:腳手架

工程環境配置 1.安裝nodejs 這里我已經安裝過了&#xff0c;只需要打開鏈接Node.js — Run JavaScript Everywhere直接下載nodejs&#xff0c;安裝直接一直下一步下一步 安裝完成之后我們來使用電腦的命令行窗口檢查一下版本 查看npm源 這里npm源的地址是淘寶的源&#xff0…

悅數圖數據庫一體機發布,讓復雜關聯計算開箱即用

在金融風控、政務治理、能源監測等關鍵領域&#xff0c;復雜數據關聯分析已成為業務決策的核心需求。然而&#xff0c;信創場景的特殊性——全棧自主可控、海量實時計算、系統高可用性——對傳統技術架構提出了近乎苛刻的要求。悅數圖數據庫一體機應運而生&#xff0c;以軟硬協…

收放卷“材料停機減速距離“計算FC(算法公式+ST源代碼+C++代碼)

PLC運動控制基礎系列之梯形速度曲線 PLC運動控制基礎系列之梯形速度曲線_三菱運動控制模塊梯形加減速-CSDN博客文章瀏覽閱讀3.2k次,點贊3次,收藏7次。本文是關于PLC運動控制的基礎教程,重點介紹了梯形速度曲線的概念、計算和應用。討論了梯形加減速在啟動和停止階段的作用,…

Centos7系統(最小化安裝)安裝zabbix7版本詳細文章、nginx源代碼配置、php源代碼、mysql-yum安裝

zabbix官網鏈接下載zabbix源代碼安裝包 選擇zabbix版本&#xff08;此文章使用zabbix7.0版本&#xff09; 安裝之前由于是最小化安裝centos7安裝一些開發環境和工具包 文章使用國內阿里源 cd /etc/yum.repos.d/;curl -O https://mirrors.aliyun.com/repo/epel-7.repo;curl -…

描述性統計圖表

一、核心圖表類型與用途 1、直方圖(Histogram) (1)定義:用連續矩形表示數據分布,橫軸為數據區間,縱軸為頻數或頻率。 (2)用途:展示數據分布形態(對稱、偏態)、識別離群值。 (3)適用場景:分析連續型變量的分布特征,如收入分布、考試成績分布。 2、箱線圖(Box P…

ThinkPad X250電池換電池芯(理論技術儲備)

參考&#xff1a;筆記本電池換電芯的經驗與心得分享 - 經典ThinkPad專區 - 專門網 換電池芯&#xff0c;需要克服以下問題&#xff1a; 1 拆電池。由于是超聲波焊接&#xff0c;拆解比較費力&#xff0c;如果暴力撬&#xff0c;有可能導致電池殼變形... 2 替換電池芯的時候如…

Java(基礎) day01 初識Java

目錄 一、運行Java程序 二、基本數據類型 1、整數類型 ?編輯2、浮點型 3、字符型 4、布爾類型 一、運行Java程序 Java是一門半編譯型、半解釋型語言。先通過javac編譯程序把xxx.java源文件進行編譯&#xff0c;編譯后生成的.class文件是由字節碼組成的平臺無關、面向JVM的文…

【美團】Java后端一面復盤|網絡+線程+MySQL+Redis+設計模式+手撕算法

&#x1f4cd; 面試公司&#xff1a;美團 &#x1f3af; 面試崗位&#xff1a;Java后端開發工程師 &#x1f4de; 面試形式&#xff1a;電話面試 &#x1f552; 面試時長&#xff1a;約 50 分鐘 &#x1f501; 面試輪次&#xff1a;第一輪技術面 ? 面試整體節奏&#xff1a; …

Go語言八股文之Mysql鎖詳解

&#x1f49d;&#x1f49d;&#x1f49d;歡迎來到我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里可以感受到一份輕松愉快的氛圍&#xff0c;不僅可以獲得有趣的內容和知識&#xff0c;也可以暢所欲言、分享您的想法和見解。 非常期待和您一起在這個小…

實戰案例:采集 51job 企業招聘信息

本文將帶你從零開始&#xff0c;借助 Feapder 快速搭建一個企業級招聘信息數據管道。在“基礎概念”部分&#xff0c;我們先了解什么是數據管道和 Feapder&#xff1b;“生動比喻”用日常場景幫助你快速理解爬蟲組件&#xff1b;“技術場景”介紹本項目中如何使用代理等采集策略…

GMT之Bash語言使用

GMT的操作有自己的邏輯和“命令”&#xff0c;但GMT是可以用Bash語言控制的&#xff0c;所以常常以.sh為后綴寫GMT程序。 GMT程序運行步驟如下&#xff1a; 采用cd &#xff0c;定位到指定文件夾&#xff1b;以sh ***.sh運行GMT&#xff0c;得到結果。 另外&#xff0c;遇到…

整合Redis

整合Redis 引入依賴 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency><groupId>org.apache.commons</groupId><art…

Vue3——Watch偵聽器

目錄 手動指定監聽對象 偵聽ref對象 偵聽ref對象中的某個屬性 reactive寫法 watchEffect 自動偵聽 多源偵聽 一次性偵聽器 watch 是?個?于觀察和響應Vue響應式系統中數據變化的?法。它允許你指定?個數據源&#xff08;可以是 響應式引?、計算屬性、組件的屬性等&#xf…

1、數據結構與算法(Python版-啃書)-緒論

1.1 計算機問題求解 一般而言&#xff0c;人們需要的不是解決一個具體問題的程序&#xff0c;而是解決一類問題的程序。 對于求平方根這樣的簡單問題&#xff0c;人們希望的也不是專用于求某個數(例如2)的平方根的函數&#xff0c;而是能求任何數的平方根的函數。 用計算機解…

微信小程序之將輪播圖設計為組件

在components文件夾上點右鍵&#xff0c;新建component&#xff0c;命名為swiper 然后將我們之前的代碼都拷貝到對應文件中&#xff0c; 然后我們的頁面要引用這個組件&#xff0c; 在pages\index\index.json中引入&#xff1a; { "usingComponents": {"van…