join
join连接组合两个表中的字段记录,包括三种:
inner join运算式:连接组合两个表中的字段记录。
left join运算式:连接组合两个表中的字段记录,并将包含了left join左边表中的全部记录。
right join运算式:连接组合两个表中的字段记录,并将包含了right join右边表中的全部记录。
inner join设定两个表相关连的运算式,以连接组合两个表中的字段记录。
inner join语法如下:
from 表1 inner join 表2 on 表1.字段1 比较运算子 表2.字段2
两个表连接的字段,譬如 [表1.字段1=表2.字段2],必须具有相同的字段类型,但是字段名称不需要相同。
例如,自动编号字段类型可以连接long 的字段类型,但是单精整数字段类型不能连接双精整数的字段类型。
比较运算子可为=、<、>、<=、>=、或<>。
join连接的字段,不可以包含memo字段类型或ole对象类型,否则会发生错误。
在一个join表达式中,可以连结多个on子句:
select fields
from 表1 inner join 表2
on 表1.字段1 比较运算子 表2.字段1 and
on 表1.字段2 比较运算子 表2.字段2) or
on 表1.字段3 比较运算子 表2.字段3)
join表达式中,可以为巢状式:
select fields
from 表1 inner join
(表2 inner join [( ]表3
[inner join [( ] 表x [inner join …)]
on 表3.字段3 比较运算子 表x.字段x)]
on 表2.字段2 比较运算子 表3.字段3)
on 表1.字段1 比较运算子 表2.字段2
在一个inner join中,可以包括巢状式的left join或right join,但是在一个left join或right join中不能包括巢状式的inner join。
让我们看一个于asp程式当中使用这个sql指令的例子。
可以利用inner join…on组合两个表中的记录,譬如asp程式rs26.asp如下,[select 销售.代号, 产品.名称, 产品.价格, 销售.数量 from 销售 inner join 产品 on 产品.代号 = 销售.代号],使用inner join…on设定两个表相关连的运算式,组合两个表中的记录:
<%
set conn1 = server.createobject("adodb.connection")
conn1.open "dbq="& server.mappath("ntopsamp.mdb") &";driver={microsoft access driver (*.mdb)};driverid=25;fil=ms access;"
set rs3 = server.createobject("adodb.recordset")
sql = "select 销售.代号, 产品.名称, 产品.价格, 销售.数量 from 销售 inner join 产品 on 产品.代号 = 销售.代号"
rs3.open sql,conn1,1,1,1
%>
<table colspan=8 cellpadding=5 border=0>
<tr>
<td align=center bgcolor="#800000"><font color="#ffffff">代号</font></td>
<td align=center bgcolor="#800000"><font color="#ffffff">名称</font></td>
<td align=center bgcolor="#800000"><font color="#ffffff">价格</font></td>
<td align=center bgcolor="#800000"><font color="#ffffff">数量</font></td>
</tr>
<% do while not rs3.eof %>
<tr>
<td bgcolor="f7efde" align=center><%= rs3(0)%></td>
<td bgcolor="f7efde" align=center><%= rs3(1)%></td>
<td bgcolor="f7efde" align=center><%= rs3(2)%></td>
<td bgcolor="f7efde" align=center><%= rs3(3)%></td>
</tr>
<%
rs3.movenext
loop
rs3.close
%>
</table>
以上的 asp程式rs26.asp,在用户端使用浏览器,浏览执行的结果,显示组合两个表中的记录,由于销售表中并没有名称字段和价格字段,通过 [inner join 产品 on 产品.代号 = 销售.代号] 找到产品表的名称字段和价格字段之资料。
上例使用inner join的语法:
select 销售.代号, 产品.名称, 产品.价格, 销售.数量 from 销售 inner join 产品 on 产品.代号 = 销售.代号
结果与以下使用where相同:
select 销售.代号, 产品.名称, 产品.价格, 销售.数量 from 销售, 产品 where 产品.代号 = 销售.代号
left join/right join
inner join连接组合两个表中相关连的字段记录,为内部连接,您还可以使用:
使用left join运算:来建立一个左边外部连接。left join除了取得两个表中相关连的字段记录,并将包含了left join左边表中的全部记录,不管在右边表中是否有相符的记录。
使用right join运算:建立一个右边外部连接。right join除了取得两个表中相关连的字段记录,并将包含了right join右边表中的全部记录,不管在左边表中是否有相符的记录。
例如,[销售left join 产品] 可以选取所有的销售记录。[销售right join 产品] 可以选取所有的产品记录。
譬如利用left join…on除了取得两个表中相关连的字段记录,并包含了left join左边表中的全部记录, asp程式rs26.asp如下,[select 销售.代号, 产品.名称, 产品.价格, 销售.数量 from 销售 left join 产品 on 产品.代号 = 销售.代号],使用left join包含了left join左边销售表中的全部记录:
<%
set conn1 = server.createobject("adodb.connection")
conn1.open "dbq="& server.mappath("ntopsamp.mdb") &";driver={microsoft access driver (*.mdb)};driverid=25;fil=ms access;"
conn1.open "driver={sql server};server=(local);uid=sa;pwd=;database=ntopsamp"
set rs3 = server.createobject("adodb.recordset")
sql = "select 销售.代号, 产品.名称, 产品.价格, 销售.数量 from 销售 left join 产品 on 产品.代号 = 销售.代号"
rs3.open sql,conn1,1,1,1
%>
<table colspan=8 cellpadding=5 border=0>
<tr>
<td align=center bgcolor="#800000"><font color="#ffffff">代号</font></td>
<td align=center bgcolor="#800000"><font color="#ffffff">名称</font></td>
<td align=center bgcolor="#800000"><font color="#ffffff">价格</font></td>
<td align=center bgcolor="#800000"><font color="#ffffff">数量</font></td>
</tr>
<% do while not rs3.eof %>
<tr>
<td bgcolor="f7efde" align=center><%= rs3(0)%></td>
<td bgcolor="f7efde" align=center><%= rs3(1)%></td>
<td bgcolor="f7efde" align=center><%= rs3(2)%></td>
<td bgcolor="f7efde" align=center><%= rs3(3)%></td>
<%
rs3.movenext
loop
rs3.close
%>
</table>
以上的asp程式rs26.asp,在用户端使用浏览器,浏览执行的结果,显示包含了left join左边销售表中的全部记录,由于销售表中并没有名称字段和价格字段,代号4的销售记录,通过 [销售 left join 产品 on 产品.代号 = 销售.代号] 找到产品表的名称字段和价格字段之资料,其他的代号并没有找到名称字段和价格字段之资料。
利用 right join…on除了取得两个表中相关连的字段记录,并包含了right join右边表中的全部记录,譬如asp程式rs26.asp如下,[select 销售.代号, 产品.名称, 产品.价格, 销售.数量 from 销售 right join 产品 on 产品.代号 = 销售.代号],使用right join包含了right join右边产品表中的全部记录:
<%
set conn1 = server.createobject("adodb.connection")
conn1.open "dbq="& server.mappath("ntopsamp.mdb") &";driver={microsoft access driver (*.mdb)};driverid=25;fil=ms access;"
set rs3 = server.createobject("adodb.recordset")
sql = "select 销售.代号, 产品.名称, 产品.价格, 销售.数量 from 销售 right join 产品 on 产品.代号 = 销售.代号"
rs3.open sql,conn1,1,1,1
%>
<table colspan=8 cellpadding=5 border=0>
<tr>
<td align=center bgcolor="#800000"><font color="#ffffff">代号</font></td>
<td align=center bgcolor="#800000"><font color="#ffffff">名称</font></td>
<td align=center bgcolor="#800000"><font color="#ffffff">价格</font></td>
<td align=center bgcolor="#800000"><font color="#ffffff">数量</font></td>
</tr>
<% do while not rs3.eof %>
<tr>
<td bgcolor="f7efde" align=center><%= rs3(0)%></td>
<td bgcolor="f7efde" align=center><%= rs3(1)%></td>
<td bgcolor="f7efde" align=center><%= rs3(2)%></td>
<td bgcolor="f7efde" align=center><%= rs3(3)%></td>
<%
rs3.movenext
loop
rs3.close
%>
</table>
以上的 asp程式rs26.asp,在用户端使用浏览器,浏览执行的结果,显示包含了right join右边产品表中的全部记录,由于产品表中并没有数量字段,代号4的产品记录,通过 [销售 right join 产品 on 产品.代号 = 销售.代号] 找到销售表的数量字段之资料,其他的代号并没有找到数量字段之资料。
搞清楚了吗?
