目录
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 )而言,就不存在这种问题,先过滤再连接还是先连接再过滤,其结果
都是一样的。