oracle_函数

本文介绍了 Oracle SQL 的实用技巧,包括常用查询语句、单行和多行函数、子查询及多表查询等内容,帮助读者掌握高效的数据处理方法。

sqlplus  用户名、密码

host clear;

show user;

select * from tab;

desc 表的名字;

show linesize;

set linesize 100;

col 列名 for 9999;

set pagesize 30;

a命令 a  desc(至少两个空格);

/表示执行上一条sql或pl/sql;

c命令 先找出错误出现在哪一行;c /被改变的、改变后的; /执行。

1,查询员工表的年基本工资和总薪水

     select EMPNO 员工编号,ENAME 员工姓名,JOB 员工职称,SAL 员工月薪,SAL*12 员工年薪,NVL(COMM, 0)员工奖金,SAL*12+NVL(COMM, 0) 员工总薪水  FROM EMP;

表达式中出现null ,则结果为null;而且null 永远!=null;

2.判断是否为null 

     select EMPNO 员工编号,ENAME 员工姓名,JOB 员工职称,SAL 员工月薪,SAL*12 员工年薪,NVL(COMM, 0)员工奖金,SAL*12+NVL(COMM, 0) 员工总薪水  FROM EMP

where COMM IS NOT NULL;(IS NULL);

3  别名

   3.1   EMPNO  as "员工编号"

   3.2   EMPNO  "员工编号"        3.1与3.2没有区别

   3.3   EMPNO  员工编号           3.3此时不能有空格等特殊字符,如有则用上面的别名。

4  distinct 的作用字段      

   4.1    select distinct job  from emp;

   4.2    select distinct job,mgr  from emp;

   说明distinct 作用于后面的所有列。

5   连接符

select 'hello'||'world'  from dual;

select concat('he','llo') from dual;

6 oracle数据库中的单引号双引号

   单引号:字符串 或日期:字符串大小写敏感(mysql并不区分大小写);日期的格式敏感;

    双引号:列的别名

7 生成文本文件的命令。

   spool d:文件名称.txt;

  spllo off;

 8 更改日期的格式 (DD-MON-RR)17-12月-80

  select  * from  v$nls_parameters; 从数据字典中查询已存在的参数。

 9  between and ;小的在前,大的在后,包含边界;

     in();可以有null;

    not in ();不可以有null; 

   where 条件的解析顺序从右往左;注意条件的先后,可以达到优化sql的效果。

10,排序

   order by 列,表达式,别名,序号

   asc: 先按第一个,第一个相同,按第二个,依次排列。

   desc :只作用于最近的字段

   null值为最大;

简化参数

1.单行函数(常用的单行函数)

  1.1字符函数

      UPPER

      LOWER

     INITCAP:首字母大写

     CONCAT

     SUBSTR : (1)SUBSTR(a,b);(2)SUBSTR(a,b,c)

     INSTR :   select  instr('aaabbb','c') from dual; 查找得到返回下标,从1开始。没有就返回0;

     LENGTH:字符数

     LENGTHB:字节数

     LPAD:   

     RPAD:      select LPAD('AAA ',10,'%') from dual;  

     TRIM  : 去掉前后指定的字符  select trim('h' from 'h hgh d hello worldh h') from dual; 

     REPLACE :  select REPLACE('hello nihao' ,'l','*') from dual;

   1.2 数字函数

     ROUND:四舍五入 。round(a,b) b,保留小数的位数,可以为负数。

     TRUNC:同上。

    MOD(A,B);取余数。

   1.3 时间和日期

         TO_CHAR(a,b):按照b的格式将a转化成字符串:select to_char(sysdate,'yyyy-MM-dd hh:mm:ss') from dual;

         日期型数据加减一个数字仍然为日期型数据、

          两个日期相减,返回之间相差的天数

          用日期除24,来减去日期中的小时数。除以7获得周数。

         select   ename 姓名,sysdate-hiredate 天, (sysdate-hiredate)/30 月,(sysdate-hiredate)/7 星期,(sysdate-hiredate)/365 年   from emp;返回近似值

          months_between:日期之间相差的月份

          add_months:多少个月之后

          next_day:下一个星期几?每个星期一,数据库自动备份。

          last_day

           round (a,b)

           trunc(a,b) 'year' 'month' 'day'

''          分布式数据库:逻辑上在一起,物理上不在一起。待续。。。。。。。

 1.4数据类型转换 

     1.4.1隐式类型转化:必须是可以转换的

     1.4.2显式类型转化

                 数字                                     字符串                                     日期

                                > to_char                                     >  to_date

                                <  to_number                              < to_char


 1.4.2.1: select  to_char(hiredate,'YYYY-MM-DD "是" DY')from emp;                     1981-05-01 是 星期五 

 1.4.2.2:  select  to_date('1981-05-01 是 星期五','YYYY-MM-DD "是" DY')from dual;    解析成日期类型


1.4.2.3: select  to_char(sal,'L99,999.99') from emp;    ¥2,975.00

1.4.2.4: select  to_number('¥2,975.00','L99,999.99') from dual; 

1.5通用函数

NVL(a,c);当a==null,返回c

NVL2(a,b,c);当当a==null,返回c,否则,返回b.

nullif(a,b);当a==b返回null,否则返回a.

coalesce(...);返回第一个不是null的值。

1.6条件表达式

  1.6.1: if -then -else 的逻辑

                select  ename,job,sal 涨前,case job   when 'PRESIDENT' then sal+1000  
                                                                                     when 'MANAGER' then sal+6000  
                                                                                    else sal  
                                                                                    end 涨后 
                                                                                    from emp;   

  1.6.2 :  decode函数

              select  ename,job,sal 涨前,decode(job ,'PRESIDENT' , sal+1000  
                                                                                       , 'MANAGER'  , sal+6000  
                                                                                                                  , sal  
                                                                                                                 )涨后 
                                                                                                                 from emp;   

 1.6.3:

       select ename||'  '||sal||'  '||
       case when sal<=1000 then sal||'   差'
       when sal>1000 and sal <=2000 then sal||'   一般'
       when sal>2000 and sal <= 3000 then sal||'   良'
       when sal > 3000 and sal < 5600 then sal||'   优'
       end sal
       from emp ;

2.多行参数

 2.1 count ,avg ,sum ,max.min

   组函数会自动过滤空值,可以在其中嵌套滤空函数来清除滤空。

 2.2求部门的平均工资。

      select deptno 部门,TO_CHAR(ROUND(AVG(SAL),2), 'L9,999.99') 平均工资 from emp GROUP BY deptno; 

2.3求部门的平均工资。

select deptno 部门,job 职位,TO_CHAR(ROUND(AVG(SAL),2), 'L9,999.99') 平均工资 from emp GROUP BY deptno,job order by 1;

  注意:select a,b,c .组函数(参数列表) from 表明 group by 必须包含前面所有的不包含在参数列表中的字段,而此处的字段可以不再前面出现。

2.4having可以和组函数一起使用,这是和where最大的区别

2.5 group by 语句的增强

 select deptno 部门,job 职位,TO_CHAR(ROUND(AVG(SAL),2), 'L9,999.99') 平均工资 ,sum(sal) 部门总薪水 from emp GROUP BY rollup(deptno,job) order by 1;

3.多表查询

3.1迪卡尔集

3.2自连接。

 select e.ename 员工的名字,b.ename 老板名字
   from emp e,emp b
  where e.mgr=b.empno;

不适合操作数据较多的表

3.3层次查询(本质上是单表查询,只有一张表不会产生迪卡尔集)

select level,empno,ename,mgr
from emp 
connect by prior  empno=mgr
start with mgr is null            (=null不争)                 

order by 1 ;

4;子查询

4.1子查询需要注意的问题 

1括号

2书写风格

3可以where select having from 后添加子查询

4不可以在group by 放置子查询

5from后面的子查询需要格外注意

6子查询和主查询可以不是同一张表,

7一般不再子查询中排序,有特殊情况top-n

8一般先子查询再主查询,但相关子查询例外

9单行子查询只能使用单行操作符,多行子查询只能使用多行操作符。

10,子查询中的null

详解

3.select后面的子查询必须是单行查询

5.from后面放置子查询。

select ename from (select ename,job from emp);



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值