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日

相关文章

  • Derby和Cassandra的区别

    Derby和Cassandra都是数据库管理系统,但是它们在设计理念、架构和用途方面存在着不同。在本篇攻略中,我们将详细讲解Derby和Cassandra的区别。 Derby Derby是一种关系型数据库管理系统,它是Java平台上的嵌入式数据库。它具有以下特点: 开源、免费 轻量级、嵌入式 关系型、遵循ACID原则 适用于小型的本地应用程序 数据仓库/OL…

    database 2023年3月27日
    00
  • 在windows电脑中安装redis

    1,github下载地址:https://github.com/MSOpenTech/redis/tags  2,下载完成后,解压到对应文件夹 3,打开redis.windows.conf,在#requirepass foobared下新增requirepass 密码;在# maxmemory <bytes>下新增maxmemory 字节数   …

    Redis 2023年4月12日
    00
  • MySQL 中 的 bit 类型,tinyint(1);

    之前一直以为 mysql中没有 bit类型,需要使用 tinyint 来标识 bit。但是前端的实体类,不好控制,后来发现这些问题已经有了默认的统一设置,这样反而更好。   总结:MySQL中 使用布尔类型的字段,就用 tinyint(1),true 为1 false 为0 辅助参考文章:https://blog.csdn.net/dianjun2454/a…

    MySQL 2023年4月13日
    00
  • Oracle中PL/SQL复合数据类型

    很好,下面是Oracle中PL/SQL复合数据类型的详细攻略: 什么是PL/SQL复合数据类型 PL/SQL (Procedural Language/Structured Query Language)是Oracle数据库的过程式语言,它支持复合数据类型。复合数据类型是将不同类型的数据组合成一个整体来处理。PL/SQL中的复合数据类型主要包括数组类型、记录…

    database 2023年5月21日
    00
  • 如何在SQL Server中实现 Limit m,n 的功能

    在SQL Server中实现类似于MySQL中的 LIMIT m,n 的限制结果集的功能,可以采用 OFFSET FETCH 的方法。 使用 OFFSET FETCH 实现 Limit m,n 语法格式如下: SELECT column FROM table ORDER BY column OFFSET m ROWS FETCH NEXT n ROWS ON…

    database 2023年5月21日
    00
  • 当数据库变慢时的解决方法

    当数据库变慢时,我们需要先通过一些指标分析确定问题的所在,再采取一些解决方法来优化数据库性能。以下是大致的完整攻略: 1. 数据库性能指标及其分析 1.1 延迟指标 响应时间(RT):请求到达数据库系统直至结果返回所需的时间,可分为平均响应时间和百分位响应时间。RT 通常要尽量地短。 等待时间(WT):等待资源/锁定的时间,为了减少 WT,可以考虑更改等待超…

    database 2023年5月19日
    00
  • python安装oracle扩展及数据库连接方法

    下面我们来详细讲解一下“Python安装Oracle扩展及数据库连接方法”的完整攻略。 安装cx_Oracle扩展库 在Python中操作Oracle数据库,需要先安装cx_Oracle扩展库。cx_Oracle是Python中一个Oracle数据库连接的第三方模块,可以用来连接Oracle数据库并进行数据的读写操作。下面是安装cx_Oracle库的步骤: …

    database 2023年5月22日
    00
  • linux mysql5.5升级至mysql5.7的步骤与踩到的坑

    下面我将详细讲解将Linux系统中的MySQL 5.5升级至MySQL 5.7的步骤与踩到的坑。 1.备份 在进行数据库升级之前,首先需要做好备份工作。可以使用mysqldump命令对数据库进行备份,备份的命令如下: mysqldump -u root -p –all-databases > backup.sql 其中,-u表示登录MySQL的用户名…

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