mysql数据库常⽤命令⽬录数据库常⽤命令启动/暂停net start mysql; 启动net stop mysql; 暂停使⽤root账户登录mysql -uroot -p123456root是默认⽤户,超级管理员-p后⾯接密码显⽰所有数据库show databases;使⽤某个数据库use 数据库名修改密码1.使⽤mysql数据库use mysql2.修改密码(将root⽤户密码修改为123456)update er set authentication_string=password('123456') where user='root';3.刷新flush privileges;创建⽤户create user 'username'@'host' identified by 'password';给⽤户授权grant privileges on databasename.tablename to 'username'@'host';privileges:⽤户操作权限,如select,insert,update等,如果要授予所有权限使⽤alldatabasename:数据库名tablename:表名,如果要授予⽤户对所有数据库和表相应操作权限可以使⽤*表⽰,如*.*如:我要username⽤户,对所有数据库和表有查和修改功能grant select,update on *.* to 'username'@'host';注意:以上授权⽤户不能给其他⽤户授权,如果想要给其他⽤户授权,⽤以下命令:grant privileges on databasename.tablename to 'username'@'host' with grant option;创建⼀个数据库⽅式1:create database 数据库名;⽅式2:create database if not exists 数据库名 default 默认编码集(utf8)删除⼀个数据库⽅式1:drop database 数据库名⽅式2:drop database if exists 数据库名什么是SQLSQL由四部分组成DDL:创建和删除结构DML:对表和视图进⾏插⼊,删除,更新操作DQL:对表和试图进⾏查询操作TCL:使⽤事务管理DML操作mysql的数据类型理论实战经常变化的字段⽤varchar知道固定长度⽤char超过255字节只能⽤varchar和text能⽤varchar的地⽅不⽤text能够⽤数字类型的字段尽量选择数字类型⽽不⽤字符串类型,这会降低查询和连接的性能,并会增加存储开销.这是因为引擎在处理查询和连接会逐个⽐较字符串中的每⼀个值,⽽对于数字类型只需⽐较⼀次就够了.同⼀张表出现多个⼤字段,能合并时尽量合并,不能合并时考虑分表DDL操作创建表create table 表名(列名1 数据类型1,列名2 数据类型2,列名3 数据类型3,....列名称n 数据类型n)defualt charset=字符集编码(utf8),engine=指定表的存储引擎(innodb)--可选查看表结构⽅式1desc 表名称;⽅式2show create table 表名称; -- 可以看的建表语句修改表结构基本语法:arlter table 表名1. 向表中添加⼀列alter table 表名 add column 列名称数据类型;如:向student表新增加⼀列stu_height学⽣⾝⾼alter table student add column stu_height int(11);2. 删除某⼀列alter table 表名 drop column 列名称例如:删除student表中的学⽣⾝⾼alter table student drop column stu_height;3. 修改列名称和数据类型alter table student change column 原列名新列名新数据类型;例如修改stu_sex 为 student_sex 数据类型修改为 varchar(30)alter table student change column stu_sex student_sex varchar(30);4. 修改某⼀列的数据类型alter table student modify column 原来的列名新的数据类型;例如:将学⽣年龄修改为int类型alter table student modify column stu_age int(11);删除表1. 直接删除drop table 表名称;2. 删除之前先判断表是否存在drop table if exists 表名称;显⽰当前库的所有表show tables;DML操作添加数据1. 单个添加插⼊所有数据时insert into 表名称 values (值1,值2,……);insert into student values(101,'⽼王',0,'⾜球',31);注意:在插⼊所有的数据时values后⾯的括号必须填满所有列,不然会报错,如果你不想插⼊全部的列,就可以在表名称后⾯指定列名称.如:insert into 表名称 (列名1,列名2) values(列名1值,列名2值)2. 批量添加⾏与⾏之间使⽤半⾓逗号分离,value关键字只定义⼀次insert into student(id,stu_name,stu_sex,stu_hobby,stu_age)values(108,'⽼王',1,'Basketball',39),(1031,'⽼张',1,'Basketball',39);修改数据1. 批量修改update 表名称 set 列名称=值;例如:student表的年龄全部修改为50update student set stu_age=50;2. 单个修改如果只想修改某⼀⾏的数据,需要加上条件例如:我只想修改id为1031的年龄为60 where 表⽰⾏过滤update student set stu_age=60 where id=1031;3. 单个修改多个值例如:修改id为1031的年龄为60,姓名为⼤⼤update student set stu_age=60,stu_name='⼤⼤' where id=1031;删除数据1. 删除⼀个删除⼀条数据delete from 表名 where 条件;例如:删除id为108的student数据delete from student where id=108;2. 删除全部delete from 表名;例如:删除student表所有数据-- 开发时最好不要⽤这个,可以定义⼀个字段⽤来表⽰是否删除,0表⽰存在1表⽰要删除,然后查询时使⽤where条件判断字段进⾏查询出来.delete from studnet;3. truncate关键字truncate是DDL,删除所有数据,不⽀持where ,不能回滚delete是DML,可以删除部分数据,因为⽀持where,可以回滚总体上truncate的效率⽐delete⾼,它们都只能删除数据不能删除表结构,只要drop才能删除表结构.数据完整性因为上⾯的表缺乏安全性,会有重复的id等数据这些都是脏数据.我们要给表定义规则,确保表中的数据有效性,⼀致性,安全性,尽最⼤可能减少脏数据,重复的的数据主键约束主键:主要的关键字,⼀个表如果创建了主键那么该⾏的所有数据必须在表中唯⼀.设置了主键约束那么这个字段不能为空,不能重复如:⾝份证必须是唯⼀的且不能为空,那么就把⾝份证设置为主键总结:⾮空且唯⼀设计原则:⼀般主键为数值类型,呈递增趋势.如果不想每次插⼊主键可以不⼿动添加可以设置为⾃动增长,⾃动增长从1开始,如果⼿动添加后设置了⼀个新值,那么下次⾃动设置时主键会从你⼿动设置的值往后递增.语法:create table tb_class(id int(11) auto_increment, -- id是主键列,不⽤显⽰插⼊值会⾃动增长class_name varchar(30),class_desc varchar(100),primary key(id) -- 为tb_class表的id设置主键约束)注意: MySQL 数据库 auto_increment⾃动增长和主键primary key 是配套的不能单独使⽤⾮空约束某字段的值不允许为空,如果其字段没有设置值将报错create table tb_class(id int(11) auto_increment, -- id是主键列,不⽤显⽰插⼊值会⾃动增长class_name varchar(30) not null,-- not null⾮空约束class_desc varchar(100),primary key(id) -- 为tb_class表的id设置主键约束)唯⼀约束制定⼀个规则让某⼀列的数据必须唯⼀特征:某列数据可以为空,但必须唯⼀,可以有多个null值,⼀般设置了唯⼀约束那么最⾼设置⾮空约束,这样能提升索引效率.例如:学⽣的⼿机号码create table tb_1(phone int unique -- unique)默认约束为某⼀列制定⼀个默认规则如:性别默认为0create table tb_1(phone int unique,sex int DEFAULT 0 -- default 0)外键约束外部的关键字叫外键,通常为多张表建⽴联系,确保表与表之间的安全性,⼀致性,能够减少数据冗余前⾯个⼏个约束建⽴在⼀张表中外键约束:多张表建⽴的约束,如果⼀张表的某个字段建⽴了外键约束,这个字段的取值就必须是你所依赖的主表中主键的值.如果取其他值会报错,当然如果主表的主键被其他从表所引⽤了这则个字段就不能删除了场景:创建⼀个tb_student表,为其添加默认约束、唯⼀约束、⾮空约束、外键约束create table tb_student(id int(11) auto_increment, -- id⾃动增长stu_name varchar(50) not null, -- name不能为空stu_mobile varchar(20) unique, -- mobile唯⼀不能重复stu_sex bit default 1, -- 设置sex默认为1class_id int(11) not null, -- 设置class_id不能为空primary key(id), -- 设置id为主键foreign key(class_id) references tb_class(id) -- 学⽣表的class_id建⽴外键去关联tb_class表的主键id,建⽴外键时⼀定要保证外键依赖的主表要先创建)engine=innodb,default charset utf8;约束总结约束分为两类:1. ⾏级别约束: 主键约束,外键约束2. 列级别约束: ⾮空约束,唯⼀约束,默认约束外键约束⼩结:foreign key(外键列) references 主表(主键列)references关键字的右边是主表的主键列,左边是从表的外键列,该关键字在主表和从表之间建⽴了联系创建表⼩结:没有外键的表是主表,有外键的表是从表.先创建主表后在创建从表(有外键的表是从表)插⼊数据⼩结:先插⼊主表数据后插⼊从表数据删除数据⼩结:先删除从表数据后删除主表数据表关系⼀对⼀数据表间⼀对⼀关系的表现有两种,⼀种是外键关联,⼀种是主键关联⼀对多/多对⼀存在最普遍的映射关系,简单来讲就如班级与学⽣的关系;⼀对多:从班级度来说⼀个班级拥有多个学⽣即为⼀对多多对⼀:从学⽣⾓度来说多个学⽣属于⼀个班级即为多对⼀-- 班级表(主表)create table tb_class(id int(11) auto_increment, -- 编辑编号class_name varchar(30) not null, -- 班级名称class_desc varchar(100), -- 班级描述primary key(id) -- 为class表设置主键约束)engine=innodb,default charset utf8;-- 学⽣表(从表)create table tb_student(id int(11) auto_increment,stu_name varchar(10) not null,stu_mobile varchar(50) unique,stu_sex bit default 1,class_id int(11) not null,primary key(id),foreign key(class_id) references tb_class(id) -- 设置外键class_id 关联tb_class表的主键)engine=innodb,default charset utf8;多对多例如:学⽣与选修课之间的关系,⼀个学⽣可以选多门课程,⼀门课程可以被多个学⽣选择通常多对多关系我们⼀般采⽤中间表处理,将多对多转换为两个⼀对多的关系.代码⽰例:-- 学⽣表create table tb_student(id int(11) auto_increment,stu_name varchar(50) not null,stu_mobile varchar(20) unique,stu_sex bit default 1,class_id int(11) not null,primary key(id),foreign key(class_id) references tb_class(id) -- 设⽴外键表明这个表是tb_class的从表)engine=innodb,default charset utf8;-- 课程表create table tb_course(id int(11) auto_increment,course_name varchar(30) not null,primary key(id))engine=innodb,default charset utf8;-- 学⽣课程表(中间表)create table tb_student_course(sut_id int(11), -- 学⽣idcourse_id int(11), -- 课程idcourse_score int(11), -- 课程成绩primary key(stu_id,course_id), -- 复合主键foreign key(stu_id) references tb_student(id),-- 将学⽣id设置为外键关联tb_student学⽣表的主键foreign key(course_id) references tb_course(id)-- 将课程id设置为外键关联tb_course课程表的主键)engine=innodb,default charset utf8;⾃⾏设计⼀个员⼯系统-- 部门表(dept)drop table if exists dept;create table dept(deptNo int(11) not null comment'部门编号',dName varchar(20) not null comment'部门名称',loc varchar(20) comment'部门所在的位置',primary key(deptNo) -- 主键约束)engine=innodb,default charset utf8 comment='部门表';-- 员⼯表(emp)drop table if exists emp;create table emp(empNo int not null comment'雇员编号',ename varchar(10) not null comment'雇员姓名',job varchar(10) not null comment'职位',mgr int(11) null default null comment'雇员对应的领导编号',hiredate date null default null comment'雇员的雇佣⽇期',sal decimal(7,2) null default null comment'基本⼯资',comm decimal(7,2) null default null comment'奖⾦,佣⾦',deptno int not null comment'雇员所在的部门编号',primary key(empNo),-- 设置主键约束foreign key(deptno) references dept(deptNo) -- 为deptno设置为外键关联表dept主键)engine=innodb character set=utf8 comment'员⼯表';-- ⼯资等级表(salgrade)drop table if exists salgrade;create table salgrade(grade int not null comment'⼯资等级',losal decimal(7,2) not null comment'此等级的最低⼯资',hisal decimal(7,2) not null comment'此等级的最⾼⼯资',primary key(grade))engine=innodb character set=utf8 comment='⼯资等级表';初始化数据脚本-- 部门表插⼊数据insert into dept values(10,'财务部','武汉');insert into dept values(20,'研发部','武汉');insert into dept values(30,'销售部','深圳'),(40,'业务部','上海');-- 员⼯表插⼊数据insert into emp values (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800.00, null, 20), (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20',1600.00, 300.00, 30),(7521, 'WARD', 'SALESMAN', 7698, '1981-02-22',1250.00, 500.00, 30),(7566, 'JONES', 'MANAGER', 7839, '1981-04-02',2975.00, null, 20),(7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28',1250.00, 1400.00,30),(7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850.00, null, 30),(7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450.00, null,10),(7788, 'SCOTT', 'ANALYST', 7566, '1987-04-19', 3000.00, null, 20),(7839, 'KING', 'PRESIDENT', null, '1981-11-17', 5000.00, null,10),(7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500.00, 0.00,30),(7876, 'ADAMS', 'CLERK', 7788, '1987-05-23', 1100.00, null,20),(7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950.00, null, 30),(7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000.00, null, 20),(7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300.00, null, 10);-- ⼯资等级表插⼊数据insert into salgrade values (1, 700, 1200),(2, 1201, 1400),(3, 1401, 2000),(4, 2001, 3000),(5, 3001, 9999);DQL查询操作单表数据查询简单查询select * from emp; -- 查询表emp中的全部数据select * from dept; -- 查询表dept中的全部数据select empno, ename,sal,job from emp; -- 查询emp表中的empno,ename,sal,job四列的的全部数据使⽤算术表达式select empno, ename,sal,sal*1.08 from emp;-- 查询emp表的empno,ename,sal三个字段,最后在查询sal字段*1.08后的值最后显⽰⼀列,字段名为sal*1.08select empno, ename,sal, sal*12 from emp;-- 查询emp表的empno,ename,sal三个字段,最后在查询sal字段*12后的值最后显⽰⼀列,字段名为sal*12select empno, ename,sal, sal*12 +1000 from emp;-- 查询emp表的empno,ename,sal三个字段,最后在查询sal字段*12+1000后的值最后显⽰⼀列,字段名为sal*12+1000注:在Select语句中,对数值型数据可以使⽤算术运算符创建表达式使⽤字段别名上⾯的使⽤sal*12,英⽂做为字段名并不是我们想要的在某些场景中,所以可以给字段重新命名-- ⼀下三种⽅式都可以重命名-- 字段名 as 重命名(AS可以省略)-->字段名重命名-- 别名如果含有空格或其他特殊字符或⼤⼩写敏感,需⽤双引号引起来:字段名 '重命名'select empno as 员⼯编号, ename 员⼯姓名, sal12 年薪 from emp;select empno, ename "Ename", sal12 "Anual Salary" from emp;select sal*12+5000 as "年度⼯资(加年终奖)" from emp;去重查询如我们想要看emp表中的部门id编号有那些,⽽查询全部会有重复的部门id,影响我们的可读性.所以可以使⽤distinct关键字去除重复的select distinct deptno from emp;-- DISTINCT的作⽤范围是后⾯所有字段的组合select distinct deptno,job from emp;排序查询使⽤order by⼦句对查询结果进⾏排序,排序⽅式包括升序(asc,不写默认),降序(desc)select empno, ename, sal from emp order by sal;-- 查询三个字段按照sal升序排序select empno, ename, sal from emp order by sal desc ; -- 降序排序-- 按多字段排序select deptno, empno, ename, sal from emp order by deptno, sal;-- 使⽤字段别名排序select empno, ename, sal*12 annsal from emp order by annsal;分页查询关键字:limit-- 查询前三条员⼯信息select * from emp limit 3;-- limit 后⾯跟1个参数,例如 limit 3 此时表⽰最多返回3⾏-- 查询第三条3条到第6条的客户信息select * from emp limit 3,6; -- limit 从第3条开始查6条数据第⼀个参数是从第⼏个开始,第⼆个参数查⼏条数据.-- 分页查询,每页5条-- 第1页select * from emp limit 0, 5;-- 第2页select * from emp limit 5, 5;-- 第3页select * from emp limit 10, 5;select * from emp limit 15, 5;select * from emp limit 20, 5;-- 找规律,第⼀个数字与页数的关系-- 要查询第⼏页:pageNumber-- 每页显⽰条数:pageSize-- 每页查询起始位置:startstart=(pageNumber-1)*pageSize;-- -- 每页显⽰3条,查询第4页的数据select * from emp limit 9,3;合并查询将多个select语句合并为⼀个select语句,关键字有union和union allunion:如果有重复过滤掉重复的数据.union all:不管是否有重复的,全部合并.-- 过滤掉了重复的select deptno from emp where job='clerk'unionselect deptno from emp where job='manager';-- 不过滤,直接合并select deptno from emp where job='clerk'union allselect deptno from emp where job='manager';where⼦句⽤法作⽤:指定查询条件使⽤where⼦句select * from emp where deptno=10;select * from emp where ename = 'JACK';select * from emp where hiredate = '2020-12-12';注意:字符串和⽇期值要⽤单引号扩起来字符串⼤⼩写敏感⽇期值格式敏感,缺省的⽇期格式是'YYYY-MM-DD HH:mm:ss'查询条件中的⽐较运算符MySQL⽀持如下⽐较运算符: > >= < <= != <>between...and..:介于两值之间(包括两值)in:出现在集合中like:模糊查询is null:为空值注意:mysql中的=运算符⽤来判断表达式是否相等,它没有==java使⽤!=来表⽰不等于,mysql也⽀持,但不要使⽤效率低,mysql使⽤<>表⽰不等于select * from emp where sal > 2900; -- 查询表emp中sal⼤于2900的全部员⼯select * from emp where deptno <> 30;-- 查询表emp中deptno不等于30的全部员⼯select * from emp where sal between 1600 and 2900;-- 查询emp表中sal在1600(包括)到2900(包括)的所有员⼯select * from emp where ename in('SMITH','CLARK','KING');-- 查询表emp中ename有在其中(Smith,clark,king)的全部员⼯使⽤like运算符进⾏模糊查询符号作⽤举例%表⽰0个或多个字符select * from emp where ename like 'S%';_表⽰1字符select * from emp where ename like '_A%';escape查找特殊符号select * from emp where ename like '/_A%' escape '/' 把/后⾯的字符不要当做通配符,就是查找第⼀个字符为下划线的ename符号作⽤举例使⽤IS NULL运算符进⾏空值判断select * from emp where comm is null;select * from emp where comm is not null;查询条件中可以使⽤逻辑运算符-- 在emp表中查询部门编号等于10并且sal⼤于1000 and(相当与Java的并且&&)select * from emp where deptno=10 and sal>1000;-- 在emp表中查询部门编号为10或者职位是clerk的员⼯ or(相当与java的或者||)select * from emp where deptno=10 or job='clerk';-- 在emp中查询⼯资不在800,1500,2000的员⼯select * from emp where sal not in(800,1500,2000);SQL优化问题:AND: 把检索结果较少的条件放到后⾯OR: 把检索结果较多的条件放到后⾯聚合函数使⽤函数可以⼤⼤提⾼select语句操作数据库的能⼒,它给数据的转换和处理提供了⽅便.函数只是将取出的数据进⾏处理,不会改变数据库中的值.函数分类:单⾏函数数学函数abs(x) 返回x的绝对值pi() 返回圆周率,默认显⽰六位⼩数sqrt(x) 返回⾮负数的x的⼆次⽅根mod(x,y) 返回x被y除后的余数ceil(x),ceiling(x) 返回不⼩于x的最⼩整数floor(x) 返回不⼤于x的最⼤整数round(x) round(x,y) 前者返回最接近于x的整数,即对x进⾏四舍五⼊;后者返回最接近x的数,其值保留到⼩数点后⾯y位,若y为负值,则将保留到x到⼩数点左边y位.sign(x) 返回参数x的符号,-1表⽰负数,0表⽰0,1表⽰正数pow(x,y)和power(x,y) 返回x的y次乘⽅的值exp(x) 返回e的x乘⽅后的值log(x) 返回x的⾃然对数,x相对于基数e的对数log10(x) 返回x的基数为10的对数radians(x) 返回x由⾓度转化为弧度的值degrees(x) 返回x由弧度转化为⾓度的值SIN(x)、ASIN(x) 前者返回x的正弦,其中x为给定的弧度值;后者返回x的反正弦值,x为正弦COS(x)、ACOS(x) 前者返回x的余弦,其中x为给定的弧度值;后者返回x的反余弦值,x为余弦TAN(x)、ATAN(x) 前者返回x的正切,其中x为给定的弧度值;后者返回x的反正切值,x为正切COT(x) 返回给定弧度值x的余切rand(x) 返回0-1之间的随机⼩数char_length(str) 计算字符串字符个数concat(s1,s2,.....) 返回连接参数产⽣的字符串,⼀个或多个待拼接的内容,任意⼀个为null则返回值为nullconcat_ws(x,s1,s2.,,,,) 返回多个字符串拼接之后的字符串,每个字符串之间有⼀个xinsert(s1,x,len,s2) 返回字符串s1,其⼦字符串起始于位置x,被字符串s2取代len个字符lower(str)和lcase(str)、upper(str)和ucase(str)前两者将str中的字母全部转换成⼩写,后两者将字符串中的字母全部转换成⼤写left(s,n)、right(s,n) 前者返回字符串s从最左边开始的n个字符,后者返回字符串s从最右边开始的n个字符lpad(s1,len,s2)、rpad(s1,len,s2)前者返回s1,其左边由字符串s2填补到len字符长度,假如s1的长度⼤于len,则返回值被缩短⾄len字符;前者返回s1,其右边由字符串s2填补到len字符长度,假如s1的长度⼤于len,则返回值被缩短⾄len字符ltrim(s)、rtrim(s)前者返回字符串s,其左边所有空格被删除;后者返回字符串s,其右边所有空格被删除trim(s)返回字符串s删除了两边空格之后的字符串trim(s1 FROM s)删除字符串s两端所有⼦字符串s1,未指定s1的情况下则默认删除空格repeat(s,n) 返回⼀个由重复字符串s组成的字符串,字符串s的数⽬等于nspace(n) 返回⼀个由n个空格组成的字符串replace(s,s1,s2)返回⼀个字符串,⽤字符串s2替代字符串s中所有的字符串s1strcmp(s1,s2)若s1和s2中所有的字符串都相同,则返回0;根据当前分类次序,第⼀个参数⼩于第⼆个则返回-1,其他情况返回1 substring(s,n,len)、MID(s,n,len)两个函数作⽤相同,从字符串s中返回⼀个第n个字符开始、长度为len的字符串,不写长度默认到最后.locate(str1,str)、position(str1 IN str)、instr(str,str1)三个函数作⽤相同,返回⼦字符串str1在字符串str中的开始位置(从第⼏个字符开始)reverse(s) 将字符串s反转elt(N,str1,str2,str3,str4,...)返回第N个字符串⽇期和时间函数CURDATE()、CURRENT_DATE()将当前⽇期按照"YYYY-MM-DD"或者"YYYYMMDD"格式的值返回,具体格式根据函数⽤在字符串或是数字语境中⽽定CURRENT_TIMESTAMP()、LOCALTIME()、NOW()、SYSDATE()这四个函数作⽤相同,返回当前⽇期和时间值,格式为"YYYY_MM-DD HH:MM:SS"或"YYYYMMDDHHMMSS",具体格式根据函数⽤在字符串或数字语境中⽽定MONTH(date)和MONTHNAME(date)前者返回指定⽇期中的⽉份,后者返回指定⽇期中的⽉份的名称WEEK(d)、WEEKOFYEAD(d)前者计算⽇期d是⼀年中的第⼏周,后者计算某⼀天位于⼀年中的第⼏周DAYOFYEAR(d)、DAYOFMONTH(d)前者返回d是⼀年中的第⼏天,后者返回d是⼀⽉中的第⼏天EXTRACT(type FROM date)从⽇期中提取⼀部分,type可以是YEAR、YEAR_MONTH、DAY_HOUR、DAY_MICROSECOND、DAY_MINUTE、DAY_SECONDTimeStampDiff(间隔类型,前⼀个⽇期,后⼀个⽇期)例如距离现在差了多少年:TimeStampDiff(year, 前⼀个⽇期, now())间隔类型有:second秒,minute分,hour时,day天,week周,month⽉,quarter季度,year年DATE_ADD(date,INTERVAL expr type)、ADD_DATE(date,INTERVAL expr type)返回将起始时间加上expr type之后的时间,⽐如DATE_ADD('2010-12-31 23:59:59', INTERVAL 1 SECOND)表⽰的就是把第⼀个时间加1秒条件判断函数IF(expr,v1,v2)如果expr是TRUE则返回v1,否则返回v2IFNULL(v1,v2)函数如果v1的值不为NULL,则返回v1,否则返回v2。