1

我想编写正确的 SQL 查询,我需要了解 SQL 格式的标准。我不是指逻辑或效率,我指的是正确的缩进和空格。在命令的情况下我也很有趣。

是否有任何正确的 SQL 格式化模式(标准)?

4

2 回答 2

1

查看数据库编码标准和指南。它自 2008 年以来已经过时,但我还找不到更好的东西。几个月前我正在寻找这个,看起来真的很好。

我正在查看 oracle 和 mysql 站点,但“怪物”从未发表过正式论文。

于 2012-10-25T04:32:49.233 回答
1

好吧,我现在不开始讨论大写表名,但通常你会考虑如何格式化选择/更新/插入/删除语句。在 Pablo Dominguez 的文档 giben 中,他们建议像这样格式化选择

select      t.Task_Id,
            t.Course_Id,
            t.Due_Dt,
            t.Start_Time,
            t.End_Time,
            t.Name,
            et.Completed_Flag,
            et.Completed_Dt
from BusyWork.dbo.TB_TASK t
inner join BusyWork.dbo.ENROLLMENTTASK et
on t.Task_Id = et.Task_Id
where t.Due_Dt >= @pStartDate
and t.Due_Dt <= @pEndDate
and et.Member_Id = @pMemberId
order by    t.Due_Dt,
            t.Start_Time 

我可以说(对我来说)阅读这样的脚本非常困难,尤其是其中的from部分,所以在我们的系统中,我们使用这样的约定

select
    t.Task_Id,
    t.Course_Id,
    t.Due_Dt,
    t.Start_Time,
    t.End_Time,
    t.Name,
    et.Completed_Flag,
    et.Completed_Dt
from BusyWork.dbo.TB_TASK as t
    inner join BusyWork.dbo.ENROLLMENTTASK as et on t.Task_Id = et.Task_Id
where
    t.Due_Dt >= @pStartDate and t.Due_Dt <= @pEndDate and
    et.Member_Id = @pMemberId
order by t.Due_Dt, t.Start_Time

updatedelete语句中我总是试图写from子句,所以我总是可以很容易地重写update/deleteselect测试它

update BusyWork.dbo.TB_TASK set
    Due_Dt = getdate(),
    Name = 'updated'
from BusyWork.dbo.TB_TASK as T
   inner join BusyWork.dbo.ENROLLMENTTASK as et on t.Task_Id = et.Task_Id
where
    t.Due_Dt >= @pStartDate and t.Due_Dt <= @pEndDate

delete BusyWork.dbo.TB_TASK
from BusyWork.dbo.TB_TASK as T
   inner join BusyWork.dbo.ENROLLMENTTASK as et on t.Task_Id = et.Task_Id
where
    t.Due_Dt >= @pStartDate and t.Due_Dt <= @pEndDate

insert语句中,我试图避免values从句,因此我也可以轻松地将语句重写为 plain select。始终在插入中明确指定列以避免在从表中添加/删除字段后出现问题。还尝试使用别名作为列名,以便在使用普通测试时检查正确的值select

insert into BusyWork.dbo.TB_TASK
(
    Due_Dt,
    Name
)
select
    getdate() as Due_Dt,
    'New' as Name

另一条规则 - 始终为列和表/视图/表函数使用别名。将来修改语句会更容易,并且可以帮助您在更改表架构时避免一些讨厌的错误。

于 2012-10-25T04:59:10.203 回答