MySQ增删改查小技巧

202 阅读1分钟

mysql insert批量插入数据,怎样避免因为一条记录的问题,全部数据都写入失败

使用关键字 ignore

INSERT IGNORE INTO t_user ( id, username )
VALUES
	( 1, "张三" ),
	( 1, "李四" ),
	( 2, "王五" ),
	( 3, "王二" );

因为主键约束,李四这条信息会插入失败,但是不影响其它三条数据插入成功

一条sql语句如何实现不存在就插入,存在则更新

使用 ON DUPLICATE KEY UPDATE 语句

INSERT INTO t_user ( id, username )
VALUES( 1, "赵六" ) 
ON DUPLICATE KEY UPDATE username = VALUES(username);

要不要使用子查询

MySQL数据库默认关闭了缓存,所以每个子查询都是相关子查询 相关子查询就是要循环执行多次的子查询 因为MyBatis等持久层框架开启了缓存功能,其中一级缓存就会保存子查询的结果,所以可以放心使用子查询

子查询示例sql

SELECT empno, ename FROM t_emp 
WHERE sal > ( SELECT sal FROM t_emp WHERE empno = 7499 ) 
AND empno != 7499;

如何替代子查询

使用from子查询,替代where子查询,from子查询只会执行一次,所以不是相关子查询

SELECT e.empno, e.ename FROM t_emp e
JOIN ( SELECT sal FROM t_emp WHERE empno = 7499 ) t ON e.sal > t.sal 
AND e.empno != 7499;

update语句中的where子查询如何改成表连接

where子查询

UPDATE t_emp SET sal = 10000 
WHERE deptno = (SELECT deptno FROM t_dept WHERE dname = 'SALES');

表连接

UPDATE t_emp e JOIN t_dept d ON e.deptno = d.deptno 
AND d.dname = 'SALES' 
SET e.sal = 10000, d.dname = "销售部";

delete语句也可以使用表连接


MySQL AES加密

SELECT HEX(AES_ENCRYPT('HelloWord','test_key'));

AES解密

SELECT AES_DECRYPT( UNHEX('AD0BDBFC67A8668428BCE6AC19D1A38F'),'test_key');