赞
踩
目录
聚集函数一般用作统计
- count([distinct]\*) 统计所有的行数(distinct 表示去重再统计,下同)
- sum([distinct]列名) 求一列的和(注意必须是数字类型的)
- avg([distinct]列名) 求一列的平均值(注意必须是数字类型)
- max([distinct]列名) 求一列的最大值
- min([distinct]列名) 求一列的最小值
例子
SELECT COUNT(*) FROM student
SELECT SUM(sid) FROM student
可以使用字符串函数来快速处理字符串
- substring(字符串, 起始位置, 结束位置) 注意下标是从 1 开始,下同
- length(字符串) 获取字符串长度(注意如果使用的是 UTF-8 编码格式,那么一个汉字占 3 字节,数字和字母占一个字节)
- left(字符串, 长度) 从最左边向右截取字符串
- right(字符串, 长度) 从最右边向左截取字符串
- upper(字符串) 字符串中的所有字母转换为大写字母
- lower(字符串) 字符串中的所有字母转换为小写字母
- replace(字符串, 原文, 替换文) 同 Java 中 String 的 replace 效果
SELECT LEFT(name, 1) FROM student
SELECT SUBSTRING(name, 2, 2) FROM student
SELECT UPPER('abcdfg')
SELECT REPLACE(`name`, '小', '大') FROM student
字符串也支持进行拼接,系统提供了字符串的拼接函数
- concat(字符串 1, 字符串 2) 连接两个字符串
SELECT concat(name, '子') FROM student
快速将日期向前移动
单位有:year(年)、month(月)、day(日)、hour(小时)、minute(分钟)、second(秒)
- date_add(日期, interval 增量 单位)
SELECT DATE_ADD('2022-1-1',INTERVAL 5 day)
SELECT DATE_ADD('2022-1-1',INTERVAL -1 year)
快速计算日期的间隔天数
- datediff(日期 1, 日期 2)
SELECT DATEDIFF('2022-3-1','2022-2-1')
快速获取当前时间
- curdate() 当前的日期
- curtime() 当前的时间
- now() 当前的日期+时间
也可以单独获取时间中的某个值
- day(日期) 获取日期是几号
- month(日期) 获取日期是几月
- year(日期) 获取日期是哪一年
SELECT DAY(NOW())
数学函数比较常规,基本与 Java 的 Math 工具类一致
- abs(x) 求 x 的绝对值
- ceiling(x) x 向上取整
- floor(x) x 向下取整
- round(x, 精度) x 取四舍五入,遵循小数点精度
- exp(x) e 的 x 次方
- rand() 0-1 之间的随机数
- log(x) x 的对数
- pi() π
- power(x, n) x 的 n 次方
- sqrt(x) x 的平方根
- sin(x) cos(x) tan(x) 三角函数
MySQL 的类型转换也分为隐式类型转换和显示类型转换
SELECT CONCAT(1, '2')
SELECT 1+'2'
这里会产生隐式转换,第一个数字转换成字符串,第二个是字符串转换成数字
需要使用强制类型转换时就需要用到类型转换函数了
- cast(数据 as 数据类型)
convert 函数
数据类型
- BINARY[(N)] :二进制字符串,转换后长度小于 N 个字节
- CHAR[(N)] :字符串,转换后长度小于 N 个字符
- DATE :日期
- DATETIME :日期时间
- DECIMAL[(M[,N])] :浮点数,M 为数字总位数(包括整数部分和小数部分),N 为小数点后的位数
- SIGNED [INTEGER] :有符号整数
- TIME :时间
- UNSIGNED [INTEGER] :无符号整数
SELECT CAST(pi() AS SIGNED)
将字符串转换为数字,会自动进行扫描,一旦遇到非数字的字符,会停止扫描
SELECT CAST('123abc456' as SIGNED) -->123
- if(条件表达式, 结果 1, 结果 2) 与 Java 中的三目运算符一致 a > b ? "AAA" : "BBB"
- ifnull(值 1, 值 2) 如果值 1 为 NULL 则返回值 2,否则返回值 1
- nullif(值 1, 值 2) 如果值 1 与值 2 相等,那么返回 NULL
- isnull(值) 判断值是否为 NULL
还有一个类似于 Java 中的 Thread.sleep 的函数,以秒为单位
SELECT sleep(10);
mysql可以自定义函数,并使用自定义的函数进行数据处理,唯一比较麻烦的就是函数定义后不能修改,只能删了重新写
在定义函数之前记得定义结束符号
delimiter $$
deleimiter ;
一般形式
- create function 函数名称([参数列表]) returns 返回值类型
- begin 和 end 之间写函数的其他逻辑,begin 和 end 就相当于 Java 中的花括号`{ ... }`
- return 后紧跟返回的结果
CREATE FUNCTION test(i int) RETURNS INT
BEGIN
RETURN i;
END
定义一个局部变量
- declare 变量名称 变量类型 [, ...]
- declare 变量名称 变量类型 default 默认值
- set 变量名称 = 值
BEGIN
DECLARE a INT;
SET a = 10;
RETURN a;
END
在函数内部使用`select`语句,它可以直接从表中读取数据,并可以结合 into 关键字将查询结果赋值给变量
BEGIN
DECLARE a INT;
-- select into from 语句
SELECT COUNT(*) INTO a FROM student;
RETURN a;
END
IF 分支语句的格式为:
- if 判断条件 then ... else if 判断条件 then .... else ... end if;
BEGIN
DECLARE a INT DEFAULT 10;
IF a > 10 THEN
RETURN 1;
ELSE
RETURN 2;
END IF;
END
可以结合`exists`关键字来判断是否为 NULL
BEGIN
DECLARE a INT DEFAULT 0;
-- IF EXISTS(SELECT * FROM student WHERE sid = 100) THEN
IF NOT EXISTS(SELECT * FROM student WHERE sid = 100) THEN
SET a = 10;
END IF;
RETURN a;
END
使用 switch 语句,与 Java 不同的是,它支持使用布尔表达式
- case 变量 when 具体值或是布尔表达式 then ... when \* then ... else ... end case;
BEGIN
DECLARE a INT DEFAULT 10;
CASE
WHEN 1 < 5 THEN
SET a = 5;
ELSE
SET a = 10;
END CASE;
RETURN a;
END
MySQL 提供了三种循环语句
WHILE 语句
- while 循环条件 do ... end while;
LOOP 循环(类似于 Java 中的 goto 写法)
- 循环名称 loop ...(可以插入 leave 语句结束) end loop 循环名称;
repeat 语句
- repeat ... until 结束循环条件 end repeat;
可以直接在一次会话中直接定义变量并使用,这时它并不是位于函数内的,这就是全局变量,它无需预先定义,直接使用即可
set @x = 10;
系统默认也有很多的变量,自己定义的变量称为用户变量,系统默认变量称为系统变量
查看系统变量
show GLOBAL VARIABLES
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。