多表查询

目录

  • 笛卡尔积
  • 内连接
  • 外连接
    • 左外连接
    • 右外连接
    • 全外连接
  • 自然连接

  

1. 笛卡尔积

​返回两表记录“相乘”的结果。若A表有m条记录,B表有n条记录,笛卡尔积会产生m*n条记录。其中,A表每一条记录,都对应一遍B表中的n条记录。
笛卡尔积返回的结果时常包含无意义的记录,所以用处并不太大,但这也不能说明其完全无意义。
试想场景:A表存放着一个班的学员信息,B表存放着学校所开设课程的信息。两者的笛卡尔积则具有该班学生选择课程结果的所有可能性。

:当两表过大时,应当尽可能避免使用笛卡尔积。

select * from A,B;

  

2. 内连接

​通过两表相同的字段连接,选取两表共有的数据。
​如A表存放学员信息,并包含学号这一字段;B表存放成绩,并也包含学号这一字段。通过内连接可查询所有学生及其对应的课程成绩。

mysql写法:

写法一:
select * from A inner join B on A.no=B.no;

写法二:
select * from A,B where A.no=B.no;

  1. 虽然写法一与写法二起到相同的作用,但前者的写法较为正规,偏向于内连接本身的意义。后者的写法偏向于在笛卡尔积的基础上,通过条件筛选结果。至于两者底层的实现,有待进一步钻研。

  2. 不加on,或不使用where的内连接退化成笛卡尔积,失去意义。

  

3. 左外连接

在内连接的基础上,加上左边有的数据。即,左边的表包含其全部的记录,右边的表若无与之对应的记录,则为null。

写法如下:

select * from A left join B on A.no=B.no

  

4. 右外连接

在内连接的基础上,加上右边有的数据。即,右边的表包含其全部的记录,左边的表若无与之对应的记录,则为null。

写法如下:

select * from A right join B on A.no=B.no

  

5. 全外连接

只要左表与右表其中一个表存在记录,则返回关联记录。相当于综合了左外连接与右外连接。

写法如下:

select * from A full join B on A.no=B.no

  1. mysql不能使用全外连接,但可以用 union 模拟。

    select * from A left join B on A.no=B.no
    UNION
    select * from A right join B on A.no = B.no;
    
  2. 全外连接是有条件的连接,不会产生错误记录;笛卡尔连接是无差别的连接,会产生错误记录

  3. 左外连接=左表全部记录+相关联结果
    右外连接=右表全部记录+相关联结果
    全外连接=左表全部记录+右表全部记录+相关联结果=左外连接+右外连接-相关联结果(即去重复)

6. 自然连接

自然连接是一种特殊的等值连接,其要求两个关系进行比较的分量必须是相同的属性组,并且在结果集中将重复属性列去掉。

posted @ 2020-07-25 10:35  仰观云  阅读(18)  评论(0编辑  收藏
Live2D