Mybatis使用杂记--疑难sql语句--零碎知识点总结

目录

1.疑难sql语句

1.查询时返回表名

 2.数据统计--根据不同条件

2.创建只有查询权限的账户:

3.修改用户密码:

方法1:

方法2:

4.SQL左连接或者右连接数据变少


1.疑难sql语句

1.查询时返回表名

(1).使用普通的mysql查询语句:(AS可以省略,但是为了可读性,通常不建议省略)

SELECT *, "etc_consume202207" table_name FROM etc_consume202207;

(2).在mybatis中使用: 

这是范围分表情况下的条件查询,要求返回的数据中带着这条数据所属的表的名字。

SELECT *, concat('${value}') as table_name FROM ${value}

  <select id="selectListByCondition" resultType="com.***.***.domain.EtcConsume">
    SELECT * FROM (
    <if test="tablesMap != null and tablesMap.size() > 0">
      <foreach collection="tablesMap" index="key" item="value" separator="UNION">
        SELECT *, concat('${value}') as table_name FROM ${value}
        <where> 1=1
          <if test="consumeCondition != null">
            <if test="consumeCondition.billId != null and consumeCondition.billId > 0">
              AND bill_id = #{consumeCondition.billId}
            </if>
            <if test="consumeCondition.issuerCustomerId != null and consumeCondition.issuerCustomerId > 0">
              AND issure_customer_id = #{consumeCondition.issuerCustomerId}
            </if>

 2.数据统计--根据不同条件

要根据不同的条件,返回不同的数据量,表shopping_order中字段pay_state==1的数据有多少?==2的数据有多少?==3的数据有多少?==4的数据有多少?

  <!--  线索数量统计  -->
  <select id="orderStatistices" resultType="com.wit.mall.order.model.OrderStatisticesDetails">
    SELECT id,
    count(0) total,
    SUM(IF(ord.pay_state = 1,1,0)) notPay,
    SUM(IF(ord.pay_state = 2,1,0)) paid,
    SUM(IF(ord.pay_state = 3,1,0)) cancelled,
    SUM(IF(ord.pay_state = 4,1,0)) refunded,
    SUM(IF(ord.order_status = 1,1,0)) notAssigned,
    SUM(IF(ord.order_status = 2,1,0)) unsignedContract,
    SUM(IF(ord.order_status = 3,1,0)) notDelivery
    FROM
    shopping_order ord
    WHERE 1=1
    <include refid="orderWashWhere"/>
  </select>

  <!-- 查询条件 -->
  <sql id="orderWashWhere">
    AND ord.del_flag = 0
    <if test="param.beginTime != null and param.beginTime !='' and param.endTime != null and param.endTime !=''">
      AND (ord.create_time BETWEEN str_to_date(#{param.beginTime}, '%Y-%m-%d %H:%i:%s') AND
      str_to_date(#{param.endTime}, '%Y-%m-%d %H:%i:%s'))
    </if>
    <if test="param.userPhone != null and param.userPhone != ''">
      AND ord.user_phone = #{param.userPhone}
    </if>
    <if test="param.departmentIds != null and param.departmentIds.size() > 0">
      AND ord.department_id in
      <foreach collection="param.departmentIds" item="departId" open="(" separator="," close=")">
        #{departId}
      </foreach>
    </if>
    <if test="param.departmentId != null">
      AND ord.department_id = #{param.departmentId}
    </if>
    <if test="param.ownerId != null">
      AND ord.owner_id = #{param.ownerId}
    </if>
    <if test="param.payState != null">
      AND ord.pay_state = #{param.payState}
    </if>
    <if test="param.orderStatus != null">
      AND ord.order_status = #{param.orderStatus}
    </if>
    <if test="param.userName != null and param.userName != ''">
      AND ord.user_name = #{param.userName}
    </if>
    <!--
    <if test="param.cityName != null and param.cityName != ''">
      AND ord.city_name = #{param.cityName}
    </if>
    -->
    <if test="param.cityCode != null and param.cityCode != ''">
      AND ord.city_code = #{param.cityCode}
    </if>
    <if test="param.dealerCode != null and param.dealerCode != ''">
      AND ord.dealer_code = #{param.dealerCode}
    </if>
    <!--
    <if test="param.dealerName != null and param.dealerName != ''">
      AND ord.dealer_name = #{param.dealerName}
    </if>
    -->
  </sql>

2.创建只有查询权限的账户:

参考文章:mysql如何创建只读用户-mysql教程-PHP中文网

mysql增加只读用户的方法:

1. 使用现有的root用户登录到Mysql。
mysql -uroot -p

2. 创建用户

授权SELECT查询权限,授权远程访问权限

注意:命令中username/password指将要创建的用户名及其密码,请自己指定。

若要限制仅指定IP可以使用此用户访问Mysql,将%改为具IP即可。

GRANT SElECT ON *.* TO 'username'@'%' IDENTIFIED BY "password";

3. 刷新mysql权限,使用户创建、授权生效。
flush privileges;

3.修改用户密码:

参考文章:MySQL修改密码(三种方法示例)_我不是彭于晏灬的博客-CSDN博客_mysql修改密码 

方法1:

使用SET PASSWORD语句更改MySQL用户密码更改密码的第二种方法是使用SET PASSWORD语句。
您可以使用user@host格式的用户帐户更新密码。如果需要更改其他帐户的密码,则当前登录的帐户至少需要UPDATE权限。
以下语句使用SET PASSWORD语句更改dbadmin用户帐户的密码。

USE mysql;

SET PASSWORD FOR 'dbadmin'@'localhost' = PASSWORD('newpasswd2');

或者:SET PASSWORD FOR 'dbadmin'@'%' = PASSWORD('newpasswd2');

FLUSH PRIVILEGES;

请注意,从MySQL 5.7.6版本开始,MySQL不推荐使用此语法,可能会在将来的版本中将其删除。作为一个代替的解决方案,它使用明文密码如下:

USE mysql;

SET PASSWORD FOR 'dbadmin'@'localhost' = 'newpasswd2';

或者:SET PASSWORD FOR 'dbadmin'@'%' = 'newpasswd2';

FLUSH PRIVILEGES;


方法2:

使用ALTER USER语句更改MySQL用户密码更改用户帐户密码的第三种方法是将ALTER USER语句与IDENTIFIED BY子句一起使用。
以下ALTER USER语句将dbadmin用户的密码更改为newpasswd3:

ALTER USER dbadmin@localhost IDENTIFIED BY 'newpasswd3';

执行上面修改密码的语句后,可尝试验证修改结果,使用新密码登录 -

C:\Users\Administrator>mysql -hlocalhost -udbadmin -p

如果要重置MySQL的root帐户的密码,则需要强制MySQL数据库服务器停止并重新启动,而无需使用授权表验证。
在本教程中,我们向您介绍了一些方便的语句,允许您更改MySQL数据库中用户帐户的密码。

4.SQL左连接或者右连接数据变少

为什么连接后数据减少?因为是先连接后过滤,应该在连接中过滤,而不是join之后在where中进行做过滤

先连接后过滤:左连接( left join )后,连接的右边的表未匹配到的话,就会显示空值,这时候如果在where中加筛选条件就会把这些空值筛选掉,这些空值有部分其实用左连接是要保留下来的,结果经过过滤给过滤掉了,因此左连接的数据变少了。

举例说明:

(1).会使左连接的数据减少

select * from A a

left join B b on b.aid = a.id

where 1 = 1

and a.columa = 'xxxxxx'

and b.columb is not null

(2).不会使左连接的数据减少

 select * from A a

left join B b on b.aid = a.id and b.columb is not null

where 1 = 1

and a.columa = 'xxxxxx'

同理:右连接( right join)的也会出现这种问题。

因此,为了解决这种问题,在左连接或者右连接时,先进行过滤然后再连接,就会避免这种问题;但对于内连接( inner join )而言,就不存在这种问题,先过滤再连接还是先连接再过滤,其结果

都是一样的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值