--数值函数 ROUND(n,[m])四舍五入,TRUNC(n,[m])截断函数,MOD()取余函数 函数用法,
select ROUND(25.328) from dual;
select ROUND(25.328,2) from dual;
select ROUND(25.328,-1) from dual;
select TRUNC(25.328) from dual;
select TRUNC(25.328,2) from dual;
select TRUNC(25.328,-1) from dual;
select ROUND(sal/30,2),TRUNC(sal/30,2) from emp;--求员工的日工资
select MOD(9,2) from dual;
select MOD(4,2) from dual;
select * from emp where MOD(empno,2)=0;--求员工号为偶数的员工信息
--日期函数SYSDATE当前日期,MONTHS_BETWEEN返回两个日期之间相差的月数,ADD_MONTHS,NEXT_DAY,LAST_DAY,ROUND(7月1日),TRUNC
select SYSDATE from dual;
select to_char(sysdate,'yyyy-MM-dd') from dual;
select months_between(sysdate,hiredate) from emp;
select round(months_between(sysdate,hiredate)/12) from emp;
select ename,add_months(hiredate,30*12) from emp;--员工入职三十年后的日期
select sysdate,next_day(sysdate,'星期二') from dual;--当前时间对应的下一个星期二的日期
select sysdate,last_day(sysdate) from dual;--当前时间对应的本月最后一天的日期
select empno,ename,hiredate from emp where hiredate = last_day(hiredate);
select *from emp where hiredate = last_day(hiredate);
select round(sysdate,'YEAR') from dual;
select trunc(sysdate,'YEAR') from dual;
SQL> select hiredate,round(hiredate,'YEAR'),round(hiredate,'MONTH') from emp where empno=7654;
HIREDATE ROUND(HIREDATE,'YEAR') ROUND(HIREDATE,'MONTH')
----------- ---------------------- -----------------------
1981-9-28 1982-1-1 1981-10-1
SQL> select hiredate,trunc(hiredate,'YEAR'),trunc(hiredate,'MONTH') from emp where empno=7654;
HIREDATE TRUNC(HIREDATE,'YEAR') TRUNC(HIREDATE,'MONTH')
----------- ---------------------- -----------------------
1981-9-28 1981-1-1 1981-9-1
--转换函数TO_DATE,TO_CHAR,TO_NUMBER,oracle中也有部分隐式转换类型,这些函数是显示转换
select * from emp where sal>2000;
select * from emp where sal>'2000';--结果相同
SQL> select to_char(hiredate,'YYYY"年"MM"月"DD"日"') from emp;
TO_CHAR(HIREDATE,'YYYY"年"MM"?
-----------------------------
1980年12月17日
1981年02月20日
1981年02月22日
1981年04月02日
1981年09月28日
1981年05月01日
1981年06月09日
1987年04月19日
1981年11月17日
1981年09月08日
1987年05月23日
1981年12月03日
1981年12月03日
1982年01月23日
14 rows selected
SQL> select to_char(hiredate,'DD-MON-RR','NLS_DATE_LANGUAGE=AMERICAN') from emp;
TO_CHAR(HIREDATE,'DD-MON-RR','
------------------------------
17-DEC-80
20-FEB-81
22-FEB-81
02-APR-81
28-SEP-81
01-MAY-81
09-JUN-81
19-APR-87
17-NOV-81
08-SEP-81
23-MAY-87
03-DEC-81
03-DEC-81
23-JAN-82
14 rows selected
select TO_CHAR(123456,'L0,000,000.00') from dual;--本地货币字符前缀,0补齐
select TO_CHAR(123456,'L9,999,999.99') from dual;--不补齐
select TO_CHAR(123456,'$9,999,999.99') from dual;--美元符号前缀
select TO_DATE(20181113,'YYYY_MM_DD') from dual;
select TO_DATE('20181113','YYYY_MM_DD') from dual;
select TO_NUMBER('$2000','$9999') from dual;
select TO_NUMBER('¥2000','L9999') from dual;
--通用函数NVL(expr1,expr2),NVL2(expr1,expr2,expr3),NULLIF(expr1,expr2),COALESCE(expr1,expr2[]),CASE,DECODE(......)
--case expr1 when X then y when x1 then y1 else y2 end
SQL> select ename,sal+NVL(comm,0) from emp;
ENAME SAL+NVL(COMM,0)
---------- ---------------
SMITH 800
ALLEN 1900
WARD 1750
JONES 2975
MARTIN 2650
BLAKE 2850
CLARK 2450
SCOTT 3000
KING 5000
TURNER 1500
ADAMS 1100
JAMES 950
FORD 3000
MILLER 1300
14 rows selected
SQL> select ename,NVL2(comm,sal+comm,sal) from emp;
ENAME NVL2(COMM,SAL+COMM,SAL)
---------- -----------------------
SMITH 800
ALLEN 1900
WARD 1750
JONES 2975
MARTIN 2650
BLAKE 2850
CLARK 2450
SCOTT 3000
KING 5000
TURNER 1500
ADAMS 1100
JAMES 950
FORD 3000
MILLER 1300
14 rows selected
SQL> select ename,hiredate,NULLIF(hiredate,trunc(hiredate,'MONTH')) from emp;
ENAME HIREDATE NULLIF(HIREDATE,TRUNC(HIREDATE
---------- ----------- ------------------------------
SMITH 1980-12-17 1980-12-17
ALLEN 1981-2-20 1981-2-20
WARD 1981-2-22 1981-2-22
JONES 1981-4-2 1981-4-2
MARTIN 1981-9-28 1981-9-28
BLAKE 1981-5-1
CLARK 1981-6-9 1981-6-9
SCOTT 1987-4-19 1987-4-19
KING 1981-11-17 1981-11-17
TURNER 1981-9-8 1981-9-8
ADAMS 1987-5-23 1987-5-23
JAMES 1981-12-3 1981-12-3
FORD 1981-12-3 1981-12-3
MILLER 1982-1-23 1982-1-23
14 rows selected
SQL> select ename,hiredate,sal,COALESCE(sal+comm,sal) from emp;
ENAME HIREDATE SAL COALESCE(SAL+COMM,SAL)
---------- ----------- --------- ----------------------
SMITH 1980-12-17 800.00 800
ALLEN 1981-2-20 1600.00 1900
WARD 1981-2-22 1250.00 1750
JONES 1981-4-2 2975.00 2975
MARTIN 1981-9-28 1250.00 2650
BLAKE 1981-5-1 2850.00 2850
CLARK 1981-6-9 2450.00 2450
SCOTT 1987-4-19 3000.00 3000
KING 1981-11-17 5000.00 5000
TURNER 1981-9-8 1500.00 1500
ADAMS 1987-5-23 1100.00 1100
JAMES 1981-12-3 950.00 950
FORD 1981-12-3 3000.00 3000
MILLER 1982-1-23 1300.00 1300
14 rows selected
NULLIF函数
NULLIF(Expression1,Expression2):给定两个参数Expression1和Expression2,如果两个参数相等,则返回NULL;否则就返回第一个参数。
等价于:Case WHEN Expression1=Expression2 Then NULL ELSE Expression1。
例如Select NULLIF(1,1)返回NULL,Select NULLIF(1,2)返回1。
有一个实际的应用,例如防止除0操作的放生,可以使用a/NULLIF(b,0),这样就不怕b是0了,当然除0操作也可以通过别的方式判断。
NULL
NULL是个神奇的东西,表示空值,未知值,任何数与它加减乘除都返回NULL。
ISNULL函数
ISNULL(Expression1,Expression2):给定两个参数Expression1和Expression2,如果Expression1是NULL,那么返回Expression2,否则返回Expression1。
等价于:Case WHEN Expression1 is NULL Then Expression2 ELSE Expression1。
例如Select ISNULL(NULL,1)返回1,Select ISNULL(1,2)返回1。
有一个实际的应用,可以对空值进行默认值替代,例如SELECT ISNULL(email,'没有填写email') from table1,所有email为null的,用'没有填写email'来替代。
COALESCE函数
COALESCE(Expression1,Expression2,Expression3,......):接受一系列的表达式或列,返回第一个非空的值。
例如SELECT COALESCE(NULL,NULL,4,NULL,NULL,5),那么返回,如果里面的参数都为NULL,那么会报错。
select iif(30>45,'对','错') as 结果
/*
结果
----
错
*/
select iif(null=null,'对','错') as 结果
/*
结果
----
错
*/
select iif(null is null,'对','错') as 结果
/*
结果
----
对
*/
WITH TIES
与top()和order by 一起用,可以返回多于top的行。防止丢失想要的信息。
例如:有个表table1
select top(3) * from table1 order by name desc:结果如下:(只有三条)
select top(3) with ties * from table1 order by name desc:结果如下:
小插件,SQL Prompt,配合Microsoft SQL Server Management Studio,使用起来非常方便,同时再加上以下几个快捷键:
(1)ctrl+5或F5,运行代码,如果想运行特定的语句,那么只是选中该语句,然后F5或ctrl+E即可。
(2)ctrl+L:显示执行计划。
(3)ctrl+R:显示隐藏下面的结果窗口,增大自己书写sql的空间。