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