“SQL92连接两个表:内连接”:
# 内连接不区分主从表
"SQL92连接两个表:内连接":
select *
from 表1,表2
where 表1.字段 = 表2.字段;# 两表重叠部分
“SQL99连接两个表:内连接”:
"SQL99连接两个表:内连接":
select *
from 表1
inner join 表2
on 表1.字段 = 表2.字段;# 两表重叠部分,其中inner可以省略
where '正常的筛选条件;'
SQL99外连接:left/right outer join on
外连接包括内连接:
外连接=内连接+没有交集的部分
(有些数据在从表中有对应的数据,有些数据在从表中没有对应的数据,需要查询没有对应数据的字段时用外连接)
表A:
name boyid
柳岩 8
苍老师 9
Angelababy 3
热巴 2
周冬雨 9
周芷若 1
岳灵珊 9
小昭 1
双儿 9
王语嫣 4
夏雪 9
赵敏 1
表B:
id boyname
1 张无忌
2 鹿晗
3 黄晓明
4 段誉
“查询表A中所有name对应的boyname”:left outer join on
# A,B表连接,不仅显示有对应数据的name,没有对应的数据也查询出来
# 主表为left左边的表A,对应的数据找不到用null代替
"查询表A中所有name对应的boyname":left outer join on
slect name boyname
from 表A
left outer join 表B
on boyid = id;
结果:
name boyname
柳岩 null
苍老师 null
Angelababy 黄晓明
热巴 鹿晗
周冬雨 null
周芷若 张无忌
岳灵珊 null
小昭 张无忌
双儿 null
王语嫣 段誉
夏雪 null
赵敏 张无忌
“查询表A中所有name对应的boyname”:right outer join on
# 主表为右边的表B,对应的数据找不到用null代替
"查询表A中所有name对应的boyname":right outer join on
select name,boyname
from 表A
right outer join 表B
on boyid = id;
输出:
Angelababy 黄晓明
热巴 鹿晗
周芷若 张无忌
小昭 张无忌
王语嫣 段誉
赵敏 张无忌
“全外连接”:左外连接和右外连接一起用,左外的所有数据加右外的所有数据,默认去重
# MySQL中使用:union关键字:联合(后面会有联合查询),oracle中使用full关键字
# MySQL中:比较复杂:需要两个连接都写
"全外连接":左外连接和右外连接一起用,左外的所有数据加右外的所有数据,默认去重
select name,boyname
from A
left outer join B
on boyid = id;
union
select name,boyname
from A
right outer join B
on boyid = id;
# oracle中使用:
select name,boyname
from A
full outer join B
on boyid = id;
“交叉连接”:cross,交叉连接就是正常的from A,B;显示笛卡尔积的表
# 表A中每一条数据都与表B中的每一条数据匹配,会有A*B条数据
"交叉连接":cross,交叉连接就是正常的from A,B;显示笛卡尔积的表
select name,boyname
from A
cross outer join B