函数
函数: 把经常使用的代码封装起来
和Java中的方法有所不同,不同点在于:MySQL中的函数必须有返回值(相较于存储过程而言),参数可以有可以没有。
- 单行函数:进来时一个参数,出去时也是一个参数。比如四舍五入函数。单行函数是可以嵌套的。
- 聚合函数(分组函数):进来时多个函数,出去时只有一个。比如求和,最大值函数。
数值函数
函数 | 用法 |
ABS(x) | 返回x的绝对值 |
CEIL(x) | 返回大于x的最小整数值 |
FLOOR(x) | 返回小于x的最大整数值 |
MOD(x,y) | 返回x/y的模 |
RAND() | 返回0~1的随机值 |
ROUND(x,y) | 返回参数x的四舍五入的有y位的小数的值 |
TRUNCATE(x,y) | 返回数字x截断为y位小数的结果 |
FORMAT(x,y) | 强制保留小数点后y位,整数部分超过三位的时候以逗号分割,并且返回的结果是文本类型的 |
SQRT(x) | 返回x的平方根 |
POW(x,y) | 返回x的y次方 |
CEIL是天花板函数,FLOOR是地板函数。MOD是取余。
SELECT FLOOR(32.32),FLOOR(-43.23),CEIL(32.32),CEIL(-43.23),MOD(12,5);
随机数函数 RAND
因子(x)一样的话,随机数结果也是一样的。
SELECT RAND(),RAND(),RAND(10),RAND(10),RAND(-1),RAND(-1);
四舍五入函数 ROUND
-- ROUND(X) 对X四舍五入后。最接近X的整数 默认情况舍掉小数位
SELECT ROUND (123.556),ROUND(123.456),ROUND(123.456,0);
-- ROUND(X,Y) 对X值四舍五入后,保留小数点后Y位
SELECT ROUND (123.456,0), ROUND (123.456,1), ROUND (123.456,-1);
截断函数 TRUNCATE
-- 不再像round那样考虑四舍五入,而是直接舍掉
SELECT TRUNCATE(123.456,0),TRUNCATE(123.456,1),TRUNCATE(123.456,-1);
字符串函数
length计算字节数,charLength是计算字符数。
CHAR_LENGTH(s) | 返回字符串s的字符数 |
LENGTH(s) | 返回字符串s的字节数,和字符集有关 |
utf8每一个汉字占三个字节(UTF-8需要使用三个字节去表示一个非ANSI字符)
concat,(用于字符串拼接)
CONCAT(S1,S2,……Sn) | 连接S1,S2,……Sn为一个字符串 |
CONCAT_WS(s,S1,S2,……Sn) | 同CONCAT(S1,S2,…)函数,但每个字符串之间要加上s |
如要求结果显示为 xxx worked for yyy
concat_ws
CONCAT_WS(s,S1,S2,……Sn) | 同CONCAT(S1,S2,…)函数,但每个字符串之间要加上s |
如下图: 指定用短横线连接字符串
SELECT CONCAT_WS('-','蛊','真','人') FROM DUAL
insert(插入替换)
字符串索引从1开始
INSERT(str,index,len,instr) | 将字符串str从index位置开始,len个字符长的子串替换为字符串instr |
SELECT INSERT ('AABBCCDD',2,6,'bc') FROM DUAL
instr函数
语法:instr(str,substr)
解释:返回目标字符串substr在字符串集str中第一次出现的位置
SELECT INSTR('Hello World','World');
==
locate()函数
locate(substr,str)
SELECT LOCATE('World','Hello World');
解释:返回目标字符串substr在字符串集str中第一次出现的位置
locate(substr,str,pos)
返回目标字符串substr在字符串集str的截取范围为从第pos位到字符串末尾是否出现,以及在整个str中第一次出现的位置,若未出现,则返回0
====
position 函数
语法:position(substr in str)
解释:返回字符串substr在str中第一次出现的位置
SELECT POSITION('World' IN 'Hello World');
与substr()函数搭配使用,--判断字符串出现的位置,然后截取固定的长度
与reverse()函数搭配使用,若想截取最后出现的位置,需要结合reverse()函数
TRIM大家族
TRIM(s) | 去掉字符串s开始与结尾的空格 |
SELECT TRIM(' hello world '); #默认是去掉前后空白符
日期时间函数
CURDATE()或CURRENT_DATE() | 返回当前系统日期 |
CURTIME()或CURRENT_TIME() | 返回当前系统时间 |
NOW()/SYSDATE()/CURRENT_TIMESTAMP()/ LOCALTIME()/LOCALTIMESTAMP() | 返回当前系统日期时间 |
获取当前系统日期
-- 获取当前系统日期
SELECT CURDATE(),CURRENT_DATE();
获取当前系统时间
#获取当前系统时间
SELECT CURTIME(),CURRENT_TIME();
获取系统日期时间值
#获取系统日期时间值。CURRENT_TIMESTAMP()、LOCALTIME()、SYSDATE()和NOW()
SELECT CURRENT_TIMESTAMP(),LOCALTIME(),SYSDATE(),NOW();
获取具体的时间值,比如年、月、日、时、分、秒。
#获取具体的时间值,比如年、月、日、时、分、秒。
#分别是YEAR(date)、MONTH(date)、DAY(date)、HOUR(time)、MINUTE(time)、SECOND(time)。
SELECT YEAR(CURDATE()),MONTH(CURDATE()),DAY(CURDATE());
SELECT HOUR(CURTIME()),MINUTE(CURTIME()),SECOND(CURTIME());
聚合/分组函数
聚合函数作用于一组数据,并对一组数据返回一个值。
常见的聚合函数:SUM,AVG, COUNT, MAX, MIN
COUNT(*) 和COUNT(1) 是一样的,可以用来计算表中有多少条记录,不管是不是NULL值都计算在内。
COUNT(具体字段) ,计算指定字段出现的个数时,是会忽略null值的
SUM计算总和的时候,也是自动把Null值过滤掉的
AVG()只能用来确定特定数值列的平均值,会忽略值为NULL的行
// 查询员工表的平均工资和工资总额
AVG()和SUM()只适用于数值类型的字段
SELECT AVG(salary),SUM(salary) FROM employees;
// 查询员工表的最大工资和最低工资
MAX()和MIN()适用于数值类型、字符串类型、日期类型的字段
SELECT MAX(salary),MIN(salary) FROM employees;
//COUNT 作用:计算指定字段在查询结构中出现的个数
//count(1)把整个一条数据拿1去充当
SELECT COUNT(employee_id),COUNT(salary),COUNT(1) FROM employees;
面试题:统计表中的记录数,使用COUNT(*)、COUNT(1)、COUNT(具体字段),哪个效率更高?
- 如果使用的是MyISAM存储引擎,则三者效率相同,都是O(1)
- 如果使用的是InnoDB存储引擎,则三者效率:COUNT(*)=COUNT(1) > COUNT(字段)
MySQL视图
- 简化查询
- 减少数据冗余
视图缺点:视图的维护成本高,特别是嵌套的视图。
1、创建视图
视图就是存储起来的select语句
创建单表视图
CREATE VIEW anchor_view AS SELECT * FROM anchor WHERE id in (8,9,10);
1.查询语句中字段的别名会作为视图中字段
2.视图中的字段在基表中可能没有对应的字段 如:AVG(salary)avg_sal
2、查看视图
查看视图的结构
DESC anchor_view;
查看视图的定义信息
SHOW CREATE VIEW anchor_view;
3、视图更新
这个更新,是指”增删改“
有些情况是不可以做更新操作的:
总结:
视图作为虚拟表,主要用于方便查询,不建议更新视图的数据。对视图数据的更改,都是通过对实际表里数据的操作来完成的