日常开发sql使用总结

版权声明:原创博文,转载请注明出处~ https://blog.csdn.net/She_lock/article/details/83301968

1、关联分页查询

关联分页查询是日常开发中常见的,使用MybatisPlus插件后,单表分页查询变得很简单,一条语句就可以搞定了如下:


       String staffGid = (String) params.get("staffGid");


        Page<BkXcOrder> page = this.selectPage(
                new Query<BkXcOrder>(params).getPage(),
                new EntityWrapper<BkXcOrder>()
                        .eq(StringUtils.isNotBlank(staffGid), "STAFF_GID", staffGid)  //查询条件
        );
        

那么多表关联分页查询怎么做呢?
首先利用插件分页,查询出来分页的currentPagepageSizetotalPagetotalCount 以及分页的数据主键 ids,然后再根据主键ids来查询这些pageSize多条数据。如下:


	@GetMapping("/queryPageBookHistoryVo")
    public R<PageUtils> queryPageBookHistoryVo(@RequestParam Map<String, Object> params) {
		//params 参数包含page、limit、staffGid信息
        String staffGid = (String) params.get("staffGid");
        Assert.isBlank(staffGid, "参数错误!");

        //先查分页数据
        PageUtils page = bkXcOrderService.queryPage(params);


        List<BkXcOrder> bkXcOrderList = (List<BkXcOrder>) page.getList();
        List<String> ids = new ArrayList<>();
        //拼接参数
        bkXcOrderList.forEach(item -> {
            ids.add(item.getGid());
        });

        //根据id来查询关联分页数据
        page.setList(bkXcOrderService.queryListByPage(ids, staffGid));

        return RUtils.ok(page);
    }
    

其中 queryListByPage dao 层的关联查询如下:


	//当包含多个参数的时候,要用@Param注解来区分
  	List<BookHistoryVo> queryListByPage(@Param("ids") List ids, @Param("staffGid") String staffGid);


    <select id="queryListByPage" resultType="com.sx.purchase.VO.BookHistoryVo">
        SELECT bk_passport.GID customerGid ,
        bk_passport.REAL_NAME customerName,
        bk_book.GID bookGid,
        bk_book.BOOKNAME bookname,
        bk_book.AUTHOR author,
        bk_book.ISBN isbn ,
        bk_book.PRICE price ,
        bk_passport.POSITION position,
        bk_passport.DEPARTMENT department
        FROM BK_XC_ORDER bk_order
        INNER JOIN BK_XC_PASSPORT_INFO bk_passport ON bk_order.CUSTOMER_GID = bk_passport.GID
        INNER JOIN BK_XC_BOOKS bk_book ON bk_order.BIBGID = bk_book.GID
        <where>
            <if test="staffGid != null and staffGid != ''">
                AND bk_order.STAFF_GID=#{staffGid}
            </if>

            <if test=" ids != null and ids.size != 0">
                AND bk_order.GID in
                <foreach collection="ids" index="index" item="item" open="(" separator="," close=")">
                    #{item}
                </foreach>
            </if>
        </where>
    </select>
    

2、删库别跑路sql

昨天主管把一个线上的两个表的数据直接 delete 了,慌得一匹。差点要跑路了,让他懵逼的一天。
我们公司使用的是oracle数据库,当你把数据删除了后,怎么找回来呢?

可以使用以下语句查询出来在 2018-10-22 10:19:00 时间节点上的数据:


select * from BK_ORDER_FORMLIST as of timestamp to_Date('2018-10-22 10:19:00', 'yyyy-mm-dd hh24:mi:ss');

3、按照字段查重

根据某个字段来查询表中这个字段是否有重复的行。


SELECT a.PHONE FROM (SELECT count(*) num,PHONE FROM BK_PASSPORT_INFO GROUP BY PHONE) a WHERE a.num >1;

4、批量添加数据

市场提出这样的要求:要求给指定公司的用户批量添加一个默认的地址。其中具体的用户数据是表里面查询的,而有的数据如地址这些是常量,那么怎么来批量插入这些数据,如下:


INSERT INTO BK_USERMAIL_ADDR(GID,PASSPORT_GID,CREATE_DATE,RECEIVE_NAME,RECEIVE_ADDR,RECEIVE_TEL,RECEIVE_POSTCODE,ISDEFAULT,PROVINCE,CITYNAME,DISTRICTNNAME)
SELECT SEQGID,GID ,SYSDATE,REAL_NAME,'金融大街31号中国电信',PHONE,'000000',0,'北京市','市辖区', '西城区' 
FROM BK_PASSPORT_INFO WHERE COMPANY_ID = '2017120818324600103';

其中SEQGID是ORACLE的序列函数,SYSDATE是时间日期函数,GID ,REAL_NAME等为表中字段。

后续陆续更新…

猜你喜欢

转载自blog.csdn.net/She_lock/article/details/83301968
今日推荐