Dtpark's blog 磨刀不误砍柴工,读完硕士再打工

多表查询 |MySQL 学习笔记(四)

2022-10-31

多表查询就是从多张表中查询数据。

一、多表关系

  • 一对一:多用于但表拆分,在任意一方加入外键来关联另一方的主键,并且该外键唯一
  • 一对多:在多的一方建立外键,一的一方建立主键
  • 多对多:建立中建表,中建表至少包含两个外键,分别关联两方主键

二、多表查询概述

2.1 基本概念及目的

  • 笛卡尔积:两个集合所有的组合情况。

在多表查询时,要消除无效的笛卡尔积。

2.2 多表查询分类

  • 连接查询

    连接查询分类.001

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

三、连接查询

3.1 内连接

内连接查询两张表的交集部分。

  • 隐式内连接
SELECT 字段列表 FROM 1, 2 WHERE 条件...;
  • 显示内连接
SELECT 字段列表 FROM 1, [INNER] JOIN 2 ON 连接条件;

3.2 外连接

  • 左外连接
SELECT 字段列表 FROM 1 LEFT [OUTER] JOIN 2 ON 条件 ...;

查询 表1 点所有数据及包含 表1 和 表2 交集部分的数据。

  • 右外连接
SELECT 字段列表 FROM 1 RIGHT [OUTER] JOIN 2 ON 条件 ...;

查询 表2 点所有数据及包含 表1 和 表2 交集部分的数据。

3.3 自连接

SELECT 字段列表 FROM 1 别名1 RIGHT JOIN 1 别名2 ON 条件 ...;

可以是内连接查询,也可以是外连接查询。

四、联合查询

联合查询就是把多次查询的结果合并起来,形成一个新的查询结果集。

  • all 没有去重,去掉 all 就会去重;
  • 待合并的必报列数几字段类型必须保持一致;
SELECT 字段列表 FROM 1 ...
UNION [ALL]
SELECT 字段列表 FROM 2 ...;

五、子查询

SQL 语句中嵌套 SELECT 语句成为嵌套查询,又称子查询

SELECT * FROM t1 WHERE column=(SELECT column1 FROM t2);

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

  • 根据子查询结果不同分类
类型 常用操作符
标量子查询(子查询结果为单个值) = 、<>、 >、 >=、 <、 <=
列子查询(子查询结果为一列) IN、 NOT IN、 ANY、 SOME、 ALL
行子查询(子查询结果为一行) =、 <>、 IN、 NOT IN
表子查询(子查询结果为多行多列) IN
操作符 描述
IN 在指定集合范围内,多选一
NOT IN 不在指定集合范围内
ANY 子查询返回列表中,有任一满足条件即可
SOME 同 ANY
ALL 子查询返回列表的所有值都必须满足

行子查询可以用 (,…, ) = (,…, ) 负值

  • 根据子查询位置,分为
    • WHERE 之后
    • FROM 之后
    • SELECT 之后

Similar Posts

Comments