SQL的多表查询


多表查询的概述

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

语法

select * from 表1,表2;

查询分类

  1. 连接查询:
  1. 内连接:相当于查询A、B表的交集部分数据;
  2. 外连接:
  1. 左外连接:查询左表所以数据,以及两张表交集部分数据;
  2. 右外连接:查询右表所以数据,以及两张表交集部分数据;
  1. 自连接:当前表与自身的连接查询,自连接必须使用表别名;
  1. 子查询:
  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 条件;
  1. 显示内连接:
select 字段列表 from 表1 [inner] join 表2 on 连接条件;

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

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

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


语法

  1. 左外连接:
select 字段列表 from 表1 left [outer] join 表2 on 条件;

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

  1. 右外连接:
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