服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Mysql - Mysql深入了解联表查询的特点

Mysql深入了解联表查询的特点

2022-07-27 13:57·~简单就好 Mysql

这篇文章主要给大家介绍了关于MySQL联表查询的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用MySQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

前言

为了减少对数据库的查询次数,例如在互不关联的表中为了减轻系统的压力,我们可以通过union all关键词将多个表查到的数据做一个联查处理

(便于统计分析时使用到不同的数据而只用一次请求)

举例:通过一条sql语句一次查询查询学生表中的性别为男的学生总数和教师表中的教师性别为男的教师总数

Mysql深入了解联表查询的特点

Mysql深入了解联表查询的特点

数据库表准备:

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", "孙风", "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;

一、传统方法(查询性能不佳)

对所查询的数据封装成一个表,在分别对表的数据查询展示出来。

这种方法比较简单但是会对数据库的查询次数大大提高

SELECT
	t1.学生男生总数,
	t2.男教师总数 
FROM
	( SELECT count( id ) AS 学生男生总数 FROM student WHERE student.sex = "男" ) t1,
	( SELECT count( id ) AS 男教师总数 FROM teacher WHERE teacher.sex = "男" ) t2

Mysql深入了解联表查询的特点

二、使用union all将多个表联合成一个表查询

	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、此时a代表学生性别为男生的总人数,b代表教师性别为男的总人数

Mysql深入了解联表查询的特点

2、此时我们只需对a和b分别求和,就能够查询出男学生和男教师的总人数

	select sum(t.a) as 学生男生总数,sum(t.b) as 男教师总数 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

Mysql深入了解联表查询的特点

三、总结

当我们使用union all多表联合时,这样对于互不关联的数据我们也能够一次就只能查询多条我们需要的数据,减少了请求次数一次查询次数,而且对数据库的性能大大提升!

到此这篇关于Mysql深入了解联表查询的特点的文章就介绍到这了,更多相关Mysql联表查询内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文地址:https://blog.csdn.net/qq_45830276/article/details/125995025

延伸 · 阅读

精彩推荐