当前位置: 首页 > news >正文

SQL 多表查询场景速查:一对一、一对多、多对多

在实际开发中,单表查询往往无法满足业务需求,我们需要进行多表查询。多表关系大致分为 一对一、一对多、多对多 三种。本文将带你速查这些场景及其典型 SQL 写法。

一、一对一关系查询

一对一关系通常出现在两张表一一对应的场景,比如用户表和用户详情表。

典型写法:

SELECT u.id, u.name, d.address, d.phone

FROM User u

INNER JOIN UserDetail d ON u.id = d.user_id;

要点:

一对一关系的 JOIN 与一对多类似,但通常主键和外键是唯一绑定。

在设计上有时会拆分表来避免冗余。

二、一对多关系查询

一对多是最常见的关系,比如 一个用户可以有多条订单。

典型写法:

SELECT u.name, o.order_id, o.amount

FROM User u

INNER JOIN Orders o ON u.id = o.user_id;

要点:

一对多查询时,结果集中会重复出现“一”的部分(如用户信息)。

通常需要结合 GROUP BY 或聚合函数做统计,比如用户订单总额:

SELECT u.name, SUM(o.amount) AS total_amount

FROM User u

INNER JOIN Orders o ON u.id = o.user_id

GROUP BY u.id, u.name;

三、多对多关系查询

多对多关系需要 中间表 作为桥梁。比如学生和课程:一个学生可以选多门课程,一门课程也可以被多个学生选。

典型设计:

● Student 学生表

● Course 课程表

● StudentCourse 学生-课程关系表

典型写法:

SELECT s.name, c.course_name

FROM Student s

INNER JOIN StudentCourse sc ON s.id = sc.student_id

INNER JOIN Course c ON sc.course_id = c.id;

要点:

中间表至少包含两列外键(指向两边表)。

查询时通常需要双 JOIN。

四、JOIN 类型选择

● INNER JOIN:只保留两边匹配的数据。

● LEFT JOIN:保留左表所有数据,即使右表无匹配。

● RIGHT JOIN:保留右表所有数据,即使左表无匹配。

示例:

-- 查询所有用户,即使没有订单

SELECT u.name, o.order_id

FROM User u

LEFT JOIN Orders o ON u.id = o.user_id;

五、面试高频问题

1. 一对一关系如何查询?

使用唯一外键连接,结果唯一对应。

2. 一对多查询结果会出现什么问题?

会出现重复记录,通常需要用聚合函数或 GROUP BY 处理。

3. 多对多如何建模?

需要引入中间表,避免直接的多对多关系。

六、总结

一对一:两表一一对应,常见于扩展表。

一对多:主表信息会重复,需要聚合处理。

多对多:必须通过中间表实现,再用双 JOIN 查询。

一句话记忆:“一对一靠唯一键,一对多靠外键,多对多靠中间表。”

http://www.dtcms.com/a/441956.html

相关文章:

  • 从 0 到 1 搭建 Python 语言 Web UI自动化测试学习系列 7--基础知识 3--常用函数 1
  • Amazon S3 Vectors:向量存储、索引与多亚马逊云科技服务协同的智能桥梁解决方案
  • 第二章 prompt思维链
  • 大模型面经(一) Prompt + RAG + 微调
  • 第一章——了解prompt以及一些基础技巧方法
  • 做牛津布面料在哪个网站找客户找人一起做素材网站
  • 土豆家族工具使用适配表格大全【windows提权】
  • PyQt5 QPushButton组件详解:按钮控件的完整指南
  • Linux中do_wait函数的实现
  • 第1章 线程安全的对象生命期管理
  • Codeforces Round 1027 A. Square Year (2114)
  • 公司网站备案信息查询嵌入式开发培训
  • mysql--核心日志文件详解
  • 营销型网站要多少钱广告联盟app
  • 浙江建设职业技术学院官方网站中信建设有限责任公司资质等级
  • Vidmy 1.0.129| 无限制下载国外视频,支持高速下载、即时抓取高清视频。使用需要科学
  • (CVPR2025)DEIM模型训练自己的数据集教程(基于Pycharm)
  • 13.排序(上)
  • 《KelpBar海带Linux智慧屏项目》
  • 二叉树的层序遍历--力扣
  • 解决Linux下操作无权限问题——chmod: 正在更改...的权限:不允许的操作
  • 哈尔滨论坛建站模板ftp上传网站后怎么弄
  • 使用D3.js画人物关系图
  • 数据结构与算法篇--语义智能指针设计模式
  • 微信小程序入门学习教程,从入门到精通,WXML(WeiXin Markup Language)语法基础(8)
  • 明天好好总结汇总分析博客
  • HTML--在textarea左侧添加行号
  • mysql逻辑备份跟物理备份的区别
  • Django 学习日志
  • 如何用word做简单的网站wordpress绑定