瑞星卡卡安全论坛技术交流区系统软件 【推荐】SQL 21 日自学通-1

1234   2  /  4  页   跳转

【推荐】SQL 21 日自学通-1

给这些人放假吧也让我们结束对AND 的学习
OR
你也可以使用OR 来对几个条件进行合并当其中的任一个条件为真时其结果就会为真
值为了展示它与AND 的不同下面我们用OR 来换掉上一个例子中的AND
输入:
SQL> SELECT LASTNAME WORKAHOLICS
2 FROM VACATION
3 WHERE YEARS >= 5
4 OR
5 ((YEARS *12)-LEAVETAKEN)/(YEARS * 12) >= 0.50
输出:
SQL 21 日自学通(V1.0) 翻译人笨猪
EMAIL wyhsillypig@163.com 56
WORKAHOLICS
ABLE
BAKER
BLEDSOE
BOLD
COSTALES
分析
上例中的结果仍然在其中但是我们又多个几个记录这几个记录出现的原因是它们满足
我们所提出的条件中的一个OR 只要记录满足其中的一个条件就会把记录返回
NOT
顾名思义它对条件取反条件为假时结果为真条件为真时结果为假
下边的SELECT 子句将返回所有开头的名字不是B 的员工
输入
SQL> SELECT *
2 FROM VACATION
3 WHERE LASTNAME NOT LIKE 'B%'
输出:
LASTNAME EMPLOYEENUM YEARS LEAVETAKEN
ABLE 101 2 4
COSTALES 211 10 78
当NOT 应用于NULL 时可以使用操作符IS 让我们再来看一下PRICES 表中WHOLESALE
列ORANGES 记录中的空值
输入/输出:
SQL> SELECT * FROM PRICE
ITEM WHOLESALE
TOMATOES .34
POTATOES .51
BANANAS .67
TURNIPS .45
CHEESE .89
APPLES .23
ORANGES
7 rows selected.
想找出所有的非空项可以写出如下语句
输入/输出:
SQL>SELECT * FROM PRICE WHERE WHOLESALE IS NOT NULL
ITEM WHOLESALE
TOMATOES .34
POTATOES .51
BANANAS .67
TURNIPS .45
CHEESE .89
APPLES .23
6 rows selected.
集合运算SET
在第一天介绍SQL 中我们已经知道了SQL 是基于集合的理论的下面这一部分将讨论
集合运算
UNION 与UNION ALL
UNION 将返回两个查询的结果并去除其中的重复部分下边有两个值勤人员表
SQL 21 日自学通(V1.0) 翻译人笨猪
EMAIL wyhsillypig@163.com 57
输入:
SQL> SELECT * FROM FOOTBALL
输出:
NAME
ABLE
BRAVO
CHARLIE
DECON
EXITOR
FUBAR
GOOBER
7 rows selected.
输入:
SQL> SELECT * FROM SOFTBALL
输出:
NAME
ABLE
BAKER
CHARLIE
DEAN
EXITOR
FALCONER
GOOBER
7 rows selected.
在这两个表中有哪些不重复的人员呢
输入/输出:
SQL> SELECT NAME FROM SOFTBALL
2 UNION
3 SELECT NAME FROM FOOTBALL
NAME
ABLE
BAKER
BRAVO
CHARLIE
DEAN
DECON
EXITOR
FALCONER
FUBAR
GOOBER
10 rows selected.
UNION 返回了两个表中的10 个记录它们是不重复的但是两个表中共有多少人呢包
括重复的人员
输入/输出:
SQL> SELECT NAME FROM SOFTBALL
2 UNION ALL
3 SELECT NAME FROM FOOTBALL
NAME
ABLE
SQL 21 日自学通(V1.0) 翻译人笨猪
EMAIL wyhsillypig@163.com 58
BAKER
CHARLIE
DEAN
EXITOR
FALCONER
GOOBER
ABLE
BRAVO
CHARLIE
DECON
EXITOR
FUBAR
GOOBER
14 rows selected.
分析
可以看到UNION ALL 与UNION 一样对表进行了合并但是它不去掉重复的记录可是
如果我们想知道都有谁同时在两个表中呢UNION 无法做到这一点我们需要学习使用
INTERSECT
INTERSECT 相交
INTERSECT 返回两个表中共有的行看下例它将返回两个表中有存在的员工
输入:
SQL> SELECT * FROM FOOTBALL
2 INTERSECT
3 SELECT * FROM SOFTBALL
输出
NAME
ABLE
CHARLIE
EXITOR
GOOBER
gototop
 

分析
这些记录是两个表中都存在的
MINUS 相减
MINUS 返回的记录是存在于第一个表中但不存在于第二个表中的记录例如
输入:
SQL> SELECT * FROM FOOTBALL MINUS SELECT * FROM SOFTBALL
输出
NAME
BRAVO
DECON
FUBAR
上例中显示了三个不在垒球队中的足球队员如果你把语句的次序颠倒那么你将得到在
垒球队中但不在足球队中的队员
输入:
SQL> SELECT * FROM SOFTBALL MINUS SELECT * FROM FOOTBALL
输出
NAME
BAKER
DEAN
SQL 21 日自学通(V1.0) 翻译人笨猪
EMAIL wyhsillypig@163.com 59
FALCONER
从属运算IN and BETWEEN
这两个运算符对你已经做过的例子提供了更快捷的操作如果你想找一个你在Colorado,
California,和Louisiana 的朋友可以输入
输入:
SQL> SELECT * FROM FRIENDS WHERE STATE= 'CA' OR STATE ='CO' OR STATE =
'LA'
输出
LASTNAME FIRSTNAME AREACODE PHONE ST ZIP
MERRICK BUD 300 555-6666 CO 80212
MAST JD 381 555-6767 LA 23456
PERKINS ALTON 911 555-3116 CA 95633
也可以输入
输入/输出:
SQL> SELECT * FROM FRIENDS WHERE STATE IN('CA','CO','LA')
LASTNAME FIRSTNAME AREACODE PHONE ST ZIP
MERRICK BUD 300 555-6666 CO 80212
MAST JD 381 555-6767 LA 23456
PERKINS ALTON 911 555-3116 CA 95633
分析
第二个实例比第一个更易读和简捷我想你一会再用以前的方法来工作了吧在IN 中也
可以使用数字例如
输入/输出:
SQL> SELECT *
2 FROM FRIENDS
3 WHERE AREACODE IN(100,381,204)
LASTNAME FIRSTNAME AREACODE PHONE ST ZIP
BUNDY AL 100 555-1111 IL 22333
MAST JD 381 555-6767 LA 23456
BOSS SIR 204 555-2345 CT 95633
如果你想要查找符合某一范围的记录例如
输入/输出:
SQL> SELECT * FROM PRICE WHERE WHOLESALE 0.25 AND WHOLESALE
0.75
ITEM WHOLESALE
TOMATOES .34
POTATOES .51
BANANAS .67
TURNIPS .45
或使用BEWTEEN 你可以这样写
输入/输出:
SQL>SELECT * FROM PRICE WHERE WHOLESALE BETWEEN 0.25 AND 0.75
ITEM WHOLESALE
TOMATOES .34
POTATOES .51
BANANAS .67
TURNIPS .45
看第二个是不是比第一个更清楚和易读
SQL 21 日自学通(V1.0) 翻译人笨猪
EMAIL wyhsillypig@163.com 60
注如果批发价为0.25 的商品在表中存在那么它们也将会被返回BETWEEN 操作将包
括边界值
摘要
在第三天我们学会了使用最基本的SELECT 子句和FROM 子句现在我们已经掌握了最为
常用的操作来使数据库返回的结果满足你的要求你学会了使用算术比较字符和逻辑
操作这为你进一步学习SQL 打下了良好的基础
问与答
问如果我不想使用命令行的SQL 那么学习这些东西对我有什么用
答不论你使用内嵌SQL 的COBOL 还是微软的ODBC 它们所使用的SQL 结构都是一
样的所以你现在学习的东西将会更有助于你以后的学习
问既然SQL 是一种标准那为什么又种是让我检查一下自己的解释器呢
答我们所使用的是ANSI1992 标准但大多数供应商对它进行了修改以使它更适用于自
己的数据库我们是以ANSI1992 标准为基础的但在具体使用时要注意它们的不同
校练场
应用下表的内容来回答下列问题
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 <=30 的更便捷写法是什么请写出来
下面的查询将返回什么结果
SELECT FIRSTNAME FROM FRIENDS WHERE FIRSTNAME='AL' AND
LASTNAME=‘BULHER’
练习
用上边给出的表返回下面的结果
NAME ST
AL FROM IL
输入
SQL> 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
gototop
 

第四天函数对数据的进一步处理
目标
在今天我们将学习函数在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
SQL 21 日自学通(V1.0) 翻译人笨猪
EMAIL wyhsillypig@163.com 63
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 就如同它的本意一样它返回某一列的所有数值的和如果想知道队员总打点的
总和是多少试一下
SQL 21 日自学通(V1.0) 翻译人笨猪
EMAIL wyhsillypig@163.com 64
输入
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 字段是无法进行汇总的
SQL 21 日自学通(V1.0) 翻译人笨猪
EMAIL wyhsillypig@163.com 65
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 函数也只能对数字进行计算
gototop
 

MAX
如果你想知道某一列中的最大值请使用MAX 例如你想知道谁的打点最高
输入
SQL>SELECT MAX(HITS) FROM TEAMSTATS
SQL 21 日自学通(V1.0) 翻译人笨猪
EMAIL wyhsillypig@163.com 66
输出
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
SQL 21 日自学通(V1.0) 翻译人笨猪
EMAIL wyhsillypig@163.com 67
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 也是一个只应用于数值对象的函数
SQL 21 日自学通(V1.0) 翻译人笨猪
EMAIL wyhsillypig@163.com 68
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(
AB)
AVG(A
B)
MIN(A
B)
MAX(
AB)
STDDEV(
AB)
VARIANCE
(AB)
SUM(A
B)
6 119.167 1 187 75.589 5712.97 715
当你下次见到比赛结果时你应该知道了SQL 正在它的后台工作
日期/ 时间函数
我们的生活是由日期和时间来掌握的大多数的SQL 解释器都提供了对它进行支持的
函数在这一部分我们使用PROJECT 表来演求日期和时间函数的用法
输入
SQL> SELECT * FROM PROJECT
输出
TASK STARTDATE ENDDATE
SQL 21 日自学通(V1.0) 翻译人笨猪
EMAIL wyhsillypig@163.com 69
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
SQL 21 日自学通(V1.0) 翻译人笨猪
EMAIL wyhsillypig@163.com 70
KICKOFF MTG
TECH SURVEY
USER MTGS
DESIGN WIDGET
分析
你将会发现这一部分中的几乎所有的函数都可能工作在不只一个地方但是如果没
有TO_CHAR 和TO_DATE 函数的帮助ADD_MONTH就无法在字符或数字类型中工作
这将在今天的晚些时候讨论
gototop
 

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 )
LEAP
FROM PROJECT;
NON_LEAP LEAP
28-FEB-95 29-FEB-96
28-FEB-95 29-FEB-96
28-FEB-95 29-FEB-96
SQL 21 日自学通(V1.0) 翻译人笨猪
EMAIL wyhsillypig@163.com 71
28-FEB-95 29-FEB-96
28-FEB-95 29-FEB-96
28-FEB-95 29-FEB-96
分析
结果当然是正确的可是为什么它输出了这么多行呢这是因为你没有指定任何列或
给出一个条件SQL 引擎对数据库中的每一条记录都应用了这一语句如果你想去掉这些
重复的内容可以这样写
输入
SQL>SELECT DISTINCT LAST_DAY('1-FEB-95') NON_LEAP LAST_DAY('1-FEB-96')
LEAP FROM PROJECT
在这句话中我们使用了关键字DISTINCT 参见第二天的介绍查询— —SELECT 语
句的使用来得到唯一的结果
输出
NON_LEAP LEAP
28-FEB-95 29-FEB-96
虽然在我的电脑上该函数可以正确地识别出闰年来但是如果你要将它应用于金融领
域那么请在你的解释器上试一下看一看它是否支持闰年
MONTHS_BETWEEN
如果你想知道在给定的两个日期中有多少个月可以像这样来使用
MONTHS_BETWEEN
输入
SQL>select task startdate enddate months between(Startdate,enddate) duration from project
输出
TASK STARTDATE ENDDATE DURATION
KICKOFF MTG 01-APR-95 01-APR-95 0
TECH SURVEY 02-APR-95 01-MAY-95 -.9677419
USER MTGS 15-MAY-95 30-MAY-95 -.483871
DESIGN WIDGET 01-JUN-95 30-JUN-95 -.9354839
CODE WIDGET 01-JUL-95 02-SEP-95 -2.032258
TESTING 03-SEP-95 17-JAN-96 -4.451613
SQL 21 日自学通(V1.0) 翻译人笨猪
EMAIL wyhsillypig@163.com 72
请等一下结果看起来不太对劲再试一下
输入/输出
SQL> SELECT TASK STARTDATE ENDDATE
MONTHS_BETWEEN ENDDATE,STARTDATE DURATION FROM
PROJECT
TASK STARTDATE ENDDATE DURATION
KICKOFF MTG 01-APR-95 01-APR-95 0
TECH SURVEY 02-APR-95 01-MAY-95 .96774194
USER MTGS 15-MAY-95 30-MAY-95 .48387097
DESIGN WIDGET 01-JUN-95 30-JUN-95 .93548387
CODE WIDGET 01-JUL-95 02-SEP-95 2.0322581
TESTING 03-SEP-95 17-JAN-96 4.4516129
分析
如你所见MONTHS_BETWEEN 对于你所给出的月份的次序是敏感的月份值为负
数可能并不是一件坏事例如你可以利用负值来判断某一日期是否在另一个日期之前
下例将会显示所有在1995 年5 月19 日以前开始的比赛
输入
SQL>SELECT * FROM PROJECT
WHERE MONTHS_BETWEEN 19 MAY 95 STARTDATE)
输出
TASK STARTDATE ENDDATE
KICKOFF MTG 01-APR-95 01-APR-95
TECH SURVEY 02-APR-95 01-MAY-95
USER MTGS 15-MAY-95 30-MAY-95
NEW_TIME
如果你想把时间调整到你所在的时区你可以使用NEW_TIME 下边给出了所有的时

简写时区简写时区
AST or ADT 大西洋标准时间HST or HDT 阿拉斯加_夏威夷时间
BST or BDT 英国夏令时MST or MDT 美国山区时间
SQL 21 日自学通(V1.0) 翻译人笨猪
EMAIL wyhsillypig@163.com 73
CST or CDT 美国中央时区NST 新大陆标准时间
EST or EDT 美国东部时区PST or PDT 太平洋标准时间
GMT 格伦威治标准时间YST or YDT Yukon 标准时间
你可以这样来调节时间
输入
SQL>SELECT ENDDATE EDT NEW_TIME ENDDATE EDT PDT FROM
PROJECT
输出
EDT NEW_TIME(ENDDATE EDT PDT
01-APR-95 1200AM 31-MAR-95 0900PM
01-MAY-95 1200AM 30-APR-95 0900PM
30-MAY-95 1200AM 29-MAY-95 0900PM
30-JUN-95 1200AM 29-JUN-95 0900PM
02-SEP-95 1200AM 01-SEP-95 0900PM
17-JAN-96 1200AM 16-JAN-96 0900PM
就像变魔术一样所有的时间和日期都变成以新的时区标准了
NEXT_DAY
NEXT_DAY 将返回与指定日期在同一个星期或之后一个星期内的你所要求的星期天
数的确切日期如果你想知道你所指定的日期的星期五是几号可以这样做
输入
SQL>SELECT STARTDATE NEXT_DAY STARTDATE FRIDAY FROM
PROJECT
返回结果如下
输出
STARTDATE NEXT_DAY(STARTDATE, 'FRIDAY')
01-APR-95 07-APR-95
02-APR-95 07-APR-95
15-MAY-95 19-MAY-95
01-JUN-95 02-JUN-95
01-JUL-95 07-JUL-95
03-SEP-95 08-SEP-95
SQL 21 日自学通(V1.0) 翻译人笨猪
EMAIL wyhsillypig@163.com 74
分析
输出的结果告诉了你距你所指定的日期最近的星期五的日期
SYSDATE
SYSDATE 将返回系统的日期和时间
输入
SQL> SELECT DISTINCT SYSDATE FROM PROJECT
输出
SYSDATE
18-JUN-95 1020PM
如果你想知道在今天你都已经启动了哪些项目的话你可以输入
输入/输出
SQL> SELECT * FROM PROJECT WHERE STARTDATE SYSDATE
TASK STARTDATE ENDDATE
CODE WIDGET 01-JUL-95 02-SEP-95
TESTING 03-SEP-95 17-JAN-96
现在你已经看到了项目在今天所启动的部分
gototop
 

数学函数
大多数情况下你所检索到的数据在使用时需要用到数学函数大多数SQL 的解释器都
提供了与这里相类似的一些数学函数这里的例子使用的表名字叫NUMBERS 内容如下
输入
SQL>SELECT * FROM NUMBERS
输出
A B A B
3.1415 4 -57.667 42
-45 .707 15 55
5 9 -7.2 5.3
SQL 21 日自学通(V1.0) 翻译人笨猪
EMAIL wyhsillypig@163.com 75
ABS
ABS 函数返回给定数字的绝对值例如
输入
SQL>SELECT ABS A ABSOLUTE_VALUE FROM NUMBERS
输出
ABSOLUTE_VALUE ABSOLUTE_VALUE
3.1415 57.667
45 15
5 7.2
CEIL 和FLOOR
CEIL 返回与给定参数相等或比给定参数在的最小整数FLOOR 则正好相反它返回
与给定参数相等或比给定参数小的最大整数例如
输入
SQL>SELECT B CEIL B CEILING FROM NUMBERS
输出
B CEILING B CEILING
4 4 42 42
.707 1 55 55
9 9 5.3 6
输入/输出
SQL>SELECT A FLOOR A FLOOR FROM NUMBERS
A FLOOR A FLOOR
3.1415 3 -57.667 -58
-45 -45 15 15
5 5 -7.2 -8
COS COSH SIN SINH TAN TANH
COS SIN TAN 函数可以返回给定参数的三角函数值默认的参数认定为弧度制
如果你没有认识到这一点那你会觉得下例所返回的值是错误
SQL 21 日自学通(V1.0) 翻译人笨猪
EMAIL wyhsillypig@163.com 76
输入
SQL>SELECT A COS A FROM NUMBERS
输出
A COS(A) A COS(A)
3.1415 -1 -57.667 .437183
-45 .52532199 15 -.7596879
5 .28366219 -7.2 .60835131
分析
你可能认为COS 45 的返回值应该为0.707 左右而不应该是0.525 如果你想让它
按照弧度制来计算那么你需要将弧度制转换成角度制由于360 角度为2 个弧度所以
我们可以写成
输入/输出
SQL>SELECT A COS A*0.01745329251994 FROM NUMBERS
A COS(A*0.01745329251994)
3.1415 .99849724
-45 .70710678
5 .9961947
-57.667 .5348391
15 .96592583
-7.2 .9921147
分析
这里的将角度转换成弧度后的数值三角函数也可以像下面所写的那样工作
输入/输出
SQL>SELECT A COS A*0.017453 COSH A*0.017453 FROM NUMBERS
A COS(A*0.017453) COSH(A*0.017453)
3.1415 .99849729 1.0015035
-45 .70711609 1.3245977
5 .99619483 1.00381
-57.667 .53485335 1.5507072
15 .96592696 1.0344645
-7.2 .99211497 1.0079058
输入/输出
SQL 21 日自学通(V1.0) 翻译人笨猪
EMAIL wyhsillypig@163.com 77
SQL> SELECT A SIN A*0.017453 SINH A*0.017453 FROM NUMBERS
A SIN(A*0.017453) SINH(A*0.017453)
3.1415 .05480113 .05485607
-45 -.7070975 -.8686535
5 .08715429 .0873758
-57.667 -.8449449 -1.185197
15 .25881481 .26479569
-7.2 -.1253311 -.1259926
输入/输出
SQL> SELECT A TAN A*0.017453 TANH A*0.017453 FROM NUMBERS
A TAN(A*0.017453) TANH(A*0.017453)
3.1415 .05488361 .05477372
-45 -.9999737 -.6557867
5 .08748719 .08704416
-57.667 -1.579769 -.7642948
15 .26794449 .25597369
-7.2 -.1263272 -.1250043
EXP
EXP 将会返回以给定的参数为指数以e 为底数的幂值其应用见下例
输入
SQL>SELECT A EXP A FROM NUMBERS
输出
A EXP(A) A EXP(A)
3.1415 23.138549 -57.667 9.027E-26
-45 2.863E-20 15 3269017.4
5 148.41316 -7.2 .00074659
LN and LOG
这是两个对数函数其中LN 返回给定参数的自然对数例如
输入
SQL>SELECT A LN(A) FROM NUMBERS
SQL 21 日自学通(V1.0) 翻译人笨猪
EMAIL wyhsillypig@163.com 78
输出
ERROR
ORA-01428 argument -45 is out of range
这是因为我们忽视了参数的取值范围负数是没有对数的改写为
输入/输出
SQL>SELECT A LN ABS A FROM NUMBERS
A LN ABS A A LN ABS A
3.1415 1.1447004 -57.667 4.0546851
-45 3.8066625 15 2.7080502
5 1.6094379 -7.2 1.974081
分析
注意你可以将ABS 函数嵌入到LN 函数中使用第二个对数函数需要两个参数其
中第二个参数为底数下例将返回以10 为底的B 列的对数值
输入/输出
SQL> SELECT B LOG B 10 FROM NUMBERS
B LOG(B,10) B LOG(B,10)
4 1.660964 42 .61604832
.707 -6.640962 55 .57459287
9 1.0479516 5.3 1.3806894
gototop
 

MOD
其实我们已经见过MOD 函数了在第三天的表达式条件及操作就有它我们
知道在ANSI 标准中规定取模运算的符号为%在一些解释器中被函数MOD 所取代下例的
查询就返回了A 与B 相除后的余数
输入
SQL>SELECT A B MOD A B FROM NUMBERS
输出
A B MOD(A,B)
3.1415 4 3.1415
-45 .707 -.459
5 9 5
SQL 21 日自学通(V1.0) 翻译人笨猪
EMAIL wyhsillypig@163.com 79
-57.667 42 -15.667
15 55 15
-7.2 5.3 -1.9
POWER
该函数可以返回某一个数对另一个数的幂在使用幂函数时第一个参数为底数第
二个指数
输入
SQL>SELECT A B POWER A B FROM NUMBERS
输出
ERROR
ORA-01428 argument 45 is out of range
分析
粗看时你可能会认为它不允许第一个参数为负数但这个印象是错误的因为像-4 这
样的数是可以做为底数的可是如果第一个参数为负数的话那么第二个参数就必须是
整数负数是不能开方的对于这个问题可以使用CEIL 或FLOOR 函数
输入
SQL>SELECT A CEIL B POWER A CEIL B FROM NUMBERS
输出
A CEIL B POWER(A,CEIL(B))
3.1415 4 97.3976
-45 1 -45
5 9 1953125
-57.667 42 9.098E+73
15 55 4.842E+64
-7.2 6 139314.07
现在就可以有正确的结果了
SIGN
如果参数的值为负数那么SIGN 返回-1 如果参数的值为正数那么SIGN 返回1
如果参数为零那么SIGN 也返回零请看下例
SQL 21 日自学通(V1.0) 翻译人笨猪
EMAIL wyhsillypig@163.com 80
输入
SQL>SELECT A SIGN A FROM NUMBERS
输出
A SIGN A A SIGN A
3.1415 1 -57.667 -1
-45 -1 15 1
5 1 -7.2 -1
你也可以在SELECT WHERE 子句中使用SIGN
输入
SQL>SELECT A FROM NUMBERS WHERE SIGN A =1
输出
A
3.1415
5
15
SQRT
该函数返回参数的平方根由于负数是不能开平方的所以我们不能将该函数应用于
负数
输入/输出
SQL>SELECT A SQRT A FROM NUMBERS
ERROR
ORA-01428 argument '-45' is out of range
但是你可以使用绝对值来解除这一限制
输入/输出
SQL>SELECT ABS A SQRT ABS A FROM NUMBERS
ABS(A) SQRT(ABS(A))
3.1415 1.7724277
45 6.7082039
5 2.236068
57.667 7.5938791
SQL 21 日自学通(V1.0) 翻译人笨猪
EMAIL wyhsillypig@163.com 81
15 3.8729833
7.2 2.6832816
0 0
字符函数
许多SQL 解释器都提供了字符和字符串的处理功能本部分覆盖了大部分字符串处理
函数这一部分的例子使用CHARACTERS 表
输入/输出
SQL> SELECT * FROM CHARACTERS
LASTNAME FIRSTNAME M CODE
PURVIS KELLY A 32
TAYLOR CHUCK J 67
CHRISTINE LAURA C 65
ADAMS FESTER M 87
COSTALES ARMANDO A 77
KONG MAJOR G 52
CHR
该函数返回与所给数值参数等当的字符返回的字符取决于数据库所依赖的字符集
例如示例的数据库采用了ASCLL 字符集示例数据库的代码列的内容为数字
输入
SQL>SELECT CODE CHR CODE FROM CHARACTERS
输出
CODE CH CODE CH
32 87 W
67 C 77 M
65 A 52 4
在数值32 处显示为空白因为32 在ASCLL 码表中是空格
CONCAT
我们在第3 天时学到过一个与这个函数所执行的功能相当的操作符号表示将两个
SQL 21 日自学通(V1.0) 翻译人笨猪
EMAIL wyhsillypig@163.com 82
字符串连接起来CONCAT 也是完成这个功能的使用方法如下
输入
SQL>SELECT CONCAT FIRSTNAME LASTNAME "FIRST AND LAST NAMES"
FROM CHARACTERS
输出
FIRST AND LAST NAMES
KELLY PURVIS
CHUCK TAYLOR
LAURA CHRISTINE
FESTER ADAMS
ARMANDO COSTALES
MAJOR KONG
分析
当用多个词来做为别名时需对它们使用引号请检查你的解释器看看它是否支持别

需要注意的是尽管在看起来输出似乎是两列但实际上它仍是一列这是因为你所连
接的Firstname 字段的宽度为15 函数取得了该列中的所有数据包括其中用以补足宽度
的空格
INITCAP
该函数将参数的第一个字母变为大写此外其它的字母则转换成小写
输入
SQL>SELECT FIRSTNAME BEFORE INITCAP FIRSTNAME AFTER
FROM CHARACTERS
输出
BEFORE AFTER
KELLY Kelly
CHUCK Chuck
LAURA Laura
FESTER Fester
ARMANDO Armando
MAJOR Major
gototop
 

LOWER 和UPPER
如你所料LOWER 将参数转换为全部小写字母而UPPER 则把参数全部转换成大写字

下例是用LOWER 函数和一个叫UPDATE的函数来把数据库的内容转变为小写字母
输入
SQL>UPDATE CHARACTERS SET FIRSTNAME='kelly'
WHERE FIRSTNAME='KELLY'
输出
1 row updated.
输入
SQL>SELECT FIRSTNAME FROM CHARACTERS
输出
FIRSTNAME FIRSTNAME
kelly FESTER
CHUCK ARMANDO
LAURA MAJOR
然后请您再输入
SQL>SELECT FIRSTNAME UPPER FIRSTNAME LOWER FIRSTNAME
FROM CHARACTERS
输出
FIRSTNAME UPPER(FIRSTNAME LOWER FIRSTNAME
kelly KELLY kelly
CHUCK CHUCK chuck
LAURA LAURA laura
FESTER FESTER fester
ARMANDO ARMANDO armando
MAJOR MAJOR major
现在你明白这两个函数的作用了吧
SQL 21 日自学通(V1.0) 翻译人笨猪
EMAIL wyhsillypig@163.com 84
LPAD 与RPAD
这两个函数最少需要两个参数最多需要三个参数每一个参数是需要处理的字符串
第二个参数是需要将字符串扩充的宽度第三个参数表示加宽部分用什么字符来做填补
第三个参数的默认值为空格但也可以是单个的字符或字符串下面的句子中向字段中加
入了五个字符该字段的定义宽度为5
输入
SQL>SELECT LASTNAME LPAD LASTNAME 20 * FROM CHARACTERS
输出
LASTNAME LPAD LASTNAME 20 * )
PURVIS *****PURVIS
TAYLOR *****TAYLOR
CHRISTINE *****CHRISTINE
ADAMS *****ADAMS
COSTALES *****COSTALES
KONG *****KONG
分析
为什么只添加了5 个占位字符呢不要忘记LASTNAME 列是15 个字符宽在可见字
符的右方填充着空格以保证字符的定义宽度请检查一下你所用的解释器现在再试一下
右扩充
输入
SQL> SELECT LASTNAME RPAD LASTNAME 20 * FROM CHARACTERS
输出
LASTNAME RPAD(LASTNAME,20,'*'
PURVIS PURVIS *****
TAYLOR TAYLOR *****
CHRISTINE CHRISTINE *****
ADAMS ADAMS *****
COSTALES COSTALES *****
KONG KONG *****
分析
通过这个操作我们可以清楚地看到空格也是该字段内容的一部分这一事实了下边的两个
SQL 21 日自学通(V1.0) 翻译人笨猪
EMAIL wyhsillypig@163.com 85
函数正是用于这一情况的
LTRIM 与RTRIM
LTRIM 和RTRIM至少需要一个参数最多允许两个参数第一个参数与LPAD 和RPAD
类似是一个字符串第二个参数也是一个字符或字符串默认则是空格如果第二个参
数不是空格的话那么该函数将会像剪除空格那样剪除所指定的字符如下例
输入
SQL> SELECT LASTNAME RTRIM LASTNAME FROM CHARACTERS
输出
LASTNAME RTRIM(LASTNAME)
PURVIS PURVIS
TAYLOR TAYLOR
CHRISTINE CHRISTINE
ADAMS ADAMS
COSTALES COSTALES
KONG KONG
你可以用下边的语句来确认字符中的空格已经被剪除了
输入
SQL> SELECT LASTNAME RPAD RTRIM LASTNAME 20 * FROM
CHARACTERS
输出
LASTNAME RPAD(RTRIM(LASTNAME)
PURVIS PURVIS**************
TAYLOR TAYLOR**************
CHRISTINE CHRISTINE***********
ADAMS ADAMS***************
COSTALES COSTALES************
KONG KONG****************
输出证明的确已经进行了剪除工作现在请再试一个LTRIM
输入
SQL>SELECT LASTNAME LTRIM LASTNAME C FROM CHARACTERS
输出
SQL 21 日自学通(V1.0) 翻译人笨猪
EMAIL wyhsillypig@163.com 86
LASTNAME LTRIM(LASTNAME,
PURVIS PURVIS
TAYLOR TAYLOR
CHRISTINE HRISTINE
ADAMS ADAMS
COSTALES OSTALES
KONG KONG
注意第三行和第五行的已经没有了
REPLACE
它的工作就如果它的名字所说的那样该函数需要三个参数第一个参数是需要搜索
的字符串第二个参数是搜索的内容第三个参数则是需要替换成的字符串如果第三个
参数省略或者是NULL 那么将只执行搜索操作而不会替换任何内容
输入
SQL> SELECT LASTNAME REPLACE LASTNAME ST REPLACEMENT FROM
CHARACTERS
输出
LASTNAME REPLACEMENT
PURVIS PURVIS
TAYLOR TAYLOR
CHRISTINE CHRIINE
ADAMS ADAMS
COSTALES COALES
KONG KONG
如果存在第三个参数如么在每一个目标字符串中搜索到的内容将会被由第三个参数所指
定的字符串替换例如
输入
SQL> SELECT LASTNAME REPLACE LASTNAME ST ** REPLACEMENT
FROM CHARACTERS
输出
LASTNAME REPLACEMENT
PURVIS PURVIS
SQL 21 日自学通(V1.0) 翻译人笨猪
EMAIL wyhsillypig@163.com 87
TAYLOR TAYLOR
CHRISTINE CHRI**INE
ADAMS ADAMS
COSTALES CO**ALES
KONG KONG
如果没有第二个参数那么只有将源字符串返回而不会执行任何操作
输入
SQL> SELECT LASTNAME REPLACE LASTNAME NULL REPLACEMENT
FROM CHARACTERS
输出
LASTNAME REPLACEMENT
PURVIS PURVIS
TAYLOR TAYLOR
CHRISTINE CHRISTINE
ADAMS ADAMS
COSTALES COSTALES
KONG KONG
gototop
 

SUBSTR
这个函数有三个参数允许你将目标字符串的一部份输出第一个参数为目标字符串
第二个字符串是将要输出的子串的起点第三个参数是将要输出的子串的长度
输入
SQL>SELECT FIRSTNAME SUBSTR FIRSTNAME 2 3 FROM CHARACTERS
输出
FIRSTNAME SUB
kelly ell
CHUCK HUC
LAURA AUR
FESTER EST
ARMANDO RMA
MAJOR AJO
如果第二个参数为负数那么将会从源串的尾部开始向前定位至负数的绝对值的位置例

SQL 21 日自学通(V1.0) 翻译人笨猪
EMAIL wyhsillypig@163.com 88
输入
SQL> SELECT FIRSTNAME SUBSTR FIRSTNAME -13 2 FROM CHARACTERS
输出
FIRSTNAME SU
kelly ll
CHUCK UC
LAURA UR
FESTER ST
ARMANDO MA
MAJOR JO
分析
切记FIRSTNAME 字段的宽度为15 这也就是为什么参数为-13 时会从第三个开始的原因
因为从15 算起向前算第13 个字符正好是第3 个字符如果没有第三个参数将会输出字
符串余下的部分
输入
SQL> SELECT FIRSTNAME SUBSTR FIRSTNAME 3 FROM CHARACTERS
输出
FIRSTNAME SUBSTR(FIRSTN
kelly lly
CHUCK UCK
LAURA URA
FESTER STER
ARMANDO MANDO
MAJOR JOR
看是不是将字符串余下的部分返回了
现在再来看一个例子
输入
SQL> SELECT * FROM SSN_TABLE
输出
SSN__________
300541117
301457111
459789998
SQL 21 日自学通(V1.0) 翻译人笨猪
EMAIL wyhsillypig@163.com 89
如果直接阅读上边的结果是比较困难的比较好的解决办法是使用下划线请先想一下下
边语句的输出情况
输入
SQL> SELECT SUBSTR SSN 1 3 ||'-'||SUBSTR SSN 4 2 ||'-'||SUBSTR SSN
6 4
SSN FROM SSN_TABLE
输出
SSN_________
300-54-1117
301-45-7111
459-78-9998
注这在当数字特别大例如1 343 178 128 需要用逗号分隔时以及区位号码或电
话号码需要下划线分隔时特别有效
这是SUBSTR 的另一个非常有用的功能倘若你需要打印一个报表而其中一些列的宽度超
过了50 个字符时你可以使用SUBSTR 来减小列宽以使它更接近数据的真实宽度请看
一个下面的这两个例子
输入
SQL> SELECT NAME JOB DEPARTMENT FROM JOB_TBL
输出
NAME______________________________________________________________
JOB_______________________________DEPARTMENT______________________
ALVIN SMITH
VICEPRESIDENT MARKETING
1 ROW SELECTED.
分析
注意这几列已经换行显示了这例得阅读变行非常困难现在试一下下边的SELECT
语句
输入
SQL> SELECT SUBSTR(NAME, 1,15) NAME, SUBSTR(JOB,1,15) JOB,
SQL 21 日自学通(V1.0) 翻译人笨猪
EMAIL wyhsillypig@163.com 90
DEPARTMENT
2 FROM JOB_TBL;
输出
NAME________________JOB_______________DEPARTMENT_____
ALVIN SMITH VICEPRESIDENT MARKETING
是不是变得好多了
TRANSLATE
这一函数有三个参数目标字符串源字符串和目的字符串在目标字符串与源字符
串中均出现的字符将会被替换成对应的目的字符串的字符
输入
SQL> SELECT FIRSTNAME, TRANSLATE(FIRSTNAME
'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
'NNNNNNNNNNAAAAAAAAAAAAAAAAAAAAAAAAAA) FROM
CHARACTERS
输出
FIRSTNAME TRANSLATE(FIRST
kelly kelly
CHUCK AAAAA
LAURA AAAAA
FESTER AAAAAA
ARMANDO AAAAAAA
MAJOR AAAAA
6 rows selected.
注意这个函数对大小写是敏感的
INSTR
如果需要知道在一个字符串中满足特定的内容的位置可以使用INSTR 它的第一个参
数是目标字符串第二个参数是匹配的内容第三和第四个参数是数字用以指定开始搜
SQL 21 日自学通(V1.0) 翻译人笨猪
EMAIL wyhsillypig@163.com 91
索的起点以及指出第几个满足条件的将会被返回下例将从字符串的第二个字符开始搜
索并返回第一个以O 开头的字符的位置
输入
SQL>SELECT LASTNAME INSTR LASTNAME O 2 1 FROM CHARACTERS
输出
LASTNAME INSTR(LASTNAME,'O',2,1)
PURVIS 0
TAYLOR 5
CHRISTINE 0
ADAMS 0
COSTALES 2
KONG 2
6 rows selected
分析
默认第三个与第四个参数的数值均为如果第三个数值为负数那么将会从后向前搜索
LENGTH
LENGTH将返回指定字符串的长度例如
输入
SQL>SELECT FIRSTNAME LENGTH RTRIM FIRSTNAME FROM CHARACTERS
输出
FIRSTNAME LENGTH(RTRIM(FIRSTNAME))
kelly 5
CHUCK 5
LAURA 5
FESTER 6
ARMANDO 7
MAJOR 5
注意这里使用了函数RTRIM 否则LENGTH将全部返回15
gototop
 

转换函数
转换函数有三个可以使你方便地将数据从一种类型变换为另一种类型本节的示例
SQL 21 日自学通(V1.0) 翻译人笨猪
EMAIL wyhsillypig@163.com 92
使用表CONVERSIONS
输入
SQL> SELECT * FROM CONVERSIONS
输出
NAME TESTNUM
40 95
13 23
74 68
NAME 列为字符串该列的宽度为15 TESTNUM 列为数字
TO_CHAR
该函数的最初功能是将一个数字转换为字符型不同的解释器可能会使用它来转换其它的
数据类型例如日期型转换为字符型或者是拥有更多的参数下例展示了该函数的基本功

输入
SQL> SELECT TESTNUM TO_CHAR TESTNUM FROM CONVERT
输出
TESTNUM TO_CHAR(TESTNUM)
95 95
23 23
68 68
稍安勿燥下例可以证明它确实已经将TESTNUM 转换为字符型了
输入
SQL>SELECT TESTNUM LENGTH TO_CHAR TESTNUM FROM CONVERT
输出
TESTNUM LENGTH(TO_CHAR(TESTNUM))
95 2
23 2
68 2
分析
如果对数字使用LENGTH函数将会返回错误注意TO_CHAR 与在先前进过的CHR 不同
SQL 21 日自学通(V1.0) 翻译人笨猪
EMAIL wyhsillypig@163.com 93
CHR 返回字符集中给定数字位置的一个字符或符号
TO_NUMBER
该函数与TO_CHAR 函数相对应显而易见它是将一个字符串型数字转换为数值型例

输入
SQL> SELECT NAME TESTNUM TESTNUM*TO_NUMBER NAME FROM CONVERT
输出
NAME TESTNUM TESTNUM*TO_NUMBER(NAME)
40 95 3800
13 23 299
74 68 5032
分析
如果该函数没有将NAME 转换为数值的话将会返回一个错误信息
其它函数
这里有三个函数可能对你是有用处的
GREATEST 与LEAST
这两个函数将返回几个表达式中最大的和最小的例如
输入
SQL> SELECT GREATEST ALPHA BRAVO FOXTROT DELTA
FROM CONVERT
输出
GREATEST
FOXTROT
FOXTROT
FOXTROT
分析
注意GREATEST 将会返回在字母表中最靠后的字符开头的字符串虽然看起来似乎没
SQL 21 日自学通(V1.0) 翻译人笨猪
EMAIL wyhsillypig@163.com 94
有必要使用FROM 子句可是如果FROM 子句没有的话你将会收到一个错误信息每
一个SELECT 语句都需要FROM 子句由于给定的表有三行所以结果返回了三个
输入
SQL> SELECT LEAST 34 567 3 45 1090 FROM CONVERT
输出
LEAST(34 567 3 45 1090)
3 3 3
就像你看到的那样这两个函数也可以对数字进行处理
USER
该函数返回当前使用数据库的用户的名字
输入
SQL> SELECT USER FROM CONVERT
输出
USER
PERKINS
PERKINS
PERKINS
只有我一个人在使用这个数据库看SELECT 又一次对表中的每一行都返回了结果
该函数与在今天早些时候提及的日期函数类似甚至尽管USER 不是表中确实存在的列
但SELECT 仍然检索了表中的每一行
总结
好长的一天啊我们一共学习了47 个函数你无需记住每一个函数只需要知道它们
的大致类型算术函数日期/时间函数字符函数转换函数其它函数而当你写一
个查询的时候你有一个明确的目标就够了
SQL 21 日自学通(V1.0) 翻译人笨猪
EMAIL wyhsillypig@163.com 95
问与答
问为什么在ANSI 标准中定义的函数这么少而不同的解释器又都定义了这么多的函数
答ANSI 标准是一个非常宽松的标准而且如果对所有的解释器生产厂家来说过多的限
制会使其走向破产的道路另一方面如果A 公司对SQL 补充了一个用于统计的函
数包而销路特别好的话那么B 公司和C 公司一定也会跟着做的
问我认为你对SQL 的介绍太简单了我的工作时应该如何去使用这些函数呢
答这个问题与一个都三角的教师所提出的问题类似事实上我也不知道如何却求一个等
腰三角形的面积所以我的回答是根据你的职业而定你的工作中需要用到哪些
函数你就去使用它而其它的对你来说则是没有必要掌握的这一观点也适用于你的
查询
校练场
1 哪个函数是用来将给定字符串的第一个字母变成大写而把其它的字符变成小写的
2 哪此函数的功能就如同它的名字含义一样
3 下边的查询将如何工作
SQL> SELECT COUNT(LASTNAME) FROM CHARACTERS;
4 下边的查询是干什么的
SQL> SELECT SUM(LASTNAME) FROM CHARACTERS;
5 哪个函数可以将FIRSTNAME 列与LASTNAME 列合并到一起
6 在下边的查询中6 是什么意思
输入
SQL> SELECT COUNT(*) FROM TEAMSTATS;
输出
COUNT(*)
6 7 下列语句将输出什么
SQL> SELECT SUBSTR LASTNAME,1,5 FROM NAME_TBL;
SQL 21 日自学通(V1.0) 翻译人笨猪
EMAIL wyhsillypig@163.com 96
练习
1 用今天的TEAMSTARTS 表来写一个查询用来显示谁的中球率低于0.25 中球率
的计算方法为hits/ab
2 用今天的CHARACTERS 表来写一个查询要求返回下边的结果
INITIALS__________CODE
K.A.P. 32
1 row selected.
gototop
 
1234   2  /  4  页   跳转
页面顶部
Powered by Discuz!NT