各种 SQL 问题解决方案收集(持续更新)

MySQL 插入数据时判断是否存在,若不存在则进行插入操作

<insert id="insertIfNotExists">
    INSERT INTO t_user (user_code, user_name) SELECT
        #{userCode},
        #{userName}
    FROM
        DUAL
    WHERE
        NOT EXISTS (
            SELECT
                1
            FROM
                t_user
            WHERE
                user_code = #{userCode}
        )
</insert>
  • DUAL 为临时表,可理解为 MySQL 的固定写法
  • 此示例是结合 Mybatis 的实例

查询列名存在于哪些表中

SELECT
    TABLE_NAME,
    COLUMN_NAME
FROM
    information_schema.`COLUMNS`
WHERE
    TABLE_SCHEMA = 'TABLE_SCHEMA'
AND COLUMN_NAME = 'COLUMN_NAME'

根据条件进行批量更新操作

  • 语法一
<update id="batchUpdateUserInfo">
    UPDATE t_user
    SET user_name = CASE user_id
            <foreach collection="users" item="u">
                WHEN #{u.userId} THEN #{u.userName}
            </foreach>
        END
    WHERE user_id IN (
        <foreach collection="users" item="u" separator=",">
            #{u.userId}
        </foreach>
    )
</update>
  • 语法二
<update id="batchUpdateUserInfo">
    UPDATE t_user
    SET user_name = CASE 
            <foreach collection="users" item="u">
                WHEN user_id = #{u.userId} THEN #{u.userName}
            </foreach>
        END
    WHERE user_id IN (
        <foreach collection="users" item="u" separator=",">
            #{u.userId}
        </foreach>
    )
</update>
  • 以上两种语法均可同时对多个值修改
  • 需要注意的是 MySQL 通常会设置 SQL 的长度(可自定义),所以实际生产中需要根据实际情况预估此操作是否有可能会超出 MySQL 的长度限制,如果超出的话需要考虑分多批进行修改

分组排序显示序号

场景设定:根据月份分组,查看每个人在每个月的排名情况

  • 现有数据
user_namemonthscore
张三20190190
李四201901100
王五20190180
张三201902100
李四20190280
王五20190290
  • SQL
SELECT
    us1.`month`,
    us1.user_name,
    us1.score,
    COUNT(*) 'top'
FROM
    user_score us1
LEFT JOIN user_score us2 ON us2.`month` = us1.`month`
AND us2.score >= us1.score
GROUP BY
    us1.`month`,
    us1.score DESC
  • 查询结果
monthuser_namescoretop
201901李四1001
201901张三902
201901王五803
201902张三1001
201902王五902
201902李四803

注意:此语法要求 month + score 不重复

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值