是否有充分的理由对SQL关键字使用大写?[关闭]


128

默认值似乎是大写的,但是否真的有任何理由要对关键字使用大写?我开始使用大写字母,因为每当我尝试创建新存储过程(例如新存储过程)时,我都试图匹配SQL Server给我的内容。但是后来,我对我的第5根婴儿的手指感到不舒服,这总是需要按住Shift按钮,因此我停止使用大写字母。我为什么要回到大写字母?

编辑:谢谢你们的答案。在COBOL为王的时候,我还没有编程,所以我没有意识到这一点。从现在开始,我将坚持使用小写字母。


9
尝试使用CAPS LOCK键。:)
MusiGenesis

7
当我要编写关键字时,我仍然必须打开CAPS LOCK,然后在我不编写关键字时关闭,然后再次打开CAPS LOCK,依此类推。这只是一个麻烦。
Hertanto Lie

17
CAPS哦...您是说我的第三个Ctrl键?
Dave Sherohman

2
IIRC,有趣的是,如果您在MSSQL中检出sp_过程,它们都是小写的。
Benjol,2009年

1
@Benjol,不是全部,但肯定有很多像sp_who。最好至少在同一个存储过程中保持一致,这是个好主意,而Microsoft在很多情况下都没有。双关语 大声笑
Gordon Bell

Answers:


107

这只是样式问题,可能起源于编辑人员不进行代码着色的时代。

我以前比较喜欢所有大写字母,但现在我倾向于所有小写字母。


6
+1我想我不是唯一一个使用所有降低关键字的人。
dance2die

2
我假设它可以追溯到编辑者不进行代码着色的时代。
Benjol,2009年

10
我可以肯定,它可以追溯到许多机器不支持小写字符的时代。
内特·CK

1
我猜想它可以追溯到彩色显示器之前的日子;)
walrii 2012年

150

个人而言,我不喜欢我对我的SQL吼叫。它使我想起BASIC或COBOL。

因此,我更喜欢使用T-SQL小写形式的数据库对象名称MixedCase。

它更容易阅读,并且文字和注释脱颖而出。


8
这完全是一个品味问题。以我的经验,喊叫的程度不是太大-我更喜欢大写的关键字,因为它更易于阅读,并且字面量和注释突出。
乔纳森·勒夫勒

93
为“我不喜欢我的SQL对我大吼” +1
dance2die

8
我不喜欢任何一种语言对我大喊大叫,但这并不能解决在SQL中大写是否是个好主意的问题。
bignose

85

SQL是旧的。大写正在喊。它看起来很奇怪并且令人讨厌。

尽管可以说是正确的,但是这些都没有解决SQL语言特有的原因为什么大写关键字是一个很好的约定。

与许多更新的语言不同,SQL具有大量的关键字,并且依赖于读者区分关键字和标识符的能力,以便从心理上解析语法。

那么,对您的问题的直接答案是“为什么大多数现代语言都不是SQL语言读者为什么从大写关键字中受益匪浅?”的答案:

  • 许多现代语言中,依靠关键字保持头脑是合理的,但对于SQL则不合理;它的关键字太多,变体太多。

  • 对于大多数现代语言而言,依靠标点符号是合理的,但对于SQL而言则是不合理的。它的数量太少,取而代之的是取决于关键字的确切顺序来指示语法。

  • 在通常情况下,对于现代语言而言,依靠自动荧光笔来区分关键字是合理的,但忽略了荧光笔可以为SQL实现的现实。大多数都不会涵盖SQL所有变体的所有关键字,并且无论如何,在荧光笔无济于事的情况下,SQL经常被例行读取。

这些是某些特定于SQL的原因,最好通过对关键字的大写字母进行标准化,并且仅对标识符使用不大写(即小写或混合)的字母来最好地服务于SQL代码阅读器。

突出显示有时会有所帮助。但是,仅在荧光笔知道您已经拥有SQL的情况下;而且我们经常在编辑器/格式化程序无法合理地知道它正在处理SQL的情况下使用SQL。示例包括内联查询,程序员文档以及另一种语言代码内的文本字符串。对于像Python或C ++这样的语言来说,情况并非如此。是的,它们的代码有时确实会出现在那些地方,但通常不会像使用SQL代码那样常规地完成。

此外,读者通常会使用荧光笔,该荧光笔仅知道您的特定SQL实现所使用的关键字的子集。除了那些非常了解您的SQL变体的关键字以外,许多不常用的关键字都不会突出显示。因此,即使读者使用荧光笔,他们仍然需要一些更直接的方法来区分任何中等复杂的SQL语句中的关键字。

因此,读者经常会(而且写者无法提前知道何时会发生)需要SQL语句本身的内容的帮助,以了解作者作为关键字的意图和标识符的意图。因此,SQL内容本身需要为读者区分关键字,而使用大写关键字是这样做的常规且有用的方法。


我觉得这个问题的紧迫原因是相当好的。您的答案已得到很好的解释,但看起来仍然有些意见。我不觉得SQL有那么多关键字。无论如何,在50个更频繁的关键字之后,您多久看到一次其他人?将它们显示为大写仍然重要吗?由于它们很少见,因此它们总是会引起人们的注意,不是吗?当然,那些该死的棘手的“非保留关键字”作为sql-server throw应该得到一些特殊对待,但是大写只是其中之一。
弗雷德里克

1
@Frédéric,您似乎在争辩说读者不需要将鲜为人知的关键字标记为关键字。不,这样的单词不能准确地引起人们的注意,因为不能期望读者知道它们是关键词。因此,它们需要像其他关键字一样被区分为关键字。
bignose

尽管我使用SQL进行了多年的编程,但也许我对SQL还是不太了解,但是直到现在,我相信几乎总是发现我不知道的关键字,因为它们导致了异常的SQL结构,至少对于那些不了解SQL的人而言认识他们。
弗雷德里克

33

戈登·贝尔的例子并不完全正确。通常,仅突出显示关键字,而不突出显示整个查询。他的第二个示例如下所示:

SELECT name, id, xtype, uid, info, status, 
base_schema_ver, replinfo, parent_obj, crdate, 
ftcatid, schema_ver, stats_schema_ver, type, 
userstat, sysstat, indexdel, refdate, version, 
deltrig, instrig, updtrig, seltrig, category, cache
FROM sysobjects
WHERE category = 0
AND xtype IN ('U', 'P', 'FN', 'IF', 'TF')
ORDER BY 1

我发现这很容易理解,因为关键字更加突出。即使语法高亮显示,我仍然发现不大写的示例更难以阅读。

在我的公司,我们在SQL格式方面走得更远。

SELECT      name, id, xtype, uid, info, status, 
            base_schema_ver, replinfo, parent_obj, crdate, 
            ftcatid, schema_ver, stats_schema_ver, type, 
            userstat, sysstat, indexdel, refdate, version, 
            deltrig, instrig, updtrig, seltrig, category, cache
FROM sysobjects
LEFT JOIN systhingies ON
    sysobjects.col1=systhingies.col2
WHERE category = 0
    AND xtype IN ('U', 'P', 'FN', 'IF', 'TF')
ORDER BY 1

1
是的,那也是我喜欢的方式。
David The Man

6
问题是...如果您在提示符下立即运行即席命令时要大写,那么如果您必须在生产环境中运行即席命令时,您的总速度将是不大写的人的1/2倍很重要。因此,我将所有内容都写成小写,然后在签入之前“美化它”,因为有人抱怨他们不知道如何运行语法突出显示功能而无法读懂它。我不了解您,但是我每年必须以生产速度运行临时命令3次确实很重要,因此我练习以所有小写形式编写测试查询的50%的工作日确实很有意义。

7
在我公司的数据库中(创建于90年代),所有表名,列,索引,存储过程等都大写,因此我们使用小写的SQL关键字。;)
Andreas

1
哇1/2快。我不这么认为!
Iharob Al Asimi

33

有一次大多数人都无法对大写字母进行任何编码,因为尚未提出相关编码(ASCII)。仅提供6位。虽然SQL最近,但是在编程中,小写字母的用法并不常见。

需要注意的是有些人声称,该数据库将得到一种紧迫感,并运行你的查询速度更快。


因此,今天不是一个很好的理由。
bignose

1
@BIGNOSE:不,绝对不是!
卢卡斯·埃德

1
我认为这是最好的答案。可悲的是,我只是讨厌SQL关键字中的小写字母,却找不到喜欢小写字母的方法,我疯了吗?
Iharob Al Asimi

@IharobAlAsimi是的,您很疯狂。您为什么要在小写的情况下写英语,但要使用结构化的英语?
卢卡斯·埃德

24

在我们阅读的文字中,少于10%的字母是大写的。因此,我们的大脑比大写字母更热衷于识别小写字母。研究表明,阅读大写文本需要更长的时间。这只是一个例子:

http://www.guardian.co.uk/media/mind-your-language/2010/oct/04/new-york-street-signs-capitals

我认为上面的示例强调,即使您只谈论一个或两个单词,也会有所作为。


5
我们不是在谈论全力以赴的小说。我们谈论的是少数几个关键字,它们只是文本的一部分。
Casey

6
您错过了重点。这与我们正在阅读的单词数无关,而与我们的大脑被训练成可以快速完成的事情有关。例如,路牌肯定不是一本小说,但是它们得出了相同的结论。当我们学习阅读时,我们开始阅读每个字母,但最终我们的大脑开始将单词识别为一组模式。如果这些模式保持一致,那会更好。请记住,大写字母通常是与小写字母不同的模式,而不仅仅是大写字母。
AaronLS '16

1
但是关键字很少,它们反复出现。因此,对于任何时间使用SQL的人来说,识别速度应该都一样快。
凯西

3
没错,这绝对不是一成不变的事情。但是只有几个非常普遍的关键字。有很多不是,通常人们将这种大写形式扩展为内置函数,但不一定是语法语言关键字。实际上,我实际上仍然使用少数几个关键字,例如SELECT / WHERE / GROUP BY,它们指示查询的主要部分的开始。但是,所有其他关键字,例如内建函数一样castrank我小写。
AaronLS '16

19

这是因为SQL是一种古老的语言(1974年),以至于在构思时,大多数键盘都没有小写字母!语言文档只是反映了当时的技术。

研究证明,ALL CAPS较难阅读,以至于美国联邦公路管理局在其《统一交通控制设备手册》中要求使用混合大小写标志,其中指出:

常规路标上的地方,街道和高速公路名称的字母应由小写字母和大写字母组成。

纽约邮报还发表了:

研究表明,很难阅读所有大写字母的标志,并且已经证明,花在离开道路上的额外毫秒时间会增加发生事故的可能性,尤其是在年纪较大的驾驶员中。

没有充分的理由使用大写字母,也没有理由。

我个人不喜欢使用大写的SQL关键字。我发现在这个时代,阅读和荒诞变得更加困难。

SQL语言被定义为不区分大小写。将手指移开该切换键!


3
我认为在其他答案中普遍存在的充分理由与您的主张相反,即“没有充分的理由使用大写字母”。
bignose 2012年

7
@bignose哦,有原因...我只是认为它们不是好理由。以我的经验,SQL程序员越初级,他们使用大写字母的可能性就越大。相反,我从未遇到过使用大写字母的合格SQL编码器。
波希米亚

3
完全同意。其他“答案”的盛行并不能使它们正确,而只是使它们成为主流。所有大写字母都是WHEM计算机的遗留物,没有在其键盘上或字符表示中出现。今天只是愚蠢的。
查尔斯·布雷塔纳

是的,不必要地耗尽CAPS LOCK键或不必要地按住Shift键而使手指狭窄。
Gordon Bell

9
我在这里闻到循环推理。如果提出原因是为了区分大小写,则将其视为不是很好的理由。如果原因是由SQL编码器提出的,但与您的立场不同,则将其视为不是合格的 SQL编码器。我认为,在此基础上,我们可以将其视为无效论点。
bignose 2014年

8

大写可以提高关键字的可见度,但是您可以补偿代码突出显示和缩进。
我们使用小写字母,因为查询编辑器和其他工具在编辑t-sql代码方面确实令人惊奇,并且我们认为无需折磨小指。


2
查询编辑器和t-sql是唯一可以让任何人读取您的SQL代码的地方吗?你怎么知道的?
bignose

8

猴子见,猴子为我做。模式匹配-如果按照我看过的方式进行操作,则子句的结构在思想上更容易排列。


7

大写字母不太可读。所有单词的轮廓都像盒子一样。没有子孙或子孙。小写FTW!


3
您给出的理由支持大写有助于区分关键词和其余关键词的立场。
bignose 2012年

5
@bignose如果SQL读起来像人类语言,为什么我们需要大写?我们不需要在人类语言中将动词或介词大写。想象一下,如果每个句子都看起来像这样。我发现它的可读性不如常规写作。那两个句子中的大写单词使我的大脑停下来,说它们比句子的其余部分慢,这减慢了我的阅读速度,并使顺畅性降低。
克里斯·米德尔顿

1
人类语言非常宽容语法的歧义。不是计算机语言,这就是为什么需要将这些歧义减至最少的原因。SQL语法无助于此,因此我们需要使用可用的工具。SQL语法没有太多,因此我们发展了大写关键字的约定。
bignose

5

我发现它更具可读性。对于每个子句的开头都有换行符,并且在子句之间缩进也是如此。


2

尝试格式化产品(我使用Red Gate的SQL Prompt / SQL Refactor)。您可以设置大写的工作方式,并且代码将始终保持一致的格式。休息一下,让计算机为您完成工作。


1
该建议忽略了正在读取SQL的许多上下文。阅读别人已经编写的代码是完全不切实际的。如果仅需要使用这样的工具来使格式错误的SQL可读,则表示赞成使用类似该问题的约定。
bignose

但是,如果您要在整个组织中使用标准,则此方法很好。如果您需要标准,意见无所谓
Trubs

2

继续使用大写字母的原因之一是,当您(或其他人)在使用诸如记事本之类的代码查看代码时,它更易于阅读。即,您可以轻松区分“关键字”和表名,SP,udf等


1

除了出于一致性的考虑,没有。尽管这是一个非常主观的主题,但我更喜欢对所有SQL使用混合大小写。SQL易于阅读,在现代IDE中,关键字始终使用颜色进行编码,因此不会丢失任何内容。


由于这里的许多其他的答案已经提出的理由,我不认为你的答案是正确的:有原因“比合格的缘故符合其他”。
bignose 2012年

...那是什么?坦率地说,尽管总是向新信息敞开大门,但我从未听说过任何信息。
查尔斯·布雷塔纳'16

我已经给出了很多原因,所以现在您知道了。
bignose

2
这些都不是正当的理由,而是个人喜好。可以根据自己的个人喜好随意选择,但不要将喜好描述为规则或最佳做法。
查尔斯·布雷塔纳'16

1

Microsoft SQL Server Management Studio中的智能/自动补全功能允许保留字使用大写或小写,但是大写的函数调用如MAX(),SUM()。

即使这样,解析器仍允许处理max()和sum()的小写版本。

这意味着在执行的性质上存在矛盾,因此仅是个人喜好问题。


4
是的,如果愿意,可以在SSMS“选项->文本编辑器-> Transact-SQL-> Intellisense”中将默认设置为“小写”。
戈登·贝尔

0

我不喜欢用大写字母写的任何东西(更讨厌打字用大写字母写),但无法说服自己与社区背道而驰。像往常一样,Vim及其关联的软件包是解决许多问题的解决方案:

http://www.vim.org/scripts/script.php?script_id=305

只需正常输入即可在输入时自动将关键字大写。我还没有使用过所有晦涩的SQL技巧,但是它并没有使我失望。


-2

我从PHP调用了大部分mySQL代码,并在vim中进行了所有PHP编辑(或者在这种情况下,我想是VIM ;-)。现在,我确定有一些插件可以突出显示PHP中的mySQL代码,但我没有找到它,也不必花时间去寻找它。因此,我更喜欢所有内容。我发现:

if ( !$bla ) 
{
   echo "select something from something where something";
}

if ( !$beepboop ) 
{
   echo "create table if not exists loremIpsum;
}

$query = "
CREATE TABLE IF NOT EXISTS HISTORY
(
   ID INT NOT NULL AUTO_INCREMENT,
   INSERTDATE TIMESTAMP DEFAULT NOW(),
   ALTERDATE TIMESTAMP(8) DEFAULT NOW(),
   DELETEDATE TIMESTAMP(8),
   ALTERCOUNT INT DEFAULT 0,
   SELECTCOUNT INT DEFAULT 0,

   PRIMARY KEY(ID),
)ENGINE=InnoDB
";

mysqlQuery( $query, $con );

可以帮助我更好地区分PHP和SQL:

if ( !$bla ) 
{
   echo "select something from something where something";
}

if ( !$beepboop ) 
{
   echo "create table if not exists loremIpsum;
}

$query = "
create table if not exists history
(
   id int not null auto_increment,
   insertdate timestamp default now(),
   alterdate timestamp(8) default now(),
   deletedate timestamp(8),
   altercount int default 0,
   selectcount int default 0,

   primary key(id),
)engine=InnoDB
";

mysqlQuery( $query, $con );

另外,由于某种原因,我讨厌将大写字母与驼峰式案例混合在一起,例如:

CREATE TABLE IF NOT EXISTS history
(
   ID INT NOT NULL AUTO_INCREMENT,
   insertDate TIMESTAMP DEFAULT NOW(),
   alterDate TIMESTAMP(8) DEFAULT NOW(),
   deleteDate TIMESTAMP(8),
   alterCount INT DEFAULT 0,
   selectCount INT DEFAULT 0,

   PRIMARY KEY(ID),
)ENGINE=InnoDB

ID让我很生气。应该是id吗?还是iD


3
不,不,不,camelCase用于变量名,而不是列名。对列名称使用正确的大小写... InsertDate,AlterDate,...
Gordon Bell

1
SQL标准要求实现忽略标识符中的大小写(将其折叠为大写)。因此,您的代码不应依赖于标识符的大小写差异,而实现该目标的常规方法是制作标识符all_lower_case
bignose

3
@bignose我不是下划线的
忠实拥护者,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.