Oracle – SQL表的连接

来源:互联网 发布:linux zh cn.utf 8 编辑:程序博客网 时间:2024/06/06 19:52

Oracle – SQL表的连接

1. 笛卡尔连接(交叉连接 )

● 笛卡尔(Descartes)乘积

又叫直积。假设集合A = {a, b},集合B = {0, 1, 2},则两个集合的笛卡尔积为{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}

● 笛卡尔(Descartes)连接

笛卡尔连接是指在SQL语句中没有写出表连接的条件,优化器把第一个表的每一条记录和第二个表的所有纪录相连接。如果第一个表的纪录数为m, 第二个表的纪录数为n,则会产生m*n条纪录数。

● 语法:

SELECT *

FROM table_1 CROSS JOIN table_2

 

2. 外部连接(OUTER JOIN)

外连接的连接查询结果集中既包含那些满足条件的行,还包含其中某个表的全部行

● ()连接:LEFT OUTER JOIN

在连接查询中,左端的表中所有的元组都列出来,并且能在右端的表中找到匹配的元组,那么连接成功。如果在右端的表中,没能找到匹配的元组,那么对应的元组是空值(NULL)

左外连接的含义是限制连接关键字右端的表中的数据必须满足连接条件,而不管左端的表中的数据是否满足连接条件,均输出左端表中的内容。

è语法

SELECT columns

FROM table_1 LEFT OUTER JOIN table_2 ON condition

SELECT student.no, name, class, course_no, grade

FROM student LEFT OUTER JOIN course 

ON student.no=course.no

 

● ()连接:RIGHT OUTER JOIN

右外连接与左外连接类似,只是右端表中的所有元组都列出,限制左端表的数据必须满足连接条件,而不管右端表中的数据是否满足连接条件,均输出表中的内容。

è语法:

SELECT columns

FROM table_1 RIGHT OUTER JOIN table_2 ON condition

SELECT student.no, name, class, course_no, grade

FROM student RIGHT OUTER JOIN course 

ON student.no=course.no

 

● ()连接:FULL OUTER JOIN

全外连接查询的特点是左、右两端表中的元组都输出,如果没能找到匹配的元组,就使用NULL来代替。

è语法:

SELECT columns

FROM table_1 FULL OUTER JOIN table_2 ON condition

SELECT student.no, name, class, course_no, grade

FROM student FULL OUTER JOIN course 

ON student.no=course.no

 

3. 内部连接(INNER JOIN)

内连接的连接查询结果集中仅包含满足条件的行,内连接是SQL Server缺省的连接方式。

● 语法:

SELECT columns

FROM table_1 INNER JOIN table_2 ON condition

或者

SELECT columns

FROM table_1, table_2

WHERE condition

 

● 等值连接:

在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列包括其中的重复列

SELECT *

FROM authors, title_authors

WHERE authors.au_id=title_authors.au_id

对于两个表中都有的au_id在结果集中都会列出来

 

 

● 自然连接:

在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列

SELECT a.*, ta.title_id, ta.au_ord, ta.royaltyper

FROM authors a, title_authors ta

WHERE authors.au_id=title_authors.au_id

对于两个表中都有的au_id在结果集中只列出一个

 

● 不等连接:

在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。

 

● 自连接:

一个表连接内连接自身。使用同一个表的相同列进行比较,这时对于同一个表应给出不同的别名。

SELECT DISTINCT t1.title_id, author=CONVERT(char(8), au_fname) + ‘’ + CONVERT(char(15), au_lname)

FROM authors a, title_author t1, title_author t2

WHERE t1.title_id=t2.title_id AND 

t1.au_id<>t2.au_id AND

t1.au_id=a.au_id