
接上一节内容,通过第二个脚本学习SQL规则。
D.TABLESPACE_NAME NAME,
D.CONTENTS TYPE,
D.EXTENT_MANAGEMENT EXTENTMANAGEMENT,
TO_CHAR(NVL(A.BYTES 1024 1024, 0), '99,999,990.900') TABLE_SIZE,
TO_CHAR(NVL(A.BYTES - NVL(F.BYTES, 0), 0) 1024 1024,
'99999999.999') || '/' ||
TO_CHAR(NVL(A.BYTES 1024 1024, 0), '99999999.999') USED,
TO_CHAR(NVL((A.BYTES - NVL(F.BYTES, 0)) A.BYTES * 100, 0),
'990.00') RATE
FROM SYS.DBA_TABLESPACES D,
(SELECT TABLESPACE_NAME, SUM(BYTES) BYTES
FROM DBA_DATA_FILES
GROUP BY TABLESPACE_NAME) A,
(SELECT TABLESPACE_NAME, SUM(BYTES) BYTES
FROM DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME) F
WHERE D.TABLESPACE_NAME = A.TABLESPACE_NAME(+)
AND D.TABLESPACE_NAME = F.TABLESPACE_NAME(+)
AND NOT
(D.EXTENT_MANAGEMENT LIKE 'LOCAL' AND D.CONTENTS LIKE 'TEMPORARY');
分解学习:
1 函数
2 子查询
3 分组汇总
4 多表查询 (内连接+外连接)
5 非标准写法
单行函数
Single-row functions 单行函数
Multiple-row functions 多行函数
常用单行函数:
字符
日期
数字
通用
转换

字符函数
大小写转换:
LOWER 所有变小写
UPPER 所有变大写
INITCAP 首字母大写
例1. 插入数据,但是要求员工的姓名一定大写
insert into emp (empno,ename ,sal) values(&no,upper('&name'),&sal);
例2. 通过姓名找员工的编号,工资,部门编号
要求:姓名不区分大小写
select empno ,ename ,sal ,deptno
from emp
where upper(ename) =upper('&name')
字符操作函数:
CONCAT 字符连接
语法:CONCAT('Hello', 'World') --> HelloWorld
select 函数名 from dual;
SQL> select concat('hello','nihao') from dual;
CONCAT('HE
----------
hellonihao
只支持2个参数 --> 嵌套
SQL> select concat(concat(ename,'_'),empno) from emp;
CONCAT(CONCAT(ENAME,'_'),EMPNO)
---------------------------------------------------
SHENWEI_7784
SMITH_7369
ALLEN_7499
等同:
select ename || '_'|| empno from emp;
字符串截取SUBSTR:
语法:SUBSTR('HelloWorld',1,5) --> Hello
SUBSTR('字符串',起始位置,截取多少位) --> Hello
起始位置:
正数 从左到右开始数 从1开始
负数 有右向左数 从-1开始
求helloworld中的 ld
SQL> select SUBSTR('HelloWorld',9,2) from dual;
SU
--
ld
SQL> select SUBSTR('HelloWorld',-2,2) from dual;
SU
--
ld
SQL> select SUBSTR('HelloWorld',-2 ) from dual;
SU
--
ld
字符串长度:
语法:LENGTH('HelloWorld') --> 10
INSTR 定位
INSTR('HelloWorld', 'W')
从字符串的左边开始数,找第一为w的位置 结束
select INSTR('HelloWoWwWWWrld', 'W') from dual;
INSTR('HELLOWOWWWWWRLD','W')
----------------------------
6
LPAD | RPAD 左右补齐
语法:LPAD(salary,10,'*')
先找salary的字段值长度,如果小于10,则在左边用*填充
lpad(字段名,长度,'字符串’)
l--->left
r--->right
规定工资长度是10个 不够的在左边补0
SQL> select ename ,lpad(sal,10,0) from emp ;
ENAME LPAD(SAL,10,0)
---------- --------------------
Tom 0000001000
SMITH 0000000800
ALLEN 0000001600
WARD 0000001250
JONES 0000002975
MARTIN 0000001250
SQL> select ename ,sal ,lpad(sal,3,0) from emp ;
ENAME SAL LPAD(S
---------- ---------- ------
Tom 1000 100
SMITH 800 800
ALLEN 1600 160
WARD 1250 125
注意:否则数据丢失
字符串查找替换 REPLACE
语法:REPLACE ('JACK and JUE','J','BL')
REPLACE ('字符串1','字符串2','字符串3')
在字符串1 找字符串2 ,替换为字符串3
例:把姓名中包含O全部替换 8
SQL> select replace(upper(ename),'O','8') from test;
REPLACE(UP
----------
SMITH
ALLEN
WARD
J8NES
MARTIN
BLAKE
CLARK
SC8TT
KING
TURNER
ADAMS
去掉首位空格或者符号:
例:
select ' hello world ' from dual;
'HELLOWORLD'
------------------
hello world
SQL> select trim(' hello world ') from dual;
TRIM('HELLO
-----------
hello world
TRIM('H' FROM 'HelloWorld') 去掉首位指定字符
SQL> select trim('h' from 'hhhahello worldhhhhh') from dual;
TRIM('H'FROM
------------
ahello world

数字函数
ROUND: Rounds value to a specified decimal 四舍五入
TRUNC: Truncates value to a specified decimal 截断
MOD: Returns remainder of division 求余数
round(数字,精度)
精度表示法:
1 2 3 . 4 5 6
-2 -1 0 1 2 3
SQL> select ROUND(45.926, 2) from dual;
ROUND(45.926,2)
---------------
45.93
select ROUND(45.926 ) from dual;
ROUND(45.926,0)
---------------
46
select ROUND(45.926 ,0) from dual;
ROUND(45.926,0)
---------------
46
select ROUND(45.926 ,-1) from dual;
ROUND(45.926,-1)
----------------
50
select ROUND(45.926 ,-2 ) from dual;
ROUND(45.926,-2)
----------------
0
select ROUND(55.926 ,-2 ) from dual
ROUND(55.926,-2)
----------------
100

日期函数
date 数据类型
The default date display format is DD-MON-RR.
一般不建议用DD-MON-RR
建立一个表
create table xs (id number ,ruxue date )
1 1998-9-1
2 2008-9-1
3 2018-9-1
SQL> select ename, hiredate from emp;
ENAME HIREDATE
---------- ---------
Tom
SMITH 17-DEC-80
ALLEN 20-FEB-81
WARD 22-FEB-81
方法1:修改环境变量
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
SQL> select ename, hiredate from emp;
ENAME HIREDATE
---------- -------------------
Tom
SMITH 1980-12-17 00:00:00
ALLEN 1981-02-20 00:00:00
WARD 1981-02-22 00:00:00
方法:用函数处理 (建议)
输入:to_date('1998-1-1','yyyy-mm-dd')
显示:to_char(hiredate,'yyyy-mm-dd hh24:mi:ss')
select ename, to_char(hiredate,'yyyy-mm-dd hh24:mi:ss') from emp;
要求向学生表中插入:
1 1998-9-1
2 2008-9-1
3 2018-9-1
默认是DD-MON-RR
insert into xs(id ,ruxue) values(1,'1-SEP-98') ;
insert into xs(id ,ruxue) values(1,'1-SEP-08') ;
insert into xs(id ,ruxue) values(1,'1-SEP-18') ;
commit;
select id, to_char(ruxue,'yyyy-mm-dd') from xs
ID TO_CHAR(RU
---------- ----------
1 1998-09-01
1 2008-09-01
1 2018-09-01
4 1908年怎么输入
insert into xs(id ,ruxue) values(4,'1-SEP-08') ;
SQL> select id, to_char(ruxue,'yyyy-mm-dd') from xs
2 ;
ID TO_CHAR(RU
---------- ----------
1 1998-09-01
1 2008-09-01
1 2018-09-01
4 2008-09-01 不对了!
你怎么输入1908呢? 用默认的肯定输入不了
一定用函数to_date('1908-9-1','yyyy-mm-dd')
insert into xs(id ,ruxue) values(4,to_date('1908-9-1','yyyy-mm-dd') ) ;
SQL> select id, to_char(ruxue,'yyyy-mm-dd') from xs;
ID TO_CHAR(RU
---------- ----------
1 1998-09-01
1 2008-09-01
1 2018-09-01
4 2008-09-01
4 1908-09-01 成功插入
总结:输入时间to_date(字符,日期格式)
显示时间to_char(日期,字符格式)
函数:SYSDATE 显示系统当前时间
SQL> select sysdate from dual;
SYSDATE
---------
16-JUL-14
SQL> select to_char(sysdate ,'yyyy-mm-dd hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'YY
-------------------
2014-07-16 04:09:47
日期可以加上和减掉一个数字 结果还是日期,两个日期之间可以做减法,日期运算单位是天。
1天后
select to_char(sysdate+1 ,'yyyy-mm-dd hh24:mi:ss') from dual;
TO_CHAR(SYSDATE+1,'
-------------------
2014-07-17 04:12:13
1小时后
select to_char(sysdate+1/24 ,'yyyy-mm-dd hh24:mi:ss') from dual;
5分钟后
select to_char(sysdate+5/1440,'yyyy-mm-dd hh24:mi:ss') from dual;
3分钟前
select to_char(sysdate-3/1440,'yyyy-mm-dd hh24:mi:ss') from dual;
日期操作函数:
MONTHS_BETWEEN 相隔多少个月
ADD_MONTHS 添加几个月
NEXT_DAY (求下一个星期几,是几月几号)
语法:
NEXT_DAY ('01-SEP-95','FRIDAY')
NEXT_DAY (日期,星期几)
英文拼写 数字表示
Monday 星期一 2
Tuesday 星期二 3
Wednesday 星期三 4
Thursday 星期四 5
Friday 星期五 6
Saturday 星期六 7
Sunday 星期日 1
今天是2017年8月17日,下周星期六是几月几号。
SQL> select to_char(next_day(to_date('2017-08-17','yyyy-mm-dd'),upper('Saturday')),'yyyy-mm-dd') from dual;
TO_CHAR(NE
----------
2017-08-19






