[2025.1.25 MySQL学习] 多表查询

多表查询

多表关系

多表关系分为三种:

  • 一对多/多对一
    • 部门和员工,一个部门对应多个员工
    • 在多的一方建立外键,指向一方的主键
  • 多对多
    • 学生和课程,一个学生可以选多个课程,一个课程也可以被多个学生选
    • 建立第三张中间表,中间表至少包含两个外键,分别关联两方主键
  • 一对一
    • 用户与用户中间的关系
    • 用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,以提升操作效率
    • 在任意一方加入外键,关联另外一方主键,并且设置外键为唯一的(UNIQUE)






多表查询概述

即从多表中查询数据(笛卡尔积),多表查询时,需要消除无效的笛卡尔积

image







多表查询分类

  • 连接查询
    • 内连接:相当于查询A、B交集部分数据
    • 外连接:
      • 左外连接:查询左表所有数据,以及两张表交集部分数据
      • 右外连接:查询右表所有数据,以及两张表交集部分数据
    • 自连接:当前表与自身的连接查询,自连接必须使用表别名
  • 子查询

1、内连接(交集)

  • 隐式内连接

image

  • 显式内连接

image

  • ps:一旦给表起了别名,不能再通过表名索取字段

2、外连接

  • 左外连接

image

  • 右外连接

image

3、自连接

image

4、联合查询

image

5、子查询

  • 概念:SQL中嵌套SELECT语句,称为嵌套查询,又称为子查询

image

子查询外部的语句可以是INSERT/UPDATE/DELETE/SELECT中的任何一个

  • 根据子查询结果,可以分为:

    • 标量子查询(查询结果为单个值)
    • 列子查询(查询结果为一列)
    • 行子查询(查询结果为一行)
    • 表子查询(查询结果为多行多列)
  • 根据子查询网位置,可以分为

    • WHERE之后
    • FROM之后
    • SELECT之后

6、标量子查询

  • 子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式,例如:
-- select id from dept where name = '销售部'
-- 此时子查询只返回一个id : 4
select * from emp where dept_id = 4;
  • 上述语句可以用(子查询)代替4,就是标量子查询

7、列子查询

  • 子查询返回结果为一列(可以是多行)
select id from dept where name = '销售不' or name = '市场部';
select * from emp where dept_id in (2, 4);
  • 上述(2,4),可以用(列子查询)代替,子查询结果(2、4)为一列

8、行子查询

  • 子查询返回的结果是一行(可以是多列)
select salary, manageid from emp where name = '员工a';
-- 拿到员工a的薪资和id,为一行多列信息
select * from emp where (salary, manageid) = (12500, 1);

上述(12500,1),可以用(行子查询)代替,子查询结果(12500、1)为一行

9、表子查询

  • 子查询结果为多行多列
select job, salary from emp where name = '员工a' or name = '员工b';
-- 此处子查询结果不止一行一列
select * from emp where (job, salary) in (select job, salary from emp where name = '员工a' or name = '员工b');
posted @   Luna-Evelyn  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库

阅读目录(Content)

此页目录为空

点击右上角即可分享
微信分享提示