平时开发中经常与数据库打交道,mysql又是现在比较常用的数据库,此文总结下平时会用到的mysql的小技巧。
1、创建备份表
快速创建和y结构一样的表x
2、获取上一次插入的自增ID
处理数据时比较有用,比如插入一条数据后,要获取插入数据的自增主键ID,就可以使用last_insert_id()
3、批量插入
可使用如下语句:
1
| INSERT INTO table1(col1,col2) select col1,col2 from table2
|
或使用如下语句:
1
| INSERT INTO table1(col1,col2) values (1,2),(2,3),(3,4);
|
批量插入比单条插入效率要高很多。
补充另外3个(插入的属性列中包含主键或者唯一索引):
1、insert ignore into
当根据主键或唯一索引判定重复时,直接忽略该条数据,执行下一条;
2、replace into
当表中存在重复数据时,则先删除此行数据,然后插入新的数据,相当于 delete + insert;
3、insert into … on duplicate key update…
当数据重复时,执行后面的update部分,当数据不存在时,执行insert.
4、合并alter操作
可以把针对同一个表的alter操作合并,提高效率
1 2
| alter table tableName add column col1 int(11), add column col2 varchar(20);
|
5、随机获取一条数据
不推荐使用 by rand();
可使用如下sql:
1 2
| SELECT * FROM users AS t1 JOIN (SELECT ROUND(RAND()*(SELECT MAX(id) FROM users)) AS id) AS t2 WHERE t1.id>=t2.id ORDER BY t1.id LIMIT 1;
|
6、日期处理
1 2 3 4 5 6 7 8 9 10 11 12 13
| SELECT CURDATE() #当前日期 SELECT NOW() #当前时间 SELECT YEAR('2020-06-29 22:31:30') #获取时间的年份 SELECT MONTH('2020-06-29 22:31:30') #获取时间的月份 SELECT DAY('2020-06-29 22:31:30') #获取时间的天数 SELECT HOUR('2020-06-29 22:31:30') #获取时间的小时 SELECT MINUTE('2020-06-29 22:31:30') #获取时间的分钟 SELECT SECOND('2020-06-29 22:31:30') #获取时间的秒数 SELECT DATE_SUB(NOW(),INTERVAL 1 YEAR) #在目前的时间减去一年 SELECT DATE_ADD(NOW(),INTERVAL 1 YEAR) #在目前的时间上加上一年 SELECT UNIX_TIMESTAMP('2020-06-29') #字符串转换成时间戳 SELECT FROM_UNIXTIME(1593360000) #时间戳转化为时间 SELECT DATE_FORMAT('2020-06-29 22:31:30', '%Y-%m-%d %H:%i:%s') #字符串转化为时间格式
|
7、判空
IFNULL(expr1,expr2)
用法:假如expr1不为NULL,则 IFNULL() 的返回值为expr1; 否则其返回值为 expr2。
ISNULL(expr)
用法:如expr 为null,那么isnull() 的返回值为 1,否则返回值为 0。
8、正则匹配
查找name字段中以’zh’开头的数据:
1
| SELECT name FROM users WHERE name REGEXP '^zh';
|
查找name字段中以’ng’结尾的数据:
1
| SELECT name FROM users WHERE name REGEXP 'ng$';
|
查找name字段中包含’li’字符串的数据:
1
| SELECT name FROM users WHERE name REGEXP 'li';
|
9、定义临时变量
1 2
| set @cur = now(); select date_format(now(), '%Y-%m-%d'), date_format(date_add(@cur,interval 1 day), '%Y-%m-%d');
|
10、使用行号
1 2 3 4 5 6 7 8 9
| SELECT USER.*, (@rownum := @rownum + 1) AS ROWNUM FROM USER INNER JOIN (SELECT @rownum := 0) r WHERE 1 ORDER BY USER.id;
|
以上几点在数据处理中会用到,以后遇到其他的再补充,大家如果有其他小技巧,欢迎评论补充!