一、常用函数
最后附练习结构和数据,不满足数学函数操作.
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;