【MySQL】多表练习、查询以及多表的关系(一)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 【MySQL】多表练习、查询以及多表的关系

多表

一、多表概述

1. 多表简介

实际开发中,一个项目通常需要很多张表才能完成。例如:一个商城项目就需要分类表(category)、商品表(product)、订单表(orders)等多张表。且这些表的数据之间存在一定的关系,接下来我们将在单表的基础上,一起学习多表方面的知识。

9ecaa009e179407f826c356f0b21d2e5.png

2. 多表创建流程

  1. 设计表:设计相关的多个表;
  2. 创建表并设置主外键关系:
  1. 方式一:创建表时设置多张表之间的关系;
  2. 方式二:创建表之后,再设置表之间的关系


3. 多表关系分类

  1. 对多关系
  1. 常见实例:客户和订单,分类和商品,部门和员工.

 表设计的原则:在从表(多方)创建一个字段,字段作为外键指向主表(一方)的主键


26b01b0fc68742f0a0e1552c32f5aa1a.png

  1. 多对多关系
  1. 常见实例:学生和课程、用户和角色

表设计的原则: 需要创建第三张表,中间表中至少两个字段,这两个字段分别作为外键指向各自一方的主键.


d3ad1aba9409460eb6fbb709588fc575.png

一对一关系:(了解)

在实际的开发中应用不多.因为一对一可以创建成一张表.如果非要设计成一对一的表关系,多半是为了解耦,提高灵活度.如QQ号跟QQ信息详情,会员信息跟用户信息


二、多表入门案例


1. 案例说明

  1. 本案例以一对多关系为例
  2. 创建两张表:
  1. 主表:分类表category
  2. 从表:商品表product

b02a685605e84492a554b29557bcef03.png

设置外键关系

外键: 通常用来描述两张表之间的关系,表达的是一种参照完整性。

如会在员工表中添加一个字段depId,用来表示其所属部门,这个字段与部门表的主键对应。

此时就可以把depId设置为员工表的外键

外键特点:

从表外键的值是对主表主键的引用。

从表外键类型,必须与主表主键类型一致。

外键约束声明:

语法1:FOREIGN KEY (自己列名) REFERENCES 主表名 (主表列);

在创建从表的时候 直接在建表语句中添加上述格式

语法2:alter table 从表 add [constraint] [外键名称] foreign key (从表外键字段名) references 主表 (主表的主键);

[外键名称] 用于删除外键约束的,一般建议“_fk”结尾

alter table 从表 drop foreign key 外键名称

781d15cb98164afabe14fcc052b06896.png

2. 创建分类表category

###创建分类表
CREATE TABLE category(
  cid INT(32) PRIMARY KEY ,
  cname VARCHAR(100) #分类名称
);
  1. 创建商品表
# 商品表
CREATE TABLE product (
   pid INT PRIMARY KEY  ,
   pname VARCHAR(40) ,
   price DOUBLE ,
   category_id INT   # 外键字段
);

4. 设置外键

#添加约束   
-- alter table 从表 add [constraint] [外键名称] foreign key (从表外键字段名) references 主表 (主表的主键);
ALTER TABLE product ADD CONSTRAINT product_fk FOREIGN KEY (category_id) REFERENCES category (cid);

添加了外键之后,如果再向商品表中插入数据,要注意数据的categroy_id字段值要跟category表中的cid值相对应,如果插入的category_id,在category表中的cid没有对应则无法插入成功.

删除外键:

ALTER TABLE product DROP FOREIGN KEY product_fk

删除之后,product表 就没有外键约束了


  1. 常见操作

观察下面语句的执行效果

#1 向分类表中添加数据

INSERT INTO category (cid ,cname) VALUES(1,'服装');

#2 向商品表添加普通数据,没有外键数据,默认为null

INSERT INTO product (pid,pname) VALUES(1,'商品名称');

#3 向商品表添加普通数据,含有外键信息(数据存放在)

INSERT INTO product (pid ,pname ,category_id) VALUES(2,'商品名称2', 1);

#4 向商品表添加普通数据,含有外键信息(数据不存在) -- 不能异常

INSERT INTO product (pid ,pname ,category_id) VALUES(3,'商品名称2',9);

#5 删除指定分类(分类被商品使用) -- 执行异常

DELETE FROM category WHERE cid = 1;


三、多表查询

1. 案例说明


本案例以一对多关系的分类和商品表为例,进行常见的几种查询

交叉连接查询

语法:select * from A,B  

内连接查询(使用的关键字 inner join  -- inner可以省略)

隐式内连接:select * from A,B where 条件;

显示内连接:select * from A inner join B on 条件;

外连接查询(使用的关键字 outer join -- outer可以省略)

左外连接:left outer join

select * from A left outer join B on 条件;

右外连接:right outer join

select * from A right outer join B on 条件;


9f6e49b1b5424382a5b31fd2047b4167.png


  1. 数据准备
CREATE TABLE category (
  cid int PRIMARY KEY ,
  cname VARCHAR(50)
);
CREATE TABLE product(
  pid int PRIMARY KEY ,
  pname VARCHAR(50),
  price INT,
  flag VARCHAR(2), #是否上架标记为:1表示上架、0表示下架
  category_id int,
  CONSTRAINT product_fk FOREIGN KEY (category_id) REFERENCES category (cid)
);
#分类
INSERT INTO category(cid,cname) VALUES('1','家电');
INSERT INTO category(cid,cname) VALUES('2','服饰');
INSERT INTO category(cid,cname) VALUES('3','化妆品');
#商品
INSERT INTO product(pid, pname,price,flag,category_id) VALUES('1','联想',5000,'1',1);
INSERT INTO product(pid, pname,price,flag,category_id) VALUES('2','海尔',3000,'1',1);
INSERT INTO product(pid, pname,price,flag,category_id) VALUES('3','雷神',5000,'1',1);
INSERT INTO product (pid, pname,price,flag,category_id) VALUES('4','JACK JONES',800,'1',2);
INSERT INTO product (pid, pname,price,flag,category_id) VALUES('5','真维斯',200,'1',2);
INSERT INTO product (pid, pname,price,flag,category_id) VALUES('6','花花公子',440,'1',2);
INSERT INTO product (pid, pname,price,flag,category_id) VALUES('7','劲霸',2000,'1',2);
INSERT INTO product (pid, pname,price,flag,category_id) VALUES('8','香奈儿',800,'1',3);
INSERT INTO product (pid, pname,price,flag,category_id) VALUES('9','相宜本草',200,'1',3);
  1. 基本查询
  2. #需求1. 显示所有商品的名字和其对应的分类

# 格式: SELECT 列名1,列名2 FROM 表1 ,表2 WHERE 表1.外键 = 表2.主键

期望效果:

437cb8f03fbf4aca8a3ae84d3abd8836.png


语句实现:

# 格式: SELECT 列名1,列名2 FROM 表1 ,表2 WHERE 表1.外键 = 表2.主键

SELECT pname,cname FROM product ,category WHERE product.category_id = category.cid

# 等效写法 : 这种写法叫 显示 内连接 , 上面的写法叫隐式内连接

SELECT pname,cname FROM product INNER JOIN category  ON  product.category_id = category.cid

#需求2.显示所有的家电的对应商品名字

格式:# 格式: SELECT 列名1,列名2 FROM 表1 ,表2 WHERE 表1.外键 = 表2.主键 and 条件2

期望效果:

30900c69ddff41eea4e0eb6946242c21.png


实现:

SELECT cname,pname FROM product ,category WHERE product.category_id = category.cid AND cname='家电'

内连接

5caec1ad01d94cc3a1f9b35650852ca4.png



相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
缓存 关系型数据库 MySQL
MySQL索引策略与查询性能调优实战
在实际应用中,需要根据具体的业务需求和查询模式,综合运用索引策略和查询性能调优方法,不断地测试和优化,以提高MySQL数据库的查询性能。
196 66
|
13天前
|
存储 Oracle 关系型数据库
索引在手,查询无忧:MySQL索引简介
MySQL 是一款广泛使用的关系型数据库管理系统,在2024年5月的DB-Engines排名中得分1084,仅次于Oracle。本文介绍MySQL索引的工作原理和类型,包括B+Tree、Hash、Full-text索引,以及主键、唯一、普通索引等,帮助开发者优化查询性能。索引类似于图书馆的分类系统,能快速定位数据行,极大提高检索效率。
48 8
|
16天前
|
SQL 关系型数据库 MySQL
MySQL 窗口函数详解:分析性查询的强大工具
MySQL 窗口函数从 8.0 版本开始支持,提供了一种灵活的方式处理 SQL 查询中的数据。无需分组即可对行集进行分析,常用于计算排名、累计和、移动平均值等。基本语法包括 `function_name([arguments]) OVER ([PARTITION BY columns] [ORDER BY columns] [frame_clause])`,常见函数有 `ROW_NUMBER()`, `RANK()`, `DENSE_RANK()`, `SUM()`, `AVG()` 等。窗口框架定义了计算聚合值时应包含的行。适用于复杂数据操作和分析报告。
57 11
|
20天前
|
存储 关系型数据库 MySQL
mysql怎么查询longblob类型数据的大小
通过本文的介绍,希望您能深入理解如何查询MySQL中 `LONG BLOB`类型数据的大小,并结合优化技术提升查询性能,以满足实际业务需求。
79 6
|
2月前
|
SQL 前端开发 关系型数据库
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
68 9
|
2月前
|
缓存 监控 关系型数据库
如何优化MySQL查询速度?
如何优化MySQL查询速度?【10月更文挑战第31天】
128 3
|
2月前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
343 1
|
11天前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
38 3
|
11天前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
38 3
|
11天前
|
SQL 关系型数据库 MySQL
数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog
《数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog》介绍了如何利用MySQL的二进制日志(Binlog)恢复误删除的数据。主要内容包括: 1. **启用二进制日志**:在`my.cnf`中配置`log-bin`并重启MySQL服务。 2. **查看二进制日志文件**:使用`SHOW VARIABLES LIKE 'log_%';`和`SHOW MASTER STATUS;`命令获取当前日志文件及位置。 3. **创建数据备份**:确保在恢复前已有备份,以防意外。 4. **导出二进制日志为SQL语句**:使用`mysqlbinlog`
52 2