牡丹江商城网站建设,卖汽车的网站怎么做的,莆田城市投资建设集团网站,建设网站需要考虑什么单行函数 1.函数的理解1.1什么是函数1.2不同DBMS函数的差异1.3MySQL的内置函数分类 2.数值函数2.1基本函数2.2角度与弧度互换函数2.3三角函数2.4指数与对数2.5进制间的转换 3.字符串函数4.日期和时间函数4.1获取日期、时间4.2日期与时间戳的转换4.3获取月份、星期、星期数、天数… 单行函数 1.函数的理解1.1什么是函数1.2不同DBMS函数的差异1.3MySQL的内置函数分类 2.数值函数2.1基本函数2.2角度与弧度互换函数2.3三角函数2.4指数与对数2.5进制间的转换 3.字符串函数4.日期和时间函数4.1获取日期、时间4.2日期与时间戳的转换4.3获取月份、星期、星期数、天数等函数4.4日期的操作函数4.5时间和秒钟转换的函数4.6计算日期和时间的函数4.7日期的格式化与解析 5.流程控制函数6.加密与解密函数7.MySQL信息函数8.其他函数 1.函数的理解
1.1什么是函数
函数在计算机语言的使用中贯穿始终函数的作用是什么呢它可以把我们经常使用的代码封装起来需要的时候直接调用即可。这样既 提高了代码效率 又 提高了可维护性 。在 SQL 中我们也可以使用函数对检索出来的数据进行函数操作。使用这些函数可以极大地 提高用户对数据库的管理效率 。 从函数定义的角度出发我们可以将函数分成 内置函数 和 自定义函数 。在 SQL 语言中同样也包括了 内置函数和自定义函数。内置函数是系统内置的通用函数而自定义函数是我们根据自己的需要编写的。
1.2不同DBMS函数的差异
我们在使用 SQL 语言的时候不是直接和这门语言打交道而是通过它使用不同的数据库软件即DBMS。DBMS 之间的差异性很大远大于同一个语言不同版本之间的差异。实际上只有很少的函数是被 DBMS 同时支持的。比如大多数 DBMS 使用||或者来做拼接符而在 MySQL 中的字符串拼接函数为concat()。大部分 DBMS 会有自己特定的函数这就意味着采用 SQL 函数的代码可移植性是很差的因此在使用函数的时候需要特别注意。
1.3MySQL的内置函数分类
MySQL提供了丰富的内置函数这些函数使得数据的维护与管理更加方便能够更好地提供数据的分析与统计功能在一定程度上提高了开发人员进行数据分析与统计的效率。
MySQL提供的内置函数从实现的功能角度可以分为数值函数、字符串函数、日期和时间函数、流程控制函数、加密与解密函数、获取MySQL信息函数、聚合函数等。这里我将这些丰富的内置函数再分为两类单行函数、聚合函数或分组函数。 两种SQL函数 单行函数
操作数据对象接受参数返回一个结果只对一行进行变换每行返回一个结果可以嵌套参数可以是一列或一个值
2.数值函数
2.1基本函数
函数用法ABS(x)返回x的绝对值SIGN(X)返回X的符号。正数返回1负数返回-10返回0PI()返回圆周率的值CEIL(x)CEILING(x)返回大于或等于某个值的最小整数FLOOR(x)返回小于或等于某个值的最大整数LEAST(e1,e2,e3…)返回列表中的最小值GREATEST(e1,e2,e3…)返回列表中的最大值MOD(x,y)返回X除以Y后的余数RAND()返回0~1的随机值RAND(x)返回0~1的随机值其中x的值用作种子值相同的X值会产生相同的随机数ROUND(x)返回一个对x的值进行四舍五入后最接近于X的整数ROUND(x,y)返回一个对x的值进行四舍五入后最接近X的值并保留到小数点后面Y位TRUNCATE(x,y)返回数字x截断为y位小数的结果SQRT(x)返回x的平方根。当X的值为负数时返回NULL举例
mysql mysql SELECT ABS(-123),ABS(32),SIGN(-23),SIGN(43),PI(),CEIL(32.32),CEILING(-43.32),FLOOR(32.32),FLOOR(-43.32),MOD(12,5) FROM DUAL;
-------------------------------------------------------------------------------------------------------------------------
| ABS(-123) | ABS(32) | SIGN(-23) | SIGN(43) | PI() | CEIL(32.32) | CEILING(-43.32) | FLOOR(32.32) | FLOOR(-43.32) | MOD(12,5) |
-------------------------------------------------------------------------------------------------------------------------
| 123 | 32 | -1 | 1 | 3.141593 | 33 | -43 | 32 | -44 | 2 |
-------------------------------------------------------------------------------------------------------------------------
1 row in set (0.00 sec)SELECT RAND(),RAND(),RAND(10),RAND(10),RAND(-1),RAND(-1) FROM DUAL;SELECT ROUND(12.33),ROUND(12.343,2),ROUND(12.324,-1),TRUNCATE(12.66,1),TRUNCATE(12.66,-1) FROM DUAL;2.2角度与弧度互换函数
函数用法RADIANS(x)将角度转化为弧度其中参数x为角度值DEGREES(x)将弧度转化为角度其中参数x为弧度值
SELECT RADIANS(30),RADIANS(60),RADIANS(90),DEGREES(2*PI()),DEGREES(RADIANS(90)) FROM DUAL;2.3三角函数
函数用法SIN(x)返回x的正弦值其中参数x为弧度值ASIN(x)返回x的反正弦值即获取正弦为x的值。如果x的值不在-1到1之间则返回NULLCOS(x)返回x的余弦值其中参数x为弧度值ACOS(x)返回x的反余弦值即获取余弦为x的值。如果x的值不在-1到1之间则返回NULLTAN(x)返回x的正切值其中参数x为弧度值ATAN(x)返回x的反正切值即返回正切值为x的值ATAN2(m,n)返回两个参数的反正切值COT(x)返回x的余切值其中X为弧度值
举例 ATAN2(M,N)函数返回两个参数的反正切值。 与ATAN(X)函数相比ATAN2(M,N)需要两个参数例如有两个点point(x1,y1)和point(x2,y2)使用ATAN(X)函数计算反正切值为ATAN((y2-y1)/(x2-x1))使用ATAN2(M,N)计算反正切值则为ATAN2(y2-y1,x2-x1)。由使用方式可以看出当x2-x1等于0时ATAN(X)函数会报错而ATAN2(M,N)函数则仍然可以计算。
ATAN2(M,N)函数的使用示例如下
SELECT SIN(RADIANS(30)),DEGREES(ASIN(1)),TAN(RADIANS(45)),DEGREES(ATAN(1)),DEGREES(ATAN2(1,1) ) FROM DUAL;2.4指数与对数
函数用法POW(x,y)POWER(X,Y)返回x的y次方EXP(X)返回e的X次方其中e是一个常数2.718281828459045LN(X)LOG(X)返回以e为底的X的对数当X 0 时返回的结果为NULLLOG10(X)返回以10为底的X的对数当X 0 时返回的结果为NULLLOG2(X)返回以2为底的X的对数当X 0 时返回NULL
SELECT POW(2,5),POWER(2,4),EXP(2),LN(10),LOG10(10),LOG2(4) FROM DUAL;2.5进制间的转换
函数用法BIN(x)返回x的二进制编码HEX(x)返回x的十六进制编码OCT(x)返回x的八进制编码CONV(x,f1,f2)返回f1进制数变成f2进制数
SELECT BIN(10),HEX(10),OCT(10),CONV(10,2,8) FROM DUAL;3.字符串函数
函数用法ASCII(S)返回字符串S中的第一个字符的ASCII码值CHAR_LENGTH(s)返回字符串s的字符数。作用与CHARACTER_LENGTH(s)相同LENGTH(s)返回字符串s的字节数和字符集有关CONCAT(s1,s2,…,sn)连接s1,s2,…,sn为一个字符串CONCAT_WS(x,s1,s2,…,sn)同CONCAT(s1,s2,…)函数但是每个字符串之间要加上xINSERT(str, idx, len,replacestr)将字符串str从第idx位置开始len个字符长的子串替换为字符串replacestrREPLACE(str, a, b)用字符串b替换字符串str中所有出现的字符串aUPPER(s) 或 UCASE(s)将字符串s的所有字母转成大写字母LOWER(s) 或LCASE(s)将字符串s的所有字母转成小写字母LEFT(str,n)返回字符串str最左边的n个字符RIGHT(str,n)返回字符串str最右边的n个字符LPAD(str, len, pad)用字符串pad对str最左边进行填充直到str的长度为len个字符RPAD(str ,len, pad)用字符串pad对str最右边进行填充直到str的长度为len个字符LTRIM(s)去掉字符串s左侧的空格RTRIM(s)去掉字符串s右侧的空格TRIM(s)去掉字符串s开始与结尾的空格TRIM(s1 FROM s)去掉字符串s开始与结尾的s1TRIM(LEADING s1FROM s)去掉字符串s开始处的s1TRIM(TRAILING s1FROM s)去掉字符串s结尾处的s1REPEAT(str, n)返回str重复n次的结果SPACE(n)返回n个空格STRCMP(s1,s2)比较字符串s1,s2的ASCII码值的大小SUBSTR(s,index,len)返回从字符串s的index位置其len个字符作用与SUBSTRING(s,n,len)、MID(s,n,len)相同LOCATE(substr,str)返回字符串substr在字符串str中首次出现的位置作用于POSITION(substr IN str)、INSTR(str,substr)相同。未找到返回0ELT(m,s1,s2,…,sn)返回指定位置的字符串如果m1则返回s1如果m2则返回s2如果mn则返回snFIELD(s,s1,s2,…,sn)返回字符串s在字符串列表中第一次出现的位置FIND_IN_SET(s1,s2)返回字符串s1在字符串s2中出现的位置。其中字符串s2是一个以逗号分隔的字符串REVERSE(s)返回s反转后的字符串NULLIF(value1,value2)比较两个字符串如果value1与value2相等则返回NULL否则返回value1 MySQL中字符串的位置是从1开始的。 SELECT FIELD(mm,hello,msm,amma),FIND_IN_SET(mm,hello,mm,amma) FROM DUAL;
SELECT NULLIF(mysql,mysql),NULLIF(mysql, );4.日期和时间函数
4.1获取日期、时间
函数用法CURDATE() CURRENT_DATE()返回当前日期只包含年、月、日CURTIME() CURRENT_TIME()返回当前时间只包含时、分、秒NOW() / SYSDATE() / CURRENT_TIMESTAMP() / LOCALTIME() /LOCALTIMESTAMP()返回当前系统日期和时间UTC_DATE()返回UTC世界标准时间日期UTC_TIME()返回UTC世界标准时间时间
SELECT CURDATE(),CURTIME(),NOW(),SYSDATE()0,UTC_DATE(),UTC_DATE()0,UTC_TIME(),UTC_TIME()0 FROM DUAL;4.2日期与时间戳的转换
函数用法UNIX_TIMESTAMP()以UNIX时间戳的形式返回当前时间。SELECT UNIX_TIMESTAMP() -1634348884UNIX_TIMESTAMP(date)将时间date以UNIX时间戳的形式返回。FROM_UNIXTIME(timestamp)将UNIX时间戳的时间转换为普通格式的时间
举例
mysql SELECT UNIX_TIMESTAMP(NOW());
-----------------------
| UNIX_TIMESTAMP(NOW()) |
-----------------------
| 1701975404 |
-----------------------
1 row in set (0.00 sec)mysql SELECT UNIX_TIMESTAMP(CURDATE());
---------------------------
| UNIX_TIMESTAMP(CURDATE()) |
---------------------------
| 1701925200 |
---------------------------
1 row in set (0.00 sec)mysql SELECT UNIX_TIMESTAMP(CURTIME());
---------------------------
| UNIX_TIMESTAMP(CURTIME()) |
---------------------------
| 1701975409 |
---------------------------
1 row in set (0.00 sec)
mysql SELECT UNIX_TIMESTAMP(2023-12-07 14:00:00);
---------------------------------------
| UNIX_TIMESTAMP(2023-12-07 14:00:00) |
---------------------------------------
| 1701975600 |
---------------------------------------
1 row in set (0.00 sec)
mysql SELECT UNIX_TIMESTAMP(1701975600);
----------------------------
| UNIX_TIMESTAMP(1701975600) |
----------------------------
| 0 |
----------------------------
1 row in set, 1 warning (0.00 sec)4.3获取月份、星期、星期数、天数等函数
函数用法YEAR(date) / MONTH(date) / DAY(date)返回具体的日期值HOUR(time) / MINUTE(time) /SECOND(time)返回具体的时间值MONTHNAME(date)返回月份January…DAYNAME(date)返回星期几MONDAYTUESDAY…SUNDAYWEEKDAY(date)返回周几注意周1是0周2是1。。。周日是6QUARTER(date)返回日期对应的季度范围为14WEEK(date) WEEKOFYEAR(date)返回一年中的第几周DAYOFYEAR(date)返回日期是一年中的第几天DAYOFMONTH(date)返回日期位于所在月份的第几天DAYOFWEEK(date)返回周几注意周日是1周一是2。。。周六是7
举例
SELECT YEAR(CURDATE()),MONTH(CURDATE()),DAY(CURDATE()),HOUR(CURTIME()),MINUTE(CURTIME()),SECOND(SYSDATE()) FROM DUAL;举例
SELECT MONTHNAME(2023-12-07),DAYNAME(2023-12-07),WEEKDAY(2023-12-07),QUARTER(CURDATE()),WEEK(CURDATE()),DAYOFYEAR(NOW()),DAYOFMONTH(NOW()),DAYOFWEEK(NOW()) FROM DUAL;4.4日期的操作函数
函数用法EXTRACT(type FROM date)返回指定日期中特定的部分type指定返回的值
EXTRACT(type FROM date)函数中type的取值与含义 举例
SELECT EXTRACT(MINUTE FROM NOW()),EXTRACT( WEEK FROM NOW()), EXTRACT( QUARTER FROM NOW()),EXTRACT( MINUTE_SECOND FROM NOW())
FROM DUAL;
-------------------------------------------------------------------------------------------------------------------------
| EXTRACT(MINUTE FROM NOW()) | EXTRACT( WEEK FROM NOW()) | EXTRACT( QUARTER FROM NOW()) | EXTRACT( MINUTE_SECOND FROM NOW()) |
-------------------------------------------------------------------------------------------------------------------------
| 34 | 49 | 4 | 3453 |
-------------------------------------------------------------------------------------------------------------------------
1 row in set (0.00 sec)4.5时间和秒钟转换的函数
函数用法TIME_TO_SEC(time)将 time 转化为秒并返回结果值。转化的公式为 小时3600分钟60秒SEC_TO_TIME(seconds)将 seconds 描述转化为包含小时、分钟和秒的时间
举例
mysql SELECT TIME_TO_SEC(NOW());
--------------------
| TIME_TO_SEC(NOW()) |
--------------------
| 56286 |
--------------------
1 row in set (0.00 sec)mysql SELECT SEC_TO_TIME(56286);
--------------------
| SEC_TO_TIME(56286) |
--------------------
| 15:38:06 |
--------------------
1 row in set (0.00 sec)4.6计算日期和时间的函数
函数用法DATE_ADD(datetime, INTERVAL expr type)ADDDATE(date,INTERVAL expr type)返回与给定日期时间相差INTERVAL时间段的日期时间DATE_SUB(date,INTERVAL expr type)SUBDATE(date,INTERVAL expr type)返回与date相差INTERVAL时间间隔的日期
上述函数中type的取值
SELECT DATE_ADD(NOW(),INTERVAL 1 DAY) AS col1,DATE_ADD(2023-12-07 15:45:00,INTERVAL 1 SECOND) AS col2,ADDDATE(2023-12-07 15:45:00,INTERVAL 1 SECOND) AS col3,DATE_ADD(2023-12-07 15:45:00,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 DATE_SUB(2023-12-07,INTERVAL 31 DAY) AS col1, SUBDATE(2023-12-07,INTERVAL 31 DAY) AS col2, DATE_SUB(2023-12-07 15:55:00,INTERVAL 1_1 DAY_HOUR) AS col3 FROM DUAL;函数用法ADDTIME(time1,time2)返回time1加上time2的时间。当time2为一个数字时代表的是秒 可以为负数SUBTIME(time1,time2)返回time1减去time2后的时间。当time2为一个数字时代表的是 秒 可以为负数DATEDIFF(date1,date2)返回date1 - date2的日期间隔天数TIMEDIFF(time1, time2)返回time1 - time2的时间间隔FROM_DAYS(N)返回从0000年1月1日起N天以后的日期TO_DAYS(date)返回日期date距离0000年1月1日的天数LAST_DAY(date)返回date所在月份的最后一天的日期MAKEDATE(year,n)针对给定年份与所在年份中的天数返回一个日期MAKETIME(hour,minute,second)将给定的小时、分钟和秒组合成时间并返回PERIOD_ADD(time,n)返回time加上n后的时间
举例
SELECT ADDTIME(NOW(),20),SUBTIME(NOW(),30),SUBTIME(NOW(),1:1:3),DATEDIFF(NOW(),2023-12-06),TIMEDIFF(NOW(),2023-12-06 12:00:00),FROM_DAYS(366),TO_DAYS(0000-12-25),LAST_DAY(NOW()),MAKEDATE(NOW(),12),MAKETIME(10,21,23),PERIOD_ADD(20200101010101,10) FROM DUAL;mysql SELECT ADDTIME(NOW(),50);
---------------------
| ADDTIME(NOW(),50) |
---------------------
| 2023-12-07 17:49:32 |
---------------------
1 row in set (0.00 sec)mysql SELECT ADDTIME(NOW(),1:1:1);
------------------------
| ADDTIME(NOW(),1:1:1) |
------------------------
| 2023-12-07 18:51:17 |
------------------------
1 row in set (0.00 sec)mysql SELECT SUBTIME(NOW(),-1:-1:-1);
---------------------------
| SUBTIME(NOW(),-1:-1:-1) |
---------------------------
| 2023-12-07 17:51:11 |
---------------------------
1 row in set, 1 warning (0.00 sec)mysql SELECT FROM_DAYS(366);
----------------
| FROM_DAYS(366) |
----------------
| 0001-01-01 |
----------------
1 row in set (0.00 sec)mysql SELECT MAKEDATE(2020,1);
------------------
| MAKEDATE(2020,1) |
------------------
| 2020-01-01 |
------------------
1 row in set (0.00 sec)mysql SELECT MAKEDATE(2020,33);
-------------------
| MAKEDATE(2020,33) |
-------------------
| 2020-02-02 |
-------------------
1 row in set (0.00 sec)mysql SELECT MAKETIME(1,1,1);
-----------------
| MAKETIME(1,1,1) |
-----------------
| 01:01:01 |
-----------------
1 row in set (0.00 sec)mysql SELECT PERIOD_ADD(20200101010101,1);
------------------------------
| PERIOD_ADD(20200101010101,1) |
------------------------------
| 13754718902 |
------------------------------
1 row in set (0.00 sec)mysql SELECT TO_DAYS(NOW());
----------------
| TO_DAYS(NOW()) |
----------------
| 739226 |
----------------
1 row in set (0.00 sec)4.7日期的格式化与解析
函数用法DATE_FORMAT(date,fmt)按照字符串fmt格式化日期date值TIME_FORMAT(time,fmt)按照字符串fmt格式化时间time值GET_FORMAT(date_type,format_type)返回日期字符串的显示格式STR_TO_DATE(str, fmt)按照字符串fmt对str进行解析解析为一个日期
上述非GET_FORMAT函数中fmt参数常用的格式符
格式符号说明格式符说明%Y4位数字表示年份%y表示两位数字表示年份%M月名表示月份January,…%m两位数字表示月份%b缩写的月名Jan.Feb.…%c 数字表示月份%D英文后缀表示月中的天数1st,2nd,3rd,…%d两位数字表示月中的天数(01,02…)%e数字形式表示月中的天数1,2,3,4,5…%H两位数字表示小数24小时制01,02…%h和%I两位数字表示小时12小时制01,02…%k数字形式的小时24小时制(1,2,3)%l数字形式表示小时12小时制1,2,3,4…%i两位数字表示分钟00,01,02%S和%s两位数字表示秒(00,01,02…)%W一周中的星期名称Sunday…%a一周中的星期缩写Sun.Mon.,Tues.…%w以数字表示周中的天数(0Sunday,1Monday…)%j以3位数字表示年中的天数(001,002…)%U以数字表示年中的第几周1,2,3。。其中Sunday为周中第一天%u以数字表示年中的第几周1,2,3。。其中Monday为周中第一天%T24小时制%r12小时制%pAM或PM%%表示%
GET_FORMAT函数中date_type和format_type参数取值如下 举例
mysql SELECT DATE_FORMAT(NOW(),%H:%i:%s);
-------------------------------
| DATE_FORMAT(NOW(),%H:%i:%s) |
-------------------------------
| 19:29:06 |
-------------------------------
1 row in set (0.00 sec)
mysql SELECT STR_TO_DATE(12/07/2023,%m/%d/%Y) FROM DUAL;
--------------------------------------
| STR_TO_DATE(12/07/2023,%m/%d/%Y) |
--------------------------------------
| 2023-12-07 |
--------------------------------------
1 row in set (0.00 sec)mysql SELECT STR_TO_DATE(12/07/2023,%m/%d/%Y);
--------------------------------------
| STR_TO_DATE(12/07/2023,%m/%d/%Y) |
--------------------------------------
| 2023-12-07 |
--------------------------------------
1 row in set (0.00 sec)mysql SELECT STR_TO_DATE(20231207180000,%Y%m%d%H%i%s);
----------------------------------------------
| STR_TO_DATE(20231207180000,%Y%m%d%H%i%s) |
----------------------------------------------
| 2023-12-07 18:00:00 |
----------------------------------------------
1 row in set (0.00 sec)mysql SELECT STR_TO_DATE(2023-12-07 18:00:00,%Y-%m-%d %H:%i:%s);
--------------------------------------------------------
| STR_TO_DATE(2023-12-07 18:00:00,%Y-%m-%d %H:%i:%s) |
--------------------------------------------------------
| 2023-12-07 18:00:00 |
--------------------------------------------------------
1 row in set (0.00 sec)
mysql SELECT GET_FORMAT(DATE, USA);
-------------------------
| GET_FORMAT(DATE, USA) |
-------------------------
| %m.%d.%Y |
-------------------------
1 row in set (0.00 sec)
mysql SELECT DATE_FORMAT(NOW(),GET_FORMAT(DATE,USA)) FROM DUAL;
-------------------------------------------
| DATE_FORMAT(NOW(),GET_FORMAT(DATE,USA)) |
-------------------------------------------
| 12.07.2023 |
-------------------------------------------
1 row in set (0.00 sec)
mysql SELECT STR_TO_DATE(2023-12-07 18:00:00,%Y-%m-%d);
-----------------------------------------------
| STR_TO_DATE(2023-12-07 18:00:00,%Y-%m-%d) |
-----------------------------------------------
| 2023-12-07 |
-----------------------------------------------
1 row in set, 1 warning (0.00 sec)5.流程控制函数
流程处理函数可以根据不同的条件执行不同的处理流程可以在SQL语句中实现不同的条件选择。MySQL中的流程处理函数主要包括IF()、IFNULL()和CASE()函数
函数用法IF(value,value1,value2)如果value的值为TRUE返回value1否则返回value2IFNULL(value1, value2)如果value1不为NULL返回value1否则返回value2CASE WHEN 条件1 THEN 结果1 WHEN 条件2 THEN 结果2… [ELSE resultn]END相当于Java的if…else if…else…CASE expr WHEN 常量值1 THEN 值1 WHEN 常量值1 THEN值1 … [ELSE 值n] END相当于Java的switch…case…
mysql SELECT IF (10,正确,错误);
----------------------------
| IF (10,正确,错误) |
----------------------------
| 正确 |
----------------------------
1 row in set (0.00 sec)mysql SELECT IFNULL (null,HelloWorld);
----------------------------
| IFNULL (null,HelloWorld) |
----------------------------
| HelloWorld |
----------------------------
1 row in set (0.00 sec)
mysql SELECT CASE WHEN 1 0 THEN yes WHEN 1 0 THEN no ELSE unknown END;
---------------------------------------------------------------------
| CASE WHEN 1 0 THEN yes WHEN 1 0 THEN no ELSE unknown END |
---------------------------------------------------------------------
| yes |
---------------------------------------------------------------------
1 row in set (0.00 sec)mysql SELECT CASE WHEN 1 0 THEN yes WHEN 1 0 THEN no ELSE unknown END;
--------------------------------------------------------------------
| CASE WHEN 1 0 THEN yes WHEN 1 0 THEN no ELSE unknown END |
--------------------------------------------------------------------
| unknown |
--------------------------------------------------------------------
1 row in set (0.00 sec)mysql SELECT CASE 1 WHEN 0 THEN 0 WHEN 1 THEN 1 ELSE -1 END;
------------------------------------------------
| CASE 1 WHEN 0 THEN 0 WHEN 1 THEN 1 ELSE -1 END |
------------------------------------------------
| 1 |
------------------------------------------------
1 row in set (0.00 sec)mysql SELECT CASE -1 WHEN 0 THEN 0 WHEN 1 THEN 1 ELSE -1 END;
-------------------------------------------------
| CASE -1 WHEN 0 THEN 0 WHEN 1 THEN 1 ELSE -1 END |
-------------------------------------------------
| -1 |
-------------------------------------------------
1 row in set (0.00 sec)6.加密与解密函数
加密与解密函数主要用于对数据库中的数据进行加密和解密处理以防止数据被他人窃取。这些函数在保证数据库安全时非常有用
函数用法PASSWORD(str)返回字符串str的加密版本41位长的字符串。加密结果 不可逆 常用于用户的密码加密MD5(str)返回字符串str的md5加密后的值也是一种加密方式。若参数为NULL则会返回NULLSHA(str)从原明文密码str计算并返回加密后的密码字符串当参数为NULL时返回NULL。 SHA加密算法比MD5更加安全 。ENCODE(value,password_seed)返回使用password_seed作为加密密码加密valueDECODE(value,password_seed)返回使用password_seed作为加密密码解密value
可以看到ENCODEvaluepassword_seed函数与DECODEvaluepassword_seed函数互为反函数 举例
mysql SELECT PASSWORD(mysql), PASSWORD(NULL);
-----------------------------------------------------------
| PASSWORD(mysql) | PASSWORD(NULL) |
-----------------------------------------------------------
| *E74858DB86EBA20BC33D0AECAE8A8108C56B17FA | |
-----------------------------------------------------------
1 row in set, 1 warning (0.00 sec)
mysql SELECT MD5(123);
----------------------------------
| MD5(123) |
----------------------------------
| 202cb962ac59075b964b07152d234b70 |
----------------------------------
1 row in set (0.08 sec)mysql SELECT SHA(Tom123);
------------------------------------------
| SHA(Tom123) |
------------------------------------------
| c7c506980abc31cc390a2438c90861d0f1216d50 |
------------------------------------------
1 row in set (0.10 sec)
mysql SELECT ENCODE(mysql,mysql);
-------------------------
| ENCODE(mysql,mysql) |
-------------------------
| g |
-------------------------
1 row in set, 1 warning (0.00 sec)mysql SELECT DECODE(ENCODE(mysql,mysql),mysql);
-----------------------------------------
| DECODE(ENCODE(mysql,mysql),mysql) |
-----------------------------------------
| mysql |
-----------------------------------------
1 row in set, 2 warnings (0.00 sec)7.MySQL信息函数
MySQL中内置了一些可以查询MySQL信息的函数这些函数主要用于帮助数据库开发或运维人员更好地对数据库进行维护工作
函数用法VERSION()返回当前MySQL的版本号CONNECTION_ID()返回当前MySQL服务器的连接数DATABASE()SCHEMA()返回MySQL命令行当前所在的数据库USER()CURRENT_USER()、SYSTEM_USER()SESSION_USER()返回当前连接MySQL的用户名返回结果格式为“主机名用户名”CHARSET(value)返回字符串value自变量的字符集COLLATION(value)返回字符串value的比较规则
举例
mysql SELECT DATABASE();
------------
| DATABASE() |
------------
| test |
------------
1 row in set (0.00 sec)
mysql SELECT USER(),CURRENT_USER(),SYSTEM_USER(),SESSION_USER();
----------------------------------------------------------------
| USER() | CURRENT_USER() | SYSTEM_USER() | SESSION_USER() |
----------------------------------------------------------------
| rootlocalhost | root% | rootlocalhost | rootlocalhost |
----------------------------------------------------------------
1 row in set (0.00 sec)mysql SELECT CHARSET(ABC);
----------------
| CHARSET(ABC) |
----------------
| utf8mb4 |
----------------
1 row in set (0.00 sec)mysql SELECT COLLATION(ABC);
--------------------
| COLLATION(ABC) |
--------------------
| utf8mb4_general_ci |
--------------------
1 row in set (0.01 sec)8.其他函数
函数用法FORMAT(value,n)返回对数字value进行格式化后的结果数据。n表示 四舍五入 后保留到小数点后n位CONV(value,from,to)将value的值进行不同进制之间的转换INET_ATON(ipvalue)将以点分隔的IP地址转化为一个数字INET_NTOA(value)将数字形式的IP地址转化为以点分隔的IP地址BENCHMARK(n,expr)将表达式expr重复执行n次。用于测试MySQL处理expr表达式所耗费的时间CONVERT(value USINGchar_code)将value所使用的字符编码修改为char_code
举例
# 如果n的值小于或者等于0则只保留整数部分
mysql SELECT FORMAT(123.123, 2), FORMAT(123.523, 0), FORMAT(123.123, -2);
-------------------------------------------------------------
| FORMAT(123.123, 2) | FORMAT(123.523, 0) | FORMAT(123.123, -2) |
-------------------------------------------------------------
| 123.12 | 124 | 123 |
-------------------------------------------------------------
1 row in set (0.00 sec)
mysql SELECT CONV(16, 10, 2), CONV(8888,10,16), CONV(NULL, 10, 2);
------------------------------------------------------
| CONV(16, 10, 2) | CONV(8888,10,16) | CONV(NULL, 10, 2) |
------------------------------------------------------
| 10000 | 22B8 | NULL |
------------------------------------------------------
1 row in set (0.00 sec)
mysql SELECT INET_ATON(192.168.1.100);
----------------------------
| INET_ATON(192.168.1.100) |
----------------------------
| 3232235876 |
----------------------------
1 row in set (0.00 sec)
mysql SELECT INET_NTOA(3232235876);
-----------------------
| INET_NTOA(3232235876) |
-----------------------
| 192.168.1.100 |
-----------------------
1 row in set (0.00 sec)
SELECT BENCHMARK(1, MD5(mysql));
----------------------------
| BENCHMARK(1, MD5(mysql)) |
----------------------------
| 0 |
----------------------------
1 row in set (0.00 sec)
mysql SELECT BENCHMARK(1000000, MD5(mysql));
----------------------------------
| BENCHMARK(1000000, MD5(mysql)) |
----------------------------------
| 0 |
----------------------------------
1 row in set (0.22 sec)
mysql SELECT CHARSET(mysql), CHARSET(CONVERT(mysql USING utf8));
----------------------------------------------------------
| CHARSET(mysql) | CHARSET(CONVERT(mysql USING utf8)) |
----------------------------------------------------------
| utf8mb4 | utf8 |
----------------------------------------------------------
1 row in set (0.00 sec)练习
显示系统时间(注日期时间)查询员工号姓名工资以及工资提高百分之20%后的结果new salary将员工的姓名按首字母排序并写出姓名的长度length查询员工id,last_name,salary并作为一个列输出别名为OUT_PUT查询公司各员工工作的年数、工作的天数并按工作年数的降序排序查询员工姓名hire_date , department_id满足以下条件雇用时间在1997之后department_id为80 或 90 或110, commission_pct不为空查询公司中入职超过10000天的员工姓名、入职时间做一个查询产生下面的结果使用case-when按照下面的条件
1.显示系统时间(注日期时间)
SELECT NOW()
FROM DUAL;2.查询员工号姓名工资以及工资提高百分之20%后的结果new salary
SELECT employee_id, last_name, salary, salary * 1.2 new salaryFROM employees;3.将员工的姓名按首字母排序并写出姓名的长度length
SELECT last_name, LENGTH(last_name)
FROM employees
ORDER BY last_name DESC;4.查询员工id,last_name,salary并作为一个列输出别名为OUT_PUT
SELECT CONCAT(employee_id, , , last_name , ,, salary) OUT_PUT
FROM employees;5.查询公司各员工工作的年数、工作的天数并按工作年数的降序排序
SELECT DATEDIFF(SYSDATE(), hire_date) / 365 worked_years, DATEDIFF(SYSDATE(),
hire_date) worked_days
FROM employees
ORDER BY worked_years DESC6.查询员工姓名hire_date , department_id满足以下条件雇用时间在1997之后department_id为80 或 90 或110, commission_pct不为空
SELECT last_name, hire_date, department_id
FROM employees
#WHERE hire_date 1997-01-01
#WHERE hire_date STR_TO_DATE(1997-01-01, %Y-%m-%d)
WHERE DATE_FORMAT(hire_date,%Y) 1997
AND department_id IN (80, 90, 110)
AND commission_pct IS NOT NULL7.查询公司中入职超过10000天的员工姓名、入职时间
SELECT last_name,hire_date
FROM employees
#WHERE TO_DAYS(NOW()) - to_days(hire_date) 10000;
WHERE DATEDIFF(NOW(),hire_date) 10000;8.做一个查询产生下面的结果
-- last_name earns salary monthly but wants salary*3
-- Dream Salary
-- King earns 24000 monthly but wants 72000
SELECT CONCAT(last_name, earns , TRUNCATE(salary, 0) , monthly but wants ,
TRUNCATE(salary * 3, 0)) Dream Salary
FROM employees;9.使用case-when按照下面的条件
-- job grade
-- AD_PRES A
-- ST_MAN B
-- IT_PROG C
-- SA_REP D
-- ST_CLERK E
-- 产生下面的结果
-- Last_name Job_id Grade
-- king AD_PRES A
SELECT last_name Last_name, job_id Job_id,
CASE job_id WHEN AD_PRES THEN A
WHEN ST_MAN THEN B
WHEN IT_PROG THEN C
WHEN SA_REP THEN D
WHEN ST_CLERK THEN E
ELSE F END grade
FROM employees;