creazygirl

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

知识点回顾:
1、adRotator控件、HyperLink控件具有navigateurl属性;linkbutton不具有该属性;
2、页面间传递参数,第二页获取时用request.paras["productid"];
 -----------------------------------------------
关于datalist的新知识:
1、datalist控件中加入按钮控件,根据按钮控件的commandname的不同会触发不同的事件:
     commandname=edit  触发editcommand事件;
     commandname=updata触发updatacommand事件;
     commandname=cancel触发cancelcommand事件;
     commandname=delete触发deletecommand事件;
     commandname非以上名称出发itemcommand事件;
     commandname=select(区分大小写)触发itemcommand和selectindexchanged事件;
2、datalist还有连个事件itemcreated与itemdatabound事件,借助这两个事件可以在运行阶段自定义datalist控件;
3、通过设置datakeyfields属性,在datakeys集合判断用户选择哪条记录;

----------------------------------------------------
分别从三个相互关联的表中选择数据:
string selsql="select s.CompanyName,s.ContactName,s.Address,s.Phone,c.CategoryName,c.Description from Suppliers s,Categories c,Products p where p.ProductID=@productid and p.CategoryID=c.CategoryID and p.SupplierID=s.SupplierID";
------------------------------------------------------
join连接(sql)
下面的例子显示了 SQL 里是如何实现连接的。

要在共同的属性上连接三个表 SUPPLIER,PART 和 SELLS, 我们通常使用下面的语句:

SELECT S.SNAME, P.PNAME
FROM SUPPLIER S, PART P, SELLS SE
WHERE S.SNO = SE.SNO AND
P.PNO = SE.PNO;

而我们得到的结果是:

SNAME | PNAME
-------+-------
Smith | Screw
Smith | Nut
Jones | Cam
Adams | Screw
Adams | Bolt
Blake | Nut
Blake | Bolt
Blake | Cam

在 FROM 子句里,我们为每个关系使用了一个别名, 因为在这些关系间有着公共的命名属性(SNO 和 PNO)。 现在我们可以区分不同表的公

共命名属性, 只需要简单的用每个关系的别名加上个点做前缀就行了。 联合是用与 一个内部联接 里显示的同样的方法计算的。首先算出笛

卡儿积 SUPPLIER × PART × SELLS 。然后选出那些满足 WHERE 子句里给出的条件的记录 (也就是说,公共命名属性的值必须相等)。 最

后我们映射出除 S.SNAME 和 P.PNAME 外的所有属性。

另外一个进行连接的方法是使用下面这样的 SQL JOIN 语法:

select sname, pname from supplier
JOIN sells USING (sno)
JOIN part USING (pno);

giving again:

sname | pname
-------+-------
Smith | Screw
Adams | Screw
Smith | Nut
Blake | Nut
Adams | Bolt
Blake | Bolt
Jones | Cam
Blake | Cam
(8 rows)

一个用 JOIN 语法创建的连接表,是一个出现在 FROM 子句里的, 在任何 WHERE,GROUP BY 或 HAVING 子句之前的表引用列表项. 其它表引

用,包括表名字或者其它 JOIN 子句,如果用逗号分隔的话, 可以包含在 FROM 子句里.连接生成的表逻辑上和任何其它在 FROM 子句里列出

的表都一样.

SQL JOIN 有两种主要类型,CROSS JOIN (无条件连接) 和条件连接.条件连接还可以根据声明的 连接条件(ON,USING,或 NATURAL)和它 应

用的方式(INNER 或 OUTER 连接)进一步细分.

连接类型
CROSS JOIN

{ T1 } CROSS JOIN { T2 }

一个交叉连接(cross join)接收两个分别有 N 行和 M 行 的表 T1 和 T2,然后返回一个包含交叉乘积 NxM 条记录的 连接表.对于 T1 的

每行 R1,T2 的每行 R2 都与 R1 连接生成 连接的表行 JR,JR 包含所有 R1 和 R2 的字段. CROSS JOIN 实际上就是一个 INNER JOIN ON

TRUE.
条件 JOIN

{ T1 } [ NATURAL ] [ INNER | { LEFT | RIGHT | FULL } [ OUTER ] ] JOIN { T2 } { ON search condition | USING ( join column list

) }

一个条件 JOIN 必须通过提供一个(并且只能有一个) NATURAL,ON,或者 USING 这样的关键字来声明它的 连接条件. ON 子句 接受一个

search condition,它与一个 WHERE 子句相同.USING 子句接受一个用逗号分隔的 字段名列表,连接表中必须都有这些字段,并且用那些字

段连接这些表,生成的连接表包含每个共有字段 和两个表的所有其它字段. NATURAL 是 USING 子句的缩写,它列出两个表中所有公共 的字

段名字.使用 USING 和 NATURAL 的副作用是 每个连接的字段都只有一份拷贝出现在结果表中 (与前面定义的关系演算的 JOIN 相比较).

[ INNER ] JOIN

对于 T1 的每行 R1,连接成的表在 T2 里都有一行满 足与 R1 一起的连接条件.

对于所有 JOIN 而言,INNER 和 OUTER 都是可选的.INNER 是缺省. LEFT,RIGHT,和 FULL 只用于 OUTER JOIN.

LEFT [ OUTER ] JOIN

首先,执行一次 INNER JOIN. 然后,如果 T1 里有一行对任何 T2 的行都不满足 连接条件,那么返回一个连接行,该行的 T2 的字段 为

null.

小技巧: 连接成的表无条件地包含 T1 里的所有行.

RIGHT [ OUTER ] JOIN

首先,执行一次 INNER JOIN. 然后,如果 T2 里有一行对任何 T1 的行都不满足 连接条件,那么返回一个连接行,该行的 T1 的字段 为

null.

小技巧: 连接成的表无条件地包含 T2 里的所有行.

FULL [ OUTER ] JOIN

首先,执行一次 INNER JOIN. 然后,如果 T1 里有一行对任何 T2 的行都不满足 连接条件,那么返回一个连接行,该行的 T1 的字段为

null. 同样,如果 T2 里有一行对任何 T1 的行都不满足 连接条件,那么返回一个连接行,该行的 T2 的字段 为 null.

小技巧: 连接成的表无条件地拥有来自 T1 的每 一行和来自 T2 的每一行.

所有 类型的 JOIN 都可以链接在一起或者嵌套在一起, 这时 T1 和 T2 都可以是连接生成的表.我们可以使用圆括弧控制 JOIN 的顺序,如

果我们不主动控制,那么连接顺序是从左到右.

posted on 2006-06-02 08:40  久久  阅读(281)  评论(0编辑  收藏  举报