荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: achang (阿昌), 信区: Database
标  题: 跟我学SQL:(二) SELECT语句选项
发信站: 荔园晨风BBS站 (2005年12月20日23:25:00 星期二), 站内信件

跟我学SQL:(二) SELECT语句选项
作者: 不详  来源:不详   http://www.csai.cn  2005年12月14日

  跟我学SQL分为三部分,其中涵盖了有关SQL标准的基本知识。在上一篇文章里我们讨
论了一些数据库术语和4种最基本的数据查询类型。此外,我们还解释了WHERE子句和条件
语句的用法,同时我们提供了各类查询的具体示例。

在这篇文章里,我们将就其他一些SQL函数和子句进行阐述,供你用于基本的SELECT数据查
询中。


SELECT选项精制结果
  正如我们从上一篇文章中所读到的那样,SELECT语句具有种类繁多的各类选项,这些
选项可以用来控制数据返回的方式。这些选项以子句、关键词和函数的形式存在。

  子句是一种修改结果的语句。子句不是必要的语句但它对数据的内容及其显示进行了
提炼。WHERE子句就是这样的子句。

  关键词触发数据库的内在功能。这些关键词在有时甚至是查询所必需的。例如“INSER
T INTO table_name (column1) VALUES (‘data1’);”语句中的INTO和VALUE就是如此。
我们将了解DISTINCT关键词,它能触发一些非常有用的可选功能。

下面总结了一些最常用的子句、关键词和函数。然后我会对每一部分举例说明。

ORDER BY – 按照指定列排序返回结果的子句
DISTINCT – 只返回结果集合内唯一行的关键词
COUNT -- 返回匹配查询的数据行总数数值的函数
AVG – 该函数返回指定列的平均值
SUM –该函数把指定的列中的数字加起来
MIN – 该函数返回列中最小的非NULL值
MAX –该函数返回列中的最大值
GROUP BY – 按列汇集查询函数结果的子句
用ORDER BY对查询结果排序
ORDER BY子句让数据库对查询结果排序,这样你就无须自己编写应用程序进行“手工”排
序了。ORDER BY子句必须放在查询语句的结尾。其基本用法如下:

SELECT * FROM Contacts ORDER BY first_name;

  你可以随意在任何选择语句中使用ORDER BY 子句返回多列结果。你还可以用它连接其
他子句:
SELECT first_name, last_name FROM Contacts WHERE first_name BETWEEN ‘a’ AND
‘k’ ORDER BY last_name;

  你可以对多列数据排序。优先顺序按从左到右依次降低,所以查询语句中各列的排列
顺序很重要。
SELECT * FROM Contacts ORDER BY company, last_name, first_name;

  查询结果默认按数字或者字母的升序排序。你可以在ORDER BY 子句后面加上DESC关键
词改成降序排列。在下面的例子中,最高的net_amount排在最先(降序)。假如两行或者
两行以上数据都包含了同样的net_amount值,那么同行中last_name值在字母表中最先出现
的排先,因为last_name一列还是按照升序排序的。
SELECT * FROM Sales ORDER BY net_amount DESC, last_name, first_name;

  在按照定义的列名排序以后,大多数数据库随后将按照数据表内的第一列排序然后顺
序向右再排序。具体的实现各有变化,因此,如果排序在应用中比较重要那么你应该明确
地定义所要排序的列。

  另外一值得注意的问题是,采用ORDER BY子句(以及WHERE子句),你正在用来排序结
果的数据列并不一定得是返回结果集合的一部分。只要所有引用的列都在数据表内存在则
下例完全有效:

SELECT company, first_name, net_amount FROM Sales ORDER BY start_date,
last_name;

DISTINCT返回不重复结果


  DISTINCT关键词只返回结果集合内不重复的数据行。例如,有时你可能需要找出Sales
表内的公司,但是你又不想看见每个条目。于是你可以用DISTINCT对应每一公司名返回一
行数据:

  SELECT DISTINCT company FROM Sales;

  在使用DISTINCT时,它适用于所有的请求列。如果你打算列出表内的所有销售人员和
他们所代表的公司而非每一销售记录,那么你可以使用下列语句。注意,这样操作还可能
返回同一公司的若干条目等等。

  SELECT DISTINCT company, last_name, first_name FROM Sales;

  你还可以在对结果缩小范围和进行排序时结合SELECT语句使用DISTINCT。为了确定显
示的内容,数据库首先会证实精练的请求是否匹配数据行,然后应用DISTINCT功能。在全
部结果集合都得以确定之后即处理ORDER BY子句。如下例所示,只有net_amount大于100的
数据行才被返回。由于DISTINCT保留遇见的第1个匹配查询条件的数据行而丢弃其他匹配行
,所以ORDER BY语句所引用的net_amount看起来就好象产生了随机的结果。

SELECT DISTINCT company, last_name, first_name FROM Sales WHERE net_amount >
100 ORDER BY company, net_amount;


函数应用逻辑
  返回单一值的函数称做聚集函数(aggregate function)。通过应用程序访问下列聚
集函数的结果时,包含结果的“字段名”就是你所使用的实际函数。例如,在分析你的数
据库结果时,结果数组的键值可能如下所示:

$keyname = “COUNT(*)”;
$resultkey = “AVG(net_amount)”;

COUNT
  COUNT函数计算出结果集合中的数据行数。和其他函数一样它接受一个参数。以下的基
本示例能告诉你数据表内的行数:SELECT COUNT(*) FROM Sales;

你也可以用它来计算任何结果集合中的行数。

SELECT COUNT(*) FROM Sales WHERE net_amount > 100;

  如果你想看看某特定列有多少行包含非空值,那你不妨对该列使用COUNT函数。注意,
除非数据库设置为字段为空时缺省填充NULL否则将返回表内数据行的总数。另外,列出的
列在超出一个的情况下会引起错误。

SELECT COUNT(company) FROM Sales;

COUNT还可以用来计算DISTINCT结果集合中的行数。
SELECT COUNT(DISTINCT company, last_name) FROM Sales;

COUNT语句通常用在程序中确定FOR循环的循环次数。


AVG
  AVG返回某列所有字段的平均值,该列必须是数字数据类型。该函数用列的名字作为其
参数,如果列字段数据类型是非数字类型的则函数返回“0”。SELECT AVG(net_amount)
FROM Sales;

你可以结合子句限制该函数的应用范围。

SELECT AVG(net_amount) FROM Sales WHERE company LIKE ‘%ABCD Co%’;

就象所有聚集函数一样,ORDER BY语句将被忽略。

SUM

  SUM的工作方式和AVG差不多,只不过该函数返回结果集合中所有字段值的和。
SELECT SUM(net_amount) FROM Sales WHERE net_amount > 100;

  AVG、SUM、MIN和MAX函数在没有指定列的情况下都会返回错误,所以你不能使用“*”
通配符。

MIN
  MIN返回指定列中最小的非空值。如果指定列是数字数据类型则结果将是最小的数字。
如果它是一种字符串数据类型则函数将返回按字母表顺序出现的第1个值。SELECT
MIN(net_amount) FROM Sales WHERE last_name = “Smith”;
SELECT MIN(last_name) FROM Sales;


MAX

  MAX的工作方式和MIN函数一样,只不过该函数返回最大的非空值。该函数也可以用于
字符串或者数字列
SELECT MAX(net_amount) FROM Sales;
SELECT MAX(company) FROM Sales WHERE net_amount > 100;

  MAX函数有时还用在包含自动递增键字段的列上确定下一条目的键ID。除非你正在运行
一个非公开的数据库,否则在使用这一信息插入下一条目时务必谨慎,以防其他用户先你
执行数据操作。
GROUP BY 令函数更有用


  虽然以上提到的所有这些函数都能提供相当有用的信息,但是,如果有GROUP BY子句
帮忙的话更能让你在列的字段子集中应用这些函数。不要对你的Sales表中每一家公司一次
又一次地执行MAX函数查询——你完全可以带GROUP BY子句获得同样的结果:

SELECT company, MAX(net_amount) FROM Sales GROUP BY company;

  这样做可以获得每家公司net_amount的的最大值。在选择多列名的时候也可以采用该
语句,你还可以用多列来对函数结果分组。

  下面的例子演示了以上各种方式。首先,包括GROUP BY子句可以令你指定要显示的其
他列。然而,你得知道这个例子将返回在组中遇到的第1个last_name值;Sum(
net_amount )将显示全部公司的结果而不仅仅针对匹配姓氏的数据行。这是因为,我们只
使用了Company字段来定义我们的组。

SELECT company, last_name, SUM(net_amount) FROM Sales GROUP BY company;

  在上面的例子中,last_name列实际上并没有提供什么有用的信息,但这样做是为了在
下一个例子中要用到的功能做准备。你可以创建多列定义的组。这样就可以在结果集合中
产生针对特定行的函数结果,而结果集合则是由所有指定的GROUP BY列联合起来创建的:

SELECT company, AVG(net_amount), last_name FROM Sales GROUP BY company,
last_name;


  上面的例子给每家公司中每一姓氏给出了平均的net_amount。你列出GROUP BY列的顺
序控制着结果的排序,但是实际的函数值结果是一样的。


  下面的例子表明如何组织结果而不显示分组的列。在有些场合这样做是很有用的,例
如,如果要显示个人的销售量但却不显示姓名就能用上下面的例子了:

SELECT company, COUNT(sale_id) FROM Sales GROUP BY company, last_name;


限制使用GROUP BY的查询
  如你在以上示例中所看到的那样,你可以结合WHERE字句利用以上的概念限制查询的范
围。WHERE子句会首先被计算,然后执行函数。在使用组的时候就是这样的。

SELECT company, AVG(net_amount), FROM Sales WHERE net_amount > 100 GROUP BY
company;

  上面的例子只对那些满足WHERE限制条件的数据行适用AVG函数。注意,WHERE子句必须
放在GROUP BY子句之前。你还可以用HAVING语句对分组计算之后限制返回的结果集合。

SELECT company, AVG(net_amount), FROM Sales WHERE last_name BETWEEN ‘a’ AND
‘m’ GROUP BY company HAVING AVG(net_amount) > 500;


  上面的语句计算每家公司net_amount的平均值,而且只计算那些姓氏满足限制条件的
销售人员的销售量,同时只显示大于500的结果。


--
提供服务器空间出租:50元/(50MB●年)    100元/(100MB●年)
※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.110.128]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店