操作符及SQL函数
SQL操作符:算术运算符、比较运算符、逻辑运算符、集合操作符、连接操作符
算术操作符
算术操作符用于执行数值计算
可以在SQL语句中使用算术表达式,算术表达式由数值数据类型的列名、数值常量和连接它们的算术操作符组成
算术操作符包括加(+)、减(-)、乘(*)、除(/)
例如:检索出课程号是‘02’的成绩+10分后的结果
select sid,cid,score+10 as lastscore where cid='02';
nvl函数 如果comm列是空,则按0计算,不然sal+comm的空值,结果就会为空
select empno,ename,sal+nvl(comm,0) as lastsal from emp;
比较操作符
比较操作符用于比较两个表达式的值
比较操作符包括 =、!=、<、>、<=、>=、BETWEEN…AND、IN、LIKE 和 IS NULL等
逻辑操作符
逻辑操作符用于组合多个比较运算的结果以生成一个或真或假的结果
逻辑操作符包括与(AND)、或(OR)和非(NOT),NOT通常和AND,OR联合使用。
集合操作符
集合操作符是将两个查询的结果组成一个结果
UNION 操作符返回两个查询的不重复的所有行。
INTERSECT 操作符只返回两个查询的公共行。
MINUS 操作符返回从第一个查询结果中排除第二个查询中出现的行。
连接操作符
连接操作符用于将多个字符串或数据值合并成一个字符串
通过使用连接操作符可以将表中的多个列合并成逻辑上的一行列
SELECT ('学号为' || SID|| '的同学姓名是' || SNAME) as SINFO FROM t_student;
操作符的优先级
SQL 操作符的优先级从高到低的顺序是:
算术操作符 --------最高优先级
连接操作符
比较操作符
NOT 逻辑操作符
AND 逻辑操作符
OR 逻辑操作符 --------最低优先级
SQL函数
SQL函数带有一个或多个参数并返回一个值
单行函数
单行函数对于从表中查询的每一行只返回一个值
可以出现在select子句中和where子句中
单行函数分为:字符函数、数字函数、日期函数、转换函数、其他函数
字符函数
字符函数接收字符输入并返回字符或数值
以及是一些其他的字符函数
CHR :根据ASCII码返回对应的字符
LPAD和RPAD :填充
TRIM :去除左右两边的空格符
LENGTH :字符串长度
DECODE :逐个值替换
例如:
SELECT LENGTH(‘student') FROM dual;
SELECT sname , DECODE(ssex,’m’,‘男’,‘f‘,’女’) as ssex FROM t_student;
数字函数
数字函数接收数字输入并返回数值结果
日期函数
日期函数对日期值进行运算,并生成日期数据类型或数值类型的结果
日期函数包括:ADD_MONTHS 、MONTHS_BETWEEN 、LAST_DAY 、ROUND 、TRUNC 、NEXT_DAY 、EXTRACT 计算年份差
转换函数
转换函数将值从一种数据类型转换为另一种数据类型
常用的转换函数有:
TO_CHAR :按照指定的格式转化字符串
TO_DATE :将字符串转化成日期
TO_NUMBER :将数字字符串转化成数字
例如:
Select TO_CHAR(0.123,‘$0.9999') FROM DUAL;
SELECT TO_CHAR(sysdate,'YYYY"年"fmMM"月"fmDD"日" HH24:MI:SS') FROM dual;
SELECT TO_DATE(‘2005-12-06’ , ‘yyyy-mm-dd’) FROM dual;
SELECT TO_NUMBER('100') FROM dual;
其他函数
以下是几个用来转换空值的函数(scottemp)
NVL、NVL2、NULLIF
例如:查询员工工资和(工资sal+奖金comm)
Select empno ,sal +comm from emp;
Select empno ,sal + nvl(comm,0) from emp;
SELECT empno,sal + nvl2(comm,comm,0) from emp;
SELECT NULLIF(100,200) FROM DUAL;
分组函数
分组函数基于一组行来返回结果
为每一组行返回一个值
分析函数
分析函数根据一组行来计算聚合值
用来计算完成聚集的累计排名、移动平均数等
分析函数为每组记录返回多个行
以下三个分析函数用于计算一个行在一组有序行中的排位,序号从1开始
ROW_NUMBER 返回连续的排位,不论值是否相等
select ename,job,deptno,sal,row_number() over(order by sal desc) as sal_rank from scott.emp;
RANK 具有相等值的行排位相同,序数随后跳跃
DENSE_RANK 具有相等值的行排位相同,序号是连续的
--计算年份差 select extract (year from sysdate)-extract(year from to_date('1995-08-26','yyyy-MM-DD')) age from dual; --add_months:指定某个时间段以后的日期 select add_months (sysdate,3) from dual;--指定三个月以后的日期 --months_between:相差的月数,其中小数是以1个月31天计算出来的 select months_between(sysdate,to_date('1995-08-26','yyyy-MM-DD'))from dual; --last_day:当月的最后一天 select last_day(sysdate) from dual; --round:四舍五入 select round(months_between(sysdate,to_date('1995-08-26','yyyy-MM-DD')))from dual; --trunc:只舍不入 select trunc(months_between(sysdate,to_date('1995-08-21','yyyy-MM-DD')))from dual; --转换函数 select to_char(0.123,'$0.999')from dual; select to_date('1995-01-07','yyyy-MM-DD')from dual; select to_number('1000')from dual; --分析函数 --ROW_NUMBER 返回连续的排位,不论值是否相等 select ename,job,deptno,sal,row_number() over(order by sal desc) as sal_rank from scott.emp; --前三名 select * from( select ename,job,deptno,sal,row_number() over(order by sal desc) as sal_rank from scott.emp )where sal_rank<=3; --RANK 具有相等值的行排位相同,序数随后跳跃 select ename,job,deptno,sal,rank() over(order by sal desc) as sal_rank from scott.emp; --DENSE_RANK 具有相等值的行排位相同,序号是连续的 select ename,job,deptno,sal,dense_rank() over(order by sal desc) as sal_rank from scott.emp; --其他函数 SELECT NULLIF(100,200) FROM DUAL;--两值相等则为空,不等则为第一个值