暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 学习:SQL-Fundamentals(SQL 规则之二)

oracleEDU 2017-08-19
464

接上一节内容,通过第二个脚本学习SQL规则。

 检查表空间脚本 
SELECT D.STATUS STATUS,

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 非标准写法 

15

单行函数

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



最后修改时间:2021-04-28 19:52:20
文章转载自oracleEDU,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论