left join 和 limit 起作用的时间点
如下 sql 语句 如果可以看到 这个结果本来是有4条记录的
image.png执行 SELECT * from tss_check_account LEFT JOIN tss_chkacc_detail on tss_check_account.id = tss_chkacc_detail.chkacc_id where tss_check_account.id in (1,2) limit 2
image.png结果只有两条,而且是同一个左表id对应的两条记录,由此我们可知limit是在第一张的四条记录中取的前两条,所以这个limit是在最后起作用的。事实上两条sql (加limit 和不加limit)explain 的结果是一样的,如下,一开始是使用左表主键选取两条记录,然后再用左表条件去全表扫描。最后如果有Limit 就截取前两条
explain 如下
image.png
数据库排他锁
如下开启排他锁
begin;
select * from goods where id = 1 for update;
update goods set stock = stock - 1 where id = 1;
commit;
如果在另一个session 中 执行update 或者 delete 或者select * from goods where id = 1 for update; 都会阻塞,直到事务超时阻塞,(如果占有排他锁的事务一直没提交)
数据库小操作
把一个表的一列更新到另一列中
UPDATE a_test as a ,a_copy as b set a.a = b.a where a.id = b.id and a.id = 1
把 a表中 id 为1 且id和b表中id相同的那一行的 a列的值 更新为b表那一行a列的值
mysql case when
如下表
CREATE TABLE `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
`num` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of test
-- ----------------------------
INSERT INTO `test` VALUES ('1', 'aa', '2');
INSERT INTO `test` VALUES ('2', 'aa', '1');
INSERT INTO `test` VALUES ('3', 'bb', '1');
需要展示如下形式
image.png
可使用
SELECT 1 as '列名',SUM(CASE `name` WHEN 'aa' THEN num ELSE 0 END ) aa,SUM(CASE `name` WHEN 'bb' THEN num ELSE 0 END ) bb from test ;
网友评论