欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Mysql

程序员文章站 2024-01-11 17:13:16
...

1、索引

(1)、创建索引

CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name

[USING index_type]

ON tbl_name(index_col_name,...)  
index_col_name : column_name[(length)][ASC | DESC]

示例 : 为city表中的city_name字段创建索引 ;

Mysql

复合索引

CREATE INDEX idx_name_email_status ON tb_seller(NAME,email,STATUS);

就相当于
对name 创建索引 ;
对name , email 创建了索引 ;
对name , email, status 创建了索引 ;

、查看索引

show index from table_name;

示例:查看city表中的索引信息;

Mysql

、删除索引

DROP INDEX index_name ON tbl_name;

示例 : 想要删除city表上的索引idx_city_name,可以操作如下:

Mysql

、ALTER命令

1). alter table tb_name add primary key(column_list);
该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL
2). alter table tb_name add unique index_name(column_list);
这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)
3). alter table tb_name add index index_name(column_list);
添加普通索引, 索引值可以出现多次。
4). alter table tb_name add fulltext index_name(column_list);
该语句指定了索引为FULLTEXT, 用于全文索引

2、视图

视图(View)是一种虚拟存在的表。视图并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。通俗的讲,视图就是一条SELECT语句执行后返回的结果集。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。

(1)、创建视图

CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]  
VIEW view_name [(column_list)]  
AS select_statement  
[WITH [CASCADED | LOCAL] CHECK OPTION]

(2)、修改视图

ALTER [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]  
VIEW view_name [(column_list)]  
AS select_statement  
[WITH [CASCADED | LOCAL] CHECK OPTION]

选项 :
WITH [CASCADED | LOCAL] CHECK OPTION
决定了是否允许更新数据使记录不再满足视图的条件。
LOCAL : 只要满足本视图的条件就可以更新。
CASCADED : 必须满足所有针对该视图的所有视图的条件才可以更新。 默认值.

示例 , 创建city_country_view视图 , 执行如下SQL :

create or replace view city_country_view  
as  
select t.*,c.country_name from country c , city t where c.country_id =
t.country_id;

查询视图 :

Mysql

(3)、查看视图

从 MySQL 5.1 版本开始,使用 SHOW TABLES
命令的时候不仅显示表的名字,同时也会显示视图的名字,而不存在单独显示视图的 SHOW
VIEWS 命令。 同样,在使用 SHOW TABLE STATUS
命令的时候,不但可以显示表的信息,同时也可以显示视图的信息。
如果需要查询某个视图的定义,可以使用 SHOW CREATE VIEW 命令进行查看 。

(4)、删除视图

DROP VIEW [IF EXISTS] view_name [, view_name] ...[RESTRICT | CASCADE]

示例 , 删除视图city_country_view :

DROP VIEW city_country_view ;

存储过程和函数

存储过程和函数是 事先经过编译并存储在数据库中的一段 SQL
语句的集合,调用存储过程和函数可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。存储过程和函数的区别在于函数必须有返回值,而存储过程没有。

、创建存储过程

CREATE PROCEDURE procedure_name ([proc_parameter[,...]])  
begin  
-- SQL语句  
end ;

示例 :

delimiter $  
create procedure pro_test1()  
begin  
select 'Hello Mysql' ;  
end$  
delimiter ;

知识小贴士
DELIMITER
该关键字用来声明SQL语句的分隔符 , 告诉 MySQL
解释器,该段命令是否已经结束了,mysql是否可以执行了。默认情况下,delimiter是分号;。在命令行客户端中,如果有一行命令以分号结束,那么回车后,mysql将会执行该命令。

、调用存储过程

call procedure_name() ;

、查看存储过程

-- 查询db_name数据库中的所有的存储过程  
select name from mysql.proc where db='db_name';  
-- 查询存储过程的状态信息  
show procedure status;  
-- 查询某个存储过程的定义  
show create procedure test.pro_test1 G;

删除存储过程

DROP PROCEDURE [IF EXISTS] sp_name ;

、变量

DECLARE

通过 DECLARE 可以定义一个局部变量,该变量的作用范围只能在 BEGIN…END 块中。

DECLARE var_name[,...] type [DEFAULT value]

示例 :

delimiter $  
create procedure pro_test2()  
begin  
declare num int default 5;  
select num+ 10;  
end$  
delimiter ;
SET

直接赋值使用 SET,可以赋常量或者赋表达式,具体语法如下:

SET var_name = expr [, var_name = expr] ...

示例 :

DELIMITER $

CREATE PROCEDURE pro_test3()

BEGIN

DECLARE NAME VARCHAR(20);

SET NAME = 'MYSQL';

SELECT NAME ;

END$

DELIMITER ;

也可以通过select … into 方式进行赋值操作 :

DELIMITER $

CREATE PROCEDURE pro_test5()

BEGIN

declare countnum int;

select count(*) into countnum from city;

select countnum;

END$

DELIMITER ;
if条件判断
if search_condition then statement_list  
[elseif search_condition then statement_list] ...  
[else statement_list]  
end if;

需求:

根据定义的身高变量,判定当前身高的所属的身材类型
180 及以上 ----------> 身材高挑
170 - 180 ---------> 标准身材
170 以下 ----------> 一般身材

示例 :

delimiter $

create procedure pro_test6()

begin

declare height int default 175;

declare description varchar(50);

if height >= 180 then

set description = '身材高挑';

elseif height >= 170 and height < 180 then

set description = '标准身材';

else

set description = '一般身材';

end if;

select description ;

end$

delimiter ;
传递参数
create procedure procedure_name([in/out/inout] 参数名 参数类型)

...

IN : 该参数可以作为输入,也就是需要调用方传入值 , 默认

OUT: 该参数作为输出,也就是该参数可以作为返回值

INOUT: 既可以作为输入参数,也可以作为输出参数

IN - 输入

需求 :

根据定义的身高变量,判定当前身高的所属的身材类型

示例 :

delimiter $  
create procedure pro_test5(in height int)  
begin  
declare description varchar(50) default '';  
if height >= 180 then  
set description='身材高挑';  
elseif height >= 170 and height < 180 then  
set description='标准身材';  
else  
set description='一般身材';  
end if;  
select concat('身高 ', height , '对应的身材类型为:',description);  
end$  
delimiter ;
OUT-输出

需求 :

根据传入的身高变量,获取当前身高的所属的身材类型

示例:

create procedure pro_test5(in height int , out description varchar(100))  
begin  
if height >= 180 then  
set description='身材高挑';  
elseif height >= 170 and height < 180 then  
set description='标准身材';  
else  
set description='一般身材';  
end if;  
end$

调用:

call pro_test5(168, @description)$  
select @description$

小知识
@description :
这种变量要在变量名称前面加上“@”符号,叫做用户会话变量,代表整个会话过程他都是有作用的,这个类似于全局变量一样。
@@global.sort_buffer_size : 这种在变量前加上 “@@” 符号, 叫做 系统变量

case结构

方式一 :

CASE case_value  
WHEN when_value THEN statement_list  
[WHEN when_value THEN statement_list] ...  
[ELSE statement_list]  
END CASE;  

方式二 :

CASE  
WHEN search_condition THEN statement_list  
[WHEN search_condition THEN statement_list] ...  
[ELSE statement_list]  
END CASE;

需求:

给定一个月份, 然后计算出所在的季度

示例 :

delimiter $  
create procedure pro_test9(month int)  
begin  
declare result varchar(20);  
case  
when month >= 1 and month <=3 then  
set result = '第一季度';  
when month >= 4 and month <=6 then  
set result = '第二季度';  
when month >= 7 and month <=9 then  
set result = '第三季度';  
when month >= 10 and month <=12 then  
set result = '第四季度';  
end case;

select concat('您输入的月份为 :', month , ' , 该月份为 : ' , result) as content
;  
end$  
delimiter ;
while循环
while search_condition do  
statement_list  
end while;

需求:

计算从1加到n的值

示例 :

delimiter $  
create procedure pro_test8(n int)  
begin  
declare total int default 0;  
declare num int default 1;  
while num<=n do  
set total = total + num;  
set num = num + 1;  
end while;  
select total;  
end$  
delimiter ;
repeat结构

有条件的循环控制语句, 当满足条件的时候退出循环 。while 是满足条件才执行,repeat
是满足条件就退出循环。

REPEAT  
statement_list  
UNTIL search_condition  
END REPEAT;

需求:

计算从1加到n的值

示例 :

delimiter $  
create procedure pro_test10(n int)  
begin  
declare total int default 0;  
repeat  
set total = total + n;  
set n = n - 1;  
until n=0  
end repeat;  
select total ;  
end$  
delimiter ;
loop语句

LOOP 实现简单的循环,退出循环的条件需要使用其他的语句定义,通常可以使用 LEAVE
语句实现。

[begin_label:] LOOP  
statement_list  
END LOOP [end_label]

如果不在 statement_list 中增加退出循环的语句,那么 LOOP
语句可以用来实现简单的死循环。

leave语句

用来从标注的流程构造中退出,通常和 BEGIN … END
或者循环一起使用。下面是一个使用 LOOP 和 LEAVE 的简单例子。

delimiter $  
CREATE PROCEDURE pro_test11(n int)  
BEGIN  
declare total int default 0;  
ins: LOOP  
IF n <= 0 then  
leave ins;  
END IF;  
set total = total + n;  
set n = n - 1;  
END LOOP ins;  
select total;  
END$  
delimiter ;
游标/光标

游标是用来存储查询结果集的数据类型 ,
在存储过程和函数中可以使用光标对结果集进行循环的处理。光标的使用包括光标的声明、OPEN、FETCH
和 CLOSE。

DECLARE cursor_name CURSOR FOR select_statement ;

OPEN 光标:

OPEN cursor_name ;

FETCH 光标:

FETCH cursor_name INTO var_name [, var_name] ...

CLOSE 光标:

CLOSE cursor_name ;

示例 :

初始化脚本:

create table emp(  
id int(11) not null auto_increment ,  
name varchar(50) not null comment '姓名',  
age int(11) comment '年龄',  
salary int(11) comment '薪水',  
primary key(`id`)  
)engine=innodb default charset=utf8 ;  
insert into emp(id,name,age,salary)
values(null,'金毛狮王',55,3800),(null,'白眉鹰  
王',60,4000),(null,'青翼蝠王',38,2800),(null,'紫衫龙王',42,1800);

-- 查询emp表中数据, 并逐行获取进行展示  
create procedure pro_test11()  
begin  
declare e_id int(11);  
declare e_name varchar(50);  
declare e_age int(11);  
declare e_salary int(11);  
declare emp_result cursor for select * from emp;  
open emp_result;  
fetch emp_result into e_id,e_name,e_age,e_salary;  
select concat('id=',e_id , ', name=',e_name, ', age=', e_age, ', 薪资为:  
',e_salary);  
fetch emp_result into e_id,e_name,e_age,e_salary;  
select concat('id=',e_id , ', name=',e_name, ', age=', e_age, ', 薪资为:  
',e_salary);  
fetch emp_result into e_id,e_name,e_age,e_salary;  
select concat('id=',e_id , ', name=',e_name, ', age=', e_age, ', 薪资为:  
',e_salary);  
fetch emp_result into e_id,e_name,e_age,e_salary;  
select concat('id=',e_id , ', name=',e_name, ', age=', e_age, ', 薪资为:  
',e_salary);  
fetch emp_result into e_id,e_name,e_age,e_salary;  
select concat('id=',e_id , ', name=',e_name, ', age=', e_age, ', 薪资为:  
',e_salary);  
close emp_result;  
end$

通过循环结构 , 获取游标中的数据 :

DELIMITER $  
create procedure pro_test12()  
begin  
DECLARE id int(11);  
DECLARE name varchar(50);  
DECLARE age int(11);  
DECLARE salary int(11);  
DECLARE has_data int default 1;  
DECLARE emp_result CURSOR FOR select * from emp;  
DECLARE EXIT HANDLER FOR NOT FOUND set has_data = 0;  
open emp_result;  
repeat  
fetch emp_result into id , name , age , salary;  
select concat('id为',id, ', name 为' ,name , ', age为 ' ,age , ', 薪水为: ',  
salary);  
until has_data = 0  
end repeat;  
close emp_result;  
end$  
DELIMITER ;

存储函数

CREATE FUNCTION function_name([param type ... ])  
RETURNS type  
BEGIN  
...  
END;

案例 :
定义一个存储过程, 请求满足条件的总记录数 ;

delimiter $  
create function count_city(countryId int)  
returns int  
begin  
declare cnum int ;

select count(*) into cnum from city where country_id = countryId;  
return cnum;  
end$  
delimiter ;

调用:

select count_city(1);  
select count_city(2);

触发器

触发器是与表有关的数据库对象,指在 insert/update/delete
之前或之后,触发并执行触发器中定义的SQL语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性
, 日志记录 , 数据校验等操作 。
使用别名 OLD 和 NEW
来引用触发器中发生变化的记录内容,这与其他的数据库是相似的。现在触发器还只支持行级触发,不支持语句级触发。

触发器类型 NEW 和 OLD的使用
INSERT 型触发器 NEW 表示将要或者已经新增的数据
UPDATE 型触发器 OLD 表示修改之前的数据 , NEW 表示将要或已经修改后的数据
DELETE 型触发器 OLD 表示将要或者已经删除的数据

、创建触发器

create trigger trigger_name  
before/after insert/update/delete  
on tbl_name  
[ for each row ] -- 行级触发器  
begin  
trigger_stmt ;  
end;

示例
需求

通过触发器记录 emp 表的数据变更日志 , 包含增加, 修改 , 删除 ;

首先创建一张日志表 :

create table emp_logs(  
id int(11) not null auto_increment,  
operation varchar(20) not null comment '操作类型, insert/update/delete',  
operate_time datetime not null comment '操作时间',  
operate_id int(11) not null comment '操作表的ID',  
operate_params varchar(500) comment '操作参数',  
primary key(`id`)  
)engine=innodb default charset=utf8;

创建 insert 型触发器,完成插入数据时的日志记录 :

DELIMITER $  
create trigger emp_logs_insert_trigger  
after insert  
on emp  
for each row  
begin  
insert into emp_logs (id,operation,operate_time,operate_id,operate_params)  
values(null,'insert',now(),new.id,concat('插入后(id:',new.id,',
name:',new.name,',  
age:',new.age,', salary:',new.salary,')'));  
end $  
DELIMITER ;

创建 update 型触发器,完成更新数据时的日志记录 :

DELIMITER $  
create trigger emp_logs_update_trigger  
after update  
on emp  
for each row  
begin  
insert into emp_logs (id,operation,operate_time,operate_id,operate_params)  
values(null,'update',now(),new.id,concat('修改前(id:',old.id,',
name:',old.name,',  
age:',old.age,', salary:',old.salary,') , 修改后(id',new.id, 'name:',new.name,',  
age:',new.age,', salary:',new.salary,')'));  
end $  
DELIMITER ;

创建delete 行的触发器 , 完成删除数据时的日志记录 :

DELIMITER $  
create trigger emp_logs_delete_trigger  
after delete  
on emp  
for each row  
begin  
insert into emp_logs (id,operation,operate_time,operate_id,operate_params)  
values(null,'delete',now(),old.id,concat('删除前(id:',old.id,',
name:',old.name,',  
age:',old.age,', salary:',old.salary,')'));  
end $  
DELIMITER ;

测试:

insert into emp(id,name,age,salary) values(null, '光明左使',30,3500);  
insert into emp(id,name,age,salary) values(null, '光明右使',33,3200);  
update emp set age = 39 where id = 3;  
delete from emp where id = 5;

、删除触发器

drop trigger [schema_name.]trigger_name

如果没有指定 schema_name,默认为当前数据库 。

、查看触发器

可以通过执行 SHOW TRIGGERS 命令查看触发器的状态、语法等信息。

show triggers ;

Mysql 优化

增加缓存层

在应用中,我们可以在应用中增加 缓存 层来达到减轻数据库负担的目的。
可以部分数据从数据库中抽取出来放到应用端以文本方式存储, 或者使用框架(Mybatis,
Hibernate)提供的一级缓存/二级缓存,或者使用redis数据库来缓存数据 。
开启Mysql的查询缓存,当执行完全相同的SQL语句的时候,服务器就会直接从缓存中读取结果,当数据被修改,
之前的缓存会失效,修改比较频繁的表不适合做查询缓存。

、主从复制

通过MySQL的主从复制,实现读写分离,使增删改操作走主节点,查询操作走从节点,从而可以降低单台服务器的读写压力。

分布式数据库架构

分布式数据库架构适合大数据量、负载高的情况,它有良好的拓展性和高可用性。通过在多台服务器之间分布数据,可以实现在多台服务器之间的负载均衡,提高访问效率。

事务

事务是由一组SQL语句组成的逻辑处理单元。

、事务ACID属性

事务具有以下4个特性,简称为事务ACID属性。

ACID属性 含义
原子性 事务是一个原子操作单元,其对数据的修改,要么全部成功,要么全部失败。
(Atomicity)
一致性 在事务开始和完成时,数据都必须保持一致状态。
(Consistent)
隔离性(Isolation) 数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的 “独立” 环境
下运行。
持久性(Durable) 事务完成之后,对于数据的修改是永久的。

(2)、并发事务处理带来的问题

问题 含义
丢失更新(Lost 当两个或多个事务选择同一行,最初的事务修改的值,会被后面的事务修改的值覆盖。
Update)
脏读(Dirty 当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据
Reads) 库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。
不可重复读(Non 一个事务在读取某些数据后的某个时间,再次读取以前读过的数据,却发现和以前
Repeatable 读出的数据不一致。
Reads)
幻读(Phantom 一个事务按照相同的查询条件重新读取以前查询过的数据,却发现其他事务插入了
Reads) 满足其查询条件的新数据。

(3)、事务隔离级别

为了解决上述提到的事务并发问题,数据库提供一定的事务隔离机制来解决这个问题。数据库的事务隔离越严格,并发副作用越小,但付出的代价也就越大,因为事务隔离实质上就是使用事务在一定程度上“串行化”
进行,这显然与“并发” 是矛盾的。
数据库的隔离级别有4个,由低到高依次为Read uncommitted、Read
committed、Repeatable
read、Serializable,这四个级别可以逐个解决脏写、脏读、不可重复读、幻读这几类问题。

隔离级别 丢失更新 脏读 不可重复读 幻读
Read uncommitted ×
Read committed × ×
Repeatable read(默认) × × ×
Serializable × × × ×

备注 : √ 代表可能出现 , × 代表不会出现 。
Mysql 的数据库的默认隔离级别为 Repeatable read , 查看方式:

show variables like 'tx_isolation';

7、锁

锁分类

从对数据操作的粒度分 :
1) 表锁:操作时,会锁定整个表。
2) 行锁:操作时,会锁定当前操作行。
从对数据操作的类型分:
1) 读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响。

  1. 写锁(排它锁):当前操作没有完成之前,它会阻断其他写锁和读锁。

(2)、InnoDB 的行锁模式

InnoDB 实现了以下两种类型的行锁。
共享锁(S):又称为读锁,简称S锁,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。
排他锁(X):又称为写锁,简称X锁,排他锁就是不能与其他锁并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改。
对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排他锁(X);
对于普通SELECT语句,InnoDB不会加任何锁;
可以通过以下语句显示给记录集加共享锁或排他锁 。

共享锁(S):SELECT * FROM table_name WHERE … LOCK IN SHARE MODE
排他锁(X) :SELECT * FROM table_name WHERE … FOR UPDATE

(3)、无索引行锁升级为表锁

如果不通过索引条件检索数据,那么InnoDB将对表中的所有记录加锁,实际效果跟表锁一样。
查看当前表的索引 :

show index from test_innodb_lock ;

、间隙锁危害

当我们用范围条件,而不是使用相等条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据进行加锁;
对于键值在条件范围内但并不存在的记录,叫做 “间隙(GAP)” , InnoDB也会对这个
“间隙” 加锁,这种锁机制就是所谓的 间隙锁(Next-Key锁) 。

、InnoDB 行锁争用情况

show status like 'innodb_row_lock%';

Innodb_row_lock_current_waits: 当前正在等待锁定的数量
Innodb_row_lock_time: 从系统启动到现在锁定总时间长度
Innodb_row_lock_time_avg:每次等待所花平均时长
Innodb_row_lock_time_max:从系统启动到现在等待最长的一次所花的时间
Innodb_row_lock_waits: 系统启动后到现在总共等待的次数
当等待的次数很高,而且每次等待的时长也不小的时候,我们就需要分析系统中为什么会有如此多的等待,然后根
据分析结果着手制定优化计划。

8、正则表达式使用

符号 含义
^ 在字符串开始处进行匹配
$ 在字符串末尾处进行匹配
. 匹配任意单个字符, 包括换行符
[…] 匹配出括号内的任意字符
[^…] 匹配不出括号内的任意字符
a* 匹配零个或者多个a(包括空串)
a+ 匹配一个或者多个a(不包括空串)
a? 匹配零个或者一个a
a1|a2 匹配a1或a2
a(m) 匹配m个a
a(m,) 至少匹配m个a
a(m,n) 匹配m个a 到 n个a
a(,n) 匹配0到n个a
(…) 将模式元素组成单一元素
select * from emp where name regexp '^T';  
select * from emp where name regexp '2$';  
select * from emp where name regexp '[uvw]';

MySQL 常用函数

、数字函数

函数名称 作 用
ABS 求绝对值
SQRT 求二次方根
MOD 求余数
CEIL 和 CEILING 两个函数功能相同,都是返回不小于参数的最小整数,即向上取整
FLOOR 向下取整,返回值转化为一个BIGINT
RAND 生成一个0~1之间的随机数,传入整数参数是,用来产生重复序列
ROUND 对所传参数进行四舍五入
SIGN 返回参数的符号
POW 和 POWER 两个函数的功能相同,都是所传参数的次方的结果值
SIN 求正弦值
ASIN 求反正弦值,与函数 SIN 互为反函数
COS 求余弦值
ACOS 求反余弦值,与函数 COS 互为反函数
TAN 求正切值
ATAN 求反正切值,与函数 TAN 互为反函数
COT 求余切值

、字符串函数

函数名称 作 用
LENGTH 计算字符串长度函数,返回字符串的字节长度
CONCAT 合并字符串函数,返回结果为连接参数产生的字符串,参数可以使一个或多个
INSERT 替换字符串函数
LOWER 将字符串中的字母转换为小写
UPPER 将字符串中的字母转换为大写
LEFT 从左侧字截取符串,返回字符串左边的若干个字符
RIGHT 从右侧字截取符串,返回字符串右边的若干个字符
TRIM 删除字符串左右两侧的空格
REPLACE 字符串替换函数,返回替换后的新字符串
SUBSTRING 截取字符串,返回从指定位置开始的指定长度的字符换
REVERSE 字符串反转(逆序)函数,返回与原始字符串顺序相反的字符串

、日期函数

函数名称 作 用
CURDATE 和 CURRENT_DATE 两个函数作用相同,返回当前系统的日期值
CURTIME 和 CURRENT_TIME 两个函数作用相同,返回当前系统的时间值
NOW 和 SYSDATE 两个函数作用相同,返回当前系统的日期和时间值
MONTH 获取指定日期中的月份
MONTHNAME 获取指定日期中的月份英文名称
DAYNAME 获取指定曰期对应的星期几的英文名称
DAYOFWEEK 获取指定日期对应的一周的索引位置值
WEEK 获取指定日期是一年中的第几周,返回值的范围是否为 0〜52 或 1〜53
DAYOFYEAR 获取指定曰期是一年中的第几天,返回值范围是1~366
DAYOFMONTH 获取指定日期是一个月中是第几天,返回值范围是1~31
YEAR 获取年份,返回值范围是 1970〜2069
TIME_TO_SEC 将时间参数转换为秒数
SEC_TO_TIME 将秒数转换为时间,与TIME_TO_SEC 互为反函数
DATE_ADD 和 ADDDATE 两个函数功能相同,都是向日期添加指定的时间间隔
DATE_SUB 和 SUBDATE 两个函数功能相同,都是向日期减去指定的时间间隔
ADDTIME 时间加法运算,在原始时间上添加指定的时间
SUBTIME 时间减法运算,在原始时间上减去指定的时间
DATEDIFF 获取两个日期之间间隔,返回参数 1 减去参数 2 的值
DATE_FORMAT 格式化指定的日期,根据参数返回指定格式的值
WEEKDAY 获取指定日期在一周内的对应的工作日索引

、聚合函数

函数名称 作用
MAX 查询指定列的最大值
MIN 查询指定列的最小值
COUNT 统计查询结果的行数
SUM 求和,返回指定列的总和
AVG 求平均值,返回指定列数据的平均值

Mysql集群

Mysql