# 数据准备
create table t_group (
group_id number(4) not null,
group_name varchar2(15)
);
create table t_person (
person_id number(4) not null,
person_name varchar2(15),
group_id number(4)
);
insert into t_group(group_id, group_name) values(1, 'RESEARCH');
insert into t_group(group_id, group_name) values(2, 'SALES');
insert into t_person(person_id, person_name, group_id) values(1, 'zhangsan', 1);
insert into t_person(person_id, person_name, group_id) values(2, 'lisi', 1);
insert into t_person(person_id, person_name) values(3, 'wangwu');
commit;
# 交叉连接(cross join)
# 笛卡尔积(左表 x 右表)
select g.group_id, g.group_name, p.person_name
from t_group g cross join t_person p;
等同于
select g.group_id, g.group_name, p.person_name
from t_group g, t_person p;
# 自然连接(natural join)
# 自动对同名属性进行比较
select group_id, group_name, person_name
from t_group g natural join t_person p;
# 左连接(left join == left outer join)
# 以左表为准,右表无数据时补空
select g.group_id, g.group_name, p.person_name
from t_group g left join t_person p on g.group_id=p.group_id;
# 右连接(right join == right outer join)
# 以右表为准,左表无数据时补空
select g.group_id, g.group_name, p.person_name
from t_group g right join t_person p on g.group_id=p.group_id;
# 全连接(full join == full outer join)
# 返回左右表的所有记录,任何一方无数据时补空
select g.group_id, g.group_name, p.person_name
from t_group g full join t_person p on g.group_id=p.group_id;
# 内连接(join == inner join)
# 只返回相匹配的
select g.group_id, g.group_name, p.person_name
from t_group g join t_person p on g.group_id=p.group_id;
# 等值连接(与内连接相同,只是 sql 格式不一样)
select g.group_id, g.group_name, p.person_name
from t_group g, t_person p
where g.group_id=p.group_id;
# 条件查询(泛指带 where 条件的查询)
select person_id, person_name, group_id from t_person where group_id is not null;