还剩9页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
SQL样式指南•SQLStyleGuideOverview综述你可以直接使用这些指导方针,或者fork后创建自己的版本一一最重要的是选择一套方针并严格遵守它欢迎通过提交issue或pullrequest来提交建议或修复bug0为了让阅读了JoeCelko的《SQLProgrammingStyle^的团队能更容易采用这套规则,这套原则被设计成与该书的兼容的形式该指南在某些领域严格一些,在另一些领域松懈一些当然该指南比Celko的书更简洁一些,因为Celko的书包含了一些趣闻和每一条原则后的理由将该文档的Markdownformat格式添加到项目代码库中或将该页面的链接发送给所有项目的参与者要比传阅实体书容易得多SimonHolywell所著的《SQL样式指南》以署名-相同方式共享
4.0国际协议发布改编自sqlstyle.guide0General一般原则Do应该做的事情使用一致的、叙述性的名称灵活使用空格和缩进来增强可读性.存储符合ISO-8601标准的日期格式YYYY-MM-DDSSSSSO最好使用标准SQL函数而不是特定供应商的函数以提高可移植性保证代码简洁明了并消除多余的SQL——比如非必要的引号或括号,或者可以推导出的多余WHERE语句
4.尽量让键保持简单,但在适当情况下不要害怕使用复合键以上是定义数据库时合乎逻辑的平衡做法当需求变更时,键也应该根据情况更新Definingconstraints定义约束确定键后,就可以用约束和字值段验证来定义它们General概述表至少需要一个键来保证其完整性和可用性约束应该有名字,除了UNIQUE、PRIMARYKEY和FOREIGNKEY之外Layoutandorder布局和顺序在CREATETABLE语句后先定义主键约束的定义应该紧跟它相应的列的定义后如果该约束与多个列相关,那么让它尽量离与其相关的列距离越近越好实在不行就讲它放在表定义的最后如果是与整个表相关联表级别的约束,那么就将放在表的定义的最后按照字母顺序安排定义ONDELETE排在ONUPDATE前有道理的话,把所有相关的语句对齐比如,把所有NOTNULL定义对齐到同一列虽然这样的做法有些慢,但是能提高可读性Validation校验用LIKE和SIMILARTO约束来保证格式已知字符串的数据完整性当数字的值的范围可以确定时,用CHECK来防止错误的值进入数据库或被错误地转换大部分情况下至少要确认值要大于零・check约束应该在单独的语句中以便debugExample CREATETABLEstaffPRIMARYKEYstaff.num^staff_numINT5MOTNULLfirst_nameVARCHAR100MOTNULLpens_in_drawerINT2NOTNULLCONSTRAINTpens_in_drawer_rangeCHECKpens_in_drawer1ANDpens_in_drawer100;Designtoavoid.面向对象设计思想并不适用于关系型数据库一一避免这个陷阱.将值存入一列并将单位存在另一列列的定义应该让自己的单位不言自明以避免在应用内进行合并使用CHECK来保证数据库中的数据是合法的EAVEntityAttributeValue#——用特殊的产品来处理无模式数据因为某些原因如为了归档、为了划分跨国公司的区域将能合并在一起的表分开这样的设计导致以后必须使用union操作而不能直接查询一个表必要时在SQL代码中加入注释优先使用C语言式的以/*开始以*/结束的块注释,或使用以一开始的行注释SELECTfile_hashstoredssdeephashFROMfile_systemWHEREfilename*.vimrc1;UpdatingthefilerecordafterwritingtothefileUPDATEfile.systemSETfilemodifieddate11980-02-2213:19:
01.00000^file.size=209732WHEREfilename*.vimrc*;Avoid应避免的事情驼峰命名法一一它不适合快速扫描描述性的前缀或匈牙利命名法比如sp_或tbl复数形式一一尽量使用更自然的集合术语比如,用staff替代employees或用people替代individuals.需要引用号的标识符一一如果你必须使用这样的标识符最好坚持用SQL92的双引号来提高可移植性面向对象编程的原则不该应用到结构化查询语言或数据库结构上Namingconventions命名惯例General一般原则保证名字独一无二且不是保留字保证名字长度不超过30个字节名字要以字母开头,不能以下划线结尾只在名字中使用字母、数字和下划线不要在名字中出现连续下划线一一这样很难辨认在名字中需要空格的地方用下划线代替.尽量避免使用缩写词使用时一定确定这个缩写简明易懂SELECTfirst_nameFROMstaff;Tables表名用集群名称,或在不那么理想的情况下,复数形式如staff和employeeso.不要使用类似tbl或其他的描述性的前缀或匈牙利命名法.表不应该同它的列同名,反之亦然尽量避免连接两个表的名字作为关系表relationshiptable的名字与其使用carsmechanics做表名不如使用services0Columns列名总是使用单数形式避免直接使用id做表的主标识符避免列名同表名同名,反之亦然总是使用小写字母,除非是特殊情况,如专有名词Aliasingorcorrelations别名与关联名.应该与它们别名的对象或与它们代表的表达式相关联.一般来说,关联名应该是对象名的第一个字母.如果已经有相同的关联名了,那么在关联名后加一个数字总是加上AS关键字,因为这样的显示声明易于阅读为计算出的数据命名时,用一个将这条数据存在表里时会使用的列名SELECTfirst_nameASfnFROMstaffASsiJOINstudentsASs2ONs
2.mentoridsi.staffnum:SELECTSUMs.monitor_tallyASmonitor_totalFROMstaffASs;Storedprocedures过程名•名字一定要包含动词.不要附加SP_或任何其他这样的叙述性前缀或使用匈牙利表示法Uniformsuffix统一的后缀下列后缀有统一的意义,能保证SQL代码更容易被理解在合适的时候使用正确的后缀・_id独一无二的标识符,如主键_status标识值或任何表示状态的值,比如publication_statuso_total总和或某些值的和_num表示该域包含数值name表示名字_seq包含一系列数值_date表示该列包含日期.tally计数值_size大小,如文件大小或服装大小_addr地址,有形的或无形的,如ip_addrQuerysyntax查询语句Reservedwords保留字保留字总是大写如SELECT和WHERE0最好使用保留字的全称而不是简写用ABSOLUTE而不用ABS0当标准ANSISQL关键字能完成相同的事情时,不要使用数据库服务器相关的关键字,这样能增强可移植性SELECTmodel_numFROMphonesASpWHEREp.release_date*2014-09-30*;Whitespace空白字符正确地使用空白字符对清晰的代码十分重要不要把代码堆再一起或移除自然语言中的空格Spaces空格用空格使根关键字都结束在同一列上在代码中形成一个从上到下的川流,这样帮助读者快速扫描代码并将关键字和实现细节分开川流在排版时应该避免,但是对书写SQL语句是有帮助的SELECTmodel_numFROMphonesASpWHEREp.release_date2014-09-30;SELECTf.species_namejAVGf.heightASaverage_heightAVGf.diameterASaverage_diameterFROMfloraASfWHEREf.species_nameBanksia*ORf.species_name*Sheoak*ORf.species_nameWattleGROUPBYf.species-namef.observation_dateUNIONALLSELECTb.species.nameAVGb.heightASaverage_heightAVGb.diameterASaverage_diameterFROMbotanic_garden_floraASbWHEREb.species_name*BanksiaORb.species_name•SheoakORb.species_nameWattleGROUPBYb.species-nameb.observation_date注意WHERE和FROM等关键字,都右对齐而真实的列名都左对齐注意下列情况总是加入空格在等号前后(=)在逗号后()单引号前后(’),除非单引号后面是括号、逗号或分号SELECTa.title^a.release_dateJa.recording_dateFROMalbumsASaWHEREa.title=*CharcoalLane1ORa.title*TheNewDanger*;Linespacing换行总是换行的情况在AND或OR前在分号后(分隔语句以提高可读性)在每个关键词定以后将多个列组成一个逻辑组时的逗号后将代码分隔成相关联的多个部分,帮助提高大段代码的可读性让所有的关键字右对齐,让所有的值左对齐,在查询语句中间留出一个空隙这样能提高速读代码的速读INSERTINTOalbumstitle^release_datejrecording_dateVALUESCharcoalLane11990-01-0101:01:
01.00000^•1990-01-0101:01:0100000*^•TheNewDanger**2008-01-0101:01:
01.00000^*1990-01-0101:01:
01.000001;UPDATEalbumsSETrelease.date=1990-01-0101:01:
01.00000WHEREtitle=TheNewDanger*;SELECTa.titlea.release_datea.recording_datea.production_dategroupeddatestogetherFROMalbumsASaWHEREa.title=*CharcoalLaneORa.title*TheNewDanger*;Identation缩进为确保SQL的可读性,一定要遵守下列规则JoinsJoin语句Join语句应该缩进到J11流的另一侧并在必要的时候添加一个换行SELECTr.last_nameFROMridersASrINNERJOINbikesASbONr.bike_vin_numb.vin_numANDb.engine_tally2INNERJOINcrewAScONr.crew_chief_last_namec・last_nameANDc.chief=Y;Subqueries子查询子查询应该在川流的右侧对齐并使用其他查询相同的样式有时候将右括号单独置于一行并同与它配对的左括号对齐是有意义的一一尤其是当存在嵌套子查询的时候SELECTr.lastname.SELECTMAXYEARchampionship_dateFROMchampionsAScWHEREc.last_namer.last_nameANDc.confirmed*Y*ASlast_championship_yearFROMridersASrWHEREr.last.nameINSELECTc.last_nameFROMchampionsAScWHEREYEARchampionship_date2008ANDc.confirmed=Y;Preferredformalisms推荐的形式尽量使用BETWEEN而不是多个AND语句同样地,使用IN而不是多个OR语句当数据输出数据库时需要处理时,使用CASE表达式CASE语句能嵌套形成更复杂的逻辑结构尽量避免UNION语句和临时表如果数据库架构能够不靠这些语句运行那么多数情况下它就不应该依靠这些语句SELECTCASEpostcodeWHENBNl*THEN•Brighton*WHENEH1THENEdinburgh*ENDAScityFROMoffice_locationsWHEREcountry=•UnitedKingdomANDopening_timeBETWEEN8AND9ANDpostcodeINBN11NNl*KW1Createsyntax创建语句声明模式信息时维护可读代码也很重要所以列定义的顺序和分组一定要有意义在CREATE定义中,每列要缩进4个空格Choosingdatatypes选择数据类型尽量不使用供应商相关的数据类型一一这些类型可不能能在老系统上使用只在真的需要浮点数运算的时候才使用REAL和FLOAT类型否则使用NUMERIC和DECIMAL类型浮点数舍入误差是个麻烦Specifyingdefaultvalues指定默认类型默认值一定与列的类型相同一一如果一个列的类型是DECIMAL那么就不要使用INTEGER类型作为默认值.默认值要紧跟类型声明并在NOTNULL声明前约束和键约束和键是构成数据库系统的重要组成部分它们能很快地变得难以阅读和理解所以遵从指导方针是很重要的Choosingkeys选择键设计时应该谨慎选择构成键的列,因为键既明显影响着性能和数据完整性.键在某种程度上应该是独一无二的.该值在不同表中的类型应该相同并且尽量不会更改.该值是否会无法通过某种标准格式(如ISO发布的标准)?如。