美文网首页
数据库一些记录

数据库一些记录

作者: c7d122ec46c0 | 来源:发表于2018-07-04 22:37 被阅读0次

    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 ;
    

    相关文章

      网友评论

          本文标题:数据库一些记录

          本文链接:https://www.haomeiwen.com/subject/tvgyuftx.html