SQL的多表查询

mysql 文章 2022-07-20 14:20 0 全屏看文

SQL的多表查询


  • 多表查询的概述

    1. 指从多张表中查询数据;
    2. 各个表格之间相互关联,基本分为:一对多(多对一)、多对多、一对一;
  • 语法

    select * from 表1,表2;
    
  • 查询分类

    1. 连接查询:
      1. 内连接:相当于查询A、B表的交集部分数据;
      2. 外连接:
        1. 左外连接:查询左表所以数据,以及两张表交集部分数据;
        2. 右外连接:查询右表所以数据,以及两张表交集部分数据;
      3. 自连接:当前表与自身的连接查询,自连接必须使用表别名;
    2. 子查询:
      1. 标量子查询:子查询结果为单个值;
      2. 列子查询:子查询结果为一列;
      3. 行子查询:子查询结果为一行;
      4. 表子查询:子查询结果为多行多列;

多表查询 - 一对多(多对一)


  • 实现

    1. 在多的一方建立外键,指向一的一方的主键;

多表查询 - 多对多


  • 实现

    1. 建立第三张中间表,中间表至少包含两个外键,分别关联两方主键;

多表查询 - 一对一


  • 实现

    1. 在任意一方加入外键,关联另外一方的主键,并设置外键为唯一的(unique);

多表查询 - 消除无效的笛卡尔积


  • 笛卡尔积

    1. 笛卡尔乘积是指在数字中,两个集合 A集合、B集合的所有组合情况;
    2. 在多表查询时,需要消除无效的笛卡尔积;
  • 消除无效的笛卡尔积

    select * from 表1,表2 where 表1外键 = 表2.主键
    

多表查询 - 连接查询 - 内连接


  • 语法

    1. 隐式内连接:

      select 查询列表 from 表1,表2 where 条件;
      
    2. 显示内连接:

      select 字段列表 from 表1 [inner] join 表2 on 连接条件;
      

      (PS:方括号("[]")内的为可选项;)

      (注意:如果已经为表设置别名,则不能直接通过表名限定字段;)

多表查询 - 连接查询 - 外连接


  • 语法

    1. 左外连接:

      select 字段列表 from 表1 left [outer] join 表2 on 条件;
      

      (PS:方括号("[]")内的为可选项;)

    2. 右外连接:

      select 字段列表 from 表1 right [outer] join 表2 on 条件;
      

      (PS:方括号("[]")内的为可选项;)

多表查询 - 连接查询 - 自连接


  • 语法

    select 字段列表 from 表1 别名1 join 表1 别名2 on 条件;
    

多表查询 - 联合查询


  • 语法

    select 字段列表 from 表1
    union [all]
    select 字段列表 from 表2;
    

    (PS:方括号("[]")内的为可选项;)

    (注意:

    union是对查询的结果合并;

    union all是对查询的结果合并后去重复;

    联合查询的多张表的列数必须保持一致,字段类型也需要保持一致;

多表查询 - 子查询


  • 语法

    select * from t1 where column1 = (select column1 from t2);
    

    (注意:子查询的外部语句可以是insert、update、delete、select的任何一个)

  • 子查询结果分类

    1. 标量子查询(子查询结果为单个值)
    2. 列子查询(子查询结果为一列)
    3. 行子查询(子查询结果为一行)
    4. 表子查询(子查询结果为多行多列)
  • 子查询位置分类

    1. where之后
    2. from之后
    3. select之后

多表查询 - 子查询 - 标量子查询


  • 概述

    子查询的返回值是单个值(数字、字符串、日期等);

  • 常用的操作符号

    =、<>、>、>=、<、<=

多表查询 - 子查询 - 列子查询


  • 概述

    子查询的返回结果是一列(可以是多行);

  • 常用的操作符号

    操作符 描述
    in 在指定的集合范围之内,多选一
    not in 不在指定的集合范围之内
    any 子查询返回列表中,有任意一个满足即可
    some 与any等同,使用some的地方都可以使用any
    all 子查询返回列表的所以值都必须满足

多表查询 - 子查询 - 行子查询


  • 概述

    子查询返回的结果是一行(可以是多行);

  • 常用操作符

    =、<>、in、not in

多表查询 - 子查询 - 表子查询


  • 概述

    子查询返回的结果为多行多列;

  • 常用操作符

    in

-EOF-