华子目录
- sql函数
- 聚合函数
- 数值型函数
- 字符串函数
- 日期和时间函数
- 流程控制函数
- case用法
sql函数
聚合函数
聚合函数是对一组值进行运算,并返回单个值。也叫分组函数,具体用法请参考该博文
https://blog.csdn.net/huaz_md/article/details/136081708?spm=1001.2014.3001.5501
数值型函数
MySQL提供了许多数值型函数,可以对数值进行各种操作和计算。以下是一些常用的数值型函数及其用法:1. `abs(x)`:返回x的绝对值。例如,`ABS(-10)` 将返回 `10`。2. `ceil(x)` 或 `ceiling(x)`:返回大于或等于x的最小整数值。例如,`CEIL(10.1)` 将返回 `11`。(向上取整)3. `floor(x)`:返回小于或等于x的最大整数值。例如,`FLOOR(10.9)` 将返回 `10`。(向下取整)4. `round(x, d)`:将x四舍五入到d位小数。例如,`ROUND(10.12345, 2)` 将返回 `10.12`。5. `truncate(x, d)`:将x截断为d位小数。例如,`TRUNCATE(10.12345, 2)` 将返回 `10.12`。6. `rand()`:返回0和1之间的随机数。例如,`SELECT RAND()` 将返回一个随机数。7. `pow(x, y)` 或 `power(x, y)`:返回x的y次幂。例如,`POW(2, 3)` 将返回 `8`。8. `sqrt(x)`:返回x的平方根。例如,`SQRT(16)` 将返回 `4`。9. `mod(x, y)`:返回x除以y的余数。例如,`MOD(10, 3)` 将返回 `1`。10. `sign(x)`:返回x的符号,如果x为负数则返回-1,如果x为正数则返回1,如果x为0则返回0。例如,`SIGN(-10)` 将返回 `-1`。这些函数可以在SELECT语句中使用,用于处理数值数据并返回计算结果。
mysql> select abs(-9);
+---------+
| abs(-9) |
+---------+
| 9 |
+---------+mysql> select * from employee;
+------+-----------+-----------------+--------+-------+--------+
| id | name | job | salary | bonus | job_id |
+------+-----------+-----------------+--------+-------+--------+
| 101 | 麦当 | 后端研发 | 25000 | 5000 | 1003 |
| 102 | 咕咚 | 网络运维 | 15000 | 3000 | 1003 |
| 103 | 迪亚 | 测试工程师 | 12000 | 2000 | 1003 |
| 104 | 米龙 | 后端开发 | 20000 | 3500 | 1003 |
| 105 | 极光 | 前端开发 | 15000 | 2500 | 1003 |
| 106 | 村长 | 人力资源 | 10000 | 500 | 1001 |
| 107 | 五条人 | 销售工程师 | 14000 | 7000 | 1002 |
| 108 | 皇帝 | 董事长 | 30000 | 10000 | 1004 |
+------+-----------+-----------------+--------+-------+--------+mysql> select abs(salary) from employee where id=101;
+-------------+
| abs(salary) |
+-------------+
| 25000 |
+-------------+
mysql> select ceil(10.9);
+------------+
| ceil(10.9) |
+------------+
| 11 |
+------------+mysql> select floor(10.9);
+-------------+
| floor(10.9) |
+-------------+
| 10 |
+-------------+
mysql> select round(10.678,2);
+-----------------+
| round(10.678,2) |
+-----------------+
| 10.68 |
+-----------------+mysql> select truncate(10.678,2);
+--------------------+
| truncate(10.678,2) |
+--------------------+
| 10.67 |
+--------------------+
在MySQL中,`RAND()`函数用于生成一个介于0和1之间的随机数。`RAND()`函数不接受任何参数。以下是`RAND()`函数的用法示例:1. 生成一个随机数:SELECT RAND();这将返回一个介于0和1之间的随机数,例如 `0.724653`.2. 生成一个随机整数:SELECT FLOOR(RAND() * 100) AS random_int;这将返回一个介于0和99之间的随机整数,例如 `42`.3. 生成一个在指定范围内的随机数:SELECT RAND() * (max_value - min_value) + min_value AS random_number;其中 `max_value` 和 `min_value` 是您希望的范围的上限和下限。例如,要生成一个介于10和20之间的随机数:SELECT RAND() * (20 - 10) + 10 AS random_number;注意:由于`RAND()`函数在每次查询时都会生成一个新的随机数,因此多次调用`RAND()`函数将返回不同的值。
mysql> select rand();#生成0-1之间的小数
+--------------------+
| rand() |
+--------------------+
| 0.7741850370300795 |
+--------------------+mysql> select floor(rand()*10);#生成0-10之间的整数
+------------------+
| floor(rand()*10) |
+------------------+
| 6 |
+------------------+mysql> select floor(rand()*(20-10)+10);#生成10-20之间的整数
+--------------------------+
| floor(rand()*(20-10)+10) |
+--------------------------+
| 15 |
+--------------------------+
mysql> select pow(2,3);
+----------+
| pow(2,3) |
+----------+
| 8 |
+----------+mysql> select power(2,3);
+------------+
| power(2,3) |
+------------+
| 8 |
+------------+
mysql> select sqrt(16);
+----------+
| sqrt(16) |
+----------+
| 4 |
+----------+mysql> select mod(10,3);
+-----------+
| mod(10,3) |
+-----------+
| 1 |
+-----------+mysql> select sign(-10);
+-----------+
| sign(-10) |
+-----------+
| -1 |
+-----------+mysql> select sign(0);
+---------+
| sign(0) |
+---------+
| 0 |
+---------+mysql> select sign(20);
+----------+
| sign(20) |
+----------+
| 1 |
+----------+
字符串函数
MySQL提供了许多字符串函数,用于对字符串进行各种操作和处理。以下是一些常用的字符串函数及其用法:1. `concat(str1, str2, ...)`:将多个字符串连接在一起。例如,`CONCAT('Hello', ' ', 'World')` 将返回 `'Hello World'`。2. `substr(str, start, length)` 或 `substring(str, start, length)`:返回从字符串中指定位置开始的指定长度的子字符串。例如,`SUBSTRING('Hello World', 1, 5)` 将返回 `'Hello'`。3. `upper(str)`:将字符串转换为大写。例如,`UPPER('hello')` 将返回 `'HELLO'`。4. `lower(str)`:将字符串转换为小写。例如,`LOWER('WORLD')` 将返回 `'world'`。5. `length(str)` 或 `char_length(str)`:返回字符串的长度。例如,`LENGTH('Hello World')` 将返回 `11`。6. `trim([{BOTH | LEADING | TRAILING} [remstr] FROM] str)`:删除字符串两端或指定字符的空格。例如,`TRIM(' hello ')` 将返回 `'hello'`。7. `replace(str, from_str, to_str)`:将字符串中的指定子字符串替换为另一个字符串。例如,`REPLACE('Hello World', 'World', 'John')` 将返回 `'Hello John'`。8. `reverse(str)`:反转字符串。例如,`REVERSE('Hello')` 将返回 `'olleH'`。9. `left(str, length)`:返回字符串左边的指定长度的子字符串。例如,`LEFT('Hello World', 5)` 将返回 `'Hello'`。10. `right(str, length)`:返回字符串右边的指定长度的子字符串。例如,`RIGHT('Hello World', 5)` 将返回 `'World'`。11. `strcmp(str1, str2)` 函数用于比较两个字符串 `str1` 和 `str2`。- 如果 `str1` 小于 `str2`,则返回负值 (-1)。- 如果 `str1` 等于 `str2`,则返回 0。- 如果 `str1` 大于 `str2`,则返回正值 (1)。SELECT STRCMP('apple', 'banana'); -- 返回负值 (-1),因为'apple'在字母表中排在'banana'之前SELECT STRCMP('apple', 'apple'); -- 返回 0,因为两个字符串相等SELECT STRCMP('banana', 'apple'); -- 返回正值 (1),因为'banana'在字母表中排在'apple'之后12. `locate(substr, str)` 函数用于在字符串 `str` 中查找子字符串 `substr` 的位置。如果找到,则返回 `substr` 在 `str` 中第一次出现的位置(从1开始),如果未找到,则返回0。`LOCATE` 函数还可以指定起始搜索位置。以下是 `LOCATE` 函数的用法示例:SELECT LOCATE('or', 'Hello World'); -- 返回 8,因为'or'在'Hello World'中的位置是从第8个字符开始SELECT LOCATE('or', 'Hello World', 5); -- 返回 8,从第5个字符开始搜索,所以找到的位置仍然是第8个字符SELECT LOCATE('banana', 'apple'); -- 返回 0,因为'banana'未在'apple'中找到在上面的示例中,第一个参数是要查找的子字符串,第二个参数是要搜索的字符串,第三个参数是可选的起始搜索位置。13. `instr(str, substr)` 函数用于返回子字符串 `substr` 在字符串 `str` 中第一次出现的位置。如果 `substr` 不在 `str` 中,则返回0。`INSTR` 函数的用法示例如下:SELECT INSTR('foobarbar', 'bar'); -- 返回 4,因为'bar'在'foobarbar'中的第一个出现位置是从第4个字符开始SELECT INSTR('foobar', 'baz'); -- 返回 0,因为'baz'不在'foobar'中
`instr` 函数还可以指定起始搜索位置:SELECT INSTR('foobarbar', 'bar', 5); -- 返回 7,从第5个字符开始搜索,'bar'在'foobarbar'中的下一个出现位置是从第7个字符开始在这个例子中,`INSTR('foobarbar', 'bar', 5)` 返回的结果是7,因为它从第5个字符开始搜索,找到了第二个'bar'出现的位置。14. `right(str, len)` 函数用于返回字符串 `str` 的右侧 `len` 个字符。如果 `len` 大于 `str` 的长度,则返回整个字符串 `str`。以下是 `RIGHT` 函数的用法示例:SELECT RIGHT('Hello World', 5); -- 返回 'World',因为返回字符串的右侧5个字符SELECT RIGHT('Hello', 10); -- 返回 'Hello',因为返回字符串的右侧10个字符,但字符串长度不足10个字符
`right` 函数通常用于截取字符串的右侧一部分,返回指定长度的子字符串。15. `insert(str, pos, len, newstr);`,这种用法用于在字符串的指定位置插入另一个字符串。例如:SELECT INSERT('Hello World', 6, 0, 'Beautiful '); -- 返回 'Hello Beautiful World',在第6个位置插入'Beautiful '在这个例子中,`INSERT('Hello World', 6, 0, 'Beautiful ')` 将在字符串 `'Hello World'` 的第6个位置插入 `'Beautiful '`。16. `lpad('目标字符串',10,'填充字符')`:将填充字符填充到目标字符的左边,补足10个mysql> select lpad('哈哈哈',10,'*');+--------------------------+| lpad('哈哈哈',10,'*') |+--------------------------+| *******哈哈哈 |+--------------------------+17. `rpad('目标字符串',10,'填充字符')`mysql> select rpad('哈哈哈',10,'*');+--------------------------+| rpad('哈哈哈',10,'*') |+--------------------------+| 哈哈哈******* |+--------------------------+
这些函数可以在SELECT语句中使用,用于处理和操作字符串数据,并返回结果。
日期和时间函数
MySQL提供了许多用于处理日期和时间的函数。以下是一些常用的日期和时间函数及其用法:1. `now()`:返回当前日期和时间。`sysdate()`select now();select sysdate();2. `curdate()`:返回当前日期。`current_date()``current_date`select curdate();select current_date();select current_date;4. `curtime()`:返回当前时间。`current_time()``current_time`select current_time();select curtime();select current_time;5. `datediff(end_date, start_date)`:计算两个日期之间的天数差。
mysql> SELECT DATEDIFF('2024-03-01', '2024-02-01');
+--------------------------------------+
| DATEDIFF('2024-03-01', '2024-02-01') |
+--------------------------------------+
| 29 |
+--------------------------------------+6. `week(date[, mode])`:返回日期所在年的第几周。
mysql> SELECT WEEK('2024-02-26');
+--------------------+
| WEEK('2024-02-26') |
+--------------------+
| 8 |
+--------------------+7. `date(字段)` 函数用于提取日期或日期/时间表达式的日期部分。它返回一个日期值,时间部分被截断为零。`DATE()` 例如,假设有一个包含日期和时间的字段 `datetime_field`,您可以使用 `DATE()` 函数来提取其日期部分:SELECT date(datetime_field) FROM your_table;这将返回 `datetime_field` 的日期部分,时间部分将被截断为零。8. `time(字段)`函数用于提取日期或日期/时间表达式的时间部分。它返回一个时间值。9. `month(字段)`获取月份
mysql> select month('2023-01-01');
+---------------------+
| month('2023-01-01') |
+---------------------+
| 1 |
+---------------------+10. `monthname()`获取指定曰期对应的月份的英文名称
mysql> select monthname('2023-01-01');
+-------------------------+
| monthname('2023-01-01') |
+-------------------------+
| January |
+-------------------------+11. `dayname()`获取指定曰期对应的星期几的英文名称
mysql> select dayname('2023-01-01');
+-----------------------+
| dayname('2023-01-01') |
+-----------------------+
| Sunday |
+-----------------------+
12. `year()`获取年份
mysql> select year('2023-01-01');
+--------------------+
| year('2023-01-01') |
+--------------------+
| 2023 |
+--------------------+
13 `month(字段)`获取月份
mysql> select month('2023-01-01');
+---------------------+
| month('2023-01-01') |
+---------------------+
| 1 |
+---------------------+
13. `day()`获取日分
mysql> select day('2023-01-01');
+-------------------+
| day('2023-01-01') |
+-------------------+
| 1 |
+-------------------+
14. `dayofyear()`获取指定曰期是一年中的第几天,返回值范围是1~366
mysql> select dayofyear('2023-12-12');
+-------------------------+
| dayofyear('2023-12-12') |
+-------------------------+
| 346 |
+-------------------------+
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2024-02-26 21:45:46 |
+---------------------+mysql> select year(now());
+-------------+
| year(now()) |
+-------------+
| 2024 |
+-------------+mysql> select month(now());
+--------------+
| month(now()) |
+--------------+
| 2 |
+--------------+mysql> select day(now());
+------------+
| day(now()) |
+------------+
| 26 |
+------------+
流程控制函数
在 MySQL 中,有一些流程控制函数可以帮助您在查询中实现条件逻辑和控制流程。以下是一些常用的流程控制函数及其用法:
IF(condition, true_value, false_value)
:根据条件返回不同的值。
mysql> SELECT IF(1 < 2, 'true', 'false');
+----------------------------+
| IF(1 < 2, 'true', 'false') |
+----------------------------+
| true |
+----------------------------+mysql> SELECT IF(2 < 1, 'true', 'false');
+--------------------------+
| IF(2<1, 'true', 'false') |
+--------------------------+
| false |
+--------------------------+
-
CASE
:类似于 switch 语句,根据不同的条件返回不同的值。SELECT CASE WHEN score >= 90 THEN 'A'WHEN score >= 80 THEN 'B'WHEN score >= 70 THEN 'C'ELSE 'D'END AS grade FROM students;
-
coalesce(val1, val2, ...)
:返回参数列表中第一个非空值。
mysql> SELECT COALESCE(NULL, 'default');
+---------------------------+
| COALESCE(NULL, 'default') |
+---------------------------+
| default |
+---------------------------+mysql> SELECT COALESCE(NULL,'dsfa' ,'default');
+----------------------------------+
| COALESCE(NULL,'dsfa' ,'default') |
+----------------------------------+
| dsfa |
+----------------------------------+
NULLIF(val1, val2)
:如果两个值相等,则返回 NULL;否则返回第一个值。
mysql> SELECT NULLIF(5, 5);
+--------------+
| NULLIF(5, 5) |
+--------------+
| NULL |
+--------------+
IFNULL(val1, val2)
:如果第一个值不为 NULL,则返回第一个值;否则返回第二个值。
mysql> SELECT IFNULL(NULL, 'default');
+-------------------------+
| IFNULL(NULL, 'default') |
+-------------------------+
| default |
+-------------------------+
这些函数可以帮助您在 MySQL 查询中实现复杂的逻辑和条件控制。
case用法
CASE
表达式是 MySQL 中用于实现条件逻辑的强大工具,类似于其他编程语言中的 switch
语句。它允许您根据不同的条件返回不同的值。CASE
表达式有两种形式:简单形式和搜索形式。
-
简单形式:
case expression或字段when value1 then result1when value2 then result2...else default_result end
在简单形式中,
expression
或字段的值与value1
、value2
等进行比较,如果匹配则返回相应的result
,如果没有匹配项则返回default_result
。例如,以下查询根据成绩返回等级:
SELECTCASEWHEN score >= 90 THEN 'A'WHEN score >= 80 THEN 'B'WHEN score >= 70 THEN 'C'ELSE 'D'END AS grade FROMstudent_scores;
-
搜索形式:
CASEWHEN condition1 THEN result1WHEN condition2 THEN result2...ELSE default_result END
在搜索形式中,每个
WHEN
子句都有一个条件,如果条件为真,则返回相应的result
,否则继续检查下一个WHEN
子句。例如,以下查询根据人口数量返回城市规模:
SELECTcity_name,CASEWHEN population > 1000000 THEN '大城市'WHEN population > 500000 THEN '中等城市'ELSE '小城市'END AS city_size FROMcities;
CASE
表达式可以嵌套在其他函数或表达式中,为复杂的条件逻辑提供了灵活的解决方案。
mysql> select * from employee;
+------+-----------+-----------------+--------+-------+--------+
| id | name | job | salary | bonus | job_id |
+------+-----------+-----------------+--------+-------+--------+
| 101 | 麦当 | 后端研发 | 25000 | 5000 | 1003 |
| 102 | 咕咚 | 网络运维 | 15000 | 3000 | 1003 |
| 103 | 迪亚 | 测试工程师 | 12000 | 2000 | 1003 |
| 104 | 米龙 | 后端开发 | 20000 | 3500 | 1003 |
| 105 | 极光 | 前端开发 | 15000 | 2500 | 1003 |
| 106 | 村长 | 人力资源 | 10000 | 500 | 1001 |
| 107 | 五条人 | 销售工程师 | 14000 | 7000 | 1002 |
| 108 | 皇帝 | 董事长 | 30000 | 10000 | 1004 |
+------+-----------+-----------------+--------+-------+--------+mysql> select salary 旧工资,-> case id-> when 101 then salary*2-> when 103 then salary-100-> else salary-> end 新工资-> from employee;
+-----------+-----------+
| 旧工资 | 新工资 |
+-----------+-----------+
| 25000 | 50000 |
| 15000 | 15000 |
| 12000 | 11900 |
| 20000 | 20000 |
| 15000 | 15000 |
| 10000 | 10000 |
| 14000 | 14000 |
| 30000 | 30000 |
+-----------+-----------+
#注:从case到end构成一个新字段#当遇到id值为101的时候,将其对应的salary值*2,当遇到id值为103的时候,将其对应的salary-100,其余情况的id值salary值不变
mysql> select salary 旧工资,-> case id-> when 101 then salary*2-> when 103 then salary-100-> else salary-> end 新工资,-> name-> from employee;
+-----------+-----------+-----------+
| 旧工资 | 新工资 | name |
+-----------+-----------+-----------+
| 25000 | 50000 | 麦当 |
| 15000 | 15000 | 咕咚 |
| 12000 | 11900 | 迪亚 |
| 20000 | 20000 | 米龙 |
| 15000 | 15000 | 极光 |
| 10000 | 10000 | 村长 |
| 14000 | 14000 | 五条人 |
| 30000 | 30000 | 皇帝 |
+-----------+-----------+-----------+
mysql> select * from employee;
+------+-----------+-----------------+--------+-------+--------+
| id | name | job | salary | bonus | job_id |
+------+-----------+-----------------+--------+-------+--------+
| 101 | 麦当 | 后端研发 | 25000 | 5000 | 1003 |
| 102 | 咕咚 | 网络运维 | 15000 | 3000 | 1003 |
| 103 | 迪亚 | 测试工程师 | 12000 | 2000 | 1003 |
| 104 | 米龙 | 后端开发 | 20000 | 3500 | 1003 |
| 105 | 极光 | 前端开发 | 15000 | 2500 | 1003 |
| 106 | 村长 | 人力资源 | 10000 | 500 | 1001 |
| 107 | 五条人 | 销售工程师 | 14000 | 7000 | 1002 |
| 108 | 皇帝 | 董事长 | 30000 | 10000 | 1004 |
+------+-----------+-----------------+--------+-------+--------+#salary在20000以上为高工资,在13000-20000之间为中等工资,在13000之下为低等工资
mysql> select name,-> case-> when salary > 20000 then '高工资'-> when salary < 13000 then '低工资'-> else '中等工资'-> end 工资等级-> from employee;
+-----------+--------------+
| name | 工资等级 |
+-----------+--------------+
| 麦当 | 高工资 |
| 咕咚 | 中等工资 |
| 迪亚 | 低工资 |
| 米龙 | 中等工资 |
| 极光 | 中等工资 |
| 村长 | 低工资 |
| 五条人 | 中等工资 |
| 皇帝 | 高工资 |
+-----------+--------------+
#注:从case到end构成一个新字段