九、Mysql数据库--单行函数(二)

在这里插入图片描述

一、字符函数

在这里插入图片描述

字符串相关基本函数
		 
		1. upper(n)(返回字符串的大写形式)
					SELECT * FROM student WHERE name=UPPER('smith') ;
					select upper(name) from student  ;

		2. Lower(n)(返回字符串的小写形式)
					SELECT lower('ABCDE') FROM student;
					SELECT LOWER(NAME) FROM student  ;



					  
		3. Length(n)(返回字符或者字符串的长度,长度包括空格)
					Select length(ename) from emp;

		
		4. Trim 
		 trim('    Mr Smith          ')  过滤首尾空格  trim() Mr Smith 
		 


Lpad 和 Rpad 填充函数

		1.Lpad (chr1,n,[chr2])  左填充
		描述:在chr1左边填充字符chr2,使得字符总长度为n。chr2可选,默认为空格;当chr1字符串长度大于n时,则从左边截取chr1的n个字符显示。
		
		 SELECT LPAD(NAME,15,'*') FROM student
		 										*****Smith  

		2.Rpad(chr1,n,chr2)右填充
		描述:在chr1右边填充chr2,使返回字符串长度为n..当chr1长度大于n时,返回左端n个字符。参考LPAD()函数。
	
		select rpad(name,15,'*') from student
												Smith***** 
												

例1:

		 SELECT LPAD(NAME,15,'*') FROM student

在这里插入图片描述
例2:

		select rpad(name,15,'*') from student

在这里插入图片描述

Concat 拼接字符串函数
		1. Concat(m,n)(连接m和n)
					SELECT CONCAT(NAME,"111",chinese) FROM student 
											将name列,‘111‘,chinese列拼接显示。
											
					SELECT CONCAT(NAME,chinese) FROM student
											将name列,chinese列拼接显示。

					SELECT CONCAT(NAME,age,chinese) FROM student
											将name列,age列,chinese列拼接显示。

Substr 截取字符串函数

		1.Substr(chr ,m[,n])
					描述:截取字符串
					 

					 SELECT SUBSTR('abcd',1) FROM student    
					 						截取’abcd’字符串,从1开始截取。abcd
					
					 SELECT SUBSTR('abcd',1,1) FROM student  
					 						截取’abcd’字符串,从1开始截取,截取1个字符。a
					
					 SELECT SUBSTR('abcd',1,2) FROM student   
					 						截取’abcd’字符串,从1开始截取,截取2个字符。ab
					
					 SELECT SUBSTR('abcd',1,3) FROM student    -
					 						截取’abcd’字符串,从1开始截取,截取3个字符。abc

Replace 替换字符串函数
	1. Replace(chr,search_string,[,replacement_string]) 替换字符串
			
					SELECT REPLACE(NAME,'ac','b') AS NAME FROM student
								将name列中的'ac'替换'b'
								
					SELECT REPLACE(NAME,'ac','') AS NAME FROM student
								将name列中的'ac'替换空字符串。

Instr 函数 (替换like函数)

		instr(field, str)  函数,
				第一个参数 field 是字段,
				第二个参数 str 是要查询的串,返回串 str 的位置,没找到就是0

		mysql 进行模糊查询时,可使用内部函数 instr,替代传统的 like 方式,并且速度更快。
		

		方式一:
				SELECT * FROM student WHERE  INSTR(NAME,'aa')
		方式二:
				SELECT * FROM student WHERE  INSTR(NAME,'aa')>0
										查看姓名中含有aa的人名。

在这里插入图片描述

		SELECT INSTR(NAME,'aa') FROM student 
				查看aa在姓名列中的索引值。

在这里插入图片描述

二、数值函数

在这里插入图片描述

		 
		1.MOD(n1,n2) 返回n1除n2的余数,如果n2=0则返回n1的值。
						 select mod(24,5) from dual;  
						 
		2.ROUND(n1[,n2]) 返回四舍五入小数点右边n2位后n1的值,n2缺省值为0,如果n2为负数就舍入到小数点左边相应的位上(虽然oracle documents上提到n2的值必须为整数,事实上执行时此处的判断并不严谨,即使n2为非整数,它也会自动将n2取整后做处理,但是我文档中其它提到必须为整的地方需要特别注意,如果不为整执行时会报错的)select round(412,-2) from dual;
		 				


例子:


		SELECT ABS(-12); -- 取绝对值
		SELECT BIN(-12); -- 十进制转二进制
		SELECT CEIL(10.34); -- 向上取整  11
		SELECT FLOOR(10.54);-- 向下取整  10
		SELECT FORMAT(10.5459,2); -- 四舍五入保留2位小数

三、日期函数

在这里插入图片描述

3.1 获取当前时间
		CURRENT_DATE ()  获取当前日期
							eg: SELECT CURRENT_DATE();  -- 2020-02-02

		CURRENT_TIME()   获取当前时间
							eg: SELECT CURRENT_TIME();  -- 21:07:05

		CURRENT_TIMESTAMP () 获取当前时间戳
							eg: SELECT CURRENT_TIMESTAMP ();  -- 2020-02-02 21:07:05

		NOW (  )  获取当前时间戳
							eg: SELECT NOW ();  -- 2020-02-02 21:07:05


		YEAR|Month|DAY|DATE (datetime )  年月日
							eg:
							SELECT YEAR(NOW());   --获取年份
							SELECT MONTH(NOW());  --获取月份
							SELECT DAY(NOW());	  --获取日份
							SELECT DATE(NOW());	  --获取日期

3.2 时间计算相关

1)在data2上加上一个时间

		
			ADDTIME (date2 ,time_interval )  将time_interval加到date2 。
											 
							eg:
								 SELECT  ADDTIME(b,'02:20:00') FROM student
								 在时间上推迟两个小时20分钟。


2)在data2上加上一个年份或者月、日、时、分、秒

			DATE_ADD (date2 , INTERVAL d_value   d_type ) 
				d_value :
							1,2,4...
				d_type:
						YEAR / MONTH / DAY  / HOUR / SECOND /MINUTE
					
						
							eg:
								SELECT b2 FROM student  
														--2020-02-02 00:00:00
														
								SELECT DATE_ADD(b2,INTERVAL 2 YEAR) FROM student 
														--2022-02-02 00:00:00
														--在原时间戳上增加2年
														
								SELECT DATE_ADD(b2,INTERVAL 2 MONTH) FROM student 
														--2020-04-02 00:00:00
														--在原时间戳上增加2月
											
								SELECT DATE_ADD(b2,INTERVAL 2 DAY) FROM student 
														--2020-02-04 00:00:00
														--在原时间戳上增加2日
								SELECT DATE_ADD(b2,INTERVAL 2 HOUR) FROM student 
														--2020-02-02 02:00:00
														--在原时间戳上增加2小时
				

3)在data2上减去一个年份或者月、日、时、分、秒

		DATE_SUB (date2 , INTERVAL d_value d_type ) 在date2上减去一个时间
					
						eg:
							SELECT b2 FROM student  
													--2020-04-04 00:00:00
													
							SELECT DATE_SUB (b2,INTERVAL 2 YEAR) FROM student 
													--2018-04-04 00:00:00
													--在原时间戳上减少2年
													
							SELECT DATE_SUB (b2,INTERVAL 2 MONTH) FROM student 
													--2020-02-04 00:00:00
													--在原时间戳上减少2月
										
							SELECT DATE_SUB (b2,INTERVAL 2 DAY) FROM student 
													--2020-04-02 00:00:00
													--在原时间戳上减少2日

4)计算两个日期的天数差,得到天数。

			
		DATEDIFF (date1 ,date2 )   两个日期差
					
					eg:
							select datediff(b,b2) from student   -- b-b2   24天


5)获取本月的最后一天

		Last_day(b)本月最后一天
				 eg:
						SELECT LAST_DAY(b) FROM student  --2020-02-29 
		

例子:

		SELECT  ADDTIME(b,'02:20:00') FROM student
			在时间上推迟两个小时20分钟。

在这里插入图片描述

四、通用函数

CASE 表达式
		1.当colume 与condition 条件相等时结果为result
				
				case colume 
				    when condition then result
				    when condition then result
				    when condition then result
				else result
				end
		
		2.当满足某一条件时,执行某一result
				
				case  
				    when condition then result
				    when condition then result
				    when condition then result
				else result
				end

例1:

			
	当语文成绩为0时,显示不及格;当语文成绩为1时,显示优秀。
		
							SELECT NAME,
							CASE chinese
								WHEN 1 THEN '优秀'
								WHEN 0 THEN '不及格'
								ELSE '零蛋'
							END  AS  语文,
							chinese
							
							FROM student 

在这里插入图片描述
例2:

		当英语成绩为0时,显示零蛋;
		当50>英语成绩>=20,显示不及格。
		当50<=英语成绩,显示优秀。


				SELECT NAME,
				CASE 
					WHEN english>=20 AND english < 50 THEN '不及格'
					WHEN english>=50 THEN '优秀'
					ELSE '零蛋'
				END  AS  英语,
				english
				
				FROM student 


在这里插入图片描述

coalesce() 函数
		coalesce(column ,str ) 判断字段是否为null,如果null,显示str。		

例子:

		SELECT  COALESCE(b,'test')  FROM student

在这里插入图片描述

单行函数嵌套
		 
			 select empno, lpad(initcap(trim(ename)),10,' ')    name, job, sal from emp;
		 

五、不支持mysql,只支持oracle

		1. Initcap (n)(首字母大写) 
					Select initcap(name) from student;
					注意:mysql不支持。oracle支持。					
		+++ 转换函数 [不支持mysql,只支持oracle]
		
				1.To_char 
						select to_char(sysdate,'yyyy') from dual;
						select to_char(sysdate,'fmyyyy-mm-dd') fr om dual;
						select to_char(sal,'L999,999,999') from emp; 
						select to_char(sysdate,’D’) from dual;//返回星期 
						
				2.To_number
						select to_number('13')+to_number('14') from dual; 
						
				3.To_date
						Select to_date(„20090210‟,‟yyyyMMdd‟) from dual; 
		 

		+++ 日期函数
		
				1.Months_between(m,n) [不支持mysql,只支持oracle]
				日期m和n相差的月数  
				select months_between(sysdate,hiredate) from emp;
				
				2. Add_months(m,n) [不支持mysql,只支持oracle]
				当前日期m后推n个月 ,用于从一个日期值增加或减少一些月份 
				select add_months(sysdate,1) from dual; 
				
				3.Next_day(d, day_of_week) [不支持mysql,只支持oracle]
				返回由"day_of_week"命名的,在变量"d"指定的日期之后的第一个工作日的日期。参数"day_of_week"必须为该星期中的某一天。
				select  next_day(sysdate,'星期一') from dual;
		
		3.TRUNC(n1[,n2] [不支持mysql,只支持oracle]
		详细:返回截尾到n2位小数的n1的值,n2缺省设置为0,当n2为缺省设置时会将n1截尾为整数,如果n2为负值,就截尾在小数点左边相应的位上
						select trunc (412.13,-2) from dual;
		 
		1.NVL(expr1,expr2)   [不支持mysql,只支持oracle]
		如果第一个参数为空那么显示第二个参数的值,如果第一个参数的值不为空,则显示第一个参数本来的值。 
		select nvl(comm,0) from emp;
		
		2.NULLIF()  
		 如果表达式exp1 与exp2 的值相等则返回null ,否则  返回exp1 的值  
		
		3.NVL2(expr1,expr2, expr3)   [不支持mysql,只支持oracle]
		如果该函数的第一个参数为空那么显示第三个参数的值,如果第一个参数的值不为空,则显示第二个参数的值。
		 select empno, ename, sal, comm, nvl2(comm, sal+comm, sal) total from emp; 
		
		4.NVL2(expr1,expr2, expr3)  [不支持mysql,只支持oracle]
		如果该函数的第一个参数为空那么显示第三个参数的值,如果第一个参数的值不为空,则显示第二个
		 select empno, ename, sal, comm, coalesce(sal+comm, sal, 0)总收入  from emp;

		
		+++ DECODE() 函数 

		在ORACLE数据库里decode函数实现的功能,于MySQL数据库里可以使用case when函数来替代;
		MySQL数据库的decode函数是解密函数,它是加密函数encode的反函数,与ORACLE数据库里
		decode函数实现的功能完全不同。
		
		decode()函数在mysql中是解密函数,它是加密函数encode的反函数。
		
		decode()函数在oracle中的功能相当于MySQL数据库里的case when函数。
				  和case 表达式类似,decode() 函数也用于实现多路分支结构  



  
		select empno, ename, sal, 
		 decode(deptno, 10, '财务部',  20 , '研发部',  30, '销售部',  '未知部门')       部门  from emp;

六、练习

		 
		练习
		 
		1.找出每个月倒数第三天受雇的员工(如:2009-5-29 )  
		Select * from emp where last_day(h redate)-2=hiredate; 
		 
		
		select t.ename,t.hiredate from  emp t where t.hiredate=last_day(t.hiredate)-2;
		2.找出25 年前雇的员工 
		Select * from emp where hiredate<=add_months(sysdate,-25*12);
		 
		select t.ename,t.hiredate from emp t where t.hiredate<add_months(sysdate,12*25)
		
		3.所有员工名字前加上Dear ,并且名字首字母大写 
		 select 'Dear ' || initcap(ename) from emp;  
		 select lpad(t.ename,12,'Dear ') from emp  t
		4.找出姓名为5 个字母的员工
		  select * from emp where length(ename)=5;
		 select t.ename from emp  t  where length(t.ename)=5
		
		5.找出姓名中不带R 这个字母的员工
		  select * from emp where ename not like '%R%';
		 
		6.显示所有员工的姓名的第一个字 
		 select substr(ename,0,1) from emp;
		 
		
		select substr(t.ename,1,1) from  emp t
发布了94 篇原创文章 · 获赞 0 · 访问量 645

猜你喜欢

转载自blog.csdn.net/weixin_45602227/article/details/104145763