函数

函数: 把经常使用的代码封装起来

和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);

mysql里float数据类型 mysql中floor函数_mysql


 随机数函数 RAND

mysql里float数据类型 mysql中floor函数_mysql_02

因子(x)一样的话,随机数结果也是一样的。

SELECT RAND(),RAND(),RAND(10),RAND(10),RAND(-1),RAND(-1);

mysql里float数据类型 mysql中floor函数_字符串_03


 四舍五入函数 ROUND

mysql里float数据类型 mysql中floor函数_database_04

-- ROUND(X) 对X四舍五入后。最接近X的整数    默认情况舍掉小数位
SELECT ROUND (123.556),ROUND(123.456),ROUND(123.456,0);

mysql里float数据类型 mysql中floor函数_database_05

-- ROUND(X,Y) 对X值四舍五入后,保留小数点后Y位 
SELECT ROUND (123.456,0), ROUND (123.456,1), ROUND (123.456,-1);

mysql里float数据类型 mysql中floor函数_数据库_06


 截断函数 TRUNCATE

mysql里float数据类型 mysql中floor函数_database_07

-- 不再像round那样考虑四舍五入,而是直接舍掉
SELECT TRUNCATE(123.456,0),TRUNCATE(123.456,1),TRUNCATE(123.456,-1);

mysql里float数据类型 mysql中floor函数_数据库_08


字符串函数

length计算字节数,charLength是计算字符数。

CHAR_LENGTH(s)

返回字符串s的字符数

LENGTH(s)

返回字符串s的字节数,和字符集有关

utf8每一个汉字占三个字节(UTF-8需要使用三个字节去表示一个非ANSI字符)

mysql里float数据类型 mysql中floor函数_mysql里float数据类型_09


 concat,(用于字符串拼接) 

CONCAT(S1,S2,……Sn)

连接S1,S2,……Sn为一个字符串

CONCAT_WS(s,S1,S2,……Sn)

同CONCAT(S1,S2,…)函数,但每个字符串之间要加上s

如要求结果显示为 xxx worked for yyy

mysql里float数据类型 mysql中floor函数_mysql里float数据类型_10


concat_ws 

CONCAT_WS(s,S1,S2,……Sn)

同CONCAT(S1,S2,…)函数,但每个字符串之间要加上s

如下图: 指定用短横线连接字符串

SELECT CONCAT_WS('-','蛊','真','人') FROM DUAL

mysql里float数据类型 mysql中floor函数_数据库_11


 insert(插入替换)

 字符串索引从1开始

INSERT(str,index,len,instr)

将字符串str从index位置开始,len个字符长的子串替换为字符串instr

SELECT INSERT ('AABBCCDD',2,6,'bc') FROM DUAL

mysql里float数据类型 mysql中floor函数_mysql里float数据类型_12


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   '); #默认是去掉前后空白符

mysql里float数据类型 mysql中floor函数_字符串_13


日期时间函数

CURDATE()或CURRENT_DATE()

返回当前系统日期

CURTIME()或CURRENT_TIME()

返回当前系统时间

NOW()/SYSDATE()/CURRENT_TIMESTAMP()/ LOCALTIME()/LOCALTIMESTAMP()

返回当前系统日期时间


获取当前系统日期

-- 获取当前系统日期
SELECT CURDATE(),CURRENT_DATE();

mysql里float数据类型 mysql中floor函数_字符串_14


获取当前系统时间

#获取当前系统时间
SELECT CURTIME(),CURRENT_TIME();

mysql里float数据类型 mysql中floor函数_database_15


 获取系统日期时间值

#获取系统日期时间值。CURRENT_TIMESTAMP()、LOCALTIME()、SYSDATE()和NOW()
SELECT CURRENT_TIMESTAMP(),LOCALTIME(),SYSDATE(),NOW();

mysql里float数据类型 mysql中floor函数_字符串_16


获取具体的时间值,比如年、月、日、时、分、秒。

#获取具体的时间值,比如年、月、日、时、分、秒。
#分别是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());

mysql里float数据类型 mysql中floor函数_数据库_17

mysql里float数据类型 mysql中floor函数_数据库_18


聚合/分组函数

聚合函数作用于一组数据,并对一组数据返回一个值。

常见的聚合函数: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(具体字段),哪个效率更高?

  1. 如果使用的是MyISAM存储引擎,则三者效率相同,都是O(1)
  2. 如果使用的是InnoDB存储引擎,则三者效率:COUNT(*)=COUNT(1) > COUNT(字段)

MySQL视图

  1. 简化查询
  2. 减少数据冗余

视图缺点:视图的维护成本高,特别是嵌套的视图。

1、创建视图

视图就是存储起来的select语句

mysql里float数据类型 mysql中floor函数_mysql_19

创建单表视图


CREATE VIEW anchor_view AS SELECT * FROM anchor WHERE id in (8,9,10);

1.查询语句中字段的别名会作为视图中字段

2.视图中的字段在基表中可能没有对应的字段 如:AVG(salary)avg_sal


2、查看视图

查看视图的结构

DESC anchor_view;

mysql里float数据类型 mysql中floor函数_数据库_20

查看视图的定义信息

SHOW CREATE VIEW anchor_view;

mysql里float数据类型 mysql中floor函数_数据库_21


3、视图更新

这个更新,是指”增删改“

mysql里float数据类型 mysql中floor函数_database_22

有些情况是不可以做更新操作的:

mysql里float数据类型 mysql中floor函数_mysql里float数据类型_23

总结:

视图作为虚拟表,主要用于方便查询,不建议更新视图的数据。对视图数据的更改,都是通过对实际表里数据的操作来完成的


 4、修改视图

mysql里float数据类型 mysql中floor函数_字符串_24


5、删除视图 

mysql里float数据类型 mysql中floor函数_mysql_25