SQL函数即数据库的内置函数,可以运用在SQL语句中实现特定的功能。SQL单行函数对于每一行数据进行计算后得到一行输出结果。SQL单行函数根据数据类型分为字符函数、数字函数、日期函数、转换函数,另外还有一些别的函数。例如NVL函数

字符函数

--lower():将字符串大写变成小写;  upper():将字符串小写变成大写 ;initcap():字符串的首字母大写
SELECT UPPER('hello') FROM DUAL;
1.查询姓名为king的雇员信息
SELECT * FROM EMP WHERE ENAME=UPPER('King');SELECT  INITCAP('hello world') FROM DUAL;
2.要求以首字母大写的形式显示所有雇员的姓名
SELECT INITCAP(ENAME) 雇员姓名 FROM EMP;--concat(str1,str2)字符串拼接
SELECT CONCAT('hello','world') FROM DUAL;
3.连接雇员的姓名和工作
SELECT CONCAT(ENAME,JOB) FROM EMP;
SELECT ENAME ||JOB FROM EMP;--substr(str,start_position,[length])字符串截取,索引可以从0开始也可以从1开始.
取得字符串中指定起始位置和长度的字符串。
SELECT SUBSTR('hello world',0,3) FROM DUAL;--length(str) 字符串长度
SELECT LENGTH('HELLO WORLD') FROM DUAL;
查询雇员姓名正好是5个字符长度的雇员的姓名和姓名长度
SELECT ENAME,LENGTH(ENAME) FROM EMP WHERE LENGTH(ENAME)=5;--replace(str1,str2,str3)字符串替换,用str3替换str1中的str2
SELECT REPLACE ('hello world','l','xx') FROM DUAL;--instr(str1,str2)查询字符串str2在字符串str1中出现的位置
SELECT INSTR('hello world','wo')  FROM DUAL;--rpad(str1,int,str2)在str1的右边追加str2,追加后返回的长度为int
SELECT RPAD ('hello',10,'x') FROM DUAL;--lpad(str1,int,str2)在str1的前边追加str2,追加后返回的长度为int
SELECT LPAD('hello',10,'x') FROM DUAL;

数值函数

--round(number,int) 四舍五入,int为指定的位数,按此位数进行四舍五入。
--如果 int大于 0,则四舍五入到指定的小数位,如果 int等于 0,则四舍
--五入到最接近的整数,如果int小于 0,则在小数点左侧进行四舍五入。
SELECT ROUND(250.73) FROM DUAL;
SELECT ROUND(250.738,2) FROM DUAL;--trunc(number,int)截断,不进行四舍五入
SELECT TRUNC(250.73)  FROM DUAL;
SELECT TRUNC(250.738,2)  FROM DUAL;--mod(number,number) 求模,取余
SELECT MOD(11,3) FROM DUAL;

日期函数

--规则:日期-日期=天数  日期+数字=日期--当前日期:
SELECT SYSDATE FROM DUAL;例:查询部门30的雇员进入公司的星期数
SELECT ENAME 雇员姓名, ROUND((SYSDATE-HIREDATE)/7) 进入公司的星期数
FROM EMP
WHERE DEPTNO=30;--Oracle中提供的日期函数:
--months_between(x,y),两个日期相差的月份数。如果x在日历中比y早,那么months_between()就返回一个负数。
例:查询部门10的雇员进入公司的月数
SELECT ENAME 雇员姓名,TRUNC(MONTHS_BETWEEN(SYSDATE,HIREDATE)) 进入公司的月数
FROM EMP WHERE DEPTNO=10;--add_months(d,n)在指定的日期上加上若干月份
SELECT ADD_MONTHS(SYSDATE,15) FROM DUAL;--next_day(date,weekday)求出指定日期date的下一个星期是几号
SELECT NEXT_DAY('2008-8-8','星期三')FROM DUAL;--last_day()求出指定日期的最后一天
SELECT LAST_DAY('2000-2-4') FROM DUAL;

转换函数

--to_char() 转换为字符串
例:查询雇员编号、姓名、雇佣日期,按月-日-年的形式显示
SELECT EMPNO,ENAME,TO_CHAR(HIREDATE,'MM-DD-YYYY') FROM EMP;例:查询雇员的姓名、雇佣日期、受佣当天周期几
SELECT ENAME,HIREDATE,TO_CHAR(HIREDATE,'DAY') FROM EMP;例:查询雇员编号、姓名、工资,L表示本地货币语言
SELECT EMPNO,ENAME,TO_CHAR(SAL,'L99,999,999') FROM EMP;--to_number()转换为数字
SELECT ENAME,SAL+TO_NUMBER('100') FROM EMP;--to_date(字符串,'format'):把字符串转换成日期
SELECT TO_DATE ('8-28-2014','mm-dd-yyyy') FROM DUAL;--注:第二个参数format不是指转换后的日期格式,而是前面字符串所对应的日期格式。

通用函数

--nvl(arg1,arg2) 如果arg1的值为null,则返回arg2的值
SELECT ENAME 姓名,(SAL+NVL(COMM,0))*12 年薪  FROM EMP;--nvl2(arg1,arg2,arg3):如果arg1参数不是null的值,返回的是arg2,否则返回的是arg3
查询雇员的奖金,如果为NULL,返回0,否则返回奖金金额。
SELECT ENAME,NVL2(COMM,COMM,0) FROM EMP;--decode()函数,类似于if..else
语法:
--decode(column/expression,结果1,返回值1,结果2,返回值2,.....,{值});例:查询雇员的编号、姓名、雇佣日期及职位,将职位替换成中文
SELECT EMPNO,ENAME,HIREDATE,
DECODE(JOB,'CLERK','职员','SALESMAN','销售员','MANAGER','经理','ANALYST','分析员','总裁') 职位
FROM EMP;--******case()函数,类似于switch语句
语法:
case column/expression
when 结果1 then....
when 结果2 then
...
..
when 结果n  then
...
{else结果}
end
例子:
select empno,ename,hiredate,
case job when 'CLERK' then '职员'when 'SALESMAN' then '销售员'when 'MANAGER' then '经理'when 'ANALYST' then '分析员'else '总裁'
end 职位
from emp;

小试牛刀

单行函数练习

1、将字符串 'abc' 以10位长度输出,不足10位用#补足(分别从左边和右边补足)
SELECT RPAD ('abc',10,'#') FROM DUAL;
SELECT LPAD ('abc',10,'#')FROM DUAL;2、将字符串'abc 234 abc abc def abc' 中'abc'  替换为 '###' 输出
SELECT REPLACE ('abc 234 abc abc def abc','abc','###') FROM DUAL;3、将字符串'    abc  ewr  3245   4     '去除两头空格输出
SELECT TRIM ('    abc  ewr  3245   4     ') FROM DUAL;4、将数字7433453.52638263 四舍五入后输出
SELECT ROUND (7433453.52638263) FROM DUAL;5、将数字743583.345234 中十位数之后数字全部忽略输出
SELECT TRUNC (743583.345234,-1) FROM DUAL;6、查询emp表,将所有员工工资上涨 11.173% 后,四舍五入到十位输出
SELECT EMP.*,ROUND(SAL*1.11173,-1) FROM EMP;7、将当前系统时间格式化为'YEAR MONTH DY DAY YYYY-MM-DD HH24:MI:SS'输出
SELECT TO_CHAR (sysdate,'YEAR MONTH DY DAY YYYY-MM-DD HH24:MI:SS') FROM DUAL;8、查询emp表,将入职时间格式化为'YYYY-MM-DD HH24:MI:SS' 显示
SELECT EMP.*, TO_CHAR (HIREDATE,'yyyy-mm-dd hh24:mi:ss') FROM EMP;9、将当前时间加一年后格式化输出显示
SELECT TO_CHAR (ADD_MONTHS(SYSDATE,12),'yyyy-mm-dd') FROM DUAL;10、查询emp表,输出当前年份与员工入职年份的差
SELECT TO_NUMBER(TO_CHAR(SYSDATE,'YYYY'))-TO_NUMBER(TO_CHAR(HIREDATE,'YYYY')) FROM EMP;11、查询employees表中入职时间满10年的员工
SELECT EMP.* FROM EMP WHERE ROUND(MONTHS_BETWEEN(SYSDATE,HIREDATE))>= '120';12、查询employees表中2000年后入职的员工
SELECT * FROM EMP WHERE TO_NUMBER(TO_CHAR(HIREDATE,'YYYY'))>=1981;13、查询employees表中所有98年3月入职的员工
SELECT * FROM EMP WHERE HIREDATE BETWEEN '1-2月-81' AND '28-2月-81' ;14、查询employees表中所有在3月入职的人
SELECT * FROM employees WHERE TO_NUMBER(TO_CHAR(hire_date,'MM')) =03;15、查询当前时间距离 '1998-8-2'  的月数
SELECT ROUND(MONTHS_BETWEEN(SYSDATE,TO_DATE('1998-8-2','yyyy-mm-dd')))FROM DUAL;16、将当前时间减12个月然后输出
SELECT ADD_MONTHS(SYSDATE,-12) FROM DUAL;17、查询下一个星期一 显示输出
SELECT NEXT_DAY(SYSDATE,'星期一') FROM DUAL;18、查询一个月的最后一天  显示输出
SELECT LAST_DAY(SYSDATE) FROM DUAL;19、查询employees表中入职时间在下半个月的员工
SELECT * FROM EMPLOYEES WHERE TO_NUMBER(TO_CHAR(HIRE_DATE,'DD'))>15;20、查询employees表中上半年入职的员工
SELECT * FROM EMPLOYEES WHERE TO_NUMBER(TO_CHAR(HIRE_DATE,'MM'))<=6;21、将数字825398374.3762 格式化成字符串后输出
SELECT TO_CHAR(825398374.3762,'9,999,999,999.9999') FROM DUAL;22、字符串变数字 'RMB825,398,374.38'
SELECT TO_NUMBER(REPLACE(SUBSTR('RMB825,398,374.38',4,14),',','')) FROM DUAL;23、查询employees表将员工薪水以 '$999,999,999.00' 格式显示
SELECT EMPLOYEES.*,TO_CHAR(SALARY,'$999,999,999.00') FROM EMPLOYEES;24、查询员工奖金,奖金为NULL的显示为0
SELECT EMP.* , NVL(COMM,0) FROM EMP;25、查询employees表中frist_name,last_name 长度相同的员工记录
SELECT * FROM EMPLOYEES WHERE LENGTH (FIRST_NAME) = LENGTH(LAST_NAME);26、查询employees表中first_name,last_name 首字母相同的员工记录
SELECT * FROM EMPLOYEES WHERE SUBSTR(FIRST_NAME,1,1) = SUBSTR(LAST_NAME,1,1);27、employees表中如果员工职位是'IT_PROG'加薪 10 % ,如果员工职位是'ST_CLEAK '加薪 15 % ,如果是'SA_REP' 加薪 20 %
SELECT EMPLOYEES.*,CASE JOB_ID WHEN 'ST_CLERK' THEN SALARY*1.15 WHEN  'SA_REP' THEN SALARY*1.2ELSE SALARY END AS New_salary FROM EMPLOYEES;28. 编写一个显示当期日期的查询,列标题为Date。
SELECT TO_CHAR(SYSDATE,'YYYY')||TO_CHAR(SYSDATE,'MM')||TO_CHAR(SYSDATE,'DD') AS "DATE" FROM DUAL;29. 显示雇员姓名、受雇日期及工资复审日期(复审日期为受雇后6个月后的第一个星期一),复审日期以列标题REVIEW显示。
SELECT ENAME,HIREDATE,NEXT_DAY(LAST_DAY(ADD_MONTHS(HIREDATE,5)),'星期一') "REVIEW" FROM EMP;30. 显示每个雇员的姓名并计算出从受雇日期起到目前一共工作了多少个月,以列标题MONTHS_WORKED显示月数(四舍五入),输出以月数升序排列。
select ename,round(months_between(sysdate,hiredate)) as "MONTHS_WORKED" from emp order by 2;31. 编写一个以下面的形式输出的查询:
<employee name> earns <salary> monthly but wants <3 times salary>.
列标题为Dream Salaries。
select ename||' earns '||sal||' monthly but wants '||sal*3 from emp;32. 创建一个查询显示每个雇员的姓名及工资(列标题为SALARY),工资的显示模式为:占15个字符的宽度,对于不够位数的以$填充。
select ename , rpad(sal,15,'$') "SALARY" from emp;
33. 编写一个查询显示名字以J、A、M开头的雇员的姓名及姓名所占的字符数,姓名的显示格式为第一个字母大写其他字母小写,为每个列设置合适的列标题。
select initcap(ename),length(ename) from emp where ename like 'J%' or ename like 'A%' or ename like 'M%';
34. 显示雇员的姓名、受雇日期及受雇当天是星期几(列标题为DAY),并以DAY升序排列。
select ename, hiredate, to_char(hiredate,'day') from emp order by 3;35. 创建一个查询显示雇员姓名及其奖金(列标题为COMM),如果该雇员不能获得奖金则以“No Commission.”显示。
select ename,  nvl2(comm,to_char(comm),'No Commission')  from emp ;
select * from emp;36.按照雇员的月薪计算相应的税率
月薪<1000,税率0
1000<=月薪<2000,税率为0.01
2000<=月薪<3000,税率为0.02
3000<=月薪<4000,税率为0.03
月薪>=4000,税率为0.05
显示雇员姓名及税率select ename,decode(sal,sal < 1000,sal*0.01,sal > = 1000
and sal <2000,sal*0.01,sal >=2000
and sal < 3000,sal * 0.02,sal >=3000
and sal < 4000,sal*0.03 ,sal >= 4000 ,sal*0.05) "税率"
from emp;37.查询显示雇员的姓名和姓名中是否含有字母A的信息,满足如下条件
姓名首字母大写,其他小写
如果字符A在姓名的首位,则显示'字符A在首位'
如果字符A在姓名的末位,则显示'字符A在末位'
如果字符A在姓名中不存在,则显示'没有字符A'
其他情况显示'字符A在中间'
select ename, case instr(ename,'A') when 1 then '字符A在首位'when length(ename) then '字符A在末尾'when 0 then '没有字符A'else '字符A在中间'end 名称类别from emp;38.如果雇员工作的前5位字符为SALES,则显示雇员姓名、姓名的长度、姓名中A的位置
select ename,length(ename),instr(ename,'A') from emp where substr(job,1,5)='SALES';select ename,round(sal*1.2) from emp;

经典SQL学习笔记 (二)-单行函数相关推荐

  1. 数据库基础篇学习笔记_单行函数

    单行函数 文章目录 单行函数 1. MySQL内置函数 1.1 单行函数 2. 数值函数 2.1 基本函数 2.2 角度与弧度互换函数 2.3 三角函数 2.4 指数与对数函数 2.5 进制间的转换 ...

  2. SQLServer sql学习笔记(开窗函数,连接,四舍五入,分页,聚合函数等)

    一.四舍五入 1. Round(@num,2)   保留两位有效数字,四舍五入但不去掉零 2.Convert(decimal(18,2),@num) 3.cast(@num as decimal(18 ...

  3. Scala2.11.7学习笔记(二)函数定义

    鲁春利的工作笔记,好记性不让烂笔头 函数定义 def 函数名(参数列表) : 返回类型 = {函数体} 说明: 返回类型默认为空(Unit,类似于Java的void): 函数体中默认最后一行为该函数的 ...

  4. Mr.J-- jQuery学习笔记(二)--核心函数jQuery对象

    核心函数 函数列表 函数说明:jQuery()    主要用于获取HTML DOM元素并将其封装为jQuery对象 jQuery(): jQuery()函数是jQuery库的最核心函数,jQuery的 ...

  5. PL/SQL学习笔记(二)

    定义并使用变量 PL/SQL有四种类型:标量类型,复合类型,引用类型(reference),LOB(Large Obejct)类型 一.标量类型 最常用的就是标量类型,是指只能存放单个数值的变量,包括 ...

  6. 经典SQL学习笔记 (四)-子查询

    子查询 当一个查询是另一个查询的条件时,称之为子查询.子查询可以使用几个简单命令构造功能强大的复合命令.子查询最常用于SELECT-SQL命令的WHERE子句中.子查询是一个 SELECT 语句,它嵌 ...

  7. C#学习笔记二(函数高级参数)

    1.Out参数 作用:使用Out参数主要是用于返回多个变量 示例: 1 int[] b = { 1, 2, 3, 4, 5 }; //有一个数组 2 int max; //用来接收返回的最大值 3 i ...

  8. Go 语言学习笔记(二):函数

    目录 函数 函数定义 函数签名和匿名函数 defer 闭包 概念 panic 和 recover 函数 函数是程序执行的一个基本语法结构,Go 语言的很多特性是基于函数这个基础实现的,比如命名类型的方 ...

  9. My SQL 学习笔记二

    本文主要记录这两天遇到的问题: 1.sql脚本文件存在自己的目录下,例如在F盘,通过命令:mysql> source F:/filename.sql 会弹出Failed  to open fil ...

  10. 经典SQL学习笔记 (九)-比赛信息数据库练习

    比赛信息数据库 题目背景:有某个学生运动会比赛信息的数据库,保存了如下的表:运动员sporter表:(运动员编号sporterid,运动员姓名name,运动员性别sex,所属系department)项 ...

最新文章

  1. python 字符串前加u r b的意义
  2. 微众WeCross 跨链平台(13)开发示例
  3. 三维列表转换成数组时,维度却只有二维
  4. mysql报错:Deadlock found when trying to get lock;
  5. Android基础——项目的文件结构(三)
  6. ubuntu16.04安装gcc g++7.5.0及各个版本的切换
  7. python字典如何删除数据库,如何从python字典中删除?
  8. T-SQL select语句连接两个表
  9. python装饰器带参数函数_python带参数装饰器的两种写法
  10. thinkphp-更新数据update函数
  11. Verilog 层次化文件设计——彩灯控制器
  12. CSS盒子模型box-sizing属性详解
  13. 如何使生成的exe程序默认以管理员权限启动
  14. 怎样在Mac上为 Apple ID 设置双重认证?
  15. windows下的虚拟化
  16. SAP中会计凭证清账关系
  17. python123子字符串输出_【无为则无心Python基础】— 13.字符串的格式化输出(一)...
  18. Django实现邮箱注册系统
  19. 这也太香了吧!阿里甩出2021最新秒杀系统设计实录!全新演绎!
  20. 架构师必看-架构之美第14章-两个系统的故事:混乱大都市(一)

热门文章

  1. 实验吧编程WP(一)
  2. Odoo-----在Form视图中添加Chatter
  3. 西门子实数转整数_实数如何转换为整数
  4. java 调用felix_寻找在动态加载Jar文件中使用Apache Felix并在Java中在运行时实例化类的基本示例...
  5. 游戏程序员的学习之路
  6. php加速模块cpan模块,查看perl模块和cpan模块介绍
  7. xp系统和win7系统哪个好
  8. Python分析《武林外传》 -----转载
  9. 尝一尝HBuilderX香不香
  10. java正则表达式 后顾_正则表达式 - CrazyManDF的个人空间 - OSCHINA - 中文开源技术交流社区...