操作字段
通常当你从一个表中取出字段值时该值与创建该表时所定义的字段名联系在一起如果你从表authors中选择所有的作者名字所有的值将会与字段名au_lname相联系但是在某些情况下你需要对字段名进行操作在SELECT语句中你可以在缺省字段名后面仅跟一个新名字来取代它例如可以用一个更直观易读的名字Author Last Name来代替字段名au_lname
SELECT au_lname Author Last Name FROM authors
当这个SELECT语句执行时来自字段au_lname的值会与Author Last Name相联系查询结果可能是这样
Author Last Name
……………………………………………………………………
White
Green
Carson
OLeary
Straight
…
( row(s) affected)
注意字段标题不再是au_lname而是被Author Last Name所取代
你也可以通过执行运算来操作从一个表返回的字段值例如如果你想把表titles中的所有书的价格加倍你可以使用下面的SELECT语句
SELECT price* FROM titles
当这个查询执行时每本书的价格从表中取出时都会加倍但是通过这种途径操作字段不会改变存储在表中的书价对字段的运算只会影响SELECT语句的输出而不会影响表中的数据为了同时显示书的原始价格和涨价后的新价格你可以使用下面的查询
SELECT price Original price price* New price FROM titles
当数据从表titles中取出时原始价格显示在标题Original price下面加倍后的价格显示在标题New price下面结果可能是这样
original price new price
………………………………………………………………
…
( row(s) affected)
你可以使用大多数标准的数学运算符来操作字段值如加(+)减()乘(*)和除(/)你也可以一次对多个字段进行运算例如
SELECT price*ytd_sales total revenue FROM titles
在这个例子中通过把价格与销售量相乘计算出了每种书的总销售额这个SELECT语句的结果将是这样的
total revenue
……………………………………………
…
( row(s) affected)
最后你还可以使用连接运算符(它看起来像个加号)来连接两个字符型字段
SELECT au_fname+ +au_lname author name FROM authors
在这个例子中你把字段au_fname和字段au_lname粘贴在一起中间用一个逗号 隔开并把查询结果的标题指定为author name这个语句的执行结果将是这样的
author names
…………………………………………………………
Johnson White
Marjorie Green
Cheryl Carson
Michael OLeary
Dean Straight
…
( row(s) affected)
可以看到SQL为你提供了对查询结果的许多控制你应该在ASP编程过程中充分利用这些优点使用SQL来操作查询结果几乎总是比使用有同样作用的脚本效率更高
排序查询结果
本章的介绍中曾强调过SQL表没有内在的顺序例如从一个表中取第二个记录是没有意义的从SQL的角度看来没有一个记录在任何其他记录之前
然而你可以操纵一个SQL查询结果的顺序在缺省情况下当记录从表中取出时记录不以特定的顺序出现例如当从表authors中取出字段au_lname时查询结果显示成这样
au_lname
……………………………………
White
Green
Carson
OLeary
Straight
…
( row(s) affected)
看一列没有特定顺序的名字是很不方便的如果把这些名字按字母顺序排列读起来就会容易得多通过使用ORDER BY子句你可以强制一个查询结果按升序排列就像这样
SELECT au_lname FROM authors ORDER BY au_lname
当这个SELECT语句执行时作者名字的显示将按字母顺序排列ORDER BY子句将作者名字按升序排列
你也可以同时对多个列使用ORDER BY子句例如如果你想同时按升序显示字段au_lname和字段au_fname你需要对两个字段都进行排序
SELECT au_lnameau_fname FROM authors ORDER BY au_lname au_fname
这个查询首先把结果按au_lname字段进行排序然后按字段au_fname排序记录将按如下的顺序取出
au_lname au_fname
……………………………………………………………………
Bennet Abraham
Ringer Albert
Ringer Anne
Smith Meander
…
( row(s) affected)
注意有两个作者有相同的名字Ringer名为Albert Ringer的作者出现名为Anne Ringer的作者之前这是因为姓Albert按字母顺序应排在姓Anne之前
如果你想把查询结果按相反的顺序排列你可以使用关键字DESC关键字DESC把查询结果按降序排列如下例所示
SELECT au_lnameau_fname FROM authors
WHERE au_lname=Ringer ORDER BY au_lname au_fname DESC
这个查询从表authors中取出所有名字为Ringer的作者记录ORDER BY子句根据作者的名字和姓将查询结果按降序排列结果是这样的
au_lname au_fname
………………………………………………………………………………………
Ringer Anne
Ringer Albert
( row(s) affectec)
注意在这个表中姓Anne出现在姓Albert之前作者名字按降序显示
你也可以按数值型字段对一个查询结果进行排序例如如果你想按降序取出所有书的价格你可以使用如下的SQL查询
SELECT price FROM titles ORDER BY price DESC
这个SELECT语句从表中取出所有书的价格显示结果时价格低的书先显示价格高的书后显示
警告
不是特别需要时不要对查询结果进行排序因为服务器完成这项工作要费些力气这意味着带有ORDER BY 子句的SELECT语句执行起来比一般的SELECT语句花的时间长
取出互不相同的记录
一个表有可能在同一列中有重复的值例如数据库pubs的表authors中有两个作者的名字是Ringer如果你从这个表中取出所有的名字名字Ringer将会显示两次
在特定情况下你可能只有兴趣从一个表中取出互不相同的值如果一个字段有重复的值你也许希望每个值只被选取一次你可以使用关键字DISTINCT来做到这一点
SELCET DISTINCT au_lname FROM authors WHERE au_lname=Ringer
当这个SELECT语句执行时只返回一个记录通过在SELECT语句中包含关键字DISTINCT你可以删除所有重复的值例如假设有一个关于新闻组信息发布的表你想取出所有曾在这个新闻组中发布信息的人的名字那么你可以使用关键字DISTINCT每个用户的名字只取一次——尽管有的用户发布了不止一篇信息
警告
如同ORDER BY子句一样强制服务器返回互不相同的值也会增加运行开销福气不得不花费一些时间来完成这项工作因此不是必须的时候不要使用关键字DISTINCT
创建新表
前面说过数据库中的所有数据存储在表中数据表包括行和列列决定了表中数据的类型行包含了实际的数据
例如数据库pubs中的表authors有九个字段其中的一个字段名为为au_lname这个字段被用来存储作者的名字信息每次向这个表中添加新作者时作者名字就被添加到这个字段产生一条新记录
通过定义字段你可以创建一个新表每个字段有一个名字和一个特定的数据类型(数据类型在后面的字段类型一节中讲述)例如字段au_lname存储的是字符型数据一个字段也可以存储其它类型的数据
使用SQL Sever创建一个新表的方法是很多的你可以可执行一个SQL语句或使用SQL事务管理器(SQL Enterprise Manager)来创建一个新表在下一节里你将学会如何用SQL语句来创建一个新表