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日

相关文章

  • php中的mongodb select常用操作代码示例

    下面是关于“PHP中的MongoDB Select常用操作代码示例”的完整攻略。 1. MongoDB基础 MongoDB是一个基于分布式文件存储的开源数据库系统,它将数据存储为文档,这些文档使用类似于JSON的格式。MongoDB提供了高性能、高可用性、易扩展性和灵活性等优势。在PHP开发中,可以使用MongoDB扩展来连接和操作MongoDB数据库。 2…

    database 2023年5月21日
    00
  • MySQL模糊查询语句整理集合

    MySQL模糊查询语句整理集合 在MySQL中,我们经常需要进行模糊查询来查找信息。这篇攻略将介绍MySQL中常用的模糊查询语句,包括LIKE、NOT LIKE、REGEXP等。 LIKE语句 LIKE语句是最常用的模糊查询语句之一。它可以匹配指定模式的字符串。 语法 SELECT column_name(s) FROM table_name WHERE c…

    database 2023年5月21日
    00
  • mysql高级、索引

    1.视图 # 引子 select * from emp left join dep on emp.dep_id = dep.id union select * from emp right join dep on emp.dep_id = dep.id; create view temp(emp_id,emp_name,salary,dep_id,dep_i…

    MySQL 2023年4月12日
    00
  • go第三方库sqlx操作MySQL及ORM原理

    下面我将详细讲解“go第三方库sqlx操作MySQL及ORM原理”的完整攻略。 一、sqlx库简介 sqlx是一个基于database / sql库的Golang软件包,它为所有基本的通过database/sql执行的操作提供了简单的包装。相同时间,它也添加了一些额外的功能。它可以通过以下命令安装: go get github.com/jmoiron/sql…

    database 2023年5月21日
    00
  • Python中MySQLdb和torndb模块对MySQL的断连问题处理

    Python中使用MySQLdb和torndb这两个模块对MySQL的断连问题处理,主要分为两步: 设置自动重连 在使用MySQLdb和torndb连接MySQL数据库时,需要在连接时设置connection pool,以确保在连接断开时能够自动尝试重连。具体的实现方式如下: 使用MySQLdb: import MySQLdb db_conn = MySQL…

    database 2023年5月21日
    00
  • 配置java环境变量(linux mac windows7)

    以下是配置Java环境变量的攻略: 配置Java环境变量 Linux 安装Java 对于Ubuntu,Debian等系统,可通过包管理器安装Java: sudo apt update sudo apt install default-jdk 配置环境变量 打开 ~/.bashrc 或 ~/.bash_profile 文件,添加以下内容: export JAV…

    database 2023年5月21日
    00
  • centos7中如何利用crontab进行mysql定时备份

    下面详细讲解在CentOS 7中如何利用crontab进行MySQL定时备份的完整攻略。 步骤一:安装MySQL 在CentOS 7中,可以通过以下命令安装MySQL: sudo yum install mysql-server 安装完成后,启动MySQL并设置开机自启动: sudo systemctl start mysqld sudo systemctl…

    database 2023年5月22日
    00
  • SQL 当相关行存在时更新记录

    要实现SQL中当相关行存在时更新记录的功能,可以使用SQL语句中的UPDATE和IF EXISTS。以下是具体步骤: 确认要更新的表和字段:首先需要连接到要更新的数据库,并确定要更新的表和要更新的字段。 构建更新SQL语句:利用UPDATE语句,设置要更新的表和字段,以及需要更新的值。然后使用WHERE子句来指定要更新的行,即“当相关行存在时”。 添加IF …

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