说明:昨天被Oracle中的外连接搞得头晕乎乎的, 弄了一晚上,到今天下午问了一下同学才搞清楚~
多表连接查询
Oracle数据库中特有的连接语法如下:
SELECT TABLE1.COLUMN, TABLE2.COLUMN
FROM TABLE1, TABLE2
WHERE TABLE1.COLUMN1 = TABLE2.COLUMN2;
1.1 内连接
我们经常使用
例如:针对我做的程序,查询某个系的安排毕业设计答辩场地信息
SJ_GD_TEACHERS存放某个系的所有的毕业设计指导教师,SJ_GD_REPLY表存放对一些教师的答辩安排
SELECT A.FTEACHERID, A.FTEACHERNAME, B.FPLACE, B.FSTARTTIME, B.FENDTIME
FROM SJ_GD_TEACHERS A, SJ_GD_REPLY B
WHERE A.FTEACHERID = B.FTEACHERID;
ANSI SQL的标准内连接语法是使用 INNER JOIN 连接左右的两个表,通过 ON 子句指定两个表的连接条件,WHERE 子句用来指定条件子句
SELECT TABEL1.COLUMN, TABLE2.COLUMN
FROM TABLE1
INNER JOIN TABLE2
ON TABLE1.COLUMN1 = TABLE2.COLUMN2
WHERE TABLE1.COLUMN2 = 'xxxx'
1.2 外连接
上面有一个问题,如果在A表中存在的FTEACHERID但在B表中该字段为NULL的记录,那么在使用内连接查询时,这些记录将不会出现在内连接列表中。这个时候我们就可以使用外连接语法来保留连接左边和右边的数据,例如那些在A表中存在但在B表中不存在的FTEACHERID记录也要显示。SQL提供了外连接来实现这种功能。外连接又分为两类,分别是用于保存左侧表内容的左外连接和保存右侧表内容的右连接。
--右外连接
SELECT TABLE1.COLUMN, TABLE2.COLUMN
FROM TABLE1, TABLE2
WHERE TABLE1.COLUMN1(+) = TABLE2.COLUM2N;
--左外连接
SELECT TABLE1.COLUMN, TABLE2.COLUMN
FROM TABLE1, TABLE2
WHERE TABLE1.COLUMN1 = TABLE2.COLUMN2(+);
注意:不能在左右两侧都放置(+)符号。
那么上述问题就可以改写成:
SELECT A.FTEACHERID, A.FTEACHERNAME, B.FPLACE, B.FSTARTTIME, B.FENDTIME
FROM SJ_GD_TEACHERS A, SJ_GD_REPLY B
WHERE A.FTEACHERID = B.FTEACHERID(+);
如果是使用ANSI SQL,则左连接、右连接及全连接语法如下所示:
SELECT TABLE1.COLUMN, TABLE2.COLUMN
FROM TABLE1
[LEFT |
RIGHT |
FULL OUTER JOIN TABLE2
ON (TABLE1.COLUMN_NAME = TABLE2.COLUMN_NAME)];
在ANSI SQL中,FULL OUTER JOIN表示全连接,除了包含连接的数据之外,还包含连接的表中不符合连接条件的数据。(注:这个我暂时还没有用到)
1.3 交叉连接
交叉连接是指用A表中的记录行与B表中的记录行数相乘得到的笛卡尔积,如果在进行里连接查询时不指定任何连接条件,将产生交叉查询。比如TABLE1表中有15条记录,TABLE2表中有3条记录,使用交叉连接得到的结果就有15*3 = 45条记录。
对于ANSI SQL标准,可以使用CROSS JOIN 来实现交叉查询语法:
SELECT TABLE1.COLUMN, TABLE2.COLUMN
FROM TABLE1
CROSS JOIN TABLE2
WHERE ......
不使用标准,直接:
SELECT TABLE1.COLUMN, TABLE2.COLUMN
FROM TABLE1, TABLE2
WHERE ......
即可。(注:这个我没有用过)
1.4 自然连接
如果两个表中有相同名字和数据类型的列,那么可以使用自然连接来自动匹配数据类型和列名。自然连接使用NATURAL JOIN关键字。
注意:自然连接只能发生在两个表中有相同名字和数据类型的列上。如果列有相同的名字,当数据类型不同,NATURAL JOIN语法会引起错误。
感觉:自然连接我目前没有使用过,不过我感觉类似于内连接,只不过比内连接有更为严格的要求!