一、表的连接
1.内连接 (inner join)
做内连接得到的是a和b的关联关系的列同时存在的进行连接,内连后a和b关联列相同的a中数据和b中数据合在一起形成新的表数据。
内连接只有满足条件的数据才会显示
-- a 表和 b 表做内连接
-- a 表中的 bNO 和 b 表中的 NO 都不为 null 且a.bNo=b.NO 组成一条新数据。
SELECT * FROM a INNER JOIN b ON(a.bNO=b.NO);
等值连接也属于内连接
SELECT * FROM a, b WHERE a.nNO=b.NO;
2.外连接
2.1 左外连接(left outer join:简写为 left join)
左外连接是 a 表中的所有行都会显示,b表 中的对应数据添加在 a 表中的对应数据后面形成新的表数据。
-- a 表和 b 表做左连接
-- a 表中的所有列都会有,b 表中只有和 a 表中关联的数据才会跟在 a 表对应数据后面
SELECT * FROM a LEFT JOIN b ON(a.bNO=b.NO);
在 oracle 中左连接的另一种写法:
SELECT * FROM a, b WHERE a.bNO = b.NO(+);
2.2 右外连接(right outer join :简写为 right join)
右外连接与左外连接刚好相反, b表中的所有行都会显示,a 表 中的对应数据添加在 b 表中的对应数据后面形成新的表数据。
-- a 表和 b 表做右连接
-- b 表中的所有列都会有,a 表中只有和 b 表中关联的数据才会跟在 b 表对应数据后面
SELECT * FROM a RIGHT JOIN b ON(a.bNO=b.NO);
在 oracle 中右连接的另一种写法
SELECT * FROM a, b WHERE a.bNo(+) = b.NO;
2.3 全外连接(full outer join:简写为 full join)
a 表和 b 表中的数据都会显示
-- a 表和 b 表做全连接
-- a 表和 b 表中的数据都会显示
SELECT * FROM a FULL JOIN b ON(a.bNO=b.NO);
3、数据集合操作
3.1 union 和 union all (并集操作)
union 和 union all 都是将多个 select 查询得到的集合进行并集操作。
使用前提:
要使用 union 或者 union all 进行合并的多个 select 查询到的集合字段个数必须要一致,对应的字段类型也要一致。
二者的区别:
union 对合并后的结果进行了去重,union all 只是进行了合并,并没有对合并后的集合进行去重;
union 会将合并后的集合根据字段的顺序进行默认排序,union all 并不会进行排序;
注:
union 的效率比 union all 的效率低,所以,如果要对合并后的集合去重就使用 union,不进行去重操作就使用 union all;
--union:得到的结果只有前一半的 select 语句的值(进行了去重操作,并且还进行了默认的排序)
SELECT * FROM a UNION SELECT * FROM b;
--union all:得到的结果是两个select 语句合并在一起的集合(没有进行去重操作且没有进行排序)
SELECT * FROM a UNION ALL SELECT * FROM b;
3.2 intersect (交集操作)
intersect 操作是将多个 select 查询得到的集合进行交集操作
-- intersect:得到的是两个 select 语句的公共部分(即交集部分)
SELECT * FROM a INTERSECT SELECT * FROM b;
3.3 minus (差集操作)
minus 操作是将多个 select 插叙得到的差集进行交集操作
-- minus:得到的是前一个 select查询出来有并且后一个 select 没有的
SELECT * FROM a MINUS SELECT * FROM b;