在编写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中,因为它是常量