友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
SQL 21日自学通(V3.0)(PDF格式)-第12部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
校练场
应用下表的内容来回答下列问题
LASTNAME FIRSTNAME AREACODE PHONE ST ZIP
BUNDY AL 100 555…1111 IL 22333
MEZA AL 200 555…2222 UK
MERRICK BUD 300 555…6666 CO 80212
MAST JD 381 555…6767 LA 23456
BULHER FERRIS 345 555…3223 IL 23332
PERKINS ALTON 911 555…3116 CA 95633
BOSS SIR 204 555…2345 CT 95633
写一下查询 返回数据库中所有名字以 M 开头的每一个人
写一个查询 返回数据库 ST 为 LA 且 FIRSTNAME 以AL 开头的人
给你两个表 PART1 和 PART2 你如何才能找出两个表中的共有元素 请写出查询
WHERE a 》= 10 AND a SELECT (FIRSTNAME || 'FROM') NAME; STATE
2 FROM FRIENDS
3 WHERE STATE = 'IL' AND
5 LASTNAME = 'BUNDY'
输出
NAME ST
AL FROM IL
仍使用上表 返回以下结果
NAME PHONE
MERRICK; BUD 300…555…6666
MAST; JD 381…555…6767
BULHER; FERRIS 345…555…3223
EMAIL wyhsillypig@163。 60
…………………………………………………………Page 61……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
EMAIL wyhsillypig@163。 61
…………………………………………………………Page 62……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
第四天 函数 对数据的进一步处理
目标
在今天我们将学习函数 在 SQL 中的函数可以执行一些储如对某一些进行汇总或或将
一个字符串中的字符转换为大写的操作 在今天结束之际 您将学会以下内容
l 汇总函数
l 日期与时间函数
l 数学函数
l 字符函数
l 转换函数
l 其它函数
这些函数将大大加强你对这一周的早些时间所学习的 SQL 的基本功能所获得的数据的
操作能力 开始的五个汇总函数 COUNT SUM AVG MAX MIN 是由 ANSI 标准
所制定的 大多数的 SQL 解释器都对汇总函数进行了扩充 其中有一些今天会提到 在有
些解释器这汇总函数的名称与这里所提到的不一样
汇总函数
这是一组函数 它们返回的数值是基于一列的 因为你不会对单个的记录求它的平均
数 这一部分的例子将使用 TEAMSTATS 表
输入
SQL》SELECT FROM TEAMSTATS
输出
NAME POS AB HITS WALKS SINGLES DOUBLES TRIPLES HR SO
JONES 1B 145 45 34 31 8 1 5 10
DONKNOW 3B 175 65 23 50 10 1 4 15
WORLEY LF 157 49 15 35 8 3 3 16
DAVID OF 187 70 24 48 4 0 17 42
HAMHOCKER 3B 50 12 10 10 2 0 0 13
EMAIL wyhsillypig@163。 62
…………………………………………………………Page 63……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
CASEY DH 1 0 0 0 0 0 0 1
COUNT
该函数将返回满足 WHERE 条件子句中记录的个数 例如你想知道都有哪一个球员的
击球数小于 350 可以这样做
输入/输出
SQL》 SELECT COUNT( ) FROM TEAMSTATS WHERE HITS/AB 。35
COUNT( )
4
为了使这段代码更易读 可以使用别名
输入/输出
SQL》SELECT COUNT( ) NUM_BELOW_350 FROM TEAMSTATS
WHERE HITS/AB 。35
NUM_BELOW_350
4
如果我们用列名来替换掉括号中的星号时会结果与原来有什么不同呢 试一下
SQL》 SELECT COUNT(NAME) NUM_BELOW_350 FROM TEAMSTATS
WHERE HITS/AB 。35
NUM_BELOW_350
4
结果是一样的 因为你所选择的NAME 列与 WHERE 子句并不相关 如果你在使用 count
时无 WHERE 子句 那么它将会返回表中的所有记录的个数
输入/输出
SQL》 SELECT COUNT( ) FROM TEAMSTATS
COUNT( )
6
SUM
SUM 就如同它的本意一样 它返回某一列的所有数值的和 如果想知道队员总打点的
总和是多少 试一下
EMAIL wyhsillypig@163。 63
…………………………………………………………Page 64……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
输入
SQL》SELECT SUM(SINGLES) TOTAL_SINGLES FROM TEAMSTATS
输出
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( 1…FEB…96 )
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!