在编写SQL时,遵循一定的格式规范可以提高代码的可读性和可维护性。以下是一些常用的SQL格式规范,以及如何通过缩行和换行来组织SQL代码的例子。
1. 缩进
- 使用空格或制表符(通常是2个或4个空格)进行缩进,以保持代码的层次结构清晰。
- 对于嵌套的SQL语句(如子查询),应适当缩进以显示其从属关系。
2. 换行
- 每个SQL语句应该在新的一行开始。
- 语句内的关键字、函数、列名、表名等之间,以及操作符两侧,可以适当换行以提高可读性。
- 长的SQL语句应该被分解为多个部分,并在合适的地方换行。
3. 命名规范
- 数据库、表、列名应该使用有意义的名称,并遵循一致的命名约定(如使用下划线
_
分隔单词)。 - 避免使用SQL的关键字作为列名或表名。
4. 注释
- 在SQL代码中添加注释,解释代码的用途、逻辑或任何需要注意的地方。
- 注释应该清晰、简洁,并且与代码保持适当的距离。
示例
以下是一个格式良好的SQL查询示例:
-- 这是一个查询示例,用于从订单表中检索客户的订单信息
SELECT
c.customer_id, -- 客户ID
c.customer_name, -- 客户姓名
o.order_id, -- 订单ID
o.order_date, -- 订单日期
SUM(od.quantity) AS total_quantity, -- 总数量
SUM(od.price * od.quantity) AS total_amount -- 总金额
FROM
customers c -- 客户表
INNER JOIN
orders o -- 订单表
ON
c.customer_id = o.customer_id
INNER JOIN
order_details od -- 订单详情表
ON
o.order_id = od.order_id
WHERE
o.order_date BETWEEN '2023-01-01' AND '2023-12-31' -- 订单日期在2023年内
GROUP BY
c.customer_id,
c.customer_name,
o.order_id,
o.order_date;
在这个示例中:
- 注释使用
--
开头,并放在与代码相关的位置。 - SQL语句的关键字、函数、列名和表名之间都有适当的空格。
- 嵌套的JOIN语句通过缩进清晰地显示了它们之间的从属关系。
- 长的SELECT列表和WHERE子句被分解为多个部分,并在合适的地方换行。
- 列名和表名都使用了有意义的名称,并遵循了使用下划线分隔单词的命名约定。
SELECT
info.project_id,
CAST('your_actual_ddate_value' AS DATE) AS report_date, -- 替换 'your_actual_ddate_value' 为你的实际日期值
SUM(remain_principal + remain_interest) AS total_remain_amount,
SUM(remain_principal) AS total_remain_principal,
COUNT(DISTINCT IF(loan_status != 'F', info.due_bill_no, NULL)) AS un_settle_num,
SUM(remain_principal * loan_init_interest_rate) / NULLIF(SUM(remain_principal), 0) AS weight_avg_inter_rate, -- 使用NULLIF避免除以零的错误
SUM(
remain_principal *
(
DATEDIFF(loan_expiry_date, loan_issue_date) * 12.0 / 365 -
DATEDIFF(CAST('your_actual_ddate_value' AS DATE), loan_issue_date) * 12.0 / 365
)
) / NULLIF(SUM(remain_principal), 0) AS weight_remain_term -- 使用NULLIF避免除以零的错误
FROM (
SELECT
project_id,
due_bill_no,
remain_principal,
remain_interest,
loan_status -- 借据状态
FROM ods.loan_info
WHERE CAST('your_actual_ddate_value' AS DATE) BETWEEN s_d_date AND date_add(e_d_date, INTERVAL -1 DAY)
AND project_id = 'your_actual_project_id_value' -- 替换 'your_actual_project_id_value' 为你的实际项目ID值
) info
INNER JOIN (
SELECT
due_bill_no,
loan_init_interest_rate,
loan_issue_date,
loan_expiry_date
FROM ods.loan_lending
WHERE project_id = 'your_actual_project_id_value' -- 替换 'your_actual_project_id_value' 为你的实际项目ID值
) smbc ON info.due_bill_no = smbc.due_bill_no
INNER JOIN (
SELECT *
FROM dim.project_due_bill_no
WHERE project_id = 'your_actual_partition_id_value' -- 替换 'your_actual_partition_id_value' 为你的实际分区ID值
) t2 ON info.project_id = t2.partition_id
AND info.due_bill_no = t2.due_bill_no
GROUP BY
info.project_id; -- 不需要包含'${ddate}'在GROUP BY中,因为它是常量