主要内容:
常用函数(函数分类1:单行、分组;函数分类2:字符、数学、日期、流程控制)、分组查询group by、连接查询
一、常用函数
1. 按使用方式分类
① 单行函数
单行函数(Scalar Functions)是对单个行进行操作的函数,每行返回一个结果。单行函数可以用于 SELECT、WHERE、ORDER BY 等子句中。
示例:
- 字符函数:UPPER()、LOWER()、CONCAT()
- 数学函数:ABS()、ROUND()、SQRT()
- 日期函数:NOW()、DATE_FORMAT()
SELECT UPPER(name) AS upper_name, ABS(salary) AS abs_salary
FROM employees
WHERE DATE_FORMAT(hire_date, '%Y-%m') = '2023-01';
② 分组函数
分组函数(Aggregate Functions)是对一组行进行操作的函数,返回一个汇总结果。分组函数通常与 GROUP BY 子句一起使用。
示例:
- 求和:SUM()
- 平均值:AVG()
- 最大值:MAX()
- 最小值:MIN()
- 计数:COUNT()
SELECT department_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id;
2. 按用途分类
① 字符函数
字符函数用于处理字符串数据,包括字符串的拼接、截取、转换等操作。
示例:
- 字符串拼接:CONCAT()
- 字符串长度:LENGTH()
- 字符串截取:SUBSTRING()
- 字符串转换:UPPER()、LOWER()
SELECT CONCAT(first_name, ' ', last_name) AS full_name, LENGTH(full_name) AS name_length
FROM employees;
② 数学函数
数学函数用于处理数值数据,包括数值的计算、取整、取绝对值等操作。
示例:
- 绝对值:ABS()
- 四舍五入:ROUND()
- 平方根:SQRT()
- 幂运算:POWER()
SELECT ABS(salary) AS abs_salary, ROUND(salary, 2) AS rounded_salary
FROM employees;
③ 日期函数
日期函数用于处理日期和时间数据,包括日期的格式化、日期差计算、当前日期获取等操作。
示例:
- 当前日期:NOW()
- 日期格式化:DATE_FORMAT()
- 日期差:DATEDIFF()
- 日期加减:DATE_ADD()、DATE_SUB()
SELECT NOW() AS current_date, DATE_FORMAT(hire_date, '%Y-%m-%d') AS formatted_hire_date
FROM employees;
④ 流程控制函数
流程控制函数用于在 SQL 语句中实现条件判断和流程控制,类似于编程语言中的条件语句。
示例:
- 条件判断:CASE
- 空值处理:IFNULL()、COALESCE()
- 条件选择:IF()
SELECT employee_id, salary,
CASE
WHEN salary > 10000 THEN 'High'
WHEN salary > 5000 THEN 'Medium'
ELSE 'Low'
END AS salary_level
FROM employees;
二、函数应用
1、字符函数实例:
LENGTH(s)、CHAR_LENGTH(s)、CONCAT(s1,s2,...)、UPPER(s)、LOWER(s)、SUBSTR(s)、INSTR(s)、TRIM(s)
1)LENGTH(str):返回字符串长度,以字节为单位;
mysql> select length('abc');
+---------------+
| length('abc') |
+---------------+
| 3 |
+---------------+
1 row in set (0.00 sec)
mysql> select length('您好');
+------------------+
| length('您好') |
+------------------+
| 6 |
+------------------+
1 row in set (0.00 sec)
补充:一个中文字一般占3-4个字节
例如:查询name字段是李平的记录,计算其email的字符串长度
mysql> select name,email,length(email) from employees where name='李平';
+--------+----------------+---------------+
| name | email | length(email) |
+--------+----------------+---------------+
| 李平 | liping@tedu.cn | 14 |
+--------+----------------+---------------+
1 row in set (0.00 sec)
2)CHAR_LENGTH(str):返回字符串长度,以字符为单位;
mysql> select char_length('abc');
+--------------------+
| char_length('abc') |
+--------------------+
| 3 |
+--------------------+
1 row in set (0.00 sec)
mysql> select char_length('您好');
+-----------------------+
| char_length('您好') |
+-----------------------+
| 2 |
+-----------------------+
1 row in set (0.00 sec)
3)CONCAT(str1,str2,...):返回连接参数产生的字符串(一个或多个待拼接的内容,任意一个为NULL,则返回值为NULL);
mysql> select concat(dept_id,'-',dept_name) from departments;
+-------------------------------+
| concat(dept_id,'-',dept_name) |
+-------------------------------+
| 1-人事部 |
| 2-财务部 |
| 3-运维部 |
| 4-开发部 |
| 5-测试部 |
| 6-市场部 |
| 7-销售部 |
| 8-法务部 |
| NULL |
+-------------------------------+
9 rows in set (0.00 sec)
4)UPPER(str)和UCASE(str): 将字符串中的字母全部转换成大写;
mysql> select upper('hello');
+----------------+
| upper('hello') |
+----------------+
| HELLO |
+----------------+
1 row in set (0.00 sec)
mysql> select ucase('abc');
+--------------+
| ucase('abc') |
+--------------+
| ABC |
+--------------+
1 row in set (0.00 sec)
例如:查询name字段为“李某”,将email字段记录转换成大写
mysql> select name,upper(email) from employees where name like '李_';
+--------+-------------------+
| name | upper(email) |
+--------+-------------------+
| 李平 | LIPING@TEDU.CN |
| 李莹 | LIYING@TEDU.CN |
| 李柳 | LILIU@TARENA.COM |
| 李慧 | LIHUI@TARENA.COM |
| 李静 | LIJING@TARENA.COM |
| 李瑞 | LIRUI@TARENA.COM |
+--------+-------------------+
6 rows in set (0.00 sec)
5)LOWER(str)和LCASE(str):将str中的字母全部转换成小写;
mysql> select lower('HELLO');
+----------------+
| lower('HELLO') |
+----------------+
| hello |
+----------------+
1 row in set (0.00 sec)
mysql> select lcase('ABC');
+--------------+
| lcase('ABC') |
+--------------+
| abc |
+--------------+
1 row in set (0.00 sec)
6)SUBSTR(str, start, length):从字符串str的start位置开始,取出length长度的子串,位置从1开始计算;
mysql> select substr('hello world',7);
+-------------------------+
| substr('hello world',7) |
+-------------------------+
| world |
+-------------------------+
1 row in set (0.00 sec)
mysql> select substr('hello world',7,3);
+---------------------------+
| substr('hello world',7,3) |
+---------------------------+
| wor |
+---------------------------+
1 row in set (0.00 sec)
7)INSTR(str,str1):返回str1参数,在str参数内的位置;
mysql> select instr('hello world','o');
+--------------------------+
| instr('hello world','o') |
+--------------------------+
| 5 |
+--------------------------+
1 row in set (0.00 sec)
mysql> select instr('hello world','or');
+---------------------------+
| instr('hello world','or') |
+---------------------------+
| 8 |
+---------------------------+
1 row in set (0.00 sec)
mysql> select instr('hello world','ol'); //不存在的参数,返回0
+---------------------------+
| instr('hello world','ol') |
+---------------------------+
| 0 |
+---------------------------+
1 row in set (0.00 sec)
例如:查询name字段为“李某”,返回email字段的记录中“@”的位置
mysql> select name,email,instr(email,'@') from employees where name='李平';
+--------+----------------+------------------+
| name | email | instr(email,'@') |
+--------+----------------+------------------+
| 李平 | liping@tedu.cn | 7 |
+--------+----------------+------------------+
1 row in set (0.00 sec)
8)TRIM(str):返回并删除两边空格之后的字符串str(仅字符串两边的空格);
mysql> select trim(' Hello World ');
+-------------------------+
| trim(' Hello World ') |
+-------------------------+
| Hello