数据库 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
$$