MySql使用及SQL语法学习
作为一个半吊子的全栈开发工程师,有些时候,不想和数据库打交道,但是任何一个系统都离不开数据库,想避开是不可能的了,硬着头皮上呗。
1.MySQL中字符串转成日期格式
在进行查询的时候,有些日期格式是使用的字符串存储的,比如:”2019-07-31 12:23:23“,但是比较的时候,需要用到日期格式,比如比较两个日期的大小:BETWEEN,这个时候就需要使用STR_TO_DATE函数。奇怪的问题是这样的。
第一张图,显示了字符串型的日期,没毛病:

第二张图,查询的时候,却出现了null,关键不是所有的都是null,而是有的是null有的不是:

经过仔细的比对,可以发现,当小时数小于12的时候,是可以转换成功的,但是没有一个18这种小时数被转换成功的,所以,猜测,应该是使用:STR_TO_DATE(i.statustime,’%Y-%m-%d %h:%i:%s’),只能转换12小时格式的时间。将 %h 改为 %H ,果然就正常了。(基础知识不扎实,硬伤啊)

1.mysql str_to_date 字符串转换为日期
2.统计一天中记录数
比如说,我想知道2019年7月31号,这一天,总共有多少条记录,可以使用
1 | SELECT COUNT(*) AS interruptCount FROM interrupt_server i WHERE (STR_TO_DATE(i.statustime,'%Y-%m-%d %H:%i:%s') BETWEEN '2019-07-31 00:00:00' AND '2019-07-31 23:59:59') and serviceid=3207 |
如果更进一步,分组查询某个时间段内容,某个分组中的某个条件大于一定值的数据怎么办呢?这里给个例子
1 | SELECT *,COUNT(*) AS interruptCount FROM interrupt_server i WHERE servicestatus>0 and (STR_TO_DATE(i.statustime,'%Y-%m-%d %H:%i:%s') BETWEEN ?1 AND ?2) and city LIKE ?3 and county like ?4 GROUP BY serviceid HAVING interruptCount >= ?5 |
里面的?1,?2,?3…这些是为了java spring boot传递参数预留的。上面的大致的意思是,先根据wehere条件进行了筛选,然后根据serviceid进行了分组,最后在各个分组中挑选出符合条件的一系列数据行,组成最后的结果集展示出来。
3.查询离某个时间点最近的记录
查询离’2018-03-20 23:57:33’这个时间点最近的一条记录:
1 | SELECT *, ABS(STR_TO_DATE('2018-03-20 23:57:33','%Y-%m-%d %H:%i:%s') - STR_TO_DATE(statustime,'%Y-%m-%d %H:%i:%s') ) AS diffTime |
查询离某个时间点最近的记录,并且时间要早于这个时间点:
1 | SELECT *, (STR_TO_DATE('2019-03-25 17:19:02','%Y-%m-%d %H:%i:%s') - STR_TO_DATE(statusutime,'%Y-%m-%d %H:%i:%s')) AS diffTime |
4.时间分段分组求和
需求是这样的:给定一个开始时间,一个结束时间,然后一个数据周期,比如说一个小时,那么就要统计从开始时间到结束时间,每一个小时之内的某一个字段的累计总量或者是平均值,如果周期是两个小时,那么就是统计从开始时间到结束时间每两个小时之内的某个字段的累计总量或者是平均值。
1 | declare @begin datetime,@end datetime,@interval int |
1.用sql语句按指定时间段分组统计
2.SQL——按照季度,固定时间段,分组统计数据
3.用sql语句按指定时间段分组统计
4.sql查询技巧,按时间分段进行分组,每半小时一组统计组内记录数量
5.SQL按时间分段分组统计数据
4.sql 语言 groupBy 分组统计时间段解决方案
5.关于MYSQL group by 分组按时间取最大值的实现方法
6.SQL GROUP BY 语句
7.如何按ClickHouse中的时间段进行分组,并使用nulls / 0s填充缺失的数据
8.这大概是最全的sql优化方案了
5.join联合查询
1.sql联合查询 JOIN和UNION区别
6.自动增长
1 | CREATE TABLE tb_student( |
1.MySQL AUTO_INCREMENT:主键自增长
7.重置自动增长列
(1) 首先,取消 kalacloud_table_demo 表中 ID 列的自增和主键的定义:
1 | ALTER TABLE kalacloud_table_demo MODIFY COLUMN id int NOT NULL FIRST ,DROP PRIMARY KEY; |
(2) 在表里新增 id_renew 列,设置为自增(AUTO_INCREMENT)主键(PRIMARY KEY),我们将使用这个列来替换 ID 列。
1 | ALTER TABLE kalacloud_table_demo ADD COLUMN id_renew int NULL AUTO_INCREMENT FIRST ,ADD PRIMARY KEY (id_renew); |
(3) 新增的id_renew列已经是连续数字,使用 SELECT 查看当前表情况,可以看到新增的 id_renew 这一列的顺序已经是连续的了。
(4) 接着,我们可以删除掉原来乱序的 ID 列
1 | ALTER TABLE kalacloud_table_demo DROP COLUMN id; |
(5) 最后,我们将 id_renew ,重命名,更为 id
1 | ALTER TABLE kalacloud_table_demo CHANGE COLUMN id_renew id int(7) NOT NULL AUTO_INCREMENT FIRST; |