为了让我们的课程更为简单和便于理解,我们先从一个范例入手,逐步深入讲解SiteFactory前台相关数据表之间的关系。 SiteFactory产品的数据是分表储存的,这样做主要有一下几个方面的优势 ●减少了冗余信息,节省了数据库存储空间 ●简化了数据库的修改、维护等操作 ●在数据量庞大的时候能够提高性能 这样我们就不得不谈下SiteFactory主要的几个表之间的关系,以及多表查询技术了,下面我为大家列出了三个表格,分别是公共模
型、节点、文章模型下的几个主要字段,说明其中的关系。
Table: PE_CommonModel 模型公共数据表字段表
字段名称 |
字段类型 |
字段描述 |
GeneralID |
int |
内容全局ID |
NodeID |
int |
节点ID |
ModelID |
int |
模型ID |
ItemID |
int |
相应表的记录ID |
TableName |
nvarchar(255) |
模型表名 |
Title |
nvarchar(255) |
标题 |
Table: PE_Nodes节点表
Name |
Data type |
Description |
NodeID |
int |
节点ID |
NodeName |
nvarchar(50) |
节点名称 |
Table: PE_U_Article 文章表
Name |
Data type |
Description |
ID |
int |
文章ID |
Content |
ntext |
内容 | 我们知道一篇文章的Title(标题)被储存在PE_CommonModel表下的Title字段中,Content(内容)被储存在PE_U_Article文章表下的Content字段中,那么我们如何同时取出标题和内容呢? 也就是如何能够同时查询PE_CommonModel表和Content表的信息,这就要用到SQL提供的多表连接功能,在SELECT语句中实现PE_CommonModel表和Content表的连接,通过连接,就可以将二者看作是一个表进行处理。 (注意:在SELECT语句中实现的多表连接,并不是一个物理存在的实体,换句话说,他在数据库表中并不存在。它只是有数据库系统在需要的时候创建,只在查询、检索数据库其间有效) 简单的两表连接 在SQL中,创建连个表的连接非常简单,只需要指明需要连接的表及其他之间的关系即可 如下面的代码: SELECT PE_CommonModel.Title, PE_U_Article.Content FROM PE_CommonModel, PE_U_Article WHERE PE_CommonModel.GeneralID = PE_U_Article.ID 我们来分析一下上面的代码,其中SELECT语句中Title字段为公共模型PE_CommonModel表中的列,Content为文章模型PE_U_Article表中的列,而FROM子句中列出了PE_CommonModel和PE_U_Article两个表,他们就是在SELECT语句中需要连接的两个表。WHERE子句则给出了这两个表的进行连接所依据的关系,即根据两个表中的ID号进行匹配(PE_CommonModel.GeneralID = PE_U_Article.ID) (扩展:SELECT语句的执行顺序为:FROM→WHERE→SELECT→ORDER BY) 扩展中介绍的SELECT语句执行顺序,该实例的执行过程实际上可以表示如下: ●首先系统执行FROM子句,这里的FROM子句列出的有两个表PE_CommonModel表和PE_U_Article表,DBMS(DataBase ManageMent Systems 数据库管理系统)将计算这两个表的笛卡尔积,列出这两个表中行的所有可能组合,形成一个中间表。中间表中的每条记录包含了两个表中的所有行。 ●而后系统将执行WHERE语句,根据“PE_CommonModel.GeneralID = PE_U_Article.ID”关系对中间表进行搜索,去除那些不满足此关系的记录。 ●最后系统执行SELECT语句,从执行WHERE子句得到后的中间表的每条记录中,去取出Title(标题)、Content(内容)两个字段的信息作为结果表 那么我们思考一下,如果不指定连接关系会出现什么样的情况呢 SELECT PE_CommonModel.Title, PE_U_Article.Content FROM PE_CommonModel, PE_U_Article 如果我们在文章中心添加了3篇内容那么标题和内容分别为: 第一篇文章,第一篇文章的内容 第二篇文章,第二篇文章的内容 第三篇文章,第三篇文章的内容 想想看,前面扩展中介绍的SELECT语句是如何执行的,结果是怎样的呢?
第一篇文章,第一篇文章的内容 第一篇文章,第二篇文章的内容 第一篇文章,第三篇文章的内容
第二篇文章,第一篇文章的内容 第二篇文章,第二篇文章的内容 第二篇文章,第三篇文章的内容
第三篇文章,第一篇文章的内容 第三篇文章,第二篇文章的内容 第三篇文章,第三篇文章的内容
从结果可以看到,每个标题信息均与所有的内容进行了匹配连接。它实际上返回连接表中所有数据行的笛卡尔积,其结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数,即3×3=9条记录,这与前面介绍的例子实例的执行过程分析相吻合。
多表连接 前面通过一个实例介绍了两个表的连接,实际上,SQL的SELECT语句中可以实现任意多个表的连接。船检连接的基本规则于已经举例过的两个表的连接相同,即在FROM子句中列出所要连接的表,在WHERE子句中指明连接关系,这里我在举一例: SELECT PE_CommonModel.Title, PE_U_Article.Content, PE_Nodes.NodeName FROM PE_CommonModel, PE_U_Article, PE_Nodes WHERE PE_CommonModel.GeneralID = PE_U_Article.ID AND PE_CommonModel.NodeID = PE_Nodes.NodeID 此列中,PE_CommonModel表、PE_U_Article表、PE_Nodes表的连接过程可以按一下方式理解。 ●从PE_CommonModel表中得到Title(标题) ●通过GeneralID(全局ID) 和ID(文章ID)与PE_U_Article表相关联,从而从PE_U_Article表中得到Content(内容),Content(内容)于PE_CommonModel的GeneralID(全局ID)对应。 ●通过PE_CommonModel表中的NodeID(节点ID)和PE_Nodes表中的NodeID(节点ID)与PE_Nodes从PE_Nodes表中得到NodeName(节点名称)
通过两个范例,可见表的基本连接,只要遵守下面的两个基本原则即可 ★FROM子句中应列出所有连接的表名 ★WHERE子句应定义连接的关系条件
(前台相关的数据表之间关系,在页尾可以看到,我已经整理列出方便大家查阅)
知识扩展: 前面介绍的表连接,是通过FROM子句列出要连接的表、WHERE子句列出连接条件来实现的。也可以在FROM子句中,通过连接关键字实现表的连接,这样有助于将连接操与WHERE的搜索条件区分开来。我们需要采用JOIN关键字来建立连接。JOIN关键字分为四种:自然连接、内连接、外连接、和交叉连接。其中外连接又分为左连接、右连接、左外连接、又外连接。这里我仅仅为大家列出内连接的使用方法。
内连接 内连接要成为等同连接,返回的结果集是两个表中所有匹配的数据,而舍弃不匹配的数据,也就是说,在这种查询中,DBMS只返回来自源表中的相关行,即查询的结果表包含的两源表行,必须满足ON子句的搜索条件。来看我们的范例一是如何通过内连接来实现: SELECT PE_CommonModel.Title, PE_U_Article.Content FROM PE_CommonModel INNER JOIN PE_U_Article ON (PE_CommonModel.GeneralID = PE_U_Article.ID) 在来看看范例二如何通过内连接来实现: SELECT PE_CommonModel.Title, PE_U_Article.Content, PE_Nodes.NodeName FROM PE_CommonModel INNER JOIN PE_U_Article ON (PE_CommonModel.GeneralID = PE_U_Article.ID) INNER JOIN PE_Nodes ON (PE_CommonModel.NodeID = PE_Nodes.NodeID) 通过连个内连接的例子,我们总结一下INNER JOIN的语法: SELECT 列 FROM 连接表 INNER JOIN 连接表 ON (表之间的连接关系)
上面的篇幅讲解了表与表之间的关系,以及如何连接多个表进行查询,下面我列出动易® SiteFactory™ 前台相关数据表关系
|