Oracle认证 百分网手机站

Oracle复习知识点(2)

时间:2018-04-25 10:40:42 Oracle认证 我要投稿

Oracle复习知识点汇总

  SELECT sysdate FROM dual; sysdate获取当前系统日期

  SELECT ename, round(sysdate-hiredate,2) hiredate FROM emp;计算员工入职天数

  SELECT ename, round((sysdate-hiredate)/365) hiredate FROM emp; 计算员工入职年数

  SELECT to_char (sysdate,'yyyy-mm-dd hh24:mi:ss') FROM dual; to_char()指定日期时间数据的格式

  SELECT to_char (sysdate,'yyyy"年"mm"月"dd"日"') FROM dual; 注释:补to_char(),加入非日期格式的内容用""引起来

  select ename,round(months_between(sysdate,hiredate)) hiredate from emp; months_between()表示间隔多少个月

  select add_months(sysdate,6) FROM dual; add_months()表示加上多少个月--------注意区分sysdate+6(加6天)

  SELECT next_day(sysdate,'星期一') FROM dual; next_day()表示下一个周几的哪一天,周日代表1,周一代表2...'星期一'是在中文环境里的表示方法,非中文要表示为'mon'

  Alter session set nls_language='AMERICAN'; 转换为英文环境

  Alter session set nls_language='SIMPLIFIED CHINESE'; 转换为中文环境

  select last_day('21-NOV-2012') from dual; last_day()表示本月最后一天是几号

  ********4、转换函数********

  select to_number('12')*12 from dual; to_number()字符串转换为数字

  select to_number('$12,345.67','$99,999.99') from dual; 补to_number(),表示仅仅取数字,不取美元符号(即带两个参数,同样的格式)

  select to_char(12345.67,'$000,000.00') from dual;to_char(数值,表示格式)数字转换为字符串,0的作用是显示数字,如果位数不够,用0补齐;若0改为9,则9的用法是显示数字并忽略前面的0;最常用的是小数点前为9,后为0

  insert into emp(empno,ename,hiredate)

  values ('2233','amy1',to_date(' 2012-10-01','yyyy-mm-dd')); to_date(日期,格式)字符串转换为日期---------注意,插入数据时,类型要对应

  ********5、通用函数*******

  select ename,sal,comm,nvl(comm,100) bonus from emp; nvl(列名,数据)空值处理函数,数据可以是数字、日期和字符串

  select ename,comm,sal,coalesce(comm,sal*0.5m,100) bonus from emp; coalesce()参数列表函数,作用是返回参数列表第一个非空参数;该语句含义是:如果comm不是null,则奖金额为comm,如果为null,则奖金额为sal*0.5,如果comm和sal都是null,则安慰奖100

  select ename,job,sal decode

  (job,'SALESMAN',1.1*sal,'ANALYST',1.05*sal,'MANAGER0',1.02*sal,sal) new_salary from emp; decode(判断条件,匹配1,值,匹配2,值,...,默认值,相当于C语言中的case语句)

  *******6、组函数*******

  如果函数中写列名,默认忽略空值

  select count(*) from emp; count(列名)统计记录总数

  select sum(sal),avg(sal) from emp; sum(列名)计算总和;avg(列名)计算平均数---------注意:这两个函数只针对数字类型

  select max(sal),min(sal) from emp; min(列名)求最小值;max(列名)求最大值-----------注意:这两个函数适用于任何类型

  ************GROUP BY及HAVING子句*******************

  select deptno,sum(sal) from emp group by deptno; 计算每个部门员工的工资和,一个一个部门来,

  select job,avg(sal) from emp;报错:不是单组分组函数。应该改为:select avg(sal) from emp group by job;即先分组,再求平均数

  注意:select后出现的列,凡是没有被组函数包围的列, 必须出现在group by短语中;出现在group by后面的列,不一定出现在select后面,但是信息不完整。

  结论:select后面的非组函数的列和group by后面列保持一致。*/

  select job,max(sal) Max_s,min(sal) Min_s,count(*) from emp group by job; 注释:区别where 是对表中数据的过滤;having是对分组得到的结果数据进一步过滤。select--from--where--group by--having--order by 正常执行顺序

  select deptno,avg(sal) from emp group by deptno having avg(sal)>2000; 查询哪些部门的平均薪水大于2000;对部门进行分组,求平均薪水,但只有平均薪水大于2000才显示出来----------注意:凡是对组函数过滤,使用having,非组函数用where

  select job,count(*) from emp where job is not null group by job having count(*)>2 order by count(*); 先找出job不为空的记录,接着对job进行分组,然后选取人数大于2的记录,最后按每组记录个数从小到大排序输出(asc省略了)

  select deptno,count(*) from emp group by deptno having count(*)>5 order by count(*);

  ****************非关联子查询*****************

  select ename from emp where sal>(select sal from emp where ename='FORD'); 先执行子查询,然后在作为一个结果参与主查询的执行*/

  select ename,sal from emp where sal=(select max(sal)from emp); 找出最大工资的值,然后与其它值进行比较,相等的输出------------注意:单行比较运算符都只能和一个值比较*/

  select ename,job from emp where deptno in (select deptno from emp where job='CLERK'); 如果子查询返回多行数据,必须使用多行比较运算符:in

  select deptno,ename,sal from emp where (deptno,sal) in (select deptno,max(sal) from emp group by deptno); 子查询执行后是多行,所以要使用in,查询结果2列,where显示要与之对应*/