当前位置: 首页 > 图文教程 > 数据库 > 数据库技巧 > sql join on 用法

数据库技巧
执行Insert Exec时的隐藏开销 分析
datastage server job之dsjob 命令
sql Union和Union All的使用方法
对分区表进行alter-switch时遇到的错误
sql left join 命令详解
sql 插入数据的三种常用方法及小贴士
SQL 优化经验总结34条
数据库 SQL千万级数据规模处理概要
数据库分页查询方法
postgres 数据库中的数据转换
ORACLE 系统函数大全SQLSERVER系统函数的异同
数据库 三范式最简单最易记的解释
主键与聚集索引
数据库触发器(Trigger)的一点使用心得
postgresql sql批量更新记录
sql join on 用法
SQL 按特定字段值排序
jdbc 数据库的连接(sqlserver oracle)
让你的insert操作速度增加1000倍的方法
数据库 关系连接

数据库技巧 中的 sql join on 用法


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-13   浏览: 107 ::
收藏到网摘: n/a

非常不错使用join on实现数据库字段的连接输出效果。

A left join B 的连接的记录数与A表的记录数同
A right join B 的连接的记录数与B表的记录数同
A left join B 等价B right join A


table A:
Field_K, Field_A
1 a
3 b
4 c
table B:
Field_K, Field_B
1 x
2 y
4 z
select a.Field_K, a.Field_A, b.Field_K, b.Field_B from a left join b on a.Field_K=b.Field_K

Field_K Field_A Field_K Field_B
---------- ---------- ---------- ----------
1 a 1 x
3 b NULL NULL
4 c 4 z

也就是说left join 则连接左边表中所有记录都会出现,如果根据连接条件在table2中找不到相关记录,则显示为null。
right join 则显示右边表中的全部记录。inner join 则只有符合条件的记录才会出现在结果集中。
 

EG2∶有两表a和b,前两字段完全相同:(id int,name varchar(10)...)
id name
----------- ----------
1 a
2 b
3 c



以下的查询语句,你知道它的运行结果吗?:
1.
select * from a left join b on a.id=b.id where a.id=1


2.
select * from a left join b on a.id=b.id and a.id=1


3.
select * from a left join b on a.id=b.id and b.id=1


4.
select * from a left join b on a.id=1



结果:
id name id name
----------- ----------- ----------- -----------
1 10 1 10

(1 row(s) affected)

id name id name
----------- ----------- ----------- -----------
1 10 1 10
2 20 NULL NULL
3 30 NULL NULL

(3 row(s) affected)

id name id name
----------- ----------- ----------- -----------
1 10 1 10
2 20 NULL NULL
3 30 NULL NULL

(3 row(s) affected)

id name id name
----------- ----------- ----------- -----------
1 10 1 10
1 10 2 20
1 10 3 30
2 20 NULL NULL
3 30 NULL NULL

(5 row(s) affected)



思路:
left join , 无非是左边表为基础, 扫描右边表匹配的记录

先是左边表的第1条记录
1 a
按条件 a.id=1, 来扫描右边表的记录
对于右边表的每条记录, 显然 a.id=1 这个条件都是成立的, 所以第1条记录匹配后的结果是:

1 a 1 a
1 a 2 b
1 a 3 c

---------------------------------------------
然后再扫描第2条记录
2 b
对于条件 a.id=1, 在边表中没有与之匹配的记录, 所以右边表为NULL
因此第2条记录匹配的结果为
2 b NULL NULL

----------------------------------------------
第3条记录与第2条记录一样, 匹配的结果是
3 c NULL NULL

---------------------------------------
因此最终结果是5条记录
1 a 1 a
1 a 2 b
1 a 3 c
2 b null null
3 c null null



内联接(典型的联接运算,使用像 = 或 <> 之类的比较运算符)。包括相等联接和自然联接。
内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如,检索 students 和 courses 表中学生标识号相同的所有行。

外联接,外联接可以是左向外联接、右向外联接或完整外部联接。


在 FROM 子句中指定外联接时,可以由下列几组关键字中的一组指定:

LEFT JOIN 或 LEFT OUTER JOIN。
左向外联接的结果集包括 LEFT OUTER 子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。

RIGHT JOIN 或 RIGHT OUTER JOIN。
右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。

FULL JOIN 或 FULL OUTER JOIN。
完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。

交叉联接。
交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积。