单函数

单行函数与聚合函数:

   什么是函数:

  • 函数在计算机语言的使用中贯穿始终,函数的作用是什么呢?它可以把我们经常使用的代码封装起来,

          需要的时候直接调用即可。这样既 提高了代码效率 ,又 提高了可维护性 。在 SQL 中我们也可以使用

          函数对检索出来的数据进行函数操作。使用这些函数,可以极大地 提高用户对数据库的管理效率 。

  • 从函数定义的角度出发,我们可以将函数分成 内置函数 和 自定义函数 。在 SQL 语言中,同样也包括了

           内置函数和自定义函数。内置函数是系统内置的通用函数,而自定义函数是我们根据自己的需要编写

           的,( SQL 的内置函数)。

       内置函数再分为两类: 单行函数 、 聚合函数(或分组函数) 。

 

 

   单行函数:

                 操作数据对象             接受参数返回一个结果

                只对一行进行变换        每行返回一个结果

                可以嵌套                参数可以是一列或一个值

  • 基本函数:

 

   指数与对数:

进制间的转换:

  • 字符串类型:

  • 日期时间类型和函数:

 

#日期和时间函数

#获取日期,时间
SELECT CURDATE(),CURRENT_DATE(),CURTIME(),NOW(),SYSDATE(),UTC_DATE(),UTC_TIME()
FROM DUAL;

#日期与时间

#日期与时间戳的转换
SELECT UNIX_TIMESTAMP(), UNIX_TIMESTAMP('2022-10-01 10:11:40'),
FROM_UNIXTIME(1660270026),FROM_UNIXTIME(1664590300)
FROM DUAL;

#获取月份、星期、星期数、天数等函数
SELECT YEAR(CURDATE()),MONTH(CURDATE()),DAY(CURDATE()), HOUR(CURTIME()),MINUTE(NOW()),SECOND(SYSDATE())
FROM DUAL;

SELECT MONTHNAME('2021-10-26'),DAYNAME('2021-10-26'),WEEKDAY('2021-10-26'), QUARTER(CURDATE()),WEEK(CURDATE()),DAYOFYEAR(NOW(DAYOFMONTH(NOW()),DAYOFWEEK(NOW()) FROM DUAL;

#日期的操作函数
SELECT EXTRACT(SECOND FROM NOW()),EXTRACT(DAY FROM NOW()),EXTRACT(HOUR_MINUTE FROM NOW())
FROM DUAL;

#时间和秒数转换的函数
SELECT TIME_TO_SEC(CURTIME()),
SEC_TO_TIME(37449)
FROM DUAL;

#计算日期和时间的函数
SELECT NOW(), DATE_ADD(NOW(),INTERVAL 1 YEAR),
DATE_ADD(NOW(),INTERVAL -1 YEAR),DATE_SUB(NOW(),INTERVAL 1 YEAR)#结果一样
FROM DUAL;

SELECT DATE_ADD(NOW(), INTERVAL 1 DAY) AS col1,DATE_ADD('2021-10-21 23:32:12',INTERVAL 1 SECOND) AS col2,
ADDDATE('2021-10-21 23:32:12',INTERVAL 1 SECOND) AS col3, DATE_ADD('2021-10-21 23:32:12',
INTERVAL '1_1' MINUTE_SECOND) AS col4, DATE_ADD(NOW(), INTERVAL -1 YEAR) AS col5, #可以是负数
DATE_ADD(NOW(), INTERVAL '1_1' YEAR_MONTH) AS col6 #需要单引号
FROM DUAL;

#日期的格式化与解析
#格式化:日期---->字符串
#解析:字符串---->日期
#此时我们谈的是日期和显示格式化和解析
#之前,接触过隐式的格式化或解析
SELECT *
FROM employees
WHERE hire_date='1993-01-13';

#格式化:
SELECT DATE_FORMAT(CURDATE(),'%Y-%M-%D'),
DATE_FORMAT(NOW(),'%y-%m-%d'),TIME_FORMAT(CURTIME(),'%H:%i:%S'),
DATE_FORMAT(NOW(),'%y-%m-%d %H:%i:%S %w %w %T %r')
FROM dual;

#解析:格式化的逆过程
SELECT STR_TO_DATE('22-08-12 10:56:50 5 5 10:56:50 10:56:50 AM','%y-%m-%d %H:%i:%S %w %w %T %r')
FROM DUAL;


SELECT DATE_FORMAT(CURDATE(), GET_FORMAT( DATE, 'USA'))
FROM DUAL;


  • 流程控制函数:

                流程处理函数可以根据不同的条件,执行不同的处理流程,可以在SQL语句中实现不同的条件选择。

               MySQL中的流程处理函数主要包括IF()、IFNULL()和CASE()函数。#流程控制函数

#IF(VALUE,VALUE1,VALUE2)
SELECT last_name,salary,IF(salary>=6000,'高工资','低工资') "details"
FROM employees;

SELECT last_name,commission_pct,IF(commission_pct IS NULL,commission_pct,0) "details",
salary*12*(1+IF(commission_pct IS NOT NULL,commission_pct,0)) "annual_sal"#不带利息的数据也能求出求年薪
FROM employees;

#IF(VALUE1,VALUE2) 看做是IF(VALUE,VALUE1,VALUE2)
SELECT last_name,commission_pct,IFNULL(commission_pct,0) "details"
FROM employees;

# CASE WHEN ... THEN ... WHEN ... THEN ... ELSE ... END
#类似java中的if...else if...else
SELECT last_name,salary,CASE WHEN salary>=15000 THEN '高薪'
WHEN salary>=10000 THEN '潜力股'
WHEN salary>=8000 THEN '小屌丝'
ELSE   '草根' END "details"
FROM employees;

#CASE ... WHEN ... THEN ... WHEN ... THEN ... ELSE ... END
#类似于java的Switch ... case
/*
练习1:查询部门号为 10,20, 30 的员工信息, 若部门号为 10, 则打印其工资的 1.1 倍,
20 号部门, 则打印其工资的 1.2 倍, 30 号部门,打印其工资的 1.3 倍数,其它部门打印工资的1.4倍数
*/
SELECT employee_id,last_name,department_id,salary,CASE department_id WHEN 10 THEN salary
                                                                    WHEN 20 THEN salary     WHEN 30 THEN sala ELSE salary * 1.4 END "details"
FROM employees;


/*
练习:查询部门号为 10,20, 30 的员工信息, 若部门号为 10, 则打印其工资的 1.1 倍,
20 号部门, 则打印其工资的 1.2 倍, 30 号部门打印其工资的 1.3 倍数。

*/
SELECT employee_id,last_name,department_id,salary,CASE department_id WHEN 10 THEN salary
                                                                    WHEN 20 THEN salary                  WHEN 30 THEN salary * 1.3
            ELSE salary * 1.4 END "details"
FROM employees
WHERE department_id IN(10,20,30)
 

 


#加密与解密的函数
#PASSWORD在mysql8.0中弃用
SELECT MD5('mysql'),SHA('mysql')
FROM DUAL;

#ENCODE() \ DECODE() 在mysql8.0中弃用

SELECT VERSION(),CONNECTION_ID(),DATABASE(),SCHEMA(),
USER(),CURRENT_USER(),CHARSET('你好'),COLLATION('hello')
FROM DUAL;

SELECT BENCHMARK(10000,MD5('mysql'))
FROM DUAL;
 
posted @ 2022-08-11 18:26  zjw_rp  阅读(72)  评论(0编辑  收藏  举报