1 单行函数 2 4.1 程序员对数据库的常用操作: 3 1.数据库的打开、关闭、查看表信息等操作。 4 2.SQL 语句,在编写程序中需要程序人员动手编写的命令语句。 5 3.函数,每个数据库都有自己的函数支持,利用这些函数可以更加方便地完成所需的功能。对于所有函数,暂不需要了解其内部工作原理,只需要清楚每个函数的作用。 6 7 4.2 Oracle 单行函数语法 8 funcation_name(列 | 表达式[,参数1,参数2]) 9 在调用单行函数的时候,函数可以接收一个数据表中的操作列,也可以接收一个具体的计算结果,同时设置若干个函数运行时所需的函数,根据作用不同,单行函数分为: 10 字符函数:接收数据返回具体的字符信息。 11 数值函数:对数字进行处理,例如四舍五入。 12 日期函数:直接对日期进行相关操作。 13 转换函数:日期、字符、数字之间可以完成相互转换功能。 14 通用函数:Oracle 自己提供的有特色的函数 15 16 17 4.3字符型函数有:接收数据返回具体的字符信息。 18 UPPER(列|字符串):将字符串的内容全部转大写。 19 LOWER(列|字符串):将字符串的内容全部转小写。 20 INITCAP(列|字符串):将字符串的开头首字母大写。 21 REPLACE(列|字符串,新的字符串):使用新的字符串替换旧的字符串。 22 LENGTH(列|字符串):求出字符串长度。 23 SUBSTR(列|字符串,开始点[,长度]):字符串截取。 24 INSTR(列|字符串,要查找的字符串,开始位置,出现位置):查找一个子字符串是否是在指定的位置上出现 25 LPAD(列|字符串,长度,填充字符):在左填充指定长度字符串。 26 RPAD(列|字符串,长度,填充字符):在右填充指定长度字符串。 27 TRIM(列|字符串):去掉左右空格 28 LTRIM(字符串):去掉左空格。 29 RTRIM(字符串):去掉右空格。 30 ASCII(字符):返回与制定字符对应的十进制数字。 31 CHR(数字):给出一个整数,并返回与之对应的字符。 32 33 用例: 34 SELECT UPPER('WenXuHong'),LOWER('MLDN') FROM dual; 35 SELECT * FROM emp WHERE ename=UPPER('smith'); 36 SELECT ename 原始姓名,INITCAP(ename) 姓名开头首字母大写 FROM emp; 37 SELECT ename ,REPLACE(ename,'A','_') FROM emp; 38 SELECT * FROM emp WHERE LENGTH(ename)=5; 39 SELECT ASCII('L') FROM dual; /*76*/ 40 SELECT CHR(76) FROM dual; /*L*/ 41 SELECT ' Wenxuhong ' 原始字符串,LTRIM(' Wenxuhong ') 去掉左空格,RTRIM(' Wenxuhong '),去掉右空格 FROM dual; 42 SELECT ' Wenxuhong ' 原始字符串,TRIM(' Wenxuhong ') 去掉左右两边空格 FROM dual; 43 44 --截取部分的字符串: 45 SELECT * FROM emp WHERE SUBSTR(ename,0,3)='JAM'; 46 47 --从指定位置截取到结尾 48 SELECT ename 原始姓名,SUBSTR(ename,3) 截取之后的姓名 FROM emp WHERE deptno=10; 49 50 --显示每个雇员姓名及其姓名的后三个字母 51 SELECT ename,SUBSTR(ename,LENGTH(ename)-2) FROM emp; 52 SELECT ename,SUBSTR(ename,-3) FROM emp; 53 54 --字符串左、右填充函数 55 SELECT LPAD('MLDN',10,'*') LPAD函数使用, 56 RPAD('MLDN',10,'*') RPAD函数使用, 57 LPAD(RPAD('MLDN',10,'*'),16,'*') 组合使用 FROM dual; 58 --字符串查找函数 59 SELECT INSTR('MLDN Java','MLDN') 查找得到返回1, 60 INSTR('MLDN Java','Java') 查找得到返回6, 61 INSTR('MLDN Java','JAVA') 查找不到返回0 FROM dual; 62 63 64 65 66 4.4 数值型函数有:对数字进行处理,例如四舍五入。 67 ROUND(数字,[,保留位数]) : 对小数进行四舍五入,可以指定保留位数,如果不指定,则表示小数点后的数字全部进行四舍五入。 68 TRUNC(数字,[,截取位数]):保留指定位数的小数,如果不指定,则表示不保留小数。 69 MOD(数字,数字):取模。 70 71 用例: 72 --ROUND 73 SELECT ROUND(789.654) 不保留小数, /*790*/ 74 ROUND(789.654,2) 保留两位小数,/*789.65*/ 75 ROUND(789.654,-1) 处理整数进位 /*790*/ 76 FROM dual; 77 78 SELECT ROUND(sal/30,2) FROM emp; 79 80 --TRUNC 81 SELECT TRUNC(789.654) 截取小数 ,/*789*/ 82 TRUNC(789.654,2) 截取两位小数,/*789.65*/ 83 TRUNC(789.654,-2) 取整 /*700*/ 84 FROM dual; 85 86 --MOD 87 SELECT MOD(10,3) /*10除以3结果是商余1,所以模是1 */ FROM dual ; 88 89 90 91 92 4.5 时间型函数有: 93 通过SYSDATE 伪列取得的只有年、月、日、时、分、秒等数据,如果想精确到毫秒则应该使用 SYSTIMESTAMP 伪列。 94 95 ADD_MONTHS(日期,数字): 在指定的日期上加入指定的月数,求出新的日期。 96 MONTHS_BETWEEN(日期1,日期2):求出两个日期间的月数。 97 LAST_DAY(日期):求出下一个星期X的具体日期。 98 NEXT_DAY(日期,星期数):求出指定日期的最后一天日期。 99 EXTRACT(格式 FROM 数据):日期时间分割,或计算给定两个日期的间隔。 100 101 用例: 102 --修改日期显示格式 ,Oracle 中默认的日期显示格式为 '日-月-年': 103 ALTER SESSION SET NLS_DATE_FORMAT='yyyy-mm-dd hh24:mi:ss'; 104 105 --ORACLE 中三个日期操作公式: 106 日期 - 数字 = 日期 107 日期 + 数字 = 日期 108 日期 - 日期 = 数字(天数) 109 日期 + 日期 = 不符合逻辑 110 111 --查询距离今天为止3天之后及3天之前的日期 112 SELECT SYSDATE+3 三天后,SYSDATE-3 三天前 FROM dual; 113 114 --查询结果中使用TRUNC完成小数点之后的内容全部清除 115 SELECT TRUNC(SYSDATE-hiredate) 雇佣天数,TRUNC((SYSDATE-10)-hiredate) 十天前雇佣天数 FROM emp ; 116 117 --ADD_MONTHS 118 SELECT SYSDATE, 119 ADD_MONTHS(SYSDATE,3) 三个月之后的日期, 120 ADD_MONTHS(SYSDATE,-3) 三个月之前的日期, 121 ADD_MONTHS(SYSDATE,60)六十个月之前的日期 122 FROM dual; 123 124 --NEXT_DAY 125 SELECT SYSDATE, 126 NEXT_DAY(SYSDATE,'星期日') 下一个星期日, 127 NEXT_DAY(SYSDATE,'星期日') 下一个星期一 128 FROM dual; 129 130 --LAST_DAY :求出指定日期的最后一天日期。 131 SELECT SYSDATE, 132 LAST_DAY(SYSDATE) 133 FROM dual; 134 135 --MONTHS_BETWEEN 136 SELECT TRUNC(MONTHS_BETWEEN(SYSDATE,hiredate)/12) 已雇佣年数, 137 TRUNC(MOD(MONTHS_BETWEEN(SYSDATE,hiredate)/12)) 已雇佣月数 138 TRUNC(sysdate - ADD_MONTHS(hiredate,MONTHS_BETWEEN(SYSDATE - hiredate))) 已雇佣天数 139 FROM emp; 140 141 --EXTRACT 函数 (抽取) ,9i 后增加的功能。 142 语法: 143 EXTRACT([YEAR|MONTH|DAY|HOUR|MINUTE|SECOND] 144 |[TIMEZONE_HOUR|TIMEZONE_MINUTE] 145 |[TIMEZONE_REGION|TIMEZONE_ABBR] 146 FROM [日期(date_value)|时间间隔(interval_value)]) 147 148 ---从日期时间中取出年、月、日数据: 149 SELECT EXTRACT(YEAR FROM DATE '2001-09-19') years, 150 EXTRACT(MONTH FROM DATE '2001-09-19') months, 151 EXTRACT(DAY FROM DATE '2001-09-19') days 152 FROM dual; 153 154 ---从时间戳中取出年、月、日、时、分、秒等数据 155 SELECT EXTRACT(YEAR FROM SYSTIMESTAMP) years, 156 EXTRACT(MONTH FROM SYSTIMESTAMP) months, 157 EXTRACT(DAY FROM SYSTIMESTAMP) days, 158 EXTRACT(HOUR FROM SYSTIMESTAMP) hours, 159 EXTRACT(MINUTE FROM SYSTIMESTAMP) minutes, 160 EXTRACT(SECOND FROM SYSTIMESTAMP) seconds 161 FROM dual; 162 163 --复杂计算时间间隔(天数) 164 SELECT 165 EXTRACT(DAY FROM TO_TIMESTAMP('1982-08-13 12:17:57','yyyy-mm-dd hh24:mi:ss') 166 - TO_TIMESTAMP('1981-09-27 12:17:57','yyyy-mm-dd hh24:mi:ss') 167 ) days 168 FROM dual; 169 170 --取得时间间隔 (顺便学习 TO_TIMESTAMP 用法 171 SELECT EXTRACT(DAY FROM TO_TIMESTAMP('1982-08-13 12:17:57','yyyy-mm-dd hh24:mi:ss') 172 - TO_TIMESTAMP('1981-09-27 12:17:57','yyyy-mm-dd hh24:mi:ss') 173 ) days , 174 EXTRACT(HOUR FROM datetime_one - datetime_two) hours, 175 EXTRACT(MINUTE FROM datetime_one - datetime_two) minutes, 176 EXTRACT(SECOND FROM datetime_one - datetime_two) seconds 177 FROM ( 178 SELECT TO_TIMESTAMP('1982-08-13 12:17:57','yyyy-mm-dd hh24:mi:ss') datetime_one, 179 TO_TIMESTAMP('1981-09-27 12:17:57','yyyy-mm-dd hh24:mi:ss') datetime_two 180 FROM dual 181 ) 182 WHERE 1=1; 183 184 185 186 187 4.6 转换函数: 188 主要功能是将一个指定的数据类型变为另一种数据类型。 189 TO_CHAR(日期|数字|列,转换格式): 将指定的数据按照指定的格式变为字符串类型。 190 TO_DATE(字符串|列,转换格式):将指定的字符串按照指定的格式变为 DATE 型。 191 TO_NUMBER(字符串|列): 将指定的数据类型变为数字型。 192 193 194 195 《TO_CHAR日期格式化标记》 196 1. YYYY :完整的年份数字表示,年有四位,所以使用四个Y。 197 2. Y,YYY :带逗号的年。 198 3. YYY :年的后三位。 199 4. YY :年的后两位。 200 5. Y :年的最后一位。 201 6. YEAR :年份的文字表示,直接表示四位的年。 202 7. MONTH :月份的文字表示,直接表示两位的月。 203 8. MM :用两位数字来表示月份,月有两位数,所以使用两个M。 204 9. DAY :天数的文字表示。 205 10. DDD :表示一年里的天数(001-366)。 206 11. DD :表示一月里的天数(01-31)。 207 12. D :表示一周里的天数(1-7)。 208 13. DY :用文字表示星期几。 209 14. WW :表示一年里的周数。 210 15. W :表示一月里的周数。 211 16. HH :表示12小时制,小时是两位数字,使用两个H。 212 17. HH24 :表示24小时制。 213 18. MI :表示分钟。 214 19. SS :表示秒,秒是两位数字,使用两个S。 215 20. SSSSS :午夜之后的秒数字表示(0-86399)。 216 21. AM|PM(A.M.|P.M.) :表示上午或下午。 217 22. FM :去掉查询后的前导0,该标记用于时间模板的后缀。 218 219 《TO_CHAR数字格式化标记》 220 1. 9 :表示一位数字 221 2. 0 :显示前导0 222 3. $ : 将货币的符号显示为美元符号。 223 4. L :根据语言环境不同,自动选择货币符号。 224 5. . : 显示小数点。 225 6. , : 显示千位数。 226 227 228 229 --ORACEL 中数据的隐式转换操作: 230 1. 字符型(VARCHAR2、VARCHAR)如果有数字组成,则可以直接转换成数字(NUMBER)。 231 2. 字符型(VARCHAR2、VARCHAR) 如果按照指定的日期格式(例如:'08-9月-81'),则可以自动转换为 DATE 型数据。 232 3. 数字型(NUMBER)和日期型(DATE)之间不能直接进行转换。 233 234 --格式化当前的日期时间 235 SELECT SYSDATE 当前系统时间, 236 TO_CHAR(SYSDATE,'YYYY-MM-DD') 格式化日期, 237 TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS') 格式化日期时间, 238 TO_CHAR(SYSDATE,'FMYYYY-MM-DD HH24:MI:SS') 去掉前导0的日期时间 239 FROM dual; 240 241 SELECT SYSDATE 当前系统时间, 242 TO_CHAR(hiredate,'YYYY-MM-DD') 格式化雇佣日期, 243 TO_CHAR(hiredate,'YYYY') 年, 244 TO_CHAR(hiredate,'MM') 月, 245 TO_CHAR(hiredate,'DD') 日 246 FROM emp; 247 248 SELECT SYSDATE 当前系统时间, TO_CHAR(SYSDATE,'YEAR-MONTH-DY') 格式化日期 FROM dual; 249 SELECT * FROM emp WHERE TO_CHAR(hiredate,'MM')='02'; 250 SELECT * FROM emp WHERE TO_CHAR(hiredate,'MM')=2; 251 252 --格式化数字显示 253 SELECT TO_CHAR(987654321.789,'999,999,999,999.99999') 格式化数字1, /*987,654,321.78900*/ 254 TO_CHAR(987654321.789,'000,000,000,000.00000') 格式化数字2 /*000,987,654,321.78900*/ 255 FROM dual; 256 257 --格式化数字显示 258 SELECT TO_CHAR(987654321.789,'L999,999,999,999.99999') 显示货币, 259 TO_CHAR(987654321.789,'$999,999,999,999.99999') 显示美元 260 FROM dual; 261 262 --TO_DATE 函数 263 SELECT TO_DATE('1979-09-19','YYYY-MM-DD') FROM dual; 264 265 --TO_TIMESTAMP 函数 将数据变为时间戳。 266 SELECT TO_TIMESTAMP('1979-09-19 18:07:10','YYYY-MM-DD HH24:MI:SS') datetime1 FROM dual; 267 268 --TO_number : 269 SELECT TO_NUMBER('09')+TO_NUMBER('19') 加法运算, 270 TO_NUMBER('09')+TO_NUMBER('19') 乘法运算 271 FROM dual; 272 273 --sysdate : 274 SELECT sysdate FROM dual; 275 276 --systimestamp : 277 SELECT systimestamp FROM dual; 278 279 4.7 特有函数: 280 NVL(数字|列,默认值) :如果显示的数字是 NULL 的话,则使用默认数值表示。 281 NVL2(数字|列,返回结果1(不为空显示),返回结果2(为空显示)) :判断指定的列是否为 NULL ,如果不为 NULL 则返回结果1,如果为空则返回结果 2 。 282 NVLLIF(表达式1,表达式2) :比较表达式1 和表达式2 的结果是否相等,如果相等返回 NULL,如果不等返回表达式1。 283 CASE 列|值 WHEN 表达式1 THEN 显示结果1 ...ELSE 表达式n ... END :用于实现多条件判断,在WHEN 之后编写条件,而在THEN 之后编写条件满足的显示操作,如果都不满足则使用ELSE中的表达式处理。 284 DECODE(列|值,判断值1,显示结果1,判断值2,显示结果2,...,默认值) : 多值判断,如果某一列(或某一个值)与判断值相同,则使用指定的显示结果输出,如果没有满足条件,则显示默认值。 285 COALESCE(表达式1,表达式2,...表达式n) :将表达式逐个判断,如果表达式1的内容是 null ,则显示表达式2,如果表达式2的内容是null,则显示表达式3,以此类推,如果表达式n 的结果还是null,则返回null。 286 287 288 --用例: 289 --NVL 运算,一个数学结算中如果存在 null ,则最后的结果也肯定是null。 290 SELECT NVL(null,0),NVL(3,0) FROM emp; 291 SELECT (SAL+NVL(COMM,0)) FROM emp; 292 293 --NVL2 : 可以同时对 null 或 非null 的值进行判断,并返回不同结果。如果 comm 为不为空,则返回 sal+comm ,comm 为空 则返回sal。 294 SELECT NVL2(comm,sal+comm,sal) FROM emp ; 295 296 --NULLIF 函数 297 SELECT NULLIF(1,1),NULLIF(1,2) FROM dual ; 298 SELECT NULLIF(LENGTH(ename),LENGTH(job)) nullif FROM emp ; 299 300 --DECODE 函数 301 SELECT DECODE(2,1,'内容为1',2,'内容为2'),DECODE(2,1,'内容为1','没有满足条件') FROM dual ; 302 303 SELECT DECODE(job, 304 'CLERK','业务员', 305 'SALESMAN','销售人员', 306 'MANAGER','经理', 307 'ANALYST','分析员', 308 'PRESIDENT','总裁', 309 ) job 310 FROM emp; 311 312 --CASE 表达式: 313 SELECT CASE job WHEN 'CLERK' THEN sal*1.1 314 WHEN 'SALESMAN' THEN sal*1.2 315 WHEN 'MANAGER' THEN sal*1.3 316 ELSE sal*1.5 317 END 新工资 318 FROM emp; 319 320 --COALESCE 函数 321 SELECT COALESCE(comm,100,2000),COALESCE(comm,NULL,NULL) FROM emp; 322
浙公网安备 33010602011771号