精典的ASP传奇的J2EE新生的NETFTP服务器服务器安全WINDOWSB/S 模式WEB安全WAP世界动态网站推广宣传
空间服务器数据库技术邮局服务器站長工具硬设与组建Alexa专题DHTML项目管理WEB标准电脑硬件
病毒知识电脑使用布线协议接入交换路由局域网无线网络网络规划
Visual BasicVisual C/C++MssqlMySqloracleSybase 存在安全风险进程系统进程列表应用程序进程列表其它进程列表
黑客编程漏洞分析本地提权免杀技术脚本漏洞数据库注入安全防护内网渗透加密解密工具使用
WAP技术WAP入门
 您的位置:   >> 相关知识 >> 数据库技术 >> Mssql >>

多表查询

合金网络科技

 
  添加日期:2007-12-12 点击次数:18次  
   
  一.使用SQL的多表查询
创建多表查询要求查询中所涉及的表要有公共字段。比如你有这样两个表客户表(ID,NAME,ADDRESS)订单表(ORDERNO,ORDERDATE,ID,)。你想在查询中显示订单表中所有字段和客户表中相应的客户的所有字段。转换成SQL语句会是这样的:
SELECT ORDERNO,ORDERDATE,ID,NAME,ADDRESS FROM 客户表,订单表 WHERE 客户表.ID=订单表.ID;

这种通过用公共字段将两个表联接起来,以访问两个不同表中的字段的操作就称为“联接”。
二.使用ACCESS的多表查询
用ACCESS创建多表查询选择表并指定它们之间的关系。一旦完成该操作,就需要选择必需的字段并指定准则。还可以提供排序顺序。新建一个查询的设计视图,把成绩表的所有字段和学生表的学生姓名添加进去。这时候,如果你去查看“SQL视图”,你会发现它的SQL语句是这样的:
SELECT 学生表.学生编号, 学生表.学生姓名, 成绩表.课程编号, 成绩表.成绩
FROM 学生表 INNER JOIN 成绩表 ON 学生表.学生编号 = 成绩表.学生编号;
注意到“INNER JOIN”没有,这一子句就是ACCESS的特征,是它自己的方言。这再一次说明了每个RDBMS都有自己的SQL方言,并使用相似的结构和不同的语法。

联接

在上一节中,我们讨论了可以通过指定两个表中字段之间的联接或关系来设置关系。基于公共字段,使关系数据库中的两个或多个字段建立起关系称为“联接”。联接是一项数据库操作,在该操作中两个或更多个表中的相关行合并在一起,形成概念上的单个表。就像上一节我们做的学生表和成绩表的例子。当查询完成时,我们看到的记录集合让人感觉好像是联接创建了另一个表。
联接可以有不同的类型。ACCESS提供了用户友好的方法来指定“联接”类型。在默认情况下,在ACCESS中创建“内部联接”。
一.内部联接
在学生表与成绩表那个例子中,两个表只有在公共字段内有相同值的记录才被联接起来。因此,结果记录集合里只显示在两个表中都存在ID的记录。这样的“联接”称为“等值联接”,因为它将两个表中公共字段有相等值的记录联接起来。这是最常用的联接,在ACCESS中称为“内部联接”。
另一类型的联接称为“非等值联接”,当表是基于比较运算符而不是“=”建立关系时,就会使用这类联接。这类联接不经常使用。
二.外部联接
外部联接,除了两个表中的公共的记录以外,该联接选择一个表中的所有记录。外部联接分左联接和右联接。在ACCESS的关系视图中,右键单击“联接线”(联接不同表中公共字段的线),然后选择“联接属性”。其中单选按钮第一项是内部联接,第二项就是左联接,第三项是右联接。如果客户表与订单表以ID相联,左联接将显示客户表所有内容和订单表中相等的记录,右联接相反。
三.自联接
假设有这样一个表:
员工号 员工姓名 主管经理的员工号
001 张三
002 李四 001
003 王二 001
004 马五 002
005 赵大 002
这时候如果我想知道每个员工的姓名和他们的主管姓名,该如何做呢?有人可能会说:可以再建一个经理表,其中记录着经理和他们的员工号。但这会造成数据冗余。(注:冗余,指数据库中存在重复的数据)。一个更有效率的解决方案则是采用“自联接”。
在ACCESS中,你可以这样完成:在设计视图中新建一个查询,在“显示表”中选择“员工表”->添加,再选择“员工表”->添加。第二次添加进来的表名称为“员工表_1”,你可以通过在表上单击右键->属性,给这个表起个“别名”(比如“经理”)。现在我们只要把员工表. 主管经理的员工号拖到经理.员工号上就可以了。这时,把员工姓名和主管经理号添加到查询中,你就会看到每个员工姓名及他们的主管姓名了。


使用聚合函数查询
  
通常,除显示现有数据之外,还有必要在表中以求和、平均值、最大值和最小值的形式计算总计信息。RDBMS提供了各种不同的聚合函数来完成这些工作。在这里我们还用学生成绩那个例子。我们想在一个查询中得到每个同学各门课程的总成绩,在ACCESS中我们可以这样做:新建一个查询,把学生表.学生姓名和成绩表.成绩添加到查询中。在查询栏的学生姓名上单击右键->合计,在这面将出现GROUP BY 字样。单击查询栏中成绩下的BROUP BY,它会列出很多表达式,选择SUM (求和)。这时候的SQL语句是这样的:
SELECT 学生表.学生姓名, Sum(成绩表.成绩) AS 成绩之Sum
FROM 学生表 INNER JOIN 成绩表 ON 学生表.学生编号 = 成绩表.学生编号
GROUP BY 学生表.学生姓名;
GROUP BY子句是分组语句,在这里是以学生姓名为条件进行分组,SUM是求和的函数。AS是给字段起个“别名”,你可以用(AS 总成绩)来给字段命名。
如果在查询栏姓名下方的准则再中写上“王二”,那么得到的将是王二同学的总成绩。SQL语句将变成:
SELECT 学生表.学生姓名, Sum(成绩表.成绩) AS 总成绩
FROM 学生表 INNER JOIN 成绩表 ON 学生表.学生编号 = 成绩表.学生编号
GROUP BY 学生表.学生姓名
HAVING 学生表.学生姓名='王';
这里的HAVING相当于WHERE条件,但只有与GROUP BY一起使用的时候才能使用HAVING而且坚决不能用WHERE。

    子查询

分析这样一种情况,要显示一名教师教(比如王老师)的学生成绩。我们要如何处理?一种方法,是用一条SQL语句从课程表中查到王老师教的课程编号,再用一条SQL语句从成绩表中查到学生这门课程的成绩。这样的方法不是最有效率的,因为它要发出两条SQL语句。我们可以用一个子查询来完成它。“子查询”就是一个嵌入到另一个查询中的“查询”。内部或嵌入的查询部是首先被求值,然后其值就被做为一个参数提供给外面的查询。上面的问题我们在ACCESS中用子查询处理就是这样的:在查询栏中添加课程名称,学生名称,成绩。课程名称的准则中写上“(select 课程名称 from 课程表 where 教师=’王’)”。这样整条SQL语句就变为:
SELECT 课程表.课程名称, 学生表.学生姓名, 成绩表.成绩
FROM 课程表 INNER JOIN (学生表 INNER JOIN 成绩表 ON 学生表.学生编号 = 成绩表.学生编号) ON 课程表.课程编号 = 成绩表.课程编号
WHERE (课程表.课程名称)=(select 课程名称 from 课程表 where 教师='王');
在这里子查询返回的记录(也就是王老师教的课程名称)做为外部查询的条件。

    索引

影响数据检索速度的要素之一是RDBMS查找记录所能达到的速度。大多数RDBMS提供了“索引”概念以帮助解决此问题。在成千上万条记录是查找一条记录是非常冗长乏味的。最初的“数据库”中就是这样一条一条的记录比较,直到找到特定记录。索引提供了解决此问题的方法。
索引就像一本书的目录,使用页号定位书中的主题。在ACCESS中表的设计视图中字段的“索引”属性可用来对特定字段进行索引。在前面讨论过的“主键”就是一种特殊的索引。不过我们还可以创建“唯一”索引。它与“主键”索引的区别在于“主键”不能为NULL。

    优化查询

RDBMS都提供了一个内置的“优化器”,它可在运行之前“优化”查询。要提高查询的性能需要牢记以下技术,这可以确保快速和有效的信息检索:
1.确保已对“联接”两侧的字段进行了索引。如果在两个表之间存在“主键-外键”关系,那么该索引将会自动创建。
2.从多个表中访问记录时,建议您在查询中包括主表的关键字字段,而不要包括相关表的外键。
3.只包括查询结果中所必需的字段。即尽是改名使用语句“select * from 表”。如果查询准则中包括一个字段,但不需要显示该字段,那么该字段就不应该显示出来。可以发出以下语句:select 学生姓名,地址 from 学生表 where 性别=‘男’;
4.必须对所有要排序的字段进行索引。如果查询需要按字段的组合排序的记录,那么必须首先创建组合索引(对多个字段的索引)。
5.也需要对包含在查询准则中的字段进行索引。
6.非索引字段或计算字段尽是不要包含在准则中。
7.建议您经常“压缩”数据库。“压缩”数据库的好处我们将在后面讲到。
8.在使用“LIKE”运算符检索记录时,通配符应该放在字符串的结尾处而不是放在字符串的开始处。如果通配符放在字符串的结尾处,可以用索引来检索记录。否则,无法使用索引。
9.尽是避免在查询中包括“备注”或“OLE对象”这样的数据类型的字段。
必须记住的一点是,数据库中的数据通常是通过网络来访问的。在大多数情况下,数据是存储在服务器上的,而查询一般在客户端执行。请求和结果都是通过网络传输的。因此,最好在查询中只包含必需的字段和记录。这样可以使通过网络传输的数据量减少到最小。

  SQL是一种功能强大的查询语言,可用来查询数据库,并从中提取信息。但这只是SQL的一个方面。SQL可以用来创建表、删除和插入记录,以及其它功能,这将在后面进行讲述。
精典的ASP精选TOP
· 利用ADODB.Stream 防盗链
· Adodb.Stream说明手册
· 采集需要登录
· ASP 判断远程图片是否存在
· 在ServerXMLHTTP组件中使用代理服务器
· 用XMLHTTP通过代理服务器从服务提取数据的一些问题
· objXML.readystate的值
· 互联网HTTP连接等出错代码大全
· 利用XMLHTTP实现的二级连动Select
· 利用 xmlhttp 分块上传文件
 
服务器安全点击TOP
· 新云最新漏洞总结篇
· 各类网站的默认数据库和密码
· Windows Server2003 防木马权限设置IIS服务器安全配置整理
· 针对ASP网站的Win 2003硬盘安全设置
· IIS 6 的PHP 最佳配置方法
· 利用SA.exe 将Iusr_victim克隆为Administrator
· Cmd模式下的入侵技术大全
· 破解网页代码加密
· SERV-U 6.4提权方法,通杀SERV-U版本
· 新云网站管理系统文件注入漏洞
 
硬设与组建点击TOP
· 从头到尾教你组建小型局域网20
· 从头到尾教你组建小型局域网19
· 从头到尾教你组建小型局域网18
· 从头到尾教你组建小型局域网17
· 从头到尾教你组建小型局域网16
· 从头到尾教你组建小型局域网15
· 从头到尾教你组建小型局域网14
· 从头到尾教你组建小型局域网13
· 从头到尾教你组建小型局域网12
· 从头到尾教你组建小型局域网11
 
病毒知识点击TOP
· 不再重装 手动清除顽固病毒AutoRUN
· 木马静态变动态 DLL木马程序大揭秘
· 详解一个很牛X的网马
· 一个网马
· Trojan-Downloader.Win32.Delf.bab
· 抓了一个AJAX的网马
· 迅雷5 最新0day利用程序
· 自动关掉270种杀毒软件
· RealPlayer 最新网马
· 五个反弹型后门的源代码
 
WINDOWS点击TOP
· 4【系统知识】常见文件扩展名及简要说明!!! ==超详尽==
· 3【系统知识】常见文件扩展名及简要说明!!! ==超详尽==
· 2【系统知识】常见文件扩展名及简要说明!!! ==超详尽==
· 1【系统知识】常见文件扩展名及简要说明!!! ==超详尽==
· Capture an HTML document as an image
· 如何给eWebEditor编辑器加上运行代码框功能
· 给CuteEditor5增加了高亮代码显示功能
· CuteEditor6.0使用配置心得体会
· 关于IE插件的CLSID问题
· 对开发的程序(制作CAB)进行签名,并允许网站中使用
  "凌风微型文章系统",针对"搜索引擎"完美设计,提高"搜索引擎"对网站容量,质量的评估值,"扁平化,转静态 ..."