数据库一些记录

2018-07-04  本文已影响0人  c7d122ec46c0

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 ;
上一篇下一篇

猜你喜欢

热点阅读