一、常用函数


最后附练习结构和数据,不满足数学函数操作.

1.1.字符函数(操作字符串类型)

<1>长度 |LENGTH(str):返字符串长度,以字节为单位
mysql> select length('abc');

<2>长度 |CHAR_LENGTH(str): 返回字符串长度,以字符为单位
mysql> select char_length('abc');

<3>拼接 |CONCAT(s1,s2,...): # 返回连接参数产生的字符串,一个或多个待拼接的内容,任意一个为NULL则返回值为NULL
mysql> select concat(SNAME, '-', SSEX) from STUDENT;

<4>转大写 |UPPER(str)和UCASE(str): 将字符串中的字母全部转换成大写
mysql> select name, upper(email) from employees where name like '李%';

<5>转小写 |LOWER(str)和LCASE(str):将str中的字母全部转换成小写
mysql> select lower('HelloWorld');

<6>切片取字符串 |SUBSTR(s, start, length): #从子符串s的start位置开始,取出length长度的子串,位置从1开始计算
mysql> select substr('hello world', 7);

<7>子串在字符串中的位置 |INSTR(str,str1): #返回str1参数,在str参数内的位置
mysql> select instr('hello world', 'or');

<8>去除空格 |TRIM(s): 返回字符串s删除了两边空格之后的字符串
mysql> select trim('  hello world.  ');

1.2.数学函数(数学1)

<1>绝对值 |ABS(x):返回x的绝对值
mysql> select abs(-10);

<2>圆周率 |PI(): 返回圆周率π,默认显示6位小数
mysql> select pi();

<3>除 |MOD(x,y): 返回x被y除后的余数
mysql> select mod(10, 3);

<4>返回最小整数 |CEIL(x)或者CEILING(x): 返回不小于x的最小整数
mysql> select ceil(10.1);

<5>返回最大整数 |FLOOR(x): 返回不大于x的最大整数
mysql> select floor(10.9)

<6>四舍五入和小数点 |ROUND(x)和ROUND(x,y): 
#前者返回最接近于x的整数,即对x进行四舍五入;
# 后者返回最接近x的数,其值保留到小数点后面y位,若y为负值,则将保留到x到小数点左边y位
mysql> select round(10.6666);

1.3.日期函数(日期)

<1>获取日期 |CURDATE()或CURRENT_DATE(): #
# 将当前日期按照"YYYY-MM-DD"或者"YYYYMMDD"格式的值返回,
# 具体格式根据函数用在字符串或是数字语境中而定
mysql> select curdate();
mysql> select CURRENT_DATE();

<2>获取日期和时间 |NOW(): 
#返回当前日期和时间值,格式为"YYYY_MM-DD HH:MM:SS"或"YYYYMMDDHHMMSS",
# 具体格式根据函数用在字符串或数字语境中而定
mysql> select now();

<3>获取月份和获取月份名称(英文月份) |MONTH(date)和MONTHNAME(date):前者返回指定日期中的月份,后者返回指定日期中的月份的名称
mysql> select month('20211001120000');
mysql> select MONTHNAME('20211001120000');

<4>工作日名称,周几,月内第几周 |DAYNAME(d),DAYOFWEEK(d),WEEKDAY(d): 1表示周日,以周日为起始思想
#DAYNAME(d)返回d对应的工作日的英文名称,如Sunday、Monday等;
# DAYOFWEEK(d)返回的对应一周中的索引,1表示周日、2表示周一;
# EEKDAY(d)表示d对应的工作日索引,0表示周一,1表示周二
mysql> select dayname('20211001120000'), DAYOFWEEK('20211001120000'),WEEKDAY('20211001120000');
返回:    Friday	6	4

<5>年内第几周 |WEEK(d): 计算日期d是一年中的第几周
mysql> select week('20211001');

<6>年内第几天 |DAYOFYEAR(d): d是一年中的第几天
mysql> select dayofyear('20211001');

<7>月内第几天 DAYOFMONTH(d): d是一月中的第几天
mysql> select DAYOFMONTH('20211001');

<8>返回年份,季度,分钟数,秒数 |YEAR(date),QUARTER(date),MINUTE(time),SECOND(time): 
#YEAR(date)返回指定日期对应的年份,范围是1970到2069;
#QUARTER(date)返回date对应一年中的季度,范围是1到4;
#MINUTE(time)返回time对应的分钟数,范围是0~59;
#SECOND(time)返回制定时间的秒值
mysql> select year('20211001');

1.4.聚集函数(聚合函数)

<1>求和 |sum()
mysql> select employee_id, sum(basic+bonus) from salary where employee_id=10 and year(date)=2018;
mysql> SELECT SUM(max_score) from hero; # 查询所有人的总评分     

<2>求平均值 |avg()
mysql> select employee_id, avg(basic+bonus) from salary where employee_id=10 and year(date)=2018;

<3>求最小值 |min()
mysql> select employee_id, min(basic+bonus) from salary where employee_id=10 and year(date)=2018;

<4>计算个数 |count()
mysql> select count(*) from departments;

1.5.数学函数(数学2)

<1>加法计算 |给user表里前5行用户对uid 号分别 加1
mysql> select id , name , uid from tarena.user where id <= 5 ;
+----+--------+------+
| id | name   | uid  |
+----+--------+------+
|  1 | root   |    0 |
|  2 | bin    |    1 |
|  3 | daemon |    2 |
|  4 | adm    |    3 |
|  5 | lp     |    4 |
+----+--------+------+
//修改
mysql> update tarena.user set uid = uid +1  where id <= 5;


<2>减法计算 |把编号8的员工 2020年12 月的减去500
mysql> select employee_id , bonus  from  tarena.salary where employee_id =8 and year(date)=2020 and month(date)=12;
+-------------+-------+
| employee_id | bonus |
+-------------+-------+
|           8 |  2000 |
+-------------+-------+
//修改
mysql> update tarena.salary set bonus = bonus - 500  where employee_id =8 and year(date)=2020 and month(date)=12;


<3>乘法计算 |把编号8的员工 2020年12 月的工资改为源工资的5倍
mysql> select employee_id , basic  from  tarena.salary where employee_id =8 and year(date)=2020 and month(date)=12;
+-------------+-------+
| employee_id | basic |
+-------------+-------+
|           8 | 25459 |
+-------------+-------+
//修改
mysql> update tarena.salary set basic=basic*5 where employee_id =8 and year(date)=2020 and month(date)=12;


<4>除法计算 |查看平均工资
mysql> select employee_id , basic , bonus , (basic+bonus)/2  As 平均工资 from  tarena.salary where employee_id =8 and year(date)=2020 and month(date)=8;
+-------------+-------+-------+--------------+
| employee_id | basic | bonus | 平均工资     |
+-------------+-------+-------+--------------+
|           8 | 24247 |  4000 |   14123.5000 |
+-------------+-------+-------+--------------+

<5>取余计算 |显示偶数行
mysql> select  * from tarena.user where id % 2  =  0 ;
+----+-----------------+----------+-------+-------+----------------------------+--------------------+---------------+
| id | name            | password | uid   | gid   | comment                    | homedir            | shell         |
+----+-----------------+----------+-------+-------+----------------------------+--------------------+---------------+
|  2 | bin             | x        |     1 |     1 | bin                        | /bin               | /sbin/nologin |
|  4 | adm             | x        |     3 |     4 | adm                        | /var/adm           | /sbin/nologin |
|  6 | sync            | x        |     5 |     0 | sync                       | /sbin              | /bin/sync     |

1.6.if函数(流程控制函数)

<1>如果true自定义返回 |IF(expr,v1,v2): #如果expr是TRUE则返回v1,否则返回v2
mysql> select if(3>0, 'yes', 'no');

<2>如果 |IFNULL(v1,v2): #如果v1不为NULL,则返回v1,否则返回v2
select TNAME, DEPART, IFNULL(DEPART, '未设置') from TEACHER; #存疑:v1表格内容需要是Null状态

1.7.case函数

<1>case说明:dept_name当v1then变v1,else别名 
CASE expr WHEN v1 THEN r1 [WHEN v2 THEN v2] [ELSE rn] END: 
#如果expr等于某个vn,则返回对应位置THEN后面的结果,如果与所有值都不相等,则返回ELSE后面的rn

mysql> select dept_id, dept_name, -> case dept_name -> when '运维部' then '技术部门' 
 -> when '开发部' then '技术部门' -> when '测试部' then '技术部门' -> when null then '未设置' 
 -> else '非技术部门'   -> end as '部门类型'  -> from departments;


附(DDL来自csdn网络)
-- ----------------------------
-- Table structure for TEACHER
-- ----------------------------
DROP TABLE IF EXISTS `TEACHER`;
CREATE TABLE `TEACHER` (
  `TNO` varchar(3) NOT NULL,
  `TNAME` varchar(4) NOT NULL,
  `TSEX` varchar(2) NOT NULL,
  `TBIRTHDAY` datetime NOT NULL,
  `PROF` varchar(6) DEFAULT NULL,
  `DEPART` varchar(10) NOT NULL,
  PRIMARY KEY (`TNO`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of TEACHER
-- ----------------------------
INSERT INTO `TEACHER` VALUES ('804', '李诚', '男', '1958-12-02 00:00:00', '副教授', '计算机系');
INSERT INTO `TEACHER` VALUES ('825', '王萍', '女', '1972-05-05 00:00:00', '助教', '计算机系');
INSERT INTO `TEACHER` VALUES ('831', '刘冰', '女', '1977-08-14 00:00:00', '助教', '电子工程系');
INSERT INTO `TEACHER` VALUES ('856', '张旭', '男', '1969-03-12 00:00:00', '讲师', '电子工程系');
SET FOREIGN_KEY_CHECKS=1;