MySql 数据库命令

数据库 mysql


一.创建数据库及其相关命令

1.登录数据库:

mysql -uroot -p

2.查询所以的数据库:

show databases;

2.改变当前窗口的编码:

set names gbk;

3.创建数据库:

create database 库名; 

4.查询数据库编码格式:

show create database 库名;

5.查看所有表格:

show tables;

二.创建表格及其相关命令

1.创建表格

create table 表格名;

2.查看表格结构

desc 表名;

3.删除表格

drop table 表格名;

4.添加表格数据

insert into 表名 values(值1,值2....);
insert into 表名(字段1,字段2...) values(值1,值2...);

5.查看表格数据

select*from 表名;

6.修改表格数据

update 表名 set 字段=值 where id=值;

7.修改所有数据

update 表名 set 字段=值;

三.对表格内字段的操作

1.添加字段

alter table 表名 add 字段名 数据类型(长度) after 字段名 约束条件 

2.修改字段数据类型

alter table 表名 modify 字段名 数据类型(长度)

3.修改字段名

alter table 表名 change 新表名 旧表名 数据类型(长度) 约束条件;

4.删除字段

alter table 表名 drop 字段1,字段2...

5.删除所有表格数据(id不重置)

truncate 表名;

6.删除所有表格数据(id重置)

delete from 表名

四.约束

1.非空约束

not null;

2.唯一约束

unique;

3.主键约束

primary key auto_increment;

4.检查约束

CONSTRAINT CK_gender CHECK(字段 between 0 and 150 ) 

5.外键约束

CONSTRAINT FK_附表的字段 FOREIGN KEY (附表的字段) REFERENCES 主表名(主表id)

数据库查询

1.简单查询

语法:

SELECT [DISTINCT] * | 字段1 别名,字段2 别名... FROM 表名

1.查询emp表中所有的记录。

SELECT * FROM emp;

2.查询emp表中所有员工的编号,姓名,职位。

SELECT empno,ename,job FROM emp; 

查询的时候可以指定查询的返回列的名称。 即为列起一个别名

SELECT empno eno,ename en,job j FROM emp; 

3.查询emp表中所有员工的职位。

SELECT job FROM emp; 

消除重复列

SELECT DISTINCT job FROM emp; 

但是,在去除重复列的时候,注意,如果同时查询多列,必须保证所有列重复才会消除。

4.查询emp表中每个员工的姓名和年薪。

查询中允许使用四则运算。(+,-,*,/)

SELECT ename,sal*12 FROM emp;

2.限定查询

之前的查询都是一张表全部的记录,如果希望可以根据指定的条件进行查询,需要用到限定查询。

语法:

SELECT [DISTINCT] * | 字段1 别名,字段2 别名... FROM 表名 [WHERE 条件] 在where后,可以添加多个条件,最常见的条件是:> < >= <= !=(<>) BETWEEN...AND,LIKE, IS NULL, AND, OR, NOT , IN

1.查询出工资大于1500的所有员工的信息。

SELECT * FROM emp WHERE sal>1500;

2.查询出工资大于(等于)1500并且小于(等于)3000的所有员工的信息

SELECT * FROM emp WHERE sal>1500 AND sal<3000;
​
SELECT * FROM emp WHERE sal BETWEEN 1500 AND 3000;

3.查询每个月可以获得奖金的员工。

只要字段中存在内容,就不为NULL

不为空:IS NOT NULL

SELECT * FROM emp WHERE comm IS NOT NULL AND comm > 0;

4.查询没有奖金的员工。

SELECT * FROM emp WHERE comm IS NULL OR comm = 0;

5.查询出,基本工资大于1500,同时可以领取奖金的人。

   SELECT * FROM emp WHERE sal>1500 AND comm IS NOT NULL AND comm > 0;

6.查询出,基本工资不大于1500,同时不可以领取奖金的人。

SELECT * FROM emp WHERE NOT( sal>1500 OR comm IS NOT NULL AND comm > 0);

7.查询出在1981年雇佣的员工信息。

1981-01-01 ~1981-12-31之间的员工信息

SELECT * FROM emp WHERE hiredate BETWEEN '1981-01-01' AND '1981-12-31';

8.查询员工姓名为smith的员工。

SELECT * FROM emp WHERE ename = 'SMITH';

字符串需要使用单引号括起来,数据是大小写区分的。

9.查询出员工编号是7369,7698,7876的员工。

 SELECT * FROM emp WHERE empno=7369 OR empno=7698 OR empno=7876;
​
 SELECT * FROM emp WHERE empno IN (7369,7698,7876);

10.模糊查询。

使用LIKE完成模糊查询

通配符:% 可以匹配任意长度 _可以匹配一个长度

查询出员姓名第二个字母包含L的员工信息。

SELECT * FROM emp WHERE ename LIKE '_L%';

查询出员姓名包含M的员工信息。

SELECT * FROM emp WHERE ename LIKE '%M%';

查询出在1981年雇佣的员工信息。

SELECT * FROM emp WHERE hiredate LIKE '%81%';

11.员工编号不等于7369的员工

 SELECT * FROM emp WHERE empno != 7369;
​
 SELECT * FROM emp WHERE empno <> 7369;

3.查询排序

SELECT [DISTINCT] * | 字段1 别名,字段2 别名... FROM 表名 别名

[WHERE 条件] ORDER BY 字段1 ASC,字段2 DESC...

ASC 升序 从低到高

DESC 降序 从高到低

1.查询所有员工,按照工地由低到高排序

SELECT * FROM emp ORDER BY sal ASC;

如果想要改为降序 ,将ASC改为DESC排序就可以了。

SELECT * FROM emp ORDER BY sal DESC;

多字段排序,先按照第一个条件排序,如果相同,则按照第二个条件排序,以此类推

2.查询出20部门的员工,查询的信息按照工资由高到低排序,如果工资相等,则按照雇佣日期由早到晚排序。

SELECT * FROM emp WHERE deptno = 20 ORDER BY sal DESC,hiredate ASC;

4.多表查询

之前所有的操作,都是从一张表中进行查询,如果需要一条语句显示多张表的数据,那必须使用多表查询。

SELECT [DISTINCT] * | 字段1 别名,字段2 别名... FROM 表名1 别名,表名2 别名 [WHERE 条件] ORDER BY 字段1 ASC,字段2 DESC...

统计函数,查询每张表的数据量。

COUNT();

查询emp表中的数据

SELECT COUNT(*) FROM emp; 

查询dept表中的数据

SELECT COUNT(*) FROM dept;

查询emp和dept表的数据

SELECT * FROM emp,dept;

查询结果一共是56条数据 56 = 14*4;

这个问题在数据库中被成为笛卡尔积。多张表的数据的乘积。

如何消除笛卡尔积:使用关联字段。添加关联条件。

在多表查询中,不同的表有相同的名称时,访问这个字段,必须加上表名。

SELECT * FROM emp,dept WHERE emp.deptno = dept.deptno;

可以使用起别名形式

SELECT * FROM emp e,dept d WHERE e.deptno = d.deptno;

或者

SELECT * FROM emp as e,dept as d WHERE e.deptno = d.deptno;

查询的结果虽然消除了笛卡尔积,但是只是显示上消除,数据库还是需要一个一个计算。数据量大时候会很慢。

1.查询每一位员工的编号,姓名,职位,部门名称,部门位置。

逐步分析:

(1)确定需要查询的表:

emp e,dept d

(2)确定需要查询的数据:

e.empno,e.ename,e.job,d.dname,d.loc

(3)确定关联的字段

 e.deptno = d.deptno
​
SELECT e.empno,e.ename,e.job,d.dname,d.loc FROM emp e,dept d WHERE e.deptno = d.deptno;

2.查询每一位员工的姓名,职位,领导的姓名

分析:需要两张emp表

(1)确定需要查询的表:

emp e1,emp e2

(2)确定需要查询的数据:

e1.ename,e1.job,e2.ename

(3)确定关联的字段

e1.mgr = e2.empno

SELECT e1.ename,e1.job,e2.ename FROM emp e1,emp e2 WHERE e1.mgr = e2.empno;
​
 

3.查询每个员工的编号,姓名,基本工资,职位,领导的姓名,部门名称,位置。

分析:需要两张emp表,dept表

(1)确定需要查询的表:

emp e1,emp e2,dept d

(2)确定需要查询的数据:

e1.empno,e1.ename,e1.sal,e1.job,e2.ename,d.dname,d.loc

(3)确定关联的字段

e1.mgr = e2.empno AND e1.deptno = d.deptno

SELECT e1.empno,e1.ename,e1.sal,e1.job,e2.ename,d.dname,d.loc FROM emp e1,emp e2,dept d WHERE e1.mgr = e2.empno AND e1.deptno = d.deptno;

4.查询每个员工的编号,姓名,工资,部门名称,工资所在公司的工资等级。

分析:需要两张emp表,dept表,salgrade表

(1)确定需要查询的表:

emp e,dept d,salgrade s

(2)确定需要查询的数据:

e.empno,e.ename,e.sal,d.dname,s.grade

(3)确定关联的字段

e.deptno = d.deptno AND e.sal BETWEEN s.losal AND s.hisal
​
SELECT e.empno,e.ename,e.sal,d.dname,s.grade FROM emp e,dept d,salgrade s WHERE e.deptno = d.deptno AND e.sal BETWEEN s.losal AND s.hisal

左右连接

左右连接指的是判断条件的参考方向。

观察以下查询

SELECT * FROM emp e,dept d WHERE e.deptno = d.deptno;

结果发现,一共四个部门,但是仅显示三个部门的结果,因为员工中没有40部门的员工,

查询是以emp为参考信息。

想要解决以上问题,那么需要使用左右连接

SQL1999语法

连接方向:

左(外)连接 LEFT OUTER JOIN...ON

SELECT * FROM emp LEFT OUTER JOIN dept ON(emp.deptno=dept.deptno);

右(外)连接 RIGHT OUTER JOIN...ON

之前所有的操作,都是从一张表中进行查询,如果需要一条语句显示多张表的数据,那必须使用多表查询。

N 交叉连接 :产生笛卡尔积

SELECT * FROM emp CROSS JOIN dept;

NATURAL JOIN 自然连接:自动关联相关联的字段,消除笛卡尔积

SELECT * FROM emp NATURAL JOIN dept;

JOIN...USING 用户指定一个字段消除笛卡尔积

SELECT * FROM emp JOIN dept USING(deptno);

JOIN...ON 指定一个条件消除笛卡尔积

SELECT * FROM emp JOIN dept ON(emp.deptno=dept.deptno);

5.统计函数

统计函数

COUNT(字段) 统计表中的记录数

AVG(字段) 求平均值

SUM(字段) 求和

MAX(字段) 求最大值

MIN(字段) 求最小值

1.统计出公司所有员工的每个月平均工资和总工资

SELECT COUNT(empno),SUM(sal),AVG(sal) FROM emp;

2.统计员工的最高工资和最低工资

SELECT MAX(sal),MIN(sal) FROM emp;

6.分组查询

前提:数据重复或者符合相同条件的时候才需要分组。

某个列(字段)出现了重复的数据才需要分组

语法:

| SELECT [DISTINCT] * | 字段1 别名,字段2 别名... FROM 表名1 别名,表名2 别名 [WHERE 条件] GROUP BY 字段1,字段2... HAVING 条件(分组之后过滤条件) ORDER BY 字段1 ASC,字段2 DESC... | | | | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ | | | | | | | | **** | | SELECT [DISTINCT] * | 字段1 别名,字段2 别名... FROM 表名1 别名,表名2 别名 [WHERE 条件] GROUP BY 字段1,字段2... HAVING 条件(分组之后过滤条件) ORDER BY 字段1 ASC,字段2 DESC... |

1.按照部门分组,统计每个部门的人数,平均工资。

SELECT deptno,COUNT(empno),AVG(sal) FROM emp GROUP BY deptno;

2.求出每个职位的最高工资和最低工资。

SELECT job,MAX(sal),MIN(sal) FROM emp GROUP BY job;

3.按照领取奖金和不领取奖金的员工分组,求出每组人数,平均工资。

SELECT comm,COUNT(sal),AVG(sal) FROM emp GROUP BY comm;

一旦出现分组,语法就有新的限制。

1.统计函数可在没有分组的时候单独使用,不能出现其他字段。

2.如果要进行分组,则SELECT子句后,只能出现分组的字段和统计函数,其他字段不能出现。

3.统计函数允许嵌套,但嵌套后不能出现任何字段。

4.查询每个部门的名称,部门的人数,平均工资。

(1)需要使用的表

emp e,dept d

(2)关联的字段

e.deptno = d.deptno

a)先查出 部门名称,部门中员工名称,员工的工资。

SELECT d.dname,e.ename,e.sal FROM emp e RIGHT OUTER JOIN dept d ON(e.deptno=d.deptno);  b)在上面的基础上分组
​
SELECT d.dname,COUNT(e.ename),AVG(e.sal) FROM emp e RIGHT OUTER JOIN dept d      ON(e.deptno=d.deptno) GROUP BY d.dname;

c).处理NULL数据。

SELECT d.dname,COUNT(e.ename),IFNULL(AVG(e.sal),0) FROM emp e RIGHT OUTER JOIN dept  d ON(e.deptno=d.deptno) GROUP BY d.dname

5.查询每个部门的编号,名称,位置,部门的人数,平均工资。

SELECT d.dname,e.ename,e.sal FROM emp e RIGHT OUTER JOIN dept d ON(e.deptno = d.deptno)
​
SELECT d.deptno,d.dname,d.loc,COUNT(e.ename),IFNULL(AVG(e.sal),0) FROM emp e RIGHT OUTER JOIN dept d ON(e.deptno = d.deptno) GROUP BY d.deptno,d.dname,d.loc;

6.统计每个部门的详细信息,并且要求这些部门的平均工资大于2000;

SELECT d.deptno,d.dname,d.loc,COUNT(e.ename),IFNULL(AVG(e.sal),0) FROM emp e RIGHT OUTER JOIN dept d ON(e.deptno = d.deptno) GROUP BY d.deptno,d.dname,d.loc;

在WHERE后添加AVG(sal)>2000条件。

SELECT d.deptno,d.dname,d.loc,COUNT(e.ename),IFNULL(AVG(e.sal),0) FROM emp e RIGHT OUTER JOIN dept d ON(e.deptno = d.deptno) WHERE AVG(e.sal)>2000 GROUP BY d.deptno,d.dname,d.loc;

以上的写法是错误。

注意:在WHERE子句后不能使用统计函数,WHERE的主要功能是从全部数据中取出部分数据。

如果想要对分组之后的数据进一步过滤。HAVING 子句,正确的查询:

SELECT d.deptno,d.dname,d.loc,COUNT(e.ename),IFNULL(AVG(e.sal),0) FROM emp e RIGHT OUTER JOIN dept d ON(e.deptno = d.deptno) GROUP BY d.deptno,d.dname,d.loc HAVING AVG(e.sal)>2000;

WHERE和HAVING的区别:

WHERE是从全部数据中筛选(过滤)出部分数据,是在GROUP BY之前 不能使用分组函数,

HAVING 是在GROUP BY之后过滤,可以在HAVING 子句中使用分组函数。

显示非销售人员的工作名称,以及从事同一工作的工资的总和,并满足从事同一工作的员工的工资总和大于等于5000,结果按照工资总和的降序排列。

1.显示所有的非销售人员。

SELECT * FROM emp WHERE job<> 'SALESMAN';

2.按照职位分组,并统计出每个职位的工资总和。

SELECT job,SUM(sal) FROM emp WHERE job<> 'SALESMAN'GROUP BY job;

3.过滤工资总和小于5000的职位

SELECT job,SUM(sal) FROM emp WHERE job<> 'SALESMAN'GROUP BY job HAVING SUM(sal)>=5000;

4.按照要求进行降序排列

SELECT job,SUM(sal) s FROM emp WHERE job<> 'SALESMAN'GROUP BY job HAVING SUM(sal)>=5000 ORDER BY s DESC;

7.子查询

在一个查询之中可以嵌套其他查询。WHERE和FROM子句中可以使用子查询。

where : 单行单列

单行多列

多行单列

单行单列:

1.查询比SMITH工资高的人。

1.查询SMITH的工资

SELECT sal FROM emp WHERE ename = 'SMITH';

2.查出比SIMTH工资高的人

SELECT * FROM emp WHERE sal > (SELECT sal FROM emp WHERE ename = 'SMITH');  **2.查询工资高于平均工资的员工信息**

1.查询平均工资

SELECT AVG(sal) FROM emp; 

2.查询高于平均工资的员工

SELECT * FROM emp WHERE sal > (SELECT AVG(sal) FROM emp);

单行多列(一般很少用)

SELECT * FROM emp WHERE (job,ename)=(SELECT job,ename FROM emp WHERE ename = 'SMITH');

多行单列

SELECT sal FROM emp WHERE job = 'MANAGER';
​
SELECT * FROM emp WHERE sal IN (SELECT sal FROM emp WHERE job = 'MANAGER');
​
SELECT * FROM emp WHERE sal NOT IN (SELECT sal FROM emp WHERE job = 'MANAGER');

ANY 三种匹配形式

=ANY 功能和IN一样

SELECT * FROM emp WHERE sal = ANY (SELECT sal FROM emp WHERE job = 'MANAGER');

>ANY 比最小值大的数据

SELECT * FROM emp WHERE sal= ANY (SELECT sal FROM emp WHERE job = 'MANAGER');

<ANY 比最大值小的数据

SELECT * FROM emp WHERE sal < ANY (SELECT sal FROM emp WHERE job = 'MANAGER');

ALL 两种形式

> ALL 比最大值大

SELECT * FROM emp WHERE sal > ALL (SELECT sal FROM emp WHERE job = 'MANAGER');

< ALL 比最小值小

SELECT * FROM emp WHERE sal < ALL (SELECT sal FROM emp WHERE job = 'MANAGER');

FROM 多行多列

查询每个部门的编号,名称,位置,部门的人数,平均工资。

通过子查询完成:

1.查处部门表中的信息

SELECT d.deptno,d.dname,d.loc FROM dept d;

2.查询部门人数和平均工资 emp

SELECT deptno,COUNT(empno),AVG(sal) FROM emp e GROUP BY deptno;

3.完成相关联操作

SELECT d.deptno,d.dname,d.loc,temp.c,temp.a FROM dept d,(SELECT deptno,COUNT(empno) c,AVG(sal) a FROM emp e GROUP BY deptno) temp WHERE d.deptno = temp.deptno;

4.显示结果没有40部门,使用左右连接解决。

SELECT d.deptno,d.dname,d.loc,temp.c,temp.a FROM dept d LEFT OUTER JOIN (SELECT deptno,COUNT(empno) c,AVG(sal) a FROM emp e GROUP BY deptno) temp ON ( d.deptno = temp.deptno);

六.MySql函数

1.字符函数

1.串|字段) 将字符串转化为大写返回。

select upper(bm) from bm;

2.LOWER(字符串|字段) 将字符串转化为小写返回。

select lower(bm) from bm;

3.LENGTH(字符串|字段) 求字符串的长度。

select length(bm) from bm;

4.REPLACE(字符串|字段,oldstr,newstr) 替换字符串

 select replace(bm,'java组','web组') from bm;

5.SUBSTR(字符串|字段,开始点,长度) 截取字符串

select substr(bm,2,3)  from bm;

6.ASCII(str) 返回字符串str的最左面字符的ASCII代码值。如果str是空字符串,返回0。如果str是 NULL,返回NULL。

select ascii(bm) from bm;

7.CONCAT(str1,str2,...) 把多个字段连接输出

select concat(bm,name) from bm;

8.LOCATE(substr , str)

返回子串substr在字符str第一个出现的位置,如果substr不是在str里面,返回0. LOCATE(substr,str,pos) 返回子串substr在字符串str第一个出现的位置,从位置pos开始。如果substr不是在str 里 面,返回0。

select locate('ja',bm) from bm;

9.INSTR(str,substr)

返回子串substr在字符串str中的第一个出现的位置。这与有2个参数形式的LOCATE()相同,

select instr(bm,'j') from bm;

10.LPAD(str,len,padstr)

返回字符串str,左面用字符串padstr填补直到str是len个字符长

select lpad(bm,9,'a') from bm;

11.RPAD(str,len,padstr)

返回字符串str,右面用字符串padstr填补直到str是len个字符长。

select rpad(bm,9,'a') from bm;

12.LEFT(str,len)

返回字符串str的最左面len个字符。

 select left(bm,3) from bm;

13.RIGHT(str,len)

返回字符串str的最右面len个字符。

 select right(bm,4) from bm;

14.SUBSTRING(str,pos,len)

从字符串str返回一个len个字符的子串,从位置pos开始。

 select substring(bm,2,3)from bm;

15.SUBSTRING(str,pos)  

select substring(bm,2)from bm;

16.SUBSTRING(str FROM pos)

从字符串str的起始位置pos返回一个子串。

select substring(bm from 2)from bm;

17.SUBSTRING_INDEX(str,delim,count)

返回从字符串str的第count个出现的分隔符delim之后的子串。如果count是正数,返回最 后的分隔符到左边(从左边数) 的所有字符。如果count是负数,返回最后的分隔符到右边的所 有字符(从右边数)。

select substring_index(job,',',2)   from bm;

18.LTRIM(str)

返回删除了其前置空格字符的字符串str。

select ltrim(job) from bm;

19.RTRIM(str)

返回删除了其拖后空格字符的字符串str

select rtrim(job) from bm;

20.TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str)

返回字符串str,其所有remstr前缀或后缀被删除了。如果没有修饰符BOTH、LEADING或TRAILING

给出,BOTH被假定。如果remstr没被指定,空格被删除。

select trim(both from bm) from bm;

21.SPACE(N)

返回由N个空格字符组成的一个字符串。

select space(1) from bm;

22.REPLACE(str,from_str,to_str)

返回字符串str,其字符串from_str的所有出现由字符串to_str代替。

 select  replace('job','from_job','to_bm') from bm;

23.REPEAT(str,count)

返回由重复countTimes次的字符串str组成的一个字符串。如果count <= 0,返回一个空字符

串。如果str或count是NULL,返回NULL

select  repeat('job',2)from bm;

24.REVERSE(str)

返回颠倒字符顺序的字符串str。

select reverse(bm) from bm;

25.INSERT(str,pos,len,newstr)

返回字符串str,在位置pos起始的子串且len个字符长得子串由字符串newstr代替。

26.ELT(N,str1,str2,str3,...)

如果N= 1,返回str1,如果N= 2,返回str2,等等。如果N小于1或大于参数个数,返回NULL。 ELT()是FIELD()反运算。

select elt(2,'bm','job')from bm;

27.FIELD(str,str1,str2,str3,...)

返回str在str1, str2, str3, ...清单的索引。如果str没找到,返回0。FIELD()是ELT()反 运算。

select field('job','bm')bm;

范例:

UPPER(字符串|字段) 将字符串转化为大写返回。

为了用户测试方便,提供了一张虚拟的表dual。

SELECT UPPER('abc') FROM dual;

2.数字函数

1.ROUND(数字|列,[保留的小数位数])四舍五入

 select round(height,1) from bm;

2.MOD(数字1,数字2) 取模,求余数

select mod(sal,2)from emp;

3.ABS(数字|列)求绝对值

 SELECT ABS(-10) FROM dual;

4.SIGN(X) 返回参数的符号,为-1、0或1,取决于X是否是负数、零或正数。

select  sign(height) from bm;

5.FLOOR(X) 返回不大于X的最大整数值。

select floor(height) from bm;

6.CEILING(X) 返回不小于X的最小整数值。

select ceiling(height) from bm;

7.TRUNCATE(X,D) 返回数字X,截断为D位小数。如果D为0,结果将没有小数点或小数部分。 D为负数时 D位为0

select  truncate(height,1)  from bm;

3.日期和时间函数

1.NOW()

以'YYYY-MM-DD HH:MM:SS'或YYYYMMDDHHMMSS格式返回当前的日期和时间,取决于函数是在一个 字符串还是在数字的上下文被使用。SYSDATE() 获取系统时间

select now();

2. CURDATE()

以'YYYY-MM-DD'或YYYYMMDD格式返回今天日期值,取决于函数是在一个字符串还是数字上下文 被使 用。

select curdate();

3. CURTIME()

以'HH:MM:SS'或HHMMSS格式返回当前时间值,取决于函数是在一个字符串还是在数字的上下文 被使 用。

select curtime();
​
​

4.DAYOFWEEK(date)

返回日期date的星期索引(1=星期天,2=星期一, ……7=星期六)。

select dayofweek(now()); 

5.WEEKDAY(date)

返回date的星期索引(0=星期一,1=星期二, ……6= 星期天)。

select weekday(now());

6.DAYOFMONTH(date)

返回date的月份中日期,在1到31范围内。

select dayofmonth(now());

7.DAYOFYEAR(date)

返回date在一年中的日数, 在1到366范围内

select dayofyear(now());

8.MONTH(date)

返回date的月份,范围1到12。

select month(now());

9.DAYNAME(date)

返回date的星期名字。

 select dayname(now());

10.MONTHNAME(date)

返回date的月份名字。

 select monthname(now());

11. QUARTER(date)

返回date一年中的季度,范围1到4。

select quarter(now());

12. WEEK(date)

WEEK(date,first)

对于星期天是一周的第一天的地方,有一个单个参数,返回date的周数,范围在0到52。2个 参数 形式WEEK()允许你指定星期是否开始于星期天或星期一。如果第二个参数是0,星期从星 期天 开始,如果第二个参数是1,从星期一开始。

select week(now(),0);
​
 select week(now(),1);
​
 select week(now());

13.YEAR(date)

返回date的年份,范围在1000到9999。

select year(now());

14.HOUR(time)

返回time的小时,范围是0到23。

select hour(now());

15.MINUTE(time)

返回time的分钟,范围是0到59。

 select minute(now());

16.SECOND(time)

回来time的秒数,范围是0到59。

 select second(now());

17.PERIOD_ADD(P,N)

增加N个月到阶段P(以格式YYMM或YYYYMM)。以格式YYYYMM返回值。注意阶段参数P不是日 期值。

select period_add(202207,3);

18.PERIOD_DIFF(P1,P2)

返回在时期P1和P2之间月数,P1和P2应该以格式YYMM或YYYYMM。注意,时期参数P1和P2 不是日期值。

select period_diff(1,6);
​
select period_diff(6,1);

19.TO_DAYS(date)

给出一个日期date,返回一个天数(从0年的天数)。

select to_days(now());

20.FROM_DAYS(N)

给出一个天数N,返回一个DATE值。 从0年开始算 所以应该输大于365的数

select from_days(3000);

21.DATE_FORMAT(date,format)

根据format字符串格式化date值。

22.FROM_UNIXTIME(unix_timestamp)

以'YYYY-MM-DD HH:MM:SS'或YYYYMMDDHHMMSS格式返回unix_timestamp参数所表示的值,取决 于函数是在一个字符串还是或数字上下文中被使用。

23.FROM_UNIXTIME(unix_timestamp,format)

返回表示 Unix 时间标记的一个字符串,根据format字符串格式化。format可以包含与DATE_FORMAT()函数列出的条目同样的修饰符。

24.SEC_TO_TIME(seconds)

返回seconds参数,变换成小时、分钟和秒,值以'HH:MM:SS'或HHMMSS格式化,取决于函数是在一个字符串还是在数字上下文中被使用。

25.TIME_TO_SEC(time)

返回time参数,转换成秒。

$$
范例 NOW() 以'YYYY-MM-DD HH:MM:SS'或YYYYMMDDHHMMSS格式返回当前的日期和时间,取决于函数是在一个字符串还是在数字的上下文被使用。 SELECT NOW(); -> '1997-12-15 23:50:26' SELECT NOW() + 0; -> 19971215235026 SYSDATE() 获取系统时间 SELECT SYSDATE() FROM dual; CURDATE() 以'YYYY-MM-DD'或YYYYMMDD格式返回今天日期值,取决于函数是在一个字符串还是数字上下文被使 用。 SELECT CURDATE() FROM dual; -> '1997-12-15' SELECT CURDATE() + 0 FROM dual; -> 19971215 CURTIME() 以'HH:MM:SS'或HHMMSS格式返回当前时间值,取决于函数是在一个字符串还是在数字的上下文被使 用。 SELECT CURTIME() FROM dual; -> '23:50:26' SELECT CURTIME() + 0 FROM dual; -> 235026 DAYOFWEEK(date) 返回日期date的星期索引(1=星期天,2=星期一, ……7=星期六)。 SELECT DAYOFWEEK('1998-02-03') FROM dual; WEEKDAY(date) 返回date的星期索引(0=星期一,1=星期二, ……6= 星期天)。 SELECT WEEKDAY('1997-10-04 22:23:00') FROM dual; SELECT WEEKDAY('1997-11-05') FROM dual; DAYOFMONTH(date) 返回date的月份中日期,在1到31范围内。 SELECT DAYOFMONTH('1998-02-03') FROM dual; DAYOFYEAR(date) 返回date在一年中的日数, 在1到366范围内 SELECT DAYOFYEAR('1998-02-03') FROM dual; MONTH(date) 返回date的月份,范围1到12 SELECT MONTH('1998-02-03') FROM dual; DAYNAME(date) 返回date的星期名字。 SELECT DAYNAME("1998-02-05") FROM dual; MONTHNAME(date) 返回date的月份名字。 SELECT MONTHNAME("1998-02-05") FROM dual; QUARTER(date) 返回date一年中的季度,范围1到4。 SELECT QUARTER('1998-04-01') FROM dual; WEEK(date) WEEK(date,first) 对于星期天是一周的第一天的地方,有一个单个参数,返回date的周数,范围在0到52。2个参数 形式WEEK()允许你指定星期是否开始于星期天或星期一。如果第二个参数是0,星期从星期天开始, 如果第二个参数是1,从星期一开始。 SELECT WEEK('1998-02-20') FROM dual; SELECT WEEK('1998-02-20',0) FROM dual; SELECT WEEK('1998-02-20',1) FROM dual; YEAR(date) 返回date的年份,范围在1000到9999。 SELECT YEAR('1998-02-03') FROM dual; HOUR(time) 返回time的小时,范围是0到23。 SELECT HOUR('10:05:03') FROM dual; MINUTE(time) 返回time的分钟,范围是0到59。 SELECT MINUTE('1998-02-03 10:05:03') FROM dual; SECOND(time) 回来time的秒数,范围是0到59。 SELECT SECOND('10:05:03') FROM dual; PERIOD_ADD(P,N) 增加N个月到阶段P(以格式YYMM或YYYYMM)。以格式YYYYMM返回值。注意阶段参数P不是日期值。 SELECT PERIOD_ADD(9801,2) FROM dual; PERIOD_DIFF(P1,P2) 返回在时期P1和P2之间月数,P1和P2应该以格式YYMM或YYYYMM。注意,时期参数P1和P2不是 日期值。 SELECT PERIOD_DIFF(9802,199703) FROM dual; TO_DAYS(date) 给出一个日期date,返回一个天数(从0年的天数)。 SELECT TO_DAYS(950501) FROM dual; SELECT TO_DAYS('1997-10-07') FROM dual; FROM_DAYS(N) 给出一个天数N,返回一个DATE值。 SELECT FROM_DAYS(729669) FROM dual; DATE_FORMAT(date,format) 根据format字符串格式化date值。 下列修饰符可以被用在format字符串中: SELECT DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y') FROM dual; SELECT DATE_FORMAT('1997-10-04 22:23:00', '%H:%i:%s') FROM dual; SELECT DATE_FORMAT('1997-10-04 22:23:00','%D %y %a %d %m %b %j') FROM dual; SELECT DATE_FORMAT('1997-10-04 22:23:00', '%H %k %I %r %T %S %w') FROM dual; FROM_UNIXTIME(unix_timestamp) 以'YYYY-MM-DD HH:MM:SS'或YYYYMMDDHHMMSS格式返回unix_timestamp参数所表示的值,取决于函数是在一个字符串还是或数字上下文中被使用。 SELECT FROM_UNIXTIME(875996580) FROM dual; -> '1997-10-04 22:23:00' SELECT FROM_UNIXTIME(875996580) + 0 FROM dual; -> 19971004222300 FROM_UNIXTIME(unix_timestamp,format) 返回表示 Unix 时间标记的一个字符串,根据format字符串格式化。format可以包含与DATE_FORMAT()函数列出的条目同样的修饰符。 SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(),'%Y %D %M %h:%i:%s %x') FROM dual; -> '1997 23rd December 03:43:30 x' SEC_TO_TIME(seconds) 返回seconds参数,变换成小时、分钟和秒,值以'HH:MM:SS'或HHMMSS格式化,取决于函数是在一个字符串还是在数字上下文中被使用。 SELECT SEC_TO_TIME(2378) FROM dual; -> '00:39:38' SELECT SEC_TO_TIME(2378) + 0 FROM dual; -> 3938 TIME_TO_SEC(time) 返回time参数,转换成秒。 SELECT TIME_TO_SEC('22:23:00') FROM dual; -> 80580 SELECT TIME_TO_SEC('00:39:38') FROM dual; -> 2378
$$

  • 7
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值