多表查询

Posted juzhuxiaozhu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多表查询相关的知识,希望对你有一定的参考价值。

目录

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

??

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. 自然连接

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






以上是关于多表查询的主要内容,如果未能解决你的问题,请参考以下文章

python flask(多对多表查询)

MyBatis多表联查

phpcms v9后台多表查询分页代码

thinkphp3.1 多表联合查询代码

mysql 多表联合查询啥用

19.Sqlite多表连接查询及聚合函数的应用