MySQL数据库多表操作通关指南(外键约束和多表联合查询)

MySQL数据库多表操作通关指南

当你开始处理大量的数据时,数据库中的单个表可能无法满足你的需要。这时候,多表操作就成为了必要的技能。本文将为你介绍 MySQL 数据库中的外键约束和多表联合查询,并提供实际的示例。

外键约束

为了在相关的表之间建立关系,MySQL 数据库提供了外键约束的功能。外键是一个表的列,它与另一个表的主键相关联。外键可以将数据分布在两个或更多的表中,并对它们之间的关系进行约束。

创建外键

创建外键需要满足以下条件:

  • 两个表必须使用 InnoDB 引擎。
  • 外键列和主键列必须具有相同的数据类型和长度。
  • 外键列和主键列必须加上 NOT NULL 约束。

接下来,我们将以学生表和学生选修表为例来演示如何创建外键。

先创建学生表:

CREATE TABLE student (
  `id` INT PRIMARY KEY AUTO_INCREMENT,
  `name` VARCHAR(20) NOT NULL,
  `age` INT NOT NULL
) ENGINE=InnoDB CHARSET=utf8mb4;

然后创建学生选修表:

CREATE TABLE stu_course (
  `id` INT PRIMARY KEY AUTO_INCREMENT, 
  `stu_id` INT NOT NULL,
  `course_id` INT NOT NULL,
  FOREIGN KEY (stu_id) REFERENCES student (id)
  ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB CHARSET=utf8mb4;

其中,stu_id 是外键列,参照了学生表的 id 列。ON DELETE CASCADEON UPDATE CASCADE 设置了当主表中记录被删除或更新时,从表对应的记录也会被删除或更新。

删除外键

如果你需要删除一个外键,可以使用以下命令:

ALTER TABLE stu_course
DROP FOREIGN KEY fk_stu_id;

其中,fk_stu_id 是外键的名称。

多表联合查询

在多表联合查询中,我们可以根据需要从多个表中检索数据。通过使用 SQL 语句,可以创建具有不同的连接类型的查询。

我们可以使用以下类型:

  • INNER JOIN
  • LEFT JOIN
  • RIGHT JOIN
  • FULL OUTER JOIN

其中,INNER JOIN 返回两个表中相匹配的行,而 LEFT JOIN 和 RIGHT JOIN 返回一个表中的所有行和其他表中匹配的行,FULL OUTER JOIN 则返回两个表中所有的行。

下面我们来看两个示例说明。

示例一:使用 INNER JOIN 连接两个表

假设我们有一个学生表和一个学生选修表。我们想要查询每个学生选修的课程。

我们可以使用 INNER JOIN 连接两个表,然后检索我们需要的数据。

SELECT s.name, c.course_name  
FROM student s  
INNER JOIN stu_course sc ON s.id = sc.stu_id  
INNER JOIN course c ON sc.course_id = c.id;

以上操作会返回学生姓名和他们选修的课程。

示例二:使用 LEFT JOIN 连接两个表

假设我们有一个商品表和一个顾客订购表。我们想要查询所有商品及顾客订购该商品的情况。

我们可以使用 LEFT JOIN 连接两个表,然后检索我们需要的数据。

SELECT p.product_name, IFNULL(o.order_count, 0)  
FROM products p  
LEFT JOIN (  
  SELECT product_id, SUM(quantity) AS order_count  
  FROM orders  
  GROUP BY product_id  
) o ON p.id = o.product_id;

以上操作会返回商品名称和该商品被订购的数量。

总结

在开始编写多表联合查询之前,我们需要正确地了解表之间的关系,并明确我们所需的数据。随着经验的增长,我们可以更加了解不同类型的 JOIN,并可以使用它们更有效地检索数据。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MySQL数据库多表操作通关指南(外键约束和多表联合查询) - Python技术站

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

相关文章

  • PLSQL一些常用知识点梳理总结

    当提到Oracle数据库中存储过程、触发器和函数的编写时,我们就不得不提到PL/SQL。PL/SQL是Programming Language/Structured Query Language的缩写,它是Oracle数据库的编程语言,允许开发人员编写可重用的程序单元比如函数、触发器和存储过程等。本文将梳理总结PL/SQL一些常见的知识点,希望对PL/SQL…

    database 2023年5月21日
    00
  • SQL Server多表查询优化方案集锦

    SQL Server多表查询优化方案集锦 在SQL Server中,多表查询时会面临到性能瓶颈的问题,需要使用一些优化方案来提高查询效率。本文将介绍一些多表查询的优化方案,帮助读者优化SQL Server多表查询性能。 1. 合理使用索引 索引是一种重要的优化手段,可以加快查询速度。在多表查询时,尤其需要合理使用索引,可以使用下面这些方法: 1.1. 创建合…

    database 2023年5月19日
    00
  • MySQL 获得当前日期时间 函数

    MySQL 中可以使用以下函数获取当前日期时间: NOW() NOW() 函数可以返回当前日期和时间的值,以 ‘YYYY-MM-DD HH:MM:SS’ 的格式表示。 示例: 查询当前日期时间: SELECT NOW(); 结果:返回 ‘YYYY-MM-DD HH:MM:SS’ 形式的当前日期时间。 CURRENT_TIMESTAMP() CURRENT_T…

    database 2023年5月22日
    00
  • Oracle数据库中 call 和 exec的区别

    题目要求讲解“Oracle数据库中 call 和 exec的区别”,我将从以下几个方面进行讲解: call 和 exec 的概念解释; call 和 exec 的语法和用法区别; 总结。 1. call 和 exec 的概念解释 在 Oracle 数据库中,call 和 exec 都用于调用存储过程(StoredProcedure)。存储过程是一组预编译的 …

    database 2023年5月21日
    00
  • redis的Sentinel模式(哨兵模式)的windows安装

    一、下载windows版本的Redis github下载地址:https://github.com/MSOpenTech/redis/tags  将压缩包解压,更名为Redis,放在D盘。 删除redis-server.pdb, redis-cli.pdb, redis-check-aof.pdb, redis-benchmark.pdb 删除Windows…

    Redis 2023年4月12日
    00
  • Mysql系列SQL查询语句书写顺序及执行顺序详解

    关于”Mysql系列SQL查询语句书写顺序及执行顺序详解”的攻略,我们可以从以下几个方面进行介绍。 常见的查询语句书写顺序 为了方便理解,在学习查询语句的过程中,我们一般会按照以下的顺序来书写我们的查询语句: 选择需要查询的列,使用select关键字。 确定查询的表名或视图名,使用from关键字,并指定查询表或视图的名称。 指定额外的条件,使用where关键…

    database 2023年5月21日
    00
  • MySQL与Oracle的语法区别详细对比

    MySQL和Oracle是两种不同的关系型数据库管理系统,它们的语法有一些区别。下面是MySQL与Oracle的语法区别详细对比的攻略: 标识符 MySQL和Oracle在标识符的规则上略有不同。MySQL允许标识符包含数字、字母、下划线,并且必须以字母或下划线开头。而在Oracle中,标识符可以包含数字、字母、下划线、美元符号,并且必须以字母开头。 示例:…

    database 2023年5月21日
    00
  • celery-redis密码连接问题

    错误问题:consumer: Cannot connect to amqp://guest:**@127.0.0.1:5672//: [WinError 10061] 由于目标计算机积极拒绝,无法连接。.Trying again in 2.00 seconds… (1/100) 解决问题:URL连接的格式为: redis://:password@host…

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