MySQL数据库查询之多表查询总结

MySQL数据库查询之多表查询总结

在实际业务中,数据库往往并不仅仅只有一张表。为了更好地提高查询效率和查询结果的准确性,我们就需要用到多表查询了。

内连接(INNER JOIN)

内连接返回同时在两个表中存在的所有行,并且在连接的列上具有相同的值。它是最常用的一种多表查询方式,下面用一个示例来说明。

有两张表,分别是学生表(students)和成绩表(scores),这两个表之间存在外键关联,外键的字段名是student_id

students表的结构如下:

CREATE TABLE `students` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `name` varchar(20) NOT NULL COMMENT '姓名',
  `gender` varchar(10) NOT NULL COMMENT '性别',
  `age` int(11) NOT NULL COMMENT '年龄',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='学生表';

scores表的结构如下:

CREATE TABLE `scores` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `student_id` int(11) NOT NULL COMMENT '学生id',
  `subject` varchar(20) NOT NULL COMMENT '课程',
  `score` int(11) NOT NULL COMMENT '成绩',
  PRIMARY KEY (`id`),
  KEY `fk_scores_students` (`student_id`),
  CONSTRAINT `fk_scores_students` FOREIGN KEY (`student_id`) REFERENCES `students` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='成绩表';

现在我们要查询出scores表中每个学生的总分数和平均分数,以及学生的姓名和性别。可以使用如下SQL语句:

SELECT s.name, s.gender, SUM(score) AS total_score, AVG(score) AS avg_score
FROM students s
INNER JOIN scores sc ON s.id = sc.student_id
GROUP BY sc.student_id;

这里使用了内连接来实现多表查询,sstudents表的别名,scscores表的别名。INNER JOIN语句将两个表连接在一起,s.idsc.student_id是连接的条件,SUM()AVG()用来计算每个学生的总分数和平均分数,GROUP BY语句将结果按照student_id分组。

左连接(LEFT JOIN)

左连接返回所有左表中的记录以及右表中那些和左表中记录关联的记录。如果右表中没有匹配的记录,就返回NULL值。下面用一个示例来说明。

有两张表,分别是学生表(students)和选课表(courses),这两个表之间存在外键关联,外键的字段名是student_id

students表的结构如下:

CREATE TABLE `students` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `name` varchar(20) NOT NULL COMMENT '姓名',
  `gender` varchar(10) NOT NULL COMMENT '性别',
  `age` int(11) NOT NULL COMMENT '年龄',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='学生表';

courses表的结构如下:

CREATE TABLE `courses` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `student_id` int(11) NOT NULL COMMENT '学生id',
  `course` varchar(20) NOT NULL COMMENT '课程',
  PRIMARY KEY (`id`),
  KEY `fk_courses_students` (`student_id`),
  CONSTRAINT `fk_courses_students` FOREIGN KEY (`student_id`) REFERENCES `students` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='选课表';

现在我们要查询出每个学生选修的课程和未选的课程。可以使用如下SQL语句:

SELECT s.name, c.course
FROM students s
LEFT JOIN courses c ON s.id = c.student_id;

这里使用了左连接来实现多表查询,sstudents表的别名,ccourses表的别名。LEFT JOIN语句将students表与courses表进行连接,s.idc.student_id是连接的条件。由于要查询出每个学生选修的课和未选的课,所以这里只需要查询students表和courses表之间的关系即可。

总结

通过内连接和左连接,我们可以实现多张表之间的数据关联,提高查询效率和查询结果的准确性。需要注意的是,在使用多表查询时,我们需要谨慎考虑表之间的关系,尽可能地使用索引来提高查询效率。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MySQL数据库查询之多表查询总结 - Python技术站

(0)
上一篇 2023年5月21日
下一篇 2023年5月21日

相关文章

  • Redis在windows下安装过程

    一、下载windows版本的Redis 去官网找了很久,发现原来在官网上可以下载的windows版本的,现在官网以及没有下载地址,只能在github上下载,官网只提供linux版本的下载 官网下载地址:http://redis.io/download github下载地址:https://github.com/MSOpenTech/redis/tags 二、…

    Redis 2023年4月12日
    00
  • Oracle 存储过程发送邮件实例学习

    1. 学习前准备 在学习 Oracle 存储过程发送邮件的过程中,我们需要先进行一些准备工作: 安装并配置 Oracle 数据库及其配置文件; 安装 Oracle 的邮件服务包 —— UTL_MAIL; 创建邮件发送存储过程。 2. 安装 UTL_MAIL UTL_MAIL 包用于在 Oracle 数据库中发送邮件,因此,在进行发送邮件之前,需要先安装该包。…

    database 2023年5月21日
    00
  • sql集合运算符使用方法

    SQL集合运算符是一种非常常见的查询技巧,用于处理多个数据表之间的数据交集、并集、差集等关系,主要包括UNION、UNION ALL、INTERSECT、EXCEPT这四种运算符。下面将详细讲解这些运算符在SQL中的使用方法。 一、UNION运算符 UNION运算符用于合并两个或多个SELECT语句的结果集,且去除重复的行,基本语法如下: SELECT co…

    database 2023年5月21日
    00
  • SQL SERVER 自增列

    SQL SERVER自增列攻略 什么是自增列 在 SQL SERVER 中,自增列是指一列数值,每当在该列中插入一条数据时,该列的值会自动加 1。自增列可以是任何数值类型,比如 INT 或 BIGINT。 如何创建自增列 创建自增列的语法如下: CREATE TABLE 表名( 列1 的数据类型 列1名, 列2 的数据类型 列2名, 自增列的数据类型 IDE…

    database 2023年5月21日
    00
  • MySQL中把varchar类型转为date类型方法详解

    MySQL中把varchar类型转为date类型方法详解 在 MySQL 中,我们可以通过 STR_TO_DATE() 函数将 varchar 类型的数据转换为 date 类型。这个函数的语法如下: STR_TO_DATE(string, format) 其中,string 表示需要转换的字符串,format 表示字符串的格式。 一、转换格式化字符串为日期 …

    database 2023年5月22日
    00
  • 如何设计高效合理的MySQL查询语句

    当我们面对海量数据时,设计高效合理的MySQL查询语句显得尤为重要,它不仅可以极大提高数据处理的效率,还能够有效减轻系统压力。在进行MySQL查询操作时,我们需要遵循以下几个原则: 尽量减少查询数据的数量 尽量减少查询的数据类型转换 尽可能使用索引 避免使用大量的子查询或联表查询 下面分别从这些原则入手,讲解如何设计高效合理的MySQL查询语句。 1. 尽量…

    database 2023年5月19日
    00
  • Oracle中定义以及使用同义词的方法

    在Oracle数据库中,同义词(Synonym)是一个非常重要的对象,它允许用户以不同的名称访问同一个对象。定义同义词的方法如下: 1. 创建同义词 创建同义词的语法格式如下: CREATE [OR REPLACE] [PUBLIC] SYNONYM 同义词名称 FOR 目标对象名称; 其中,[OR REPLACE]表示如果已经存在同义词,则先删除原同义词,…

    database 2023年5月21日
    00
  • MySQL xtrabackup 物理备份原理解析

    MySQL xtrabackup 物理备份原理解析 一、什么是 MySQL xtrabackup xtrabackup 是 Percona 提供的一个 MySQL 物理备份工具,使用该工具可以在不停止 MySQL 服务的情况下备份数据库。除此之外,xtrabackup 还支持增量备份和恢复数据的功能,是备份 MySQL 数据库的重要工具之一。 二、MySQL…

    database 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部