文章目录

  • 01 数据库操作, 数据表操作
    • 1. MySQL 服务管理
      • 1.1 查看服务是否开启
      • 1.2 MySQL 服务管理命令
    • 2. 连接数据库
      • 2.1 使用命令行客户端连接
      • 使用 mysql 命令连接数据库
      • 2.2 使用 Navicat 连接
    • 3. 数据库操作介绍
    • 4. 数据库操作
      • 4.1 创建数据库
      • 4.2 修改数据库编码
      • 4.3 显示所有数据库
      • 4.4 切换、使用数据库
      • 4.5 显示当前数据库
      • 4.6 删除数据库
    • 5. 数据表操作
  • 02 数据查询
    • 1. 导入数据
      • 1.1 创建库
      • 1.2 选用库
      • 1.3 导入数据表
    • 2. 单表查询数据
      • 2.1 查询表中所有数据
      • 2.2 查询指定字段的显示
      • 2.3 as别名
      • 2.4 消除重复数据 (group by可以结合聚合函数, 其功能更强大)
      • 2.5 带条件的查询
        • 2.5.1 比较运算符
        • 2.5.2 逻辑运算符
        • 2.5.3 模糊查询
        • 2.5.4 范围查询
        • 2.5.5 空判断
      • 2.6 查询结果排序
        • 2.6.1 单字段排序
        • 2.6.2 多字段排序
      • 2.7 分页查询
      • 2.8 聚合函数
      • 2.9 分组
    • 3. 多表查询数据
      • 3.1 普通多表查询
      • 3.2 多表查询
      • 3.3 表别名
      • 3.4 内链接查询
      • 3.5 左连接查询
      • 3.6 右连接查询
      • 3.7 标量子查询
      • 3.8 列级子查询
      • 3.9 行级子查询
  • MySQL常用函数
    • 时间和日期函数
    • 数学函数
    • 系统信息函数
    • 其他函数
  • sql时间
  • MySQL日期数据类型、时间类型使用总结
    • 一、MySQL 获得当前日期时间 函数
    • 二、MySQL 日期时间 Extract(选取) 函数。
    • 三、MySQL 日期时间计算函数
    • 四、MySQL 日期转换函数、时间转换函数
    • 五、MySQL 时间戳(Timestamp)函数
    • 六、MySQL 时区(timezone)转换函数

01 数据库操作, 数据表操作

1. MySQL 服务管理

1.1 查看服务是否开启

ps aux | grep mysql

1.2 MySQL 服务管理命令

  1. 启动服务

    sudo service mysql start
    
  2. 停止服务

    sudo service mysql stop
    
  3. 重新启动服务

    sudo service mysql restart
    
  4. 查看服务状态

    sudo service mysql status
    

2. 连接数据库

2.1 使用命令行客户端连接

使用命令行客户端连接, 连接数据库需要知道主机,端口号,用户名,密码。。。

mysql -hlocalhost -p3306 -uroot -pmysql

使用 mysql 命令连接数据库

使用 mysql 命令连接数据库,可以只指定用户名和密码,其它 使用默认

mysql -u root -p

2.2 使用 Navicat 连接

cd xxx/navicat112_mysql_cs_x64/
./start_navicat

3. 数据库操作介绍

在数据库操作中,基本操作都是围绕增删改查来操作。简称CRUD

简称 全称 解释
C Create 创建
R Read/Retrieve 查询
U Update 修改
D Delete 删除

4. 数据库操作

4.1 创建数据库

create database testdb;
create database testdb2 character set utf8;
show create database testdb;

4.2 修改数据库编码

alter database testdb charset=utf8;

4.3 显示所有数据库

show databases;

4.4 切换、使用数据库

use 数据库名

use testdb;

4.5 显示当前数据库

select database();

4.6 删除数据库

drop database 数据库名

drop database testdb2;

5. 数据表操作

查看表

show tables;

创建表

create table stu(sid int,sname char(20),sage int);

显示创建表信息

show create table stu;

增加字段

alter table stu add gender char(4);

删除字段

alter table stu drop gender;

修改字段的数据类型

  alter table stu modify sname varchar(20);

修改列的数据类型并且改名

  alter table stu change sid snumber smallint;

2.4.3 MySQL 常用字段类型

整数类型

小数类型

字符串类型

枚举类型 enum(枚举值1,枚举值2,…)

enum('男','女')

2.4.4 查询数据

select * from stu;

2.4.5 插入数据

插入所有字段数据

insert into tStudent values(1,‘tom’,20)

插入指定字段

insert into stu(sage,sname) values(20,‘jack’);

插入多条数据

insert into stu values(2,‘rose’,20),(3,‘tony’,22);

更新所有的数据

update stu set sAge=25;

更新满足条件的数据

update stu set sname=‘alice’ where name=‘tony’;

2.4.7 删除数据

删除全部数据 truncate

truncate stu;不需要加条件,也不能加条件,删除全部数据,重置自动编号到默认值,没有事务,速度快。

delete from stu;相当于 truncate stu,但是delete操作有事务操作,所以速度慢,而且不会重置自动编号

删除满足条件的数据

delete from stu where snumber = 1;

2.4.8 添加约束

添加约束的作用

约束是一种限制,它通过对表的行或列的数据做出限制,来确保表的数据的准确性,

完整性、唯一性,可靠性、联动性

没有对字段设置约束时的问题

数据冗余

失去数据完整性

数据缺少唯一标识

失去实体完整性

失去域完整性

失去引用完整性

数据库常用约束

主键约束

create table tpk(id int primary key , name char(10));

自动增长

create table tai(id int auto_increment primary key,name varchar(10));

唯一性约束

create table tuni(id int unique,name char(10));

非空约束

create table tnn(id int,name char(10) not null);

默认约束

create table tdt(id int,name char(10) default ‘NoName’);

外键约束

– 表1

create table fClass(id int primary key,name char(10));

– 表2

create table fStudent(id int primary key auto_increment,

name char(10), cid int, foreign key(cid) references fClass(id));

   设置外键约束字段所关联的字段,必须是主键约束字段。想要删除有设置外键的表,必须先删除外键所关联的表。

检查约束 (在MySQL中无效,不起作用)

create table tchk(id int,age int check(age > 0 and age < 150),gender char(10) check(‘boy’ or ‘girl’));

2.4.9 增加删除约束

添加主键约束

alter table tpk add constraint PK_id primary key(id);

删除主键约束

alter table tpk drop primary key;

添加外键约束

alter table tfk add constraint FK_id foreign key (id) references tpk(id);

删除外键约束

alter table tfk drop foreign key FK_id;

2.4.10 数据库导入导出

作用:使用数据库和导入导出功能,可以对数据库进行备份,迁移等操作。

导出数据库

导出整个数据库

mysqldump -uroot -p School > school_bak.sql

导出库当中的指定表

mysqldump -uroot -p School tpk > tpk.sql

mysqldump -uroot -p School tpk tfk > tpktfk.sql

导入数据库

导入数据库前需要先创建一个空数据库, 如sch

mysql -uroot -p sch < school_bak.sql

2.4.11 数据表设计思想

需求分析:根据用户的需求,分析出需要记录的数据

需求设计:根据分析出的数据,设计E-R模型图 (Entity-Relationship,实体关系图)

详细设计:将E-R模型图转换成数据表

三大范式:使用数据库三大范式的设计思想对数据表进行审核

第一范式 : 每一列都具有原子性,也就是不能再分割

第二范式 : 每个表只描述一件事情

第三范式 : 表中不能存在冗余字段

2.4.12 数据表练习

<创建数据库 School>

create database School;

<创建学生表 tStudent>

tStudent学生表结构:

– sId – 学生编号 – sName – 姓名 – sAge – 年龄 – sGender – 性别 – sAddress-- 地址 –

sPhone – 电话 – sBirthday – 生日 – sCardId – 身份证号 – sClassId – 班级Id

答案:

create table tStudent(sId int,sName char(20),sAge tinyint,sGender enum(‘boy’,‘girl’),

sAddress varchar(50),sPhone char(11),sBirthday year,sCardId char(18),sClassid int);

<创建成绩表 tScore>

TblScore成绩表结构:

– sId(成绩id,主键,自动编号) – sStuId(学生编号) – sEnglish(英语成绩) – sMath(数学成绩)

答案:

create table tScore(sid int unsigned auto_increment primary key, sStuId int, sEnglish float(5,2), smath float(5,2) );

<创建班级表 tClass>

tClass班级表结构:

– cId –班级ID – cName –班级名称 – cDescription –班级描述 答案:

答案:

create table tClass(cId int,cName char(10),cDescription varchar(100));

<创建老师表tTeacher>

tTeacher老师表:

– tTId – tTName – tTGender – tTAge – tTSalary – tTBirthday

答案:

create table tTeacher(tId int, tName char(20),tAge tinyint,tGender enum(‘boy’,‘girl’),tSalary float(10,2),tBirthday year);

02 数据查询

1. 导入数据

安装并开启MySQL数据库服务
连接到数据库

1.1 创建库

create database db charset utf8;

1.2 选用库

use db;

1.3 导入数据表

source /home/python/Desktop/school.sql

2. 单表查询数据

2.1 查询表中所有数据

select * from t_students;

2.2 查询指定字段的显示

select c_id,c_name,c_adress from t_student;

2.3 as别名

select c_id as 学号,c_name as 姓名,c_adress 住址 from t_student;

2.4 消除重复数据 (group by可以结合聚合函数, 其功能更强大)

select distinct c_adress from t_student;select distinct c_name,c_adress from t_student;

2.5 带条件的查询

select * from t_student where c_gender="男";

2.5.1 比较运算符

select * from t_student where c_age<20;

2.5.2 逻辑运算符

select * from t_student where c_age<20 and c_gender="女";

2.5.3 模糊查询

select * from t_student where c_name like "孙";select * from t_student where c_name like "孙%";select * from t_student where c_name like "孙_";

2.5.4 范围查询

select * from t_student where id in(1,3,8);select * from t_student where id between 2 and 5;

2.5.5 空判断

select * from t_student where c_age is null;select * fron t_student where c_age is not null;

2.6 查询结果排序

2.6.1 单字段排序

select * from t_student order by c_age;select * from t_student order by c_age asc;

2.6.2 多字段排序

select * from t_student order by c_age desc,c_id asc,c_gender;

2.7 分页查询

select * from t_student limit 3;select * from t_student limit 2,3;

2.8 聚合函数

select  sum(c_age) from t_student;select avg(c_age) from t_student;select max(c_age) from t_student where c_gender="男";select min(c_age) from t_student where c_gender="女";select count(*) from t_student;select dount(*) from t_student where c_gender="女";

2.9 分组

  • 单字段分组

    select c_gender from t_student group by c_gender;
    
  • 多字段分组

    select c_gender,c_adress from t_student group by c_gender,c_adress;
    
  • group_concat()

    select c_gender,group_concat(c_name) from t_student group by c_gender;
    
  • 分组和内聚函数使用

    select c_gender,max(c_age),nin(c_age),sum(c_age),avg(c_age),count(c_age) from t_student group by c_gender;delect c_gender,max(c_age),min(c_age),sum(c_age),avg(c_age),count(c_age) from t_student group by c_gender;
    
  • having条件子句

    having作用和where类似, 用来对分组数据进行筛选
    where是对 “from 表” 中数据进行筛选
    heving是对 “group by” 分组后的数据包进行筛选
    因为在执行顺序上, 在执行where时, 分组还没有执行
    得先根据where的条件取出数据, 才能对取出的数据进行分组.

    select c_gender,group_concat(c_name) from t_student where c_age>50 group by c_gender having c_gender="女";select c_gender,group_concat(c_name) from t_student where c_age>50 group by c_gender having c_gender="女";
    
  • 分组汇总(了解即可)

    作用: 会在分组下方, 加一行, 显示汇总
    语法: with rollup

    select c_gender from t_student group by c_gender with rollup;select c_gender,count(*) from t_student group by c_gender with rollup;
    

3. 多表查询数据

3.1 普通多表查询

select * from t_student,t_class;    (无意义)

3.2 多表查询

select * from t_student,t_class where t_student.c_class_id = t_class.c_id;select t_student.name,t_student.c_name from t_student.c_

3.3 表别名

select ts.c_name as "姓名", tc.c_name "班级名" from t_student as ts,t_class tc where ts.c_class_id = tc.c_id;

3.4 内链接查询

select ts.c_name,tc.c_name from t_student as ts inner join t_class tc on ts.c_class_id = tc.c_id;

3.5 左连接查询

select ts.c_name,tc.c_name from t_student as ts left join t_class tc on ts.c_class_id = tc.c_id;

3.6 右连接查询

select ts.c_name,tc.c_name from t_student as ts right jion t_class tc on ts.c_class_id = tc.c_id;

3.7 标量子查询

select * from t_srudent where c_age > (select avg(c_age) from t_stuent);

3.8 列级子查询

select * from t_student where c_id in (select c_class_id from t_student);

3.9 行级子查询

select * from t_student where(c_age,c_calss_id) = (select max(c_age),min(c_class_id) from t_student);

MySQL常用函数

时间和日期函数

CURDATE 和 CURRENT_DATE:返回当前系统的日期值
CURTIME 和 CURRENT_TIME:返回当前系统的时间值
NOW 和 SYSDATE:返回当前系统的日期和时间值
UNIX_TIMESTAMP:获取UNIX时间戳函数
FROM_UNIXTIME:将UNIX时间戳转换为时间格式
MONTH:获取指定日期中的月份
MONTHNAME:获取指定日期中的月份英文名称
DAYNAME:获取指定日期对应的星期几的英文名称
DAYOFWEEK:获取指定日期对应的一周的索引位置值
WEEK:获取指定日期是一年中的第几周
DAYOFYEAR:获取指定日期是一年中的第几天
DAYOFMONTH:获取指定日期是一个月中的第几天
YEAR:获取年份,返回值范围是1970~2069
TIME_TO_SEC:将时间参数转换为秒数
DATE_ADD 和 ADDDATE:都是向日期添加指定的时间间隔
DATE_SUB 和 SUBDATE:都是向日期减去指定的时间间隔
ADDTIME:时间加法运算,在原始时间上添加指定的时间
SUBTIME:时间减法运算,在原始时间上减去指定的时间
DATEDIFF:获取连个日期之间间隔
WEEKDAY:获取指定日期在一周内的对应的工作日索引

数学函数

ABS(x):返回x的绝对值
SIGN(x):返回x的符号
PI():返回圆周率π,默认显示6位小数
SQRT(x):返回非负数的x的二次方根
MOD(x,y):返回x被y除后的余数
CEIL(x)、CEILING(x):返回不小于x的最小整数
FLOOR(x):返回不大于x的最大整数
EXP(x):返回e的x乘方后的值
LOG(x):返回x的自然对数,x相对于基数e的的对数
LOG10(x):返回x的基数为10的对数
RADIANS(x):返回x由角度转化为弧度的值
CHAR_LENGTH(str):计算字符串字符个数
CONCAT(s1,s2,...):返回连接参数产生的字符串
CONCAT_WS(x,s1,s2,...):返回多个字符串拼接之后的字符串
LEFT(s,n):返回字符串s从最左边开始的n个字符
RIGHT(s,n):返回字符串s从最右边开始的n个字符
TRIM(s):返回字符串s删除了两边空格之后的字符串
TRIM(s1 FROM s):删除字符串s两端所有子字符串s1
REPEAT(s,n):返回一个由重复字符串s组成的字符串
SPACE(n):返回一个由n个空格组成的字符串
REPLACE(s,s1,s2):返回一个字符串,用字符串s2代替字符串s中的所有字符串s1
SUBSTRING(s,n,len)、MID(s,n,len):从字符串s中返回一个,第n个字符串开始、长度为len的字符串
REVERSE(s):将字符串s反转
ELT(n,str1,str2,str3,str4,...):返回第n个字符串

系统信息函数

VERSION():查看MySQL版本号
CONNECTION_ID():查看当前用户的连接数
USER()\CURRENT_USER()、SYSTEM_USER()、SESSION_USER():查看当前被MySQL服务器验证的用户名和主机的组合
CHARSET(str):查看字符串str使用的字符集
COLLATION():查看字符串排列方式

其他函数

FORMAT(x,n):将数字x格式化
CONV(n,from_base,to_base):不同进制数之间的转换
INET_ATON(expr):给出一个作为字符串的网络地址的点地址
BENCHMARK(count,expr):重复执行count次表达式,expr用它在MySQL客户端内部报告语句执行的时间
CONVERT(str USING charset):是哦那个字符集charset表示字符串str

sql时间

  1. mysql产生随机数
# 1.产生0到1000间的随机数
SELECT RAND() * 10000;
# 2.对应产生相应的整数
SELECT FLOOR(RAND() * 10000);
# 3.产生500-1000间的整形
SELECT FLOOR( 500 + RAND() * (1000 - 500));
  1. mysql获取时间戳
# 秒级时间戳:1606371113
SELECT UNIX_TIMESTAMP();
# 毫秒级时间戳:1606371209293
select REPLACE(unix_timestamp(current_timestamp(3)),'.','')

MySQL日期数据类型、时间类型使用总结

MySQL 日期类型:日期格式、所占存储空间、日期范围 比较。

日期类型        存储空间       日期格式                 日期范围
------------ ---------   --------------------- -----------------------------------------
datetime       8 bytes   YYYY-MM-DD HH:MM:SS   1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
timestamp      4 bytes   YYYY-MM-DD HH:MM:SS   1970-01-01 00:00:01 ~ 2038
date           3 bytes   YYYY-MM-DD            1000-01-01          ~ 9999-12-31
year           1 bytes   YYYY                  1901                ~ 2155

在 MySQL 中创建表时,对照上面的表格,很容易就能选择到合适自己的数据类型。不过到底是选择 datetime 还是 timestamp,可能会有点犯难。这两个日期时间类型各有优点:datetime 的日期范围比较大;timestamp 所占存储空间比较小,只是 datetime 的一半。

另外,timestamp 类型的列还有个特性:默认情况下,在 insert, update 数据时,timestamp 列会自动以当前时间(CURRENT_TIMESTAMP)填充/更新。“自动”的意思就是,你不去管它,MySQL 会替你去处理。

建表的代码为:

create table t8 (`id1` timestamp NOT NULL default CURRENT_TIMESTAMP,`id2` datetime default NULL
);

一般情况下,我倾向于使用 datetime 日期类型。

两者之间的比较:

  1. timestamp容易所支持的范围比timedate要小。 并且容易出现超出的情况

2.timestamp比较受时区timezone的影响以及MYSQL版本和服务器的SQL MODE的影响.

MySQL 时间类型:时间格式、所占存储空间、时间范围。

时间类型        存储空间      时间格式                 时间范围
------------ ---------   --------------------- -----------------------------------------
time           3 bytes   HH:MM:SS              -838:59:59          ~ 838:59:59

time 时间范围居然有这么大的范围,特别是 time 可以取负值,有点奇怪。后来,看了 MySQL 手册才知道这是为了满足两个日期时间相减才这样设计的。

select timediff('2000:01:31 23:59:59', '2000:01:01 00:00:00'); -- 743:59:59
select timediff('2000:01:01 00:00:00', '2000:01:31 23:59:59'); -- -743:59:59
select timediff('23:59:59', '12:00:00');                        -- 11:59:59

注意,timediff 的两个参数只能是 datetime/timestamp, time 类型的,并且这两个参数类型要相同。即:datetime/timestamp 和 datetime/timestamp 比较;time 和 time 相比较。

虽然 MySQL 中的日期时间类型比较丰富,但遗憾的是,目前(2008-08-08)这些日期时间类型只能支持到秒级别,不支持毫秒、微秒。也没有产生毫秒的函数。

《MySQL:MySQL日期数据类型、MySQL时间类型使用总结》适用于 MySQL 5.X 及以上版本。

一、MySQL 获得当前日期时间 函数

1.1 获得当前日期+时间(date + time)函数:now()

mysql> select now();+---------------------+
| now()               |
+---------------------+
| 2008-08-08 22:20:46 |
+---------------------+

除了 now() 函数能获得当前的日期时间外,MySQL 中还有下面的函数:

current_timestamp()
,current_timestamp
,localtime()
,localtime
,localtimestamp    -- (v4.0.6)
,localtimestamp() -- (v4.0.6)

这些日期时间函数,都等同于 now()。鉴于 now() 函数简短易记,建议总是使用 now() 来替代上面列出的函数。

1.2 获得当前日期+时间(date + time)函数:sysdate()

sysdate() 日期时间函数跟 now() 类似,不同之处在于:now() 在执行开始时值就得到了, sysdate() 在函数执行时动态得到值。看下面的例子就明白了:

mysql> select now(), sleep(3), now();+---------------------+----------+---------------------+
| now()               | sleep(3) | now()               |
+---------------------+----------+---------------------+
| 2008-08-08 22:28:21 |        0 | 2008-08-08 22:28:21 |
+---------------------+----------+---------------------+mysql> select sysdate(), sleep(3), sysdate();+---------------------+----------+---------------------+
| sysdate()           | sleep(3) | sysdate()           |
+---------------------+----------+---------------------+
| 2008-08-08 22:28:41 |        0 | 2008-08-08 22:28:44 |
+---------------------+----------+---------------------+

可以看到,虽然中途 sleep 3 秒,但 now() 函数两次的时间值是相同的; sysdate() 函数两次得到的时间值相差 3 秒。MySQL Manual 中是这样描述 sysdate() 的:Return the time at which the function executes。

sysdate() 日期时间函数,一般情况下很少用到。

  1. 获得当前日期(date)函数:curdate()
mysql> select curdate();+------------+
| curdate() |
+------------+
| 2008-08-08 |
+------------+

其中,下面的两个日期函数等同于 curdate():

current_date()
,current_date
  1. 获得当前时间(time)函数:curtime()
mysql> select curtime();+-----------+
| curtime() |
+-----------+
| 22:41:30 |
+-----------+

其中,下面的两个时间函数等同于 curtime():

current_time()
,current_time
  1. 获得当前 UTC 日期时间函数:utc_date(), utc_time(), utc_timestamp()
mysql> select utc_timestamp(), utc_date(), utc_time(), now()+---------------------+------------+------------+---------------------+
| utc_timestamp()     | utc_date() | utc_time() | now()               |
+---------------------+------------+------------+---------------------+
| 2008-08-08 14:47:11 | 2008-08-08 | 14:47:11   | 2008-08-08 22:47:11 |
+---------------------+------------+------------+---------------------+

因为我国位于东八时区,所以本地时间 = UTC 时间 + 8 小时。UTC 时间在业务涉及多个国家和地区的时候,非常有用。

二、MySQL 日期时间 Extract(选取) 函数。

  1. 选取日期时间的各个部分:日期、时间、年、季度、月、日、小时、分钟、秒、微秒
set @dt = '2008-09-10 07:15:30.123456';select date(@dt);        -- 2008-09-10
select time(@dt);        -- 07:15:30.123456
select year(@dt);        -- 2008
select quarter(@dt);     -- 3
select month(@dt);       -- 9
select week(@dt);        -- 36
select day(@dt);         -- 10
select hour(@dt);        -- 7
select minute(@dt);      -- 15
select second(@dt);      -- 30
select microsecond(@dt); -- 123456
  1. MySQL Extract() 函数,可以上面实现类似的功能:
set @dt = '2008-09-10 07:15:30.123456';select extract(year                from @dt); -- 2008
select extract(quarter             from @dt); -- 3
select extract(month               from @dt); -- 9
select extract(week                from @dt); -- 36
select extract(day                 from @dt); -- 10
select extract(hour                from @dt); -- 7
select extract(minute              from @dt); -- 15
select extract(second              from @dt); -- 30
select extract(microsecond         from @dt); -- 123456select extract(year_month          from @dt); -- 200809
select extract(day_hour            from @dt); -- 1007
select extract(day_minute          from @dt); -- 100715
select extract(day_second          from @dt); -- 10071530
select extract(day_microsecond     from @dt); -- 10071530123456
select extract(hour_minute         from @dt); --    715
select extract(hour_second         from @dt); --    71530
select extract(hour_microsecond    from @dt); --    71530123456
select extract(minute_second       from @dt); --      1530
select extract(minute_microsecond from @dt); --      1530123456
select extract(second_microsecond from @dt); --        30123456

MySQL Extract() 函数除了没有date(),time() 的功能外,其他功能一应具全。并且还具有选取‘day_microsecond’ 等功能。注意这里不是只选取 day 和 microsecond,而是从日期的 day 部分一直选取到 microsecond 部分。够强悍的吧!

MySQL Extract() 函数唯一不好的地方在于:你需要多敲几次键盘。

  1. MySQL dayof… 函数:dayofweek(), dayofmonth(), dayofyear()

分别返回日期参数,在一周、一月、一年中的位置。

set @dt = '2008-08-08';select dayofweek(@dt);   -- 6
select dayofmonth(@dt); -- 8
select dayofyear(@dt);   -- 221

日期 ‘2008-08-08’ 是一周中的第 6 天(1 = Sunday, 2 = Monday, …, 7 = Saturday);一月中的第 8 天;一年中的第 221 天。

  1. MySQL week… 函数:week(), weekofyear(), dayofweek(), weekday(), yearweek()
set @dt = '2008-08-08';select week(@dt);        -- 31
select week(@dt,3);      -- 32
select weekofyear(@dt); -- 32select dayofweek(@dt);   -- 6
select weekday(@dt);     -- 4select yearweek(@dt);    -- 200831

MySQL week() 函数,可以有两个参数,具体可看手册。 weekofyear() 和 week() 一样,都是计算“某天”是位于一年中的第几周。 weekofyear(@dt) 等价于 week(@dt,3)。

MySQL weekday() 函数和 dayofweek() 类似,都是返回“某天”在一周中的位置。不同点在于参考的标准, weekday:(0 = Monday, 1 = Tuesday, …, 6 = Sunday); dayofweek:(1 = Sunday, 2 = Monday, …, 7 = Saturday)

MySQL yearweek() 函数,返回 year(2008) + week 位置(31)。

  1. MySQL 返回星期和月份名称函数:dayname(), monthname()
set @dt = '2008-08-08';select dayname(@dt);     -- Friday
select monthname(@dt);   -- August

思考,如何返回中文的名称呢?

  1. MySQL last_day() 函数:返回月份中的最后一天。
select last_day('2008-02-01'); -- 2008-02-29
select last_day('2008-08-08'); -- 2008-08-31

MySQL last_day() 函数非常有用,比如我想得到当前月份中有多少天,可以这样来计算:

mysql> select now(), day(last_day(now())) as days;+---------------------+------+
| now()               | days |
+---------------------+------+
| 2008-08-09 11:45:45 |   31 |
+---------------------+------+

三、MySQL 日期时间计算函数

  1. MySQL 为日期增加一个时间间隔:date_add()
set @dt = now();select date_add(@dt, interval 1 day);        -- add 1 day
select date_add(@dt, interval 1 hour);       -- add 1 hour
select date_add(@dt, interval 1 minute);     -- ...
select date_add(@dt, interval 1 second);
select date_add(@dt, interval 1 microsecond);
select date_add(@dt, interval 1 week);
select date_add(@dt, interval 1 month);
select date_add(@dt, interval 1 quarter);
select date_add(@dt, interval 1 year);select date_add(@dt, interval -1 day);       -- sub 1 day

MySQL adddate(), addtime()函数,可以用 date_add() 来替代。下面是 date_add() 实现 addtime() 功能示例:

mysql> set @dt = '2008-08-09 12:12:33';mysql>
mysql> select date_add(@dt, interval '01:15:30' hour_second);+------------------------------------------------+
| date_add(@dt, interval '01:15:30' hour_second) |
+------------------------------------------------+
| 2008-08-09 13:28:03                            |
+------------------------------------------------+mysql> select date_add(@dt, interval '1 01:15:30' day_second);+-------------------------------------------------+
| date_add(@dt, interval '1 01:15:30' day_second) |
+-------------------------------------------------+
| 2008-08-10 13:28:03                             |
+-------------------------------------------------+

date_add() 函数,分别为 @dt 增加了“1小时 15分 30秒” 和 “1天 1小时 15分 30秒”。建议:总是使用 date_add() 日期时间函数来替代 adddate(), addtime()。

  1. MySQL 为日期减去一个时间间隔:date_sub()

    mysql> select date_sub('1998-01-01 00:00:00', interval '1 1:1:1' day_second);+----------------------------------------------------------------+
    | date_sub('1998-01-01 00:00:00', interval '1 1:1:1' day_second) |
    +----------------------------------------------------------------+
    | 1997-12-30 22:58:59                                            |
    +----------------------------------------------------------------+
    

MySQL date_sub() 日期时间函数 和 date_add() 用法一致,不再赘述。另外,MySQL 中还有两个函数 subdate(), subtime(),建议,用 date_sub() 来替代。

  1. MySQL 另类日期函数:period_add(P,N), period_diff(P1,P2)

函数参数“P” 的格式为“YYYYMM” 或者 “YYMM”,第二个参数“N” 表示增加或减去 N month(月)。

MySQL period_add(P,N):日期加/减去N月。

mysql> select period_add(200808,2), period_add(20080808,-2)+----------------------+-------------------------+
| period_add(200808,2) | period_add(20080808,-2) |
+----------------------+-------------------------+
|               200810 |                20080806 |
+----------------------+-------------------------+

MySQL period_diff(P1,P2):日期 P1-P2,返回 N 个月。

mysql> select period_diff(200808, 200801);+-----------------------------+
| period_diff(200808, 200801) |
+-----------------------------+
|                           7 |
+-----------------------------+

在 MySQL 中,这两个日期函数,一般情况下很少用到。

  1. MySQL 日期、时间相减函数:datediff(date1,date2), timediff(time1,time2)
    MySQL datediff(date1,date2):两个日期相减 date1 - date2,返回天数。

    select datediff('2008-08-08', '2008-08-01'); -- 7
    select datediff('2008-08-01', '2008-08-08'); -- -7
    

    MySQL timediff(time1,time2):两个日期相减 time1 - time2,返回 time 差值。

    select timediff('2008-08-08 08:08:08', '2008-08-08 00:00:00'); -- 08:08:08
    select timediff('08:08:08', '00:00:00');                       -- 08:08:08
    

    注意:timediff(time1,time2) 函数的两个参数类型必须相同。

四、MySQL 日期转换函数、时间转换函数

  1. MySQL (时间、秒)转换函数:time_to_sec(time), sec_to_time(seconds)
select time_to_sec('01:00:05'); -- 3605
select sec_to_time(3605);        -- '01:00:05'
  1. MySQL (日期、天数)转换函数:to_days(date), from_days(days)
select to_days('0000-00-00'); -- 0
select to_days('2008-08-08'); -- 733627select from_days(0);           -- '0000-00-00'
select from_days(733627);      -- '2008-08-08'
  1. MySQL Str to Date (字符串转换为日期)函数:str_to_date(str, format)
select str_to_date('08/09/2008', '%m/%d/%Y');                   -- 2008-08-09
select str_to_date('08/09/08' , '%m/%d/%y');                   -- 2008-08-09
select str_to_date('08.09.2008', '%m.%d.%Y');                   -- 2008-08-09
select str_to_date('08:09:30', '%h:%i:%s');                     -- 08:09:30
select str_to_date('08.09.2008 08:09:30', '%m.%d.%Y %h:%i:%s'); -- 2008-08-09 08:09:30

可以看到,str_to_date(str,format) 转换函数,可以把一些杂乱无章的字符串转换为日期格式。另外,它也可以转换为时间。“format” 可以参看 MySQL 手册。

  1. MySQL Date/Time to Str(日期/时间转换为字符串)函数:date_format(date,format), time_format(time,format)
mysql> select date_format('2008-08-08 22:23:00', '%W %M %Y');+------------------------------------------------+
| date_format('2008-08-08 22:23:00', '%W %M %Y') |
+------------------------------------------------+
| Friday August 2008                             |
+------------------------------------------------+mysql> select date_format('2008-08-08 22:23:01', '%Y%m%d%H%i%s');+----------------------------------------------------+
| date_format('2008-08-08 22:23:01', '%Y%m%d%H%i%s') |
+----------------------------------------------------+
| 20080808222301                                     |
+----------------------------------------------------+mysql> select time_format('22:23:01', '%H.%i.%s');+-------------------------------------+
| time_format('22:23:01', '%H.%i.%s') |
+-------------------------------------+
| 22.23.01                            |
+-------------------------------------+

MySQL 日期、时间转换函数:date_format(date,format), time_format(time,format) 能够把一个日期/时间转换成各种各样的字符串格式。它是 str_to_date(str,format) 函数的 一个逆转换。

  1. MySQL 获得国家地区时间格式函数:get_format()

MySQL get_format() 语法:

get_format(date|time|datetime, 'eur'|'usa'|'jis'|'iso'|'internal'

MySQL get_format() 用法的全部示例:

select get_format(date,'usa')          ;   -- '%m.%d.%Y'
select get_format(date,'jis')          ;   -- '%Y-%m-%d'
select get_format(date,'iso')          ;   -- '%Y-%m-%d'
select get_format(date,'eur')          ;   -- '%d.%m.%Y'
select get_format(date,'internal')     ;   -- '%Y%m%d'
select get_format(datetime,'usa')      ;   -- '%Y-%m-%d %H.%i.%s'
select get_format(datetime,'jis')      ;   -- '%Y-%m-%d %H:%i:%s'
select get_format(datetime,'iso')      ;   -- '%Y-%m-%d %H:%i:%s'
select get_format(datetime,'eur')      ;   -- '%Y-%m-%d %H.%i.%s'
select get_format(datetime,'internal') ;   -- '%Y%m%d%H%i%s'
select get_format(time,'usa')          ;   -- '%h:%i:%s %p'
select get_format(time,'jis')          ;   -- '%H:%i:%s'
select get_format(time,'iso')          ;   -- '%H:%i:%s'
select get_format(time,'eur')          ;   -- '%H.%i.%s'
select get_format(time,'internal')     ;   -- '%H%i%s'

MySQL get_format() 函数在实际中用到机会的比较少。

  1. MySQL 拼凑日期、时间函数:makdedate(year,dayofyear), maketime(hour,minute,second)
select makedate(2001,31);   -- '2001-01-31'
select makedate(2001,32);   -- '2001-02-01'select maketime(12,15,30); -- '12:15:30'

五、MySQL 时间戳(Timestamp)函数

  1. MySQL 获得当前时间戳函数:current_timestamp, current_timestamp()
mysql> select current_timestamp, current_timestamp();+---------------------+---------------------+
| current_timestamp   | current_timestamp() |
+---------------------+---------------------+
| 2008-08-09 23:22:24 | 2008-08-09 23:22:24 |
+---------------------+---------------------+
  1. MySQL (Unix 时间戳、日期)转换函数:
unix_timestamp(),
unix_timestamp(date),
from_unixtime(unix_timestamp),
from_unixtime(unix_timestamp,format)

下面是示例:

select unix_timestamp();                       -- 1218290027            ===得到当前时间的UNIX时间值

将具体时间来转换成timestamp

select unix_timestamp('2008-08-08');           -- 1218124800
select unix_timestamp('2008-08-08 12:30:00'); -- 1218169800

将timestamp来转换成具体时间

select from_unixtime(1218290027);              -- '2008-08-09 21:53:47'
select from_unixtime(1218124800);              -- '2008-08-08 00:00:00'
select from_unixtime(1218169800);              -- '2008-08-08 12:30:00'select from_unixtime(1218169800, '%Y %D %M %h:%i:%s %x'); -- '2008 8th August 12:30:00 2008'
  1. MySQL 时间戳(timestamp)转换、增、减函数:
timestamp(date)                                     -- date to timestamp
timestamp(dt,time)                                  -- dt + time
timestampadd(unit,interval,datetime_expr)           --
timestampdiff(unit,datetime_expr1,datetime_expr2)   --

请看示例部分:

select timestamp('2008-08-08');                         -- 2008-08-08 00:00:00
select timestamp('2008-08-08 08:00:00', '01:01:01');    -- 2008-08-08 09:01:01
select timestamp('2008-08-08 08:00:00', '10 01:01:01'); -- 2008-08-18 09:01:01select timestampadd(day, 1, '2008-08-08 08:00:00');     -- 2008-08-09 08:00:00
select date_add('2008-08-08 08:00:00', interval 1 day); -- 2008-08-09 08:00:00

MySQL timestampadd() 函数类似于 date_add()。

select timestampdiff(year,'2002-05-01','2001-01-01');                    -- -1
select timestampdiff(day ,'2002-05-01','2001-01-01');                    -- -485
select timestampdiff(hour,'2008-08-08 12:00:00','2008-08-08 00:00:00'); -- -12select datediff('2008-08-08 12:00:00', '2008-08-01 00:00:00');           -- 7

MySQL timestampdiff() 函数就比 datediff() 功能强多了,datediff() 只能计算两个日期(date)之间相差的天数。

六、MySQL 时区(timezone)转换函数

convert_tz(dt,from_tz,to_tz)select convert_tz('2008-08-08 12:00:00', '+08:00', '+00:00'); -- 2008-08-08 04:00:00

时区转换也可以通过 date_add, date_sub, timestampadd 来实现。

select date_add('2008-08-08 12:00:00', interval -8 hour); -- 2008-08-08 04:00:00
select date_sub('2008-08-08 12:00:00', interval 8 hour); -- 2008-08-08 04:00:00
select timestampadd(hour, -8, '2008-08-08 12:00:00');      -- 2008-08-08 04:00:00

《MySQL》MySQL教程相关推荐

  1. db2 springboot 整合_springboot的yml配置文件通过db2的方式整合mysql的教程

    springboot整合MySQL很简单,多数据源就master,slave就行了,但是在整合DB2就需要另起一行,以下是同一个yml文件 先配置MySQL,代码如下 spring: datasour ...

  2. PHP环境搭建:Windows 7下安装配置PHP+Apache+Mysql环境教程(转)

    转至:http://www.leapsoul.cn/?p=695 这两天刚装好Windows 7,碰巧前段时间有朋友问我Windows下如何安装搭建PHP环境,所以打算勤劳下,手动一步步搭建PHP环境 ...

  3. centos得mysql安装教程_Centos下Mysql安装图文教程_MySQL

    Mysql是比较常用的数据库,日常开发中也是采用地比较多.工欲善其事必先利其器,本文特地来讲解下如何在centos(其他linux发行版类似)下安装Mysql.首先准备的材料:Mysql,我这里采用的 ...

  4. mysql 5.7.17远端登陆_Mysql 5.7.17安装后登录mysql的教程

    Mysql-5.7.17的安装在文章下面有介绍,大家可以参考下.下面先给大家介绍下Mysql 5.7.17安装后登录mysql的教程,一起看看吧. 在运行 ./bin/mysqld –initiali ...

  5. mysql怎么滤空_《MySQL 入门教程》第 08 篇 过滤条件

    文章来源:<MySQL 入门教程>第 08 篇 过滤条件 原文作者:不剪发的Tony老师 来源平台:CSDN 上一篇我们学习了如何使用 SELECT 和 FROM 查询表中的数据.很多时候 ...

  6. Win10+Python+Django+Nginx+MySQL开发教程及实例(1)——开发环境搭建

    Win10+Python+Django+Nginx+MySQL开发教程及实例 PaulTsao 本教程共有三篇内容: 第一篇:Win10+Python+Django+Nginx+MySQL 开发环境搭 ...

  7. 32位mysql安装包_《MySQL 入门教程》第 02 篇 MySQL 安装

    文章来源:<MySQL 入门教程>第 02 篇 MySQL 安装 原文作者:不剪发的Tony老师 来源平台:CSDN 上一篇我们了解了什么是MySQL数据库. 本文介绍如何在 Window ...

  8. python安装mysql数据库教程,Python配置mysql的教程(必看)

    下面小编就为大家带来一篇Python配置mysql的教程(推荐).小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 Linux系统自带Python,且根据系统自带资源来对p ...

  9. qt 连接mysql数据库_QT连接MYSQL数据库教程

    QT连接MYSQL数据库教程 最近购买了阿里云Linux服务器,处于自学需要安装了MYSQL5.7. 准备用QT开发个小工具,在使用QT提供的标准类连接MYSQL库的时候一直爆出无法加载MYSQL驱动 ...

  10. mysql 全文检索 教程_MySQL:详细说明MySQL全文检索图文详细教程

    软件安装:装机软件必备包 本站电脑知识提供电脑入门知识,计算机基础知识,计算机网络应用基础知识,电脑配置知识,电脑故障排除和电脑常识大全,帮助您更好的学习电脑!不为别的,只因有共同的爱好,为中国互联网 ...

最新文章

  1. 初步了解超图官网提供的应用程序
  2. CVPR 2018 RASNet:《Learning Attentions: Residual Attentional Siamese Network for Tracking》论文笔记
  3. Python多继承基础
  4. 如何修改移动设备按钮默认样式
  5. 信息学奥赛一本通(1172:求10000以内n的阶乘)
  6. 配置多台机器SSH相互通信信任
  7. 重写重载与重定义的区别
  8. 关于e的等式及相关证明
  9. 围棋选手不到30岁就下坡,最大因素是什么?
  10. php l框架,一个很简单的PHP框架lyue
  11. R-CNN解读+代码梳理
  12. 从二维码图片到镂空二维码stl模型(1)
  13. 华为达芬奇AI芯片架构
  14. 红蜘蛛10013端口被占用
  15. 一切成功源于积累——20140928 认识货币——英镑
  16. 自行解决12306页面显示异常的问题(长城宽带下WWW。12306无法正常使用)
  17. PWM控制的基本原理
  18. 记录win10突然卡死,只有鼠标能动,无法点击,大小写灯失效,只能强制关机
  19. [Python] Python数值取整
  20. 惠普打印机驱动服务器系统安装教程,Hp打印机驱动怎么安装,详细图文版教程...

热门文章

  1. 凌晨三点,官方警报消息吵醒了你,消息内容是:「不要抬头看月亮。」(一)
  2. 用c语言完成流水灯控制的程序设计,单片机C语言程序设计之TIMER0控制流水灯
  3. java h5 桌面应用_用HTML5打造本地桌面应用
  4. 用html5,nodeJs开发桌面应用程序
  5. 病毒主动即时升级 反病毒软件如何应对
  6. [论文笔记-1]Aspect-based Sentiment Analysis as Machine Reading Comprehension
  7. 【NeRF】原始论文解读
  8. QQ改群资料显示抱歉服务器繁忙,更换管理员失败,提示云服务器繁忙~!
  9. c语言中如何输出右斜杆,在C++中怎么输入反斜杠“ \ ”
  10. Android 实现全屏截图、剪裁图片、分享图片至其他应用进程功能(踩坑记录)