日期:2013-06-12  浏览次数:20489 次

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

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


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

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

关键词触发数据库的内在功用。这些关键词在有时甚至是查询所必需的。例如“INSERT 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_am