笛卡尔积
由没有联结条件的表关系返回的结果称为笛卡尔积。检索出的行的数目将是第一个表中的行数乘以第二个表中的行数;
例如:
select A_col, B_col from A_table, B_table;
注:尽量避免这种操作,因为会产生大量数据,浪费资源。
=============
分类:
sql92:
- 等值连接
- 非等值连接
- 自连接
sql99:
- 内连接 inner
- 外连接 :
- 1 左外连接 left [outer]
- 1 右外连接 right [outer]
- 1 全外连接 full [outer]
- 1 左外连接 left [outer]
- 交叉连接 cross
==================
sql92
1. 等值连接
select A_col, B_col from A_table, B_table where A_table.A_col = B_table.B_col;
使用别名:
select a.A_col, b.B_col from A_table a, B_table b where a.A_col = b.B_col;
- 说明:通过两个表的关联字段进行等值连接
----------
2. 非等值连接
select a.A_col, b.B_col from A_table a, B_table b where a.A_col between b.B_col1 and b.B_col2;
- 说明:关联条件不等于,比如上面使用的 A_table 的字段在 B_table 两个字段的区间内 作为关联条件。
3. 自连接
select a1.A_col1, a2.a_col2 from A_table a1, A_table a2 where a1.A_col1 = a2.a_col2;
- 说明:将一个表看作两个表进行自己跟自己的关联
----------
============
sql99
- 关联查询和sql92其实原理都一样,区别在于sql92的关联条件是写在where 条件后面的,而关联查询的关联条件和where 条件分离放在了 on 后面,这样分工更明确,代码可读性更强。
- 不管内连接还是外连接其实都还可以细分为 等值连接、不等值连接和自连接的,相关使用思想和上面类似,区别在于关联条件放在了 on 后面。下面只介绍等值连接一种方式。
1.内连接 inner
返回的结果集是两个表中所有相匹配的数据,而舍弃不匹配的数据。也就是说,在这种查询中,DBMS只返回来自源表中的相关的行,即查询的结果表包含的两源表行,必须满足ON子句中的搜索条件。作为对照,如果在源表中的行在另一表中没有对应(相关)的行,则该行就被过滤掉,不会包括在结果表中。内连接使用比较运算符来完成。
select a.A_col, b.B_col from A_table a inner join B_table b on a.A_col = b.B_col where 1=1;
说明:
- 这里A_table使用 inner join 内连了 B_table ,关连条件写在on 后面
inner join 可以简写为 join
- 结果集为两个表的交集,属于关连查询中最小结果集。
----------
2.外连接 outer
外连接分为 左外连接(left outer join)、右外连接(right outer join)和全外连接(full outer join)。其中outer 关键字可以省略。使用最多的是左外连接,右外连接和左外连接很相似,全外连接很少用。
2.1 左外连接 left outer
左向外连接通常称为左连接,可省略outer关键字。以 FROM 关键字后面的表为主表,JOIN 后面的表为从表。主表根据关联条件去从表中匹配数据,主表一条数据可能会匹配到一到多条数据,这时候主表的的这条数据会跟匹配到的数据组合生成一到多条数据。也有可能会匹配不到数据,则在相关联的结果集行中从表的所有选择列表列均为空值。所以说左连接的结果集最小为主表的大小。
select a.A_col, b.B_col from A_table a left outer join B_table b on a.A_col = b.B_col where 1=1;
说明:
- left outer join 可简写为 left join
- 主表为 A_table 从表为 B_table
- 关连的结果集最小为 A_table 的数据条数
----------
2.2 右外连接 right outer
和左外连接相似,只不过这里主从表位子调换。主表为 JOIN 后面的表,从表为 FROM 后面的表。
其他都一样,这里就不再详述。
----------
2.3 全外连接 full outer
全外连接相当于左连接 和右连接 的集合。结果集为 左表和右表的所有行。如果左表匹配到了右表数据,则和右表数据组合生成一条数据。如果左表没有匹配到右表数据,或者右表没有匹配到左表数据,这些行同样会列出。 结果集属于两表的并集。
select a.A_col, b.B_col from A_table a full outer join B_table b on a.A_col = b.B_col where 1=1;
说明:
- full outer join 可简写为 full join
- 不分主从表
- 关连结果集为两表的并集
-----------
3.交叉连接 cross
交叉连接和使用 from 同时查询多个表一样,它们都返回被连接的两个表所有数据行的笛卡尔积。返回到的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。惟一的不同在于,交叉连接使用CROSS JOIN关键字将表于表分开,而不是使用逗号。
下面两条SQL语句是完全等价的:
SELECT * FROM table1, table2 where 1 = 1; SELECT * FROM table1 CROSS JOIN table2 where 1 = 1;
说明:
- 在使用CROSS JOIN关键字交叉连接表时,因为生成的是两个表的笛卡尔积,因而不能使用ON关键字,只能在WHERE子句中定义过滤条件。
- DBMS通常在FROM子句中,对连接的表进行CROSS JOIN,然后过滤得到的中间表。