使用ISQL执行SELECT查询
当你安装SQL Sever时你同时安装了一个叫作ISQL/w的应用程序ISQL/w允许你执行交互的SQL查询在把查询包括到你的ASP网页中之前用ISQL/w对其进行测试是非常有用的
注意
在这本书的第一部份你学习了怎样安装和配置Microsoft SQL Sever 如果没有安装SQL Sever或者SQL Sever不能运行请参阅第三章安装和使用SQL Sever
选择任务上SQL Sever程序组中的ISQL_w以启动该程序程序启动时首先会出现一个对话框要求输入服务器信息和登录信息(见图)在Sever框中输入你的SQL服务器的名字如果服务器正运行在本地计算机上服务器名字就是你计算机的名字在登录信息框中输入一个登录帐号和密码或选择使用可信连接然后单击Connect按钮
图
注意
如果你将SQL Sever配置为使用完整安全或混合安全那么你可以使用可信连接如果你使用标准安全你则需要提供用户帐号和密码要了解更多信息参见第三章
如果一切正常在你单击连接按钮后会出现一个查询窗口如图所示(如果有异常请参考第三章)
图
在执行查询之前你需要选择数据库安装 SQL Sever时你已为自己创建了一个数据库SQL Sever还有许多系统数据库如mastermodelmsdb和tempdb
方便的是SQL Sever带有一个特殊的名为pubs的例子数据库库 pubs中包含供一个虚拟的出版商使用的各个表文档中所有的例子程序都是针对这个库来设计的本书中的许多例子也使用这个数据库
在查询窗口顶部的DB下拉框中选择数据库pubs这样你就选择了数据库你所有的查询都将针对这个库中的各个表来执行现在你可以执行你的第一个查询了这真让人兴奋!
你的第一个查询将针对一个名为autrors的表表中包含所有为某个虚拟出版商工作的作者的相关数据单击查询窗口并输入以下的语句
SELECT phone FROM authors WHERE au_name=Ringer
输入完成后单击执行查询按钮(一个绿色三角形看起来像VCR播放键)单击此按钮后任何出现在查询窗口中的语句均会被执行查询窗口会自动变成结果显示窗口你可以看到查询的结果(见图)
你看到的查询结果也许与图所示的不同在SQL Sever的不同版本中库pubs中的数据会有所不同对SQL Sever 来说将会找到两条记录结果显示窗口中应显示如下内容
phone
………………
_
_
( row(s) affected)
图
你所执行的SELECT语句从表authors中取出所有名字为Ringer的作者的电话号码你通过在WHERE子句中使用特殊的选择条件来限制查询的结果你也可以忽略选择条件从表中取出所有作者的电话号码要做到这一点单击Query标签返回到查询窗口输入以下的SELECT语句
SELECT Phone FROM authors
这个查询执行后会取出表authors中的所有电话号码(没有特定的顺序)如果表authors中包含一百个电话号码会有一百个记录被取出如果表中有十亿个电话号码这十亿条记录都会被取出(这也许需要一些时间) 表authrs的字段包括姓名字电话号码地址城市州和邮政编码通过在SELECT语句的第一部份指定它们你可以从表中取出任何一个字段你可以在一个SELECT语句中一次取出多个字段比如
SELECT au_fname au_lname phone FROM authors
这个SELECT语句执行后将取出这三个列的所有值下面是这个查询的结果的一个示例(为了节省纸张只显示查询结果的一部分其余记录用省略号代替)
au_fname au_lname phone
…………………………………………………………………………
Johnson White _
Marjorie Green _
Cheryl Carson _
Michael OLeary _
…
( row(s) affected)
在SELECT语句中你需要列出多少个字段你就可以列出多少不要忘了把字段名用逗号隔开你也可以用星号(*)从一个表中取出所有的字段这里有一个使用星号的例子
SELECT * FROM authors
这个SELECT语句执行后表中的所有字段的值都被取出你会发现你将在SQL查询中频繁使用星号
技巧
你可以使用星号来查看一个表的所有列的名字要做到这一点只需要在执行完SELECT语句后看一下查询结果的列标题
操作多个表
到现在为止你只尝试了用一句SQL查询从一个表中取出数据你也可以用一个SELECT语句同时从多个表中取出数据只需在SELECT语句的FROM从句中列出要从中取出数据的表名称即可
SELECT au_lname title FROM authors titles
这个SELECT语句执行时同时从表authors和表titles中取出数据从表authors中取出所有的作者名字从表titles中取出所有的书名在ISQL/w程序中执行这个查询看一下查询结果你会发现一些奇怪的出乎意料的情况作者的名字并没有和它们所着的书相匹配而是出现了作者名字和书名的所有可能的组合这也许不是你所希望见到的
出了什么差错?问题在于你没有指明这两个表之间的关系你没有通过任何方式告诉SQL如何把表和表关联在一起由于不知道如何关联两个表服务器只能简单地返回取自两个表中的记录的所有可能组合
要从两个表中选出有意义的记录组合你需要通过建立两表中字段的关系来关联两个表要做到这一点的途径之一是创建第三个表专门用来描述另外两个表的字段之间的关系
表authors有一个名为au_id的字段包含有每个作者的唯一标识表titles有一个名为title_id的字段包含每个书名的唯一标识如果你能在字段au_id和字段title_id 之间建立一个关系你就可以关联这两个表数据库pubs中有一个名为titleauthor的表正是用来完成这个工作表中的每个记录包括两个字段用来把表titles和表authors关联在一起下面的SELECT语句使用了这三个表以得到正确的结果
SELECT au_nametitle FROM authorstitlestitleauthor
WHERE authorsau_id=titleauthorau_id
AND titlestitle_id=titleauthortitle_id
当这个SELECT语句执行时每个作者都将与正确的书名相匹配表titleauthor指明了表authors和表titles的关系它通过包含分别来自两个表的各一个字段实现这一点第三个表的唯一目的是在另外两个表的字段之间建立关系它本身不包含任何附加数据
注意在这个例子中字段名是如何书写的为了区别表authors和表titles中相同的字段名au_id每个字段名前面都加上了表名前缀和一个句号名为authorau_id 的字段属于表authors名为titleauthorau_id的字段属于表titleauthor两者不会混淆
通过使用第三个表你可以在两个表的字段之间建立各种类型的关系例如一个作者也许写了许多不同的书或者一本书也许由许多不同的作者共同完成当两个表的字段之间有这种多对多的关系时你需要使用第三个表来指明这种关系
但是在许多情况下两个表之间的关系并不复杂比如你需要指明表titles和表publishers之间的关系因为一个书名不可能与多个出版商相匹配你不需要通过第三个表来指明这两个表之间的关系要指明表titles和表publishers之间的关系你只要让这两个表有一个公共的字段就可以了在数据库pubs中表titles和表publishers都有一个名为pub_id的字段如果你想得到书名及其出版商的一个列表你可以使用如下的语句
SELECT titlepub_name FROM titlespublishers
WHERE titlespub_id=publisherspub_id
当然如果一本书是由两个出版商联合出版的那么你需要第三个表来代表这种关系
通常当你予先知道两个表的字段间存在多对多关系时就使用第三个表来关联这两个表反之如果两个表的字段间只有一对一或一对多关系你可以使用公共字段来关联它门