SQL 21日自学通(V3.0)(PDF格式)-第18部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
TOTAL_SINGLES
174
如果想得到多个列的和 可按如下所做
输入/输出
SQL》 SELECT SUM(SINGLES) TOTAL_SINGLES SUM(DOUBLES)
TOTAL_DOUBLES SUM(TRIPLES) TOTAL_TRIPLES SUM(HR) TOTAL_HR
FROM TEAMSTATS
TOTAL_SINGLES TOTAL_DOUBLES TOTAL_TRIPLES TOTAL_HR
174 32 5 29
类似地 如果想找一下所有的点数在 300 包括 300 以上的的队员 则语句如下
输入/输出
SQL》SELECT SUM(SINGLES) TOTAL_SINGLES SUM(DOUBLES) TOTAL_DOUBLES
SUM(TRIPLES) TOTAL_TRIPLES SUM(HR) TOTAL_HR FROM TEAMSTATS
WHERE HITS/AB 》=。300
TOTAL_SINGLES TOTAL_DOUBLES TOTAL_TRIPLES TOTAL_HR
164 30 5 29
想估计一下一个球队的平均中球率
输入/输出
SQL》SELECT SUM(HITS)/SUM(AB) TEAM_AVERAGE FROM TEAMSTATS
TEAM_AVERAGE
。33706294
SUM 只能处理数字 如果它的处理目标不是数字 你将会收到如下信息
输入/输出
SQL》SELECT SUM(NAME) FROM TEAMSTATS;
ERROR
ORA…01722 invalid number
no rows selected
该错误信息当然的合理的 因为NAME 字段是无法进行汇总的
EMAIL wyhsillypig@163。 64
…………………………………………………………Page 65……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
AVG
AVG 可以返回某一列的平均值 如果你想知道漏球的平均数请看下例
输入
SQL》SELECT AVG(SO) AVE_STRIKE_OUTS FROM TEAMSTATS
输出
AVE_STRIKE_OUTS
16。166667
下边的例子反映了 SUM 与 AVG 的不同之处
输入/输出
SQL》SELECT AVG(HITS/AB) TEAM_AVERAGE FROM TEAMSTATS
TEAM_AVERAGE
。26803448
分析
可是在上一个例子中的打中率是。3370629 这是怎么回事呢 AVG 计算的是打中的次
数与总打击次数商的平均值 然而在上一个例子中是对打中次数和打击次数分别求和后在
进行相除的 举例来说 A 队员打了 100 杆 中了 50 次 那么他的平均值是 0。5 B 队员
打了 1 杆 没打中 他的平均值是 0。0 而 0。0 与 0。5 的平均值是 0。25 如果你按打 101 杆
中 50 杆计算 那么结果就会是正确的了 下边的例子将会返回正确的击中率
输入/输出
SQL》SELECT AVG(HITS)/AVG(AB) TEAM_AVERAGE FROM TEAMSTATS
TEAM_AVERAGE
。33706294
与 SUM 函数一样 AVG 函数也只能对数字进行计算
MAX
如果你想知道某一列中的最大值 请使用 MAX 例如 你想知道谁的打点最高
输入
SQL》SELECT MAX(HITS) FROM TEAMSTATS
EMAIL wyhsillypig@163。 65
…………………………………………………………Page 66……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
输出
MAX(HITS)
70
你能从这里知道是谁打的最多吗
输入/输出
SQL》SELECT NAME FROM TEAMSTATS WHERE HITS=MAX HITS
ERROR at line 3
ORA…00934 group function is not allowed here
很不幸 你不能 这一信息提示你汇总函数无法在 WHERE 子句中使用 但是请别灰
心 在第 7 天的 子查询 深入 SELECT 语句 将引入子查询的概念并会给出知道谁是打
点最多人解决方案
如果把它用的非数字场合会有什么情况出现呢
输入/输出
SQL》SELECT MAX(NAME) FROM TEAMSTATS
MAX(NAME)
WORLEY
这是一个新现象 MAX 返回了最高的字符串 最大的是 z 所以说 MAX 既可以处
理数值也可以处理字符
MIN
MIN 与 MAX 类似 它返回一列中的最小数值 例如 你想知道打杆的最小值是多少
输入
SQL》SELECT MIN AB FROM TEAMSTATS
输出
MIN(AB)
1
下列语句将返回名字在字母表中排在最前边的
输入/输出
SQL》SELECT MIN(NAME) FROM TEAMSTATS
EMAIL wyhsillypig@163。 66
…………………………………………………………Page 67……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
MIN(NAME)
CASEY
你可以同时使用 MAX 和 MIN 函数以获得数值的界限 例如
输入/输出
SQL》SELECT MIN AB MAX AB FROM TEAMSTATS
MIN(AB) MAX(AB)
1 187
对于统计函数来说这一信息有时非常有用
注 我们在今天开始曾说过 这五个函数是由 ANSI 标准所定义的 其余的函数也已
经成为了事实上的标准 你可以在所有的 SQL 解释器中找到它们 这里 我们使用的它们
在 ORACLE7 中的名字 在其它的解释器中它们的名称可能与这里提到的不同
VARIANCE
VARIANCE 方差 不是标准中所定义的 但它却是统计领域中的一个至关重要的数
值 使用方法如下
输入
SQL》SELECT VARIANCE HITS FROM TEAMSTATS
输出
VARIANCE(HITS)
802。96667
如果我们在将它应用于字符串
输入/输出
SQL》SELECT VARIANCE NAME FROM TEAMSTATS
ERROR
ORA…01722 invalid number
No rows selected
可见 VARIANCE 也是一个只应用于数值对象的函数
EMAIL wyhsillypig@163。 67
…………………………………………………………Page 68……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
STDDEV
这是最后一个统计函数 STDDEV 返回某一列数值的标准差 它的应用示例如下
输入
SQL》SELECT STDDEV HITS FROM TEAMSTATS
输出
STDDEV(HITS)
28。336666
同样 对字符型列应用该函数时会得到错误信息
输入/输出
SQL》SELECT STDDEV(NAME) FROM TEAMSTATS
ERROR
ORA…01722 invalid number
no rows selected
这些统计函数也可以在一个语句中同时使用
输入/输出
SQL》SELECT COUNT AB AVG(AB) MIN(AB) MAX(AB) STDDEV(AB)
VARIANCE(AB) SUM(AB) FROM TEAMSTATS
COUNT( AVG(A MIN(A MAX( STDDEV( VARIANCE SUM(A
AB) B) B) AB) AB) (AB) B)
6 119。167 1 187 75。589 5712。97 715
当你下次见到比赛结果时 你应该知道了 SQL 正在它的后台工作
日期/ 时间函数
我们的生活是由日期和时间来掌握的 大多数的 SQL 解释器都提供了对它进行支持的
函数 在这一部分我们使用 PROJECT 表来演求日期和时间函数的用法
输入
SQL》 SELECT * FROM PROJECT
输出
TASK STARTDATE ENDDATE
EMAIL wyhsillypig@163。 68
…………………………………………………………Page 69……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
KICKOFFMTG 01…APR…95 01…APR…95
TECHSURVEY 02…APR…95 01…MAY…95
USERMTGS 15…MAY…95 30…MAY…95
DESIGNWIDGET 01…JUN…95 30…JUN…95
CODEWIDGET 01…JUL…95 02…SEP…95
TESTING 03…SEP…95 17…JAN…96
注 这里的数据类型使用日期型 大多数 SQL 解释器都有日期型 但是在语法的细则
上有不同之处
ADD_MONTHS
该函数的功能是将给定的日期增加一个月 举例来说 由于一些特殊的原因 上述的
计划需要推迟两个月 那么可以用下面的方法来重新生成一个日程表
输入
SQL》SELECT TASK STARTDATE ENDDATE
ORIGINAL_END ADD_MONTHS(ENDDATE;2) FROM PROJECT
输出
TASK STARTDATE ORIGINAL ADD_MONTH
KICKOFFMTG 01…APR…95 01…APR…95 01…JUN…95
TECHSURVEY 02…APR…95 01…MAY…95 01…JUL…95
USERMTGS 15…MAY…95 30…MAY…95 30…JUL…95
DESIGNWIDGET 01…JUN…95 30…JUN…95 31…AUG…95
CODEWIDGET 01…JUL…95 02…SEP…95 02…NOV…95
TESTING 03…SEP…95 17…JAN…96 17…MAR…96
尽管这种延误不太可能发生 但是实现日程的变动却是非常容易的 ADD_MONTHS
也可能工作在 SELECT 之外 试着输入
输入
SQL》SELECT TASK TASKS_SHORTER_THAN_ONE_MONTH
FROM PROJECT WHERE ADD_MONTHS(STARTDATE 1) ENDDATE
结果如下所示
输出
TASKS_SHORTER_THAN_ONE_MONTH
EMAIL wyhsillypig@163。 69
…………………………………………………………Page 70……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
KICKOFF MTG
TECH SURVEY
USER MTGS
DESIGN WIDGET
分析
你将会发现这一部分中的几乎所有的函数都可能工作在不只一个地方 但是 如果没
有 TO_CHAR 和 TO_DATE 函数的帮助 ADD_MONTH 就无法在字符或数字类型中工作
这将在今天的晚些时候讨论
LAST_DAY
LAST_DAY 可以返回指定月份的最后一天 例如 如果你想知道在 ENDDATE 列中的
给出日期中月份的最后一天是几号时 你可以输入
输入
SQL》SELECT ENDDATE LAST_DAY ENDDATE FROM PROJECT
结果如下
输出
ENDDATE LAST_DAY(ENDDATE)
01…APR…95 30…APR…95
01…MAY…95 31…MAY…95
30…MAY…95 31…MAY…95
30…JUN…95 30…JUN…95
02…SEP…95 30…SEP…95
17…JAN…96 31…JAN…96
如果是在闰年的最后一天呢
输入/输出
SQL》SELECT LAST_DAY( 1…FEB…95 ) NON_LEAP LAST_DAY(