目录
- 笛卡尔积
- 内连接
- 外连接
- 左外连接
- 右外连接
- 全外连接
- 自然连接
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;
注
-
虽然写法一与写法二起到相同的作用,但前者的写法较为正规,偏向于内连接本身的意义。后者的写法偏向于在笛卡尔积的基础上,通过条件筛选结果。至于两者底层的实现,有待进一步钻研。
-
不加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
注
-
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;
-
全外连接是有条件的连接,不会产生错误记录;笛卡尔连接是无差别的连接,会产生错误记录
-
左外连接=左表全部记录+相关联结果
右外连接=右表全部记录+相关联结果
全外连接=左表全部记录+右表全部记录+相关联结果=左外连接+右外连接-相关联结果(即去重复)
6. 自然连接
自然连接是一种特殊的等值连接,其要求两个关系进行比较的分量必须是相同的属性组,并且在结果集中将重复属性列去掉。