记录一条不难但包括了常见操作的SQL查询

本文解释了一个SQL查询,用于在Mybatis中检查项目预算超支情况。通过左连接两个表(project和budget),计算超支次数并根据预算状态返回正常预算或已超预算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言 :

这条SQL 还是比较简单,不过涉及了一些常见的SQL操作和技巧,包括联接(JOIN)、条件筛选(WHERE)、聚合函数(COUNT)、条件判断(CASE WHEN)、子查询等。

功能

简单来说就是有两个表,一个项目表(project)和一个预算表(budget),这两个表是一对多的关系,比如一个项目会有生产预算和销售预算,预算表中有两个这样的字段:总预算(totalBudget)和已使用预算(usedBudget),当 usedBudget大于totalBudget 时,那么这个项目就超预算了,现在我要对项目project 进行查询,回显的字段有一个 预算状态,同时呢,查询条件中有一个 查询全部的项目和超预算的项目(这个查询条件就是针对budget的),怎样算超预算呢? 只要生产预算与销售预算其中一个超了,那么就算这个项目超预算了。

SQL 如下:(简化版本 以Mybatis 中的SQL表示,以便表示参数):

SELECT
	A.id,
	A.projectName,
	COALESCE ( over_budget_count, 0 ) AS over_budget_count,
CASE
		
		WHEN over_budget_count <![CDATA[ > ]]> 0 THEN
		'已超预算' ELSE '正常预算' 
	END AS budget_status 
FROM
	project A
	LEFT JOIN (
	SELECT
		B.project_id,
		COUNT(*) AS over_budget_count 
	FROM
		budget B
	 WHERE
        B.deleted = 0
        AND B.total_budget <![CDATA[ < ]]> B.used_budget
        GROUP BY
        B.project_id
        ) AS subquery ON A.id = subquery.project_id
	 <where>
            A.deleted = 0
            <if test="budgetStatus != null and budgetStatus != ''"> -- 传入的条件
                <choose>
                    <when test="budgetStatus == 'EXCEEDS_BUDGET'">
                        AND over_budget_count > 0
                    </when>
                    <otherwise>
                        <!-- 默认条件,不过滤超预算状态 -->
                    </otherwise>
                </choose>
            </if>
        </where>
	ORDER BY
	A.create_time DESC

理解以上SQL

  1. SELECT子句:查询以SELECT语句开头,指定从project表中检索的列,包括项目ID、名称等相关属性。此外,它根据预定义条件确定预算状态。
  2. FROM子句:主要涉及的表是project,表示为A。这是存储主要项目信息的地方。
  3. LEFT JOIN:使用一个子查询执行了一个左连接操作,该子查询计算了每个项目的预算超支数量(over_budget_count)。拿到这个over_budget_count ,我们就可以知道当前项目是否超预算了。
  4. WHERE子句:应用条件以过滤检索到的数据。基于预算状态应用了额外的条件。
  5. ORDER BY子句 排序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

书语时

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值