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

yizhihongxing

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日

相关文章

  • SQL 按照时间单位分组

    首先需要明确一下什么是按照时间单位分组。在SQL中,我们可以使用DATE_TRUNC函数将一个时间列按照指定的时间单位(如年、月、日、小时等)截取,并对这个时间单位进行分组和聚合计算。下面将介绍如何在SQL中使用DATE_TRUNC函数进行时间分组操作。 使用DATE_TRUNC函数进行时间分组 DATE_TRUNC函数的语法如下: DATE_TRUNC(‘…

    database 2023年3月27日
    00
  • Oracle如何更改表空间的数据文件位置详解

    如何更改表空间的数据文件位置是一个常见的 Oracle 数据库管理员需要解决的问题。以下是完整的攻略过程: 准备工作 确认您已经有 Oracle 数据库管理员或者超级用户的权限,以便进行下列的操作。 确认要更改表空间的数据文件位置的表空间没有正在使用的数据文件,即表空间置于 OFFLINE 状态的操作已经完成。 确认您已经有足够的存储空间,以便移动数据文件到…

    database 2023年5月22日
    00
  • Mysql数据库监听binlog的开启步骤

    下面是详细讲解Mysql数据库监听binlog的开启步骤的完整攻略。 什么是binlog 先来了解一下binlog。MySQL 的二进制日志,即 binlog。它记录了所有更新或修改了数据库数据的操作,包括数据库的更改语句,如 INSERT、UPDATE 和 DELETE 等,以及关闭或重启服务器时的操作等。 为什么要监听binlog 在一些情况下,我们需要…

    database 2023年5月22日
    00
  • MySQL 数据库的监控方式小结

    MySQL是广泛使用的关系型数据库管理系统,为了保证MySQL数据库的稳定性和性能,需要在运行时对其进行监控。本文将介绍MySQL数据库的监控方式,帮助用户更好地掌握和管理MySQL数据库。 监控MySQL的工具 1. MySQL自带工具 MySQL自带以下工具,可以用于监控MySQL的性能和状态: mysqladmin:用于管理mysql服务,查询状态信息…

    database 2023年5月22日
    00
  • BMS和EMS的区别

    BMS(Battery Management System)和EMS(Energy Management System)是电池管理系统和能量管理系统,这两个概念是由电力电子技术在电动汽车和新能源领域引入的。虽然它们是相关的,但它们的功能和应用范围不同。 BMS是电池管理系统,用于维护电动车电池的健康、充电和放电状态的监控和控制。BMS需要实时测量电池的电压、…

    database 2023年3月27日
    00
  • Python MySQL数据库基本操作及项目示例详解

    Python MySQL数据库基本操作及项目示例详解 本文将为您介绍 Python 语言中如何操作 MySQL 数据库,包括连接数据库、创建表、插入数据、修改数据、删除数据以及查询数据等基本操作,最后还将提供两个项目示例,分别是购物车系统和学生信息管理系统。 一、连接数据库 Python 连接 MySQL 数据库的方式有多种,其中最常见的方式是使用 pymy…

    database 2023年5月21日
    00
  • sql server 创建临时表的使用说明

    创建临时表是SQL Server中常用的一种操作,可以在查询过程中临时存储数据,方便后续使用,同时也不会占用数据库中的实际表格。本文将介绍如何创建临时表并使用它,涉及到创建、查询、修改、删除等操作。 1. 创建临时表的语法 在SQL Server中,创建临时表需要使用CREATE TABLE语句。临时表分为本地临时表和全局临时表两种,本地临时表只能在当前会话…

    database 2023年5月21日
    00
  • mysql中,创建包含json数据类型的表?创建json表时候的注意事项?查询json字段中某个key的值?

    需求描述:   在mysql数据库中,创建包含json数据类型的表.记录下,在创建的过程中,需要注意的问题. 操作过程: 1.通过以下的语句,创建包含json数据类型的表 mysql> create table tab_json(id bigint not null auto_increment,data json,primary key(id)); …

    MySQL 2023年4月13日
    00
合作推广
合作推广
分享本页
返回顶部