多表连接查询

一、多表查询的基础语法

SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column = table2.column;

二、表与表之间的连接
在Oracle中主要有如下3种类型的连接:
1、内连接,这种连接但会即满足A表又满足B表的行,只有(join)的条件满足才返回,否则不会返回任何数据。
2、外连接,外连接是内连接的扩展,外连接返回符合条件的行,同时可以根据指定的条件返回不满足连接条件的左边表行或者右边的表行。外连接又分为左外连接和右外连接。
3、自连接,是指一个表连接到自身,比如emp表中每个员工属于一个经理,经理的员工编号也存在于emp表中,因此可以说是mgr和emp是自连接关系
三、内连接
内连接又称为等值连接或者简单连接,它用来连接来个或多个表,一般使用一个表的主键等于另一个表外键(也有可能是主键,俩个表主键一致)。

SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column = table2.column;

四、外连接

--右外连接
SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column(+) = table2.column;
--左外连接
SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column = table2.column(+);

(+)外连接语法是Oracle特有的连接格式。放在哪个表后面讲返回哪个表的所有数据。需要注意一下:
1、不能使用OUTER JOIN的ANSI连接语法使用(+)创建连接语法。
2、(+)仅能出现在WHERE子句中,并且只能用于一个表或者视图的一列,因此如果A表和B需要使用多个列作为连接条件时,,必须要在所有的这些条件上添加(+)操作符,如果不指定,Oracle是做是一个内连接查询,并且没有任何的警告和错误提示表示这是一个外连接错误。
3、(+)操作符仅能作用于一个列,不能用于一个表达式。
包含(+)操作符的WHERE条件中不能包含其他使用OR逻辑操作符的条件。
4、WHERE条件不能使用IN 比较条件比较一个别标记了(+)的列。
ANSI的外连接语法如下

SELECT table1.column, table2.column										
FROM table1															--FROM子句仅包含一个表
[ LEFT | RIGHT | FULL OUTER JOIN  table2							--使用连接子句连接到另一个表
ON ( table1.column_name = table2.column_name )];					--在ON子句中指定查询条件

LEFT 左连接
RIGHT 右连接
FULL OUTER 全连接,这种连接实际上包含了左右俩边的数据,类似于讲左右连接的数据进行了UNION合并。
五、自引用连接

SELECT a.* FROM buser a, buser b
WHERE a.account = b.account;

多表连接查询_第1张图片
六、交叉连接
交叉连接在ANSI SQL 中又称为CROSS JOIN,它会返回来个表上的所有行的笛卡尔乘积,也就是一个表的数据行与另一个表数据行相乘的结果。
语法:

SELECT a.column_name 
FROMSELECT a.column_name, b.column_name
						FROM table a
						CROSS JOIN table b);

七、自然连接
自然连接指可以让连接完全自动基于有匹配数据类型和名字的表列进行自动连接,这种连接成为自然连接,使用NATURAL JOIN关键字。
语法:

SELECT a.column1, a.column2
FROM table a NATURAL JOIN talbe b
WHERE 条件;

在俩个表中具有相同名字的列不能再任何地方用表名或者别名前缀进行限制,否则Oracle会抛出ORA-25154异常。

你可能感兴趣的:(Oracle学习笔记,oracle,数据库)