我的這個問題是從看 4gl代碼的時候帶出來的疑問,平時老沒有注意這個問題,現在下班了,抽個時閒做個總結,以免以後再犯糊塗。
如:
let ls_sql=" SELECT rvu08,rvv31,ccp03,rvu04,pmm22,rvv32[1,2],sum(rvv17),sum(rvv17*rvv38),",
" sum(rvv17*rvv38*pmm42),sum(rvv17*rvv38*pmm42)/sum(rvv17),pmm43,gec07 ",
" FROM rvu_file,rvv_file,ccp_file, pmm_file,outer gec_file ",
這裡就有個 outer,對這一類的語句的感覺都是模模糊糊i的。
總結如下
左连接 (left join),又称内部连接 inner join
SELECT A1.store_name, SUM(A2.Sales) SALES
FROM Georgraphy A1, Store_Information A2
WHERE A1.store_name = A2.store_name ( )
GROUP BY A1.store_name
這個句子表示 在A2表右邊有個加號。所以結果中所有A2的行都要列出來。
外联接。外联接可以是左向外联接、右向外联接或完整外部联接。
在 FROM 子句中指定外联接时,可以由下列几组关键字中的一组指定:
LEFT JOIN 或 LEFT OUTER JOIN。
左向外联接的结果集包括 LEFT OUTER 子句中指定的匹配条件的行和左表的所有行。
RIGHT JOIN 或 RIGHT OUTER JOIN。
右向外联接是左向外联接的反向联接。将返回匹配条件的行和右表的所有行。
FULL JOIN 或 FULL OUTER JOIN。
完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。
内联接 仅 当至少有一个同属于两表的行符合联接条件时,内联接才返回行。内联接消除与另一个表中的任何行不匹配的行。而外联接会返回 FROM 子句中提到的至少一个表或视图的所有行,只要这些行符合任何 WHERE 或 HAVING 搜索条件。将检索通过左向外联接引用的左表的所有行,以及通过右向外联接引用的右表的所有行。完整外部联接中两个表的所有行都将返回。
-
關於informix方面的解釋是
在关系代数中,连接运算是由一个笛卡尔积运算和一个选取运算构成的。首先用笛卡尔积完成对两个数据集合的乘运算,然后对生成的结果集合进行选取运算,确保只把分别来自两个数据集合并且具有重叠部分的行合并在一起。连接的全部意义在于在水平方向上合并两个数据集合(通常是表),并产生一个新的结果集合,其方法是将一个数据源中的行于另一个数据源中和它匹配的行组合成一个新元组。SQL提供了多种类型的连接方式,它们之间的区别在于:从相互交叠的不同数据集合中选择用于连接的行时所采用的方法不同。连接类型定义内连接只连接匹配的行左外连接包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行右外连接包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边表中全部匹配的行全外连接包含左、右两个表的全部行,不管另外一边的表中是否存在与它们匹配的行。(H)(theta)连接使用等值以外的条件来匹配左、右两个表中的行交叉连接生成笛卡尔积-它不使用任何匹配或者选取条件,而是直接将一个数据源中的每个行与另一个数据源的每个行都一一匹配在INFORMIX中连接表的查询如果FROM子句指定了多于一个表引用,则查询会连接来自多个表的行。连接条件指定各列之间(每个表至少一列)进行连接的关系。因为正在比较连接条件中的列,所以它们必须具有一致的数据类型。SELECT语句的FROM子句可以指定以下几种类型的连接FROM子句关键字相应的结果集CROSS JOIN笛卡尔乘积(所有可能的行对)INNER JOIN仅对满足连接条件的CROSS中的列LEFT OUTER JOIN一个表满足条件的行,和另一个表的所有行RIGHT OUTER JOIN与LEFT相同,但两个表的角色互换FULL OUTER JOINLEFT OUTER 和 RIGHT OUTER中所有行的超集
内连接是最常见的一种连接,它页被称为普通连接,而E.FCodd最早称之为自然连接。
在句子中,其實inner join 也就等於什麽都不限制的。
select * from t_institution i inner join t_teller t on i.inst_no = t.inst_nowhere i.inst_no = "5801"
這裡的 inner可是省略。相當於
select * from t_institution i, t_teller t where i.inst_no = t.inst_noand i.inst_no = "5801
剛剛開篇提到的那個outer我查了半天也在旺上查不到是外連接還是内連接。所以只好自己做個測試看看。真是浪費資源。。。。。。。。
不果現在要下班了,來不及了,明天再測試。。。。。。。。。