Mysql深入了解聯(lián)表查詢的特點(diǎn)
前言
為了減少對數(shù)據(jù)庫的查詢次數(shù),例如在互不關(guān)聯(lián)的表中為了減輕系統(tǒng)的壓力,我們可以通過union all關(guān)鍵詞將多個(gè)表查到的數(shù)據(jù)做一個(gè)聯(lián)查處理
(便于統(tǒng)計(jì)分析時(shí)使用到不同的數(shù)據(jù)而只用一次請求)
舉例:通過一條sql語句一次查詢查詢學(xué)生表中的性別為男的學(xué)生總數(shù)和教師表中的教師性別為男的教師總數(shù)


數(shù)據(jù)庫表準(zhǔn)備:
1、student表
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '',
`birth` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '',
`sex` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES ('01', '趙雷', '1990-01-01', '男');
INSERT INTO `student` VALUES ('02', '錢電', '1990-12-21', '男');
INSERT INTO `student` VALUES ('03', '孫風(fēng)', '1990-05-20', '男');
INSERT INTO `student` VALUES ('04', '李云', '1990-08-06', '男');
INSERT INTO `student` VALUES ('05', '周梅', '1991-12-01', '女');
INSERT INTO `student` VALUES ('06', '吳蘭', '1992-03-01', '女');
INSERT INTO `student` VALUES ('07', '鄭竹', '1989-07-01', '女');
INSERT INTO `student` VALUES ('08', '王菊', '1990-01-20', '女');
SET FOREIGN_KEY_CHECKS = 1;2、teacher表
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for teacher
-- ----------------------------
DROP TABLE IF EXISTS `teacher`;
CREATE TABLE `teacher` (
`id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '',
`sex` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of teacher
-- ----------------------------
INSERT INTO `teacher` VALUES ('01', '張三', '男');
INSERT INTO `teacher` VALUES ('02', '李四', '女');
INSERT INTO `teacher` VALUES ('03', '王五', '男');
SET FOREIGN_KEY_CHECKS = 1;一、傳統(tǒng)方法(查詢性能不佳)
對所查詢的數(shù)據(jù)封裝成一個(gè)表,在分別對表的數(shù)據(jù)查詢展示出來。
這種方法比較簡單但是會對數(shù)據(jù)庫的查詢次數(shù)大大提高
SELECT t1.學(xué)生男生總數(shù), t2.男教師總數(shù) FROM ( SELECT count( id ) AS 學(xué)生男生總數(shù) FROM student WHERE student.sex = '男' ) t1, ( SELECT count( id ) AS 男教師總數(shù) FROM teacher WHERE teacher.sex = '男' ) t2

二、使用union all將多個(gè)表聯(lián)合成一個(gè)表查詢
select t.* from ( SELECT count(id) as a,0 as b FROM student WHERE student.sex = '男' union all SELECT 0 as a,count(id) as b FROM teacher WHERE teacher.sex = '男' ) t
1、此時(shí)a代表學(xué)生性別為男生的總?cè)藬?shù),b代表教師性別為男的總?cè)藬?shù)

2、此時(shí)我們只需對a和b分別求和,就能夠查詢出男學(xué)生和男教師的總?cè)藬?shù)
select sum(t.a) as 學(xué)生男生總數(shù),sum(t.b) as 男教師總數(shù) from ( SELECT count(id) as a,0 as b FROM student WHERE student.sex = '男' union all SELECT 0 as a,count(id) as b FROM teacher WHERE teacher.sex = '男' ) t

三、總結(jié)
當(dāng)我們使用union all多表聯(lián)合時(shí),這樣對于互不關(guān)聯(lián)的數(shù)據(jù)我們也能夠一次就只能查詢多條我們需要的數(shù)據(jù),減少了請求次數(shù)一次查詢次數(shù),而且對數(shù)據(jù)庫的性能大大提升!
到此這篇關(guān)于Mysql深入了解聯(lián)表查詢的特點(diǎn)的文章就介紹到這了,更多相關(guān)Mysql聯(lián)表查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot+ MySQL多線程查詢與聯(lián)表查詢性能對比
- MySQL的聯(lián)表查詢實(shí)現(xiàn)
- .NET?6?跨服務(wù)器聯(lián)表查詢操作MySql、Oracle、SqlServer等相互聯(lián)表
- MySQL派生表聯(lián)表查詢實(shí)戰(zhàn)過程
- Mysql 如何實(shí)現(xiàn)多張無關(guān)聯(lián)表查詢數(shù)據(jù)并分頁
- MySQL聯(lián)表查詢基本操作之left-join常見的坑
- MySQL聯(lián)表查詢的簡單示例
- mysql嵌套查詢和聯(lián)表查詢優(yōu)化方法
- Mysql聯(lián)表查詢索引失效的幾種問題解決
相關(guān)文章
mysql?8.0.28?winx64.zip安裝配置方法圖文教程
這篇文章主要為大家詳細(xì)介紹了mysql?8.0.28?winx64.zip安裝配置方法圖文教程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
mysql 5.7.21 解壓版通過歷史data目錄恢復(fù)數(shù)據(jù)的教程圖解
本文通過圖文并茂的形式給大家介紹了mysql 5.7.21 解壓版,通過歷史data目錄恢復(fù)數(shù)據(jù)的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-09-09
MySQL Workbench工具導(dǎo)出導(dǎo)入數(shù)據(jù)庫方式
這篇文章主要介紹了MySQL Workbench工具導(dǎo)出導(dǎo)入數(shù)據(jù)庫方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-05-05
Mysql之索引的數(shù)據(jù)結(jié)構(gòu)詳解
索引是存儲引擎用于快速找到數(shù)據(jù)記錄的一種數(shù)據(jù)結(jié)構(gòu),類似于教科書的目錄部分,在MySQL中,索引可以加速數(shù)據(jù)查找,減少磁盤I/O的次數(shù),提高查詢速率,但是,創(chuàng)建和維護(hù)索引需要耗費(fèi)時(shí)間,并且索引需要占磁盤空間,在InnoDB中,索引的實(shí)現(xiàn)基于B+樹結(jié)構(gòu)2024-12-12
CentOS系統(tǒng)下如何設(shè)置mysql每天自動備份
備份是容災(zāi)的基礎(chǔ),是指為防止系統(tǒng)出現(xiàn)操作失誤或系統(tǒng)故障導(dǎo)致數(shù)據(jù)丟失,而將全部或部分?jǐn)?shù)據(jù)集合從應(yīng)用主機(jī)的硬盤或陣列復(fù)制到其它的存儲介質(zhì)的過程。本文將詳細(xì)介紹在CentOS系統(tǒng)下如何設(shè)置mysql每天自動備份,有需要的朋友們下面來一起看看吧。2016-10-10

