MySQL工作总结

1.在表中具体某个位置上新增一列

(1).在某列后面新增一列

ALTER TABLE '表名' ADD COLUMN '增加列名' VARCHAR(20) NOT NULL COMMENT '注释' AFTER '列名';

(2).新增一列指定为表中的第一列

ALTER TABLE '表名' ADD COLUMN '增加列名' VARCHAR(20) NOT NULL COMMENT '注释' FIRST;

2.FORMAT 格式化

#保留4位小数
SELECT FORMAT('2013.123456',4);

运行结果:

 3.IFNULL 为空判断

#如果为空,默认为"0"
SELECT IFNULL(NULL,"0");

#如果为空,默认为"晓"
SELECT IFNULL(NULL,"晓");

运行结果:

 

  4.DATE_FORMAT 格式化日期形式

SET @batchDate = "2020-12-28";
SELECT DATE_SUB(@batchDate,INTERVAL WEEKDAY(@batchDate) +0 DAY) AS "本周一",DATE_SUB(@batchDate,INTERVAL WEEKDAY(@batchDate) -6 DAY) AS "本周日";

运行结果:

5.获取本周第一天和最后一天、上周第一天和最后一天

SET @batchDate = "2020-12-28";
SELECT DATE_SUB(@batchDate,INTERVAL WEEKDAY(@batchDate) +0 DAY) AS "本周一",DATE_SUB(@batchDate,INTERVAL WEEKDAY(@batchDate) -6 DAY) AS "本周日";

运行结果:

SET @batchDate = "2020-12-28";
SELECT DATE_SUB(@batchDate,INTERVAL WEEKDAY(@batchDate) +7 DAY) AS "上周一",DATE_SUB(@batchDate,INTERVAL WEEKDAY(@batchDate) +1 DAY) AS "上周日";

运行结果:

6.获取当月的第一天和最后一天、上月的第一天和最后一天

#获取日期"20201228"这个日期当前月的第一天和最后一天日期
SELECT DATE_ADD("20201228",INTERVAL -DAY("20201228")+1 DAY) AS '当月的第一天日期',LAST_DAY("20201228") AS '当月的最后一天日期';

运行结果:

#获取日期"2020-12-28"上一个月的第一天和最后一天日期
SELECT ADDDATE(LAST_DAY(SUBDATE("2020-12-28",INTERVAL 2 MONTH)),1) AS "上个月的第一天",LAST_DAY(SUBDATE("2022-12-28",INTERVAL 1 MONTH)) AS "上个月的最后一天";

 运行结果:

7.获取上一年当月的第一天和最后一天

SET @batchDate = "2020-12-28";
SELECT DATE_ADD(DATE_ADD(@batchDate,INTERVAL -DAY(@batchDate)+1 DAY),INTERVAL -12 MONTH) AS '去年当月第一天',DATE_ADD(LAST_DAY(@batchDate),INTERVAL -12 MONTH) AS '去年当月最后一天';

运行结果:

 

8.获取日期中的year、month、day

#获取日期中的year、month、day
set @dateTemp = "20201228";
SELECT YEAR(@dateTemp),MONTH(@dateTemp),DAY(@dateTemp);

运行结果:

9.获取当前日期月份的天数

#计算当前日期月份的天数的
SELECT DAY(LAST_DAY(CURDATE())) AS "方式一天数",TIMESTAMPDIFF(DAY,CURDATE(),(DATE_ADD(CURDATE(),INTERVAL 1 MONTH))) AS "方式二天数";

 运行结果:

10.获取当年的第一天和最后一天

#获取当年的第一天和最后一天
SELECT CONCAT(YEAR("2020-12-28"),"-01-01") AS "当年的第一天", CONCAT(YEAR("2020-12-28"),"-12-31") AS "当年的最后一天";

运行结果:

 

11.获取去年的第一天和最后一天

SET @batchDate = "2020-12-28";
SELECT CONCAT(YEAR(@batchDate)-1,"-01-01") AS '去年第一天',CONCAT(YEAR(@batchDate)-1,"-12-31") AS '去年最后一天';

运行结果:

 

12.计算两个日期之间相差天数

#计算date1和date2相差天数
SELECT DATEDIFF("2020-12-01","2020-11-01") AS "相差天数";

运行结果:

 

13.判断一个字符串是否包含某个字符

LOCATE(s,str):如果包含s字符就会返回这个字符在str字符串中的索引;否则返回0。

#字符串是否包含某个字段
SET @str = "ASGB";
SELECT LOCATE("S",@str) AS "是否包含S",LOCATE("B",@str) AS "是否包含B",LOCATE("W",@str) AS "是否包含W",LOCATE("T",NULL) AS "是否包含T";

 运行结果:

14.TIMESTAMPDIFF

(1).计算两个日期间隔的年数,精确到天

#计算两个日期间隔的年数,精确到天
SELECT TIMESTAMPDIFF(YEAR,'2020-01-08','2022-01-07') AS "YEAR";

(2).根据身份证号计算年龄,精确到天

#根据身份证计算年龄,精确到天
SELECT TIMESTAMPDIFF(YEAR,SUBSTRING('410425199112216013',7,8),'2021-12-21') AS "AGE";

15.更换主键操作

(1).删除主键

1)新建表

#新建表
CREATE TABLE temp_table(
app_no VARCHAR(30) PRIMARY KEY COMMENT '授信号',
id_no VARCHAR(10) DEFAULT NULL COMMENT '身份证号'
);

2)删除主键

#删除主键
ALTER TABLE temp_table DROP PRIMARY KEY;

删除前:

删除后:

(2).更换主键

        有时候系统会要求表中必须有主键,这时候如果变更主键,需要将删除主键和新增主键归为一条语句,同时进行,否则会报错。

1)新建表

#新建表
CREATE TABLE temp_table(
app_no VARCHAR(30) PRIMARY KEY COMMENT '授信号',
id_no VARCHAR(10) DEFAULT NULL COMMENT '身份证号'
);

2)更换主键

#更换主键
ALTER TABLE temp_table DROP PRIMARY KEY,ADD id BIGINT(19) NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'id' FIRST;

变更前:

变更后:

16.获取几个值中的最大值

#获取几个值中的最大值
SELECT GREATEST(45,55,12) AS "最大的值";

运行结果:

17.数据库内存满了,使用delete删除数据表后内存没有减少,反而增加了

原因:

delete 删除数据时,其实对应的数据行并不是真正的删除,仅仅是将其标记成可复用的状态,所以表空间不会变小。并且delete语句每次删除一行,会在事务日志中为所删除的每行记录一项。所以就会出现使用delete清除数据空间后,不但空间没有变小,反而增大的原因。

解决办法:

RENAME TABLE yak_key_context to yak_key_context_hst;
CREATE TABLE yak_key_context LIKE yak_key_context_hst;
DROP TABLE yak_key_context_hst;

参考:

(1)MySQL基础系列之 DDL、DML和DCL的区别与理解_通往架构师的路上的博客-CSDN博客

(2)Mysql数据库执行delete命令删除表数据后,主机磁盘空间为什么还被一直占用着呢?_不太想事贼佛系的CV码农的博客-CSDN博客_mysql 一直执行 delete数据 (3)MySQL中Delete和Truncate区别_mysql truncate和delete_Decade102的博客-CSDN博客

18.查询数据库中表的内存

(1)查询某个数据库中每个表所占内存:

-- 查询mysql数据库中每个表所占空间,倒序排序
-- 方法一:
SELECT TABLE_NAME AS '表名',CONCAT(ROUND(SUM(DATA_LENGTH/1024/1024),2),"MB") AS 'data'
FROM information_schema.`TABLES`
WHERE TABLE_SCHEMA = 'mysql' -- 数据库
GROUP BY TABLE_NAME         
ORDER BY DATA_LENGTH DESC;

-- 方法二:
SELECT TABLE_NAME AS '表名',TRUNCATE(DATA_LENGTH/1024/1024,2) AS 'data'
FROM information_schema.`TABLES`
WHERE TABLE_SCHEMA = 'mysql' -- 数据库
GROUP BY TABLE_NAME         
ORDER BY DATA_LENGTH DESC;

方法一运行结果:

方法二运行结果:

(2)查询某个数据库中某个表所占内存:

-- 查询mysql数据库中具体某个表的所占空间
-- 方法一:
SELECT  TABLE_NAME AS '表名',CONCAT(ROUND(SUM(DATA_LENGTH/1024/1024),2),"MB") AS 'data'
FROM information_schema.`TABLES`
WHERE TABLE_SCHEMA = 'mysql' AND TABLE_NAME = 'help_topic';

-- 方法二:
SELECT  TABLE_NAME AS '表名',TRUNCATE(DATA_LENGTH/1024/1024,2) AS 'data'
FROM information_schema.`TABLES`
WHERE TABLE_SCHEMA = 'mysql' AND TABLE_NAME = 'help_topic';

方法一运行结果:

方法二运行结果:

19.查看当前安装mysql数据库的版本

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值