読者です 読者をやめる 読者になる 読者になる

SQLスタイルガイド(日本語訳)

SQL Style Guide

Simon Holywell @Treffynnon


日本語訳について

日本語訳は誤訳や原文の最新版に追随していない恐れがあります。誤訳や改善点があれば、GitHubissueまたはpull requestを使用するか、Twitterでお知らせください。
翻訳: 久利史之 @nkuritw


概要

このガイドラインは利用の他、forkしたり、自分自身のものに改変したりすることができます。ここで大事なのはスタイルを選択しそれを踏襲することです。変更の提案やバグの修正にはGitHubissueまたはpull requestを使用してください。

このガイドラインは『Joe Celko’s SQL Programming Style』と互換性があり、すでにその本を読んだことがあるチームにとっては適用が容易です。このガイドはより独断的な部分もあればより緩やかな部分もあります。Celkoの書籍は各ルールの背後にあるエピソードや根拠を詳細に掲載していますが、このガイドはより簡潔になっています。

このガイドのMarkdown版を活用すれば、紙の本では難しいプロジェクトのコード規約に含めたり、プロジェクトの参加者がその場で参照し自由に読んだりすることが容易になります。

SQLスタイルガイド by Simon Holywell は、クリエイティブ・コモンズ 表示-継承4.0国際ライセンスの下にあります。原本はhttp://www.sqlstyle.guideです。

全般

推奨

  • 一貫性があり説明的な識別子と名前を使用する。
  • スペースとインデントを慎重に使用しコードを読みやすくする。
  • ISO-8601に準拠した日付時間フォーマット(YYYY-MM-DD HH:MM:SS.SSSSS)で格納する。
  • 移植性のためベンダー固有の関数の代わりに標準のSQL関数のみを使用する。
  • コードを簡潔で冗長なSQLのない状態に保つ。例えば、不必要なクォート、括弧、他の条件と重なる WHERE 句は避ける。
  • 必要に応じてSQLコードにコメントを挿入する。可能なら /* で始まり */ で終わるC言語スタイルのコメントを使用し、その他の場合、-- で始まり改行で終わる行コメントを使用する。
SELECT file_hash  -- stored ssdeep hash
  FROM file_system
 WHERE file_name = '.vimrc';
/* Updating the file record after writing to the file */
UPDATE file_system
   SET file_modified_date = '1980-02-22 13:19:01.00000',
       file_size = 209732
 WHERE file_name = '.vimrc';

非推奨

  • CamelCase - 読みづらくなる。
  • 説明的接頭辞やハンガリアン記法sp_またはtblなど)。
  • 複数形 - できるだけ集合体を表す用語を使用する。たとえばemployeesの代わりにstaff、またはindividualsの代わりにpeopleを使用する。
  • 引用符で囲まれた識別子 - 使用しなければならない場合、移植性のためSQL92の二重引用符が欠かせなくなる(ベンダーによってはサーバーを構成する必要がある)。
  • オブジェクト指向設計原則をSQLまたはデータベース構造に適用すべきではない。

命名規則

通則

  • 名前が一意であり、予約語に存在しないことを確認する。
  • 桁数を最大30バイトにする。実務的にはマルチバイト文字セットを除き30文字である。
  • 名前は文字で始めなければならずアンダースコアでは終わらない方が良い。
  • 名前には英字、数字、アンダースコアのみを使用する。
  • 複数の連続したアンダースコアの使用を避ける。読取るのが難しくなる。
  • 名前にスペースを含めるのが自然な場合はアンダースコアを使用する。(first nameはfirst_name
  • 略語を避ける。略語を使う必要がある場合は、一般的に通じるものであることを確認する。
SELECT first_name
  FROM staff;

  • 集合名詞を使用するか、望ましくはないが、複数形を使用する。例えば、employeesよりstaffが望ましい。
  • tblなどの接頭辞やハンガリアン記法による接頭辞を付けない。
  • 表に列の名前と同じ名前を付けない。その逆も同様である。
  • 関連付けする表の名前に2つの表名を連結した名前を付けないようにする。cars_mechanicsよりservicesが望ましい。

  • 常に単数形の名前を使用する。
  • 主キーに単純にidを使うのは極力避ける。
  • 表と同じ名前の列を追加しない。逆もまた同様である。
  • 固有名詞など意味のある場合を除いて、常に小文字を使用する。

別名、相関名

  • 何らかの方法でオブジェクトまたはその別名へ関連付けをすべきである。
  • 大雑把な方法として相関名はオブジェクト名の先頭文字を使う。
  • すでに同じ相関名がある場合は数値を追加する。
  • 常にASキーワードを記載する。明示的であれば読みやすくなる。
  • 計算データ(SUM()AVG())には、それが実際の列にあるつもりで名付ける。
SELECT first_name AS fn
  FROM staff AS s1
  JOIN students AS s2
    ON s2.mentor_id = s1.staff_num;
SELECT SUM(s.monitor_tally) AS monitor_total
  FROM staff AS s;

ストアド・プロシージャ

  • 名前に動詞を含める。
  • sp_またはそのような説明的接頭辞やハンガリアン記法を含めない。

統一的接尾辞

以下の接尾辞は一般的意味を持ち、SQLコードから列を読み取り理解しやすくする。適切な箇所で正しい接尾辞を使用すること。

  • _id - 主キーである列など一意の識別子。
  • _status - flag値または任意のタイプの状況を表す(例: publication_status)。
  • _total - 値の集合の合計または総計。
  • _num - フィールドに数値が含まれていることを表す。
  • _name - first_nameのように名前を強調する。
  • _seq - 連続した数値を含む。
  • _date - 何かの日付を含む列であることを表す。
  • _tally - カウント。
  • _size - ファイルサイズや衣類などのサイズ。
  • _addr - 有形無形のデータのアドレス(例: ip_addr)。

問合せ文

予約語

SELECTWHEREなど予約語は常に大文字を使用する。

略語を避け利用可能な完全なキーワードを使用するのが最も望ましい。(ABSよりABSOLUTEが望ましい。)

同じ機能を有するANSI SQLキーワードがすでに存在する場合はデータベース固有のものは使用しない。これはコードの移植性をより高くするためである。

SELECT model_num
  FROM phones AS p
 WHERE p.release_date > '2014-09-30';

空白類

コードを読みやすくするには、適切にスペースを補完することが重要である。コードを密集させたり、自然言語にあるスペースを削除したりしてはならない。

スペース

スペースを活用し、基底のキーワードがすべて同じ位置で終わるようにコードを整列させる。これは途中で「リバー」1を形作り、コードの見通しを良くし、実装の詳細からキーワードを分離することを容易にする。「リバー」はタイポグラフィ(欧文組版)では望ましくないとされるが、役に立つ。

SELECT f.average_height, f.average_diameter
  FROM flora AS f
 WHERE f.species_name = 'Banksia'
    OR f.species_name = 'Sheoak'
    OR f.species_name = 'Wattle';

SELECTFROM、その他キーワードはすべて右揃えされ、列名や実装の詳細は左揃えされている点に注意する。

網羅していないが、以下の場合は常にスペースを入れる。

  • イコール(=)の前後
  • カンマ(,)の後
  • アポストロフィ')の外側(括弧内またはカンマやセミコロンが後に来る場合は除く)
SELECT a.title, a.release_date, a.recording_date
  FROM albums AS a
 WHERE a.title = 'Charcoal Lane'
    OR a.title = 'The New Danger';

行間

以下のものは常に改行や空行を入れる。

  • ANDまたはORの前
  • セミコロンの後。問合せを分けて読みやすくするため。
  • キーワードの定義後。
  • 複数の列を論理的なグループに分けたコンマの後。
  • コードを関連するセクション単位に分離する場合。これはひとまとまりの大きなコードの可読性を向上させる。

すべてのキーワードを右に寄せ、値を左揃えにすると、問合せ文の中程に一様に縦の空間ができる。これも問合せの定義を素早く把握するのに大きく役立つ。

INSERT INTO albums (title, release_date, recording_date)
VALUES ('Charcoal Lane', '1990-01-01 01:01:01.00000', '1990-01-01 01:01:01.00000'),
       ('The New Danger', '2008-01-01 01:01:01.00000', '1990-01-01 01:01:01.00000');
UPDATE albums
   SET release_date = '1990-01-01 01:01:01.00000'
 WHERE title = 'The New Danger';
SELECT a.title,
       a.release_date, a.recording_date, a.production_date -- grouped dates together
  FROM albums AS a
 WHERE a.title = 'Charcoal Lane'
    OR a.title = 'The New Danger';

インデント

SQLを読みやすくするには以下のインデントについての基準が重要である。

結合

JOIN句は、「リバー」の向こう側にインデントし、必要に応じて改行でグループ化する

SELECT r.last_name
  FROM riders AS r
       INNER JOIN bikes AS b
       ON r.bike_vin_num = b.vin_num
          AND b.engines > 2

       INNER JOIN crew AS c
       ON r.crew_chief_last_name = c.last_name
          AND c.chief = 'Y';

副問合せ

副問合せもまた「リバー」の右側に配置し、他の問合せと同じスタイルを使用してレイアウトすべきである。閉じ括弧を新しい行の開き括弧と同じ文字位置に配置することが有効な場合もある。特にネストされた副問合せの場合に有効である。

SELECT r.last_name,
       (SELECT MAX(YEAR(championship_date))
          FROM champions AS c
         WHERE c.last_name = r.last_name
           AND c.confirmed = 'Y') AS last_championship_year
  FROM riders AS r
 WHERE r.last_name IN
       (SELECT c.last_name
          FROM champions AS c
         WHERE YEAR(championship_date) > '2008'
           AND c.confirmed = 'Y');

望ましい形式

  • 複数のANDを組み合わせる代わりにBETWEENを使用する。
  • 同様に複数のOR句を使用する代わりにIN()句を使用する。
  • 使用するデータベースに接続した状態で値を変換する必要がある場合にはCASE式を使う。CASE式はネストしてより複雑な論理構造を形成することができる。
  • UNION節および一時表は極力避ける。これらの機能へ依存しないようにスキーマを最適化できる場合はそうした方が良い。
SELECT CASE postcode
       WHEN 'BN1' THEN 'Brighton'
       WHEN 'EH1' THEN 'Edinburgh'
       END AS city
  FROM office_locations
 WHERE country = 'United Kingdom'
   AND opening_time BETWEEN 8 AND 9
   AND postcode IN ('EH1', 'BN1', 'NN1', 'KW1')

Create文

スキーマ情報を宣言する際も人間が読めるコードにすることが重要である。必要に応じて列定義を順序付けしグループ化すると良い。

CREATE文内の列定義は4つのスペースでインデントする。

データ型の選択

  • できるだけベンダー固有のデータ型は使用しないようにする。 これらは移植性がないだけでなく、同じベンダーのソフトウェアの古いバージョンでは使用できない可能性がある。
  • 浮動小数点による計算がどうしても必要な場合のみREALまたはFLOAT型を使い、それ以外は常にNUMERICDECIMAL型が望ましい。浮動小数点の丸め誤差は煩わしい。

デフォルト値の指定

  • 列のデフォルト値は列と同じ型でなければならない。列がDECIMAL型で宣言されている場合、INTEGERをデフォルト値にしないようにする。
  • デフォルト値は、データ型の宣言の後、NOT NULL文の前に来なければならない。

制約とキー

制約とそのサブセットであるキーは、データベース定義の非常に重要な要素である。それらはすぐに判別困難になる可能性がある。だからこそ次のようなガイドラインの基準が重要である。

キーの選択

定義においてキーとなる列を決定することは、パフォーマンスとデータの整合性に影響するため、慎重に検討されるべきである。

  1. キーはある程度一意でなければならない。
  2. スキーマ全体を通じデータ型の一貫性があり、将来の変更可能性が低いこと。
  3. 標準的なフォーマット(ISOで公開されているものなど)で値を検証できるようにする。これは項番2に通じる。
  4. キーをできるだけシンプルに保つ一方で、必要に応じて複合キーを恐れずに使用する。

これはデータベース定義の時点で論理的かつ慎重に行われる作業である。万一、将来要件が変わっても定義を変更し最新の状態に保つことを可能にする。

制約の定義

キーが決まれば、フィールド値の検証とともに制約を利用してシステム上でキーを定義することができる。

通則
  • 表には、完全で有用なキーが少なくとも1つ必要である。
  • UNIQUEPRIMARY KEYFOREIGN KEYと言ったデータベースベンダーが自動で付与する自明のものを除き、制約には独自の名称を付与する。
レイアウトと順序
  • CREATE TABLE文の直後にPRIMARY KEYを定める。
  • 制約は、対応する列の直下に定義します。列名の右に揃うようにインデントする。
  • 複数列制約であれば、可能な限り両方の列定義に近くに配置することを検討する。それが困難な場合は、最後の手段としてCREATE TABLE定義の最後に含める。
  • 表全体に適用される表レベルの制約であればそれも最後に表示する。
  • アルファベット順を使用する。ON DELETEON UPDATEの前に来る。
  • 必要に応じ問合せの各要素を同じ文字位置に揃える。例えば、NOT NULLの定義はすべて同じ文字位置から開始する。これは絶対必要というわけではないがコードを見通し良く読みやすくする。
検証
  • 文字列のフォーマットが分かっている場合は整合性を確保するためにLIKESIMILAR TO制約を使用する。
  • 数値の範囲が完全に判明している場合は、範囲をCHECK()として記述し、データベースへの誤った値が入力されるのを抑止するか列の定義に合うように大きすぎるデータの自動切り捨てを行う。多くの場合、少なくとも値が0より大きいかどうかを確認する。
  • CHECK()制約はデバッグを容易にするため独立した節にすべきである。
CREATE TABLE staff (
    PRIMARY KEY (staff_num),
    staff_num      INT(5)       NOT NULL,
    first_name     VARCHAR(100) NOT NULL,
    pens_in_drawer INT(2)       NOT NULL,
                   CONSTRAINT pens_in_drawer_range
                   CHECK(pens_in_drawer >= 1 AND pens_in_drawer < 100)
);

非推奨設計

  • オブジェクト指向設計原則は、リレーショナルデータベース設計へ効果的に変換されない。この落とし穴を避ける。
  • ある列に値を配置し、別の列に単位があること。その列の単位が自明となるようにし、アプリケーションで列を再度結合する必要性をなくすべきである。その列に挿入されたデータの有効性を確保するためCHECK()制約を使用する。
  • EAV(エンティティ・アトリビュート)表。そのようなスキーマレスデータを扱うための専用製品を使用する。
  • 本来1つにまとめるべきデータを時間単位のアーカイブ多国籍企業の所在地といった任意の問題により多数の表に分割すること。1つの表を照会する単純な問合せの代わりにUNION句により複数の表にまたがった問合せを作成する必要が出てくる。

付録

予約語リファレンス

ANSI SQL(92,99および2003)、MySQL 3から5.x、PostgreSQL 8.1、MS SQL Server 2000、MS ODBCおよびOracle 10.2の予約語リスト

A
ABORT
ABS
ABSOLUTE
ACCESS
ACTION
ADA
ADD
ADMIN
AFTER
AGGREGATE
ALIAS
ALL
ALLOCATE
ALSO
ALTER
ALWAYS
ANALYSE
ANALYZE
AND
ANY
ARE
ARRAY
AS
ASC
ASENSITIVE
ASSERTION
ASSIGNMENT
ASYMMETRIC
AT
ATOMIC
ATTRIBUTE
ATTRIBUTES
AUDIT
AUTHORIZATION
AUTO_INCREMENT
AVG
AVG_ROW_LENGTH
BACKUP
BACKWARD
BEFORE
BEGIN
BERNOULLI
BETWEEN
BIGINT
BINARY
BIT
BIT_LENGTH
BITVAR
BLOB
BOOL
BOOLEAN
BOTH
BREADTH
BREAK
BROWSE
BULK
BY
C
CACHE
CALL
CALLED
CARDINALITY
CASCADE
CASCADED
CASE
CAST
CATALOG
CATALOG_NAME
CEIL
CEILING
CHAIN
CHANGE
CHAR
CHAR_LENGTH
CHARACTER
CHARACTER_LENGTH
CHARACTER_SET_CATALOG
CHARACTER_SET_NAME
CHARACTER_SET_SCHEMA
CHARACTERISTICS
CHARACTERS
CHECK
CHECKED
CHECKPOINT
CHECKSUM
CLASS
CLASS_ORIGIN
CLOB
CLOSE
CLUSTER
CLUSTERED
COALESCE
COBOL
COLLATE
COLLATION
COLLATION_CATALOG
COLLATION_NAME
COLLATION_SCHEMA
COLLECT
COLUMN
COLUMN_NAME
COLUMNS
COMMAND_FUNCTION
COMMAND_FUNCTION_CODE
COMMENT
COMMIT
COMMITTED
COMPLETION
COMPRESS
COMPUTE
CONDITION
CONDITION_NUMBER
CONNECT
CONNECTION
CONNECTION_NAME
CONSTRAINT
CONSTRAINT_CATALOG
CONSTRAINT_NAME
CONSTRAINT_SCHEMA
CONSTRAINTS
CONSTRUCTOR
CONTAINS
CONTAINSTABLE
CONTINUE
CONVERSION
CONVERT
COPY
CORR
CORRESPONDING
COUNT
COVAR_POP
COVAR_SAMP
CREATE
CREATEDB
CREATEROLE
CREATEUSER
CROSS
CSV
CUBE
CUME_DIST
CURRENT
CURRENT_DATE
CURRENT_DEFAULT_TRANSFORM_GROUP
CURRENT_PATH
CURRENT_ROLE
CURRENT_TIME
CURRENT_TIMESTAMP
CURRENT_TRANSFORM_GROUP_FOR_TYPE
CURRENT_USER
CURSOR
CURSOR_NAME
CYCLE
DATA
DATABASE
DATABASES
DATE
DATETIME
DATETIME_INTERVAL_CODE
DATETIME_INTERVAL_PRECISION
DAY
DAY_HOUR
DAY_MICROSECOND
DAY_MINUTE
DAY_SECOND
DAYOFMONTH
DAYOFWEEK
DAYOFYEAR
DBCC
DEALLOCATE
DEC
DECIMAL
DECLARE
DEFAULT
DEFAULTS
DEFERRABLE
DEFERRED
DEFINED
DEFINER
DEGREE
DELAY_KEY_WRITE
DELAYED
DELETE
DELIMITER
DELIMITERS
DENSE_RANK
DENY
DEPTH
DEREF
DERIVED
DESC
DESCRIBE
DESCRIPTOR
DESTROY
DESTRUCTOR
DETERMINISTIC
DIAGNOSTICS
DICTIONARY
DISABLE
DISCONNECT
DISK
DISPATCH
DISTINCT
DISTINCTROW
DISTRIBUTED
DIV
DO
DOMAIN
DOUBLE
DROP
DUAL
DUMMY
DUMP
DYNAMIC
DYNAMIC_FUNCTION
DYNAMIC_FUNCTION_CODE
EACH
ELEMENT
ELSE
ELSEIF
ENABLE
ENCLOSED
ENCODING
ENCRYPTED
END
END-EXEC
ENUM
EQUALS
ERRLVL
ESCAPE
ESCAPED
EVERY
EXCEPT
EXCEPTION
EXCLUDE
EXCLUDING
EXCLUSIVE
EXEC
EXECUTE
EXISTING
EXISTS
EXIT
EXP
EXPLAIN
EXTERNAL
EXTRACT
FALSE
FETCH
FIELDS
FILE
FILLFACTOR
FILTER
FINAL
FIRST
FLOAT
FLOAT4
FLOAT8
FLOOR
FLUSH
FOLLOWING
FOR
FORCE
FOREIGN
FORTRAN
FORWARD
FOUND
FREE
FREETEXT
FREETEXTTABLE
FREEZE
FROM
FULL
FULLTEXT
FUNCTION
FUSION
G
GENERAL
GENERATED
GET
GLOBAL
GO
GOTO
GRANT
GRANTED
GRANTS
GREATEST
GROUP
GROUPING
HANDLER
HAVING
HEADER
HEAP
HIERARCHY
HIGH_PRIORITY
HOLD
HOLDLOCK
HOST
HOSTS
HOUR
HOUR_MICROSECOND
HOUR_MINUTE
HOUR_SECOND
IDENTIFIED
IDENTITY
IDENTITY_INSERT
IDENTITYCOL
IF
IGNORE
ILIKE
IMMEDIATE
IMMUTABLE
IMPLEMENTATION
IMPLICIT
IN
INCLUDE
INCLUDING
INCREMENT
INDEX
INDICATOR
INFILE
INFIX
INHERIT
INHERITS
INITIAL
INITIALIZE
INITIALLY
INNER
INOUT
INPUT
INSENSITIVE
INSERT
INSERT_ID
INSTANCE
INSTANTIABLE
INSTEAD
INT
INT1
INT2
INT3
INT4
INT8
INTEGER
INTERSECT
INTERSECTION
INTERVAL
INTO
INVOKER
IS
ISAM
ISNULL
ISOLATION
ITERATE
JOIN
K
KEY
KEY_MEMBER
KEY_TYPE
KEYS
KILL
LANCOMPILER
LANGUAGE
LARGE
LAST
LAST_INSERT_ID
LATERAL
LEADING
LEAST
LEAVE
LEFT
LENGTH
LESS
LEVEL
LIKE
LIMIT
LINENO
LINES
LISTEN
LN
LOAD
LOCAL
LOCALTIME
LOCALTIMESTAMP
LOCATION
LOCATOR
LOCK
LOGIN
LOGS
LONG
LONGBLOB
LONGTEXT
LOOP
LOW_PRIORITY
LOWER
M
MAP
MATCH
MATCHED
MAX
MAX_ROWS
MAXEXTENTS
MAXVALUE
MEDIUMBLOB
MEDIUMINT
MEDIUMTEXT
MEMBER
MERGE
MESSAGE_LENGTH
MESSAGE_OCTET_LENGTH
MESSAGE_TEXT
METHOD
MIDDLEINT
MIN
MIN_ROWS
MINUS
MINUTE
MINUTE_MICROSECOND
MINUTE_SECOND
MINVALUE
MLSLABEL
MOD
MODE
MODIFIES
MODIFY
MODULE
MONTH
MONTHNAME
MORE
MOVE
MULTISET
MUMPS
MYISAM
NAME
NAMES
NATIONAL
NATURAL
NCHAR
NCLOB
NESTING
NEW
NEXT
NO
NO_WRITE_TO_BINLOG
NOAUDIT
NOCHECK
NOCOMPRESS
NOCREATEDB
NOCREATEROLE
NOCREATEUSER
NOINHERIT
NOLOGIN
NONCLUSTERED
NONE
NORMALIZE
NORMALIZED
NOSUPERUSER
NOT
NOTHING
NOTIFY
NOTNULL
NOWAIT
NULL
NULLABLE
NULLIF
NULLS
NUMBER
NUMERIC
OBJECT
OCTET_LENGTH
OCTETS
OF
OFF
OFFLINE
OFFSET
OFFSETS
OIDS
OLD
ON
ONLINE
ONLY
OPEN
OPENDATASOURCE
OPENQUERY
OPENROWSET
OPENXML
OPERATION
OPERATOR
OPTIMIZE
OPTION
OPTIONALLY
OPTIONS
OR
ORDER
ORDERING
ORDINALITY
OTHERS
OUT
OUTER
OUTFILE
OUTPUT
OVER
OVERLAPS
OVERLAY
OVERRIDING
OWNER
PACK_KEYS
PAD
PARAMETER
PARAMETER_MODE
PARAMETER_NAME
PARAMETER_ORDINAL_POSITION
PARAMETER_SPECIFIC_CATALOG
PARAMETER_SPECIFIC_NAME
PARAMETER_SPECIFIC_SCHEMA
PARAMETERS
PARTIAL
PARTITION
PASCAL
PASSWORD
PATH
PCTFREE
PERCENT
PERCENT_RANK
PERCENTILE_CONT
PERCENTILE_DISC
PLACING
PLAN
PLI
POSITION
POSTFIX
POWER
PRECEDING
PRECISION
PREFIX
PREORDER
PREPARE
PREPARED
PRESERVE
PRIMARY
PRINT
PRIOR
PRIVILEGES
PROC
PROCEDURAL
PROCEDURE
PROCESS
PROCESSLIST
PUBLIC
PURGE
QUOTE
RAID0
RAISERROR
RANGE
RANK
RAW
READ
READS
READTEXT
REAL
RECHECK
RECONFIGURE
RECURSIVE
REF
REFERENCES
REFERENCING
REGEXP
REGR_AVGX
REGR_AVGY
REGR_COUNT
REGR_INTERCEPT
REGR_R2
REGR_SLOPE
REGR_SXX
REGR_SXY
REGR_SYY
REINDEX
RELATIVE
RELEASE
RELOAD
RENAME
REPEAT
REPEATABLE
REPLACE
REPLICATION
REQUIRE
RESET
RESIGNAL
RESOURCE
RESTART
RESTORE
RESTRICT
RESULT
RETURN
RETURNED_CARDINALITY
RETURNED_LENGTH
RETURNED_OCTET_LENGTH
RETURNED_SQLSTATE
RETURNS
REVOKE
RIGHT
RLIKE
ROLE
ROLLBACK
ROLLUP
ROUTINE
ROUTINE_CATALOG
ROUTINE_NAME
ROUTINE_SCHEMA
ROW
ROW_COUNT
ROW_NUMBER
ROWCOUNT
ROWGUIDCOL
ROWID
ROWNUM
ROWS
RULE
SAVE
SAVEPOINT
SCALE
SCHEMA
SCHEMA_NAME
SCHEMAS
SCOPE
SCOPE_CATALOG
SCOPE_NAME
SCOPE_SCHEMA
SCROLL
SEARCH
SECOND
SECOND_MICROSECOND
SECTION
SECURITY
SELECT
SELF
SENSITIVE
SEPARATOR
SEQUENCE
SERIALIZABLE
SERVER_NAME
SESSION
SESSION_USER
SET
SETOF
SETS
SETUSER
SHARE
SHOW
SHUTDOWN
SIGNAL
SIMILAR
SIMPLE
SIZE
SMALLINT
SOME
SONAME
SOURCE
SPACE
SPATIAL
SPECIFIC
SPECIFIC_NAME
SPECIFICTYPE
SQL
SQL_BIG_RESULT
SQL_BIG_SELECTS
SQL_BIG_TABLES
SQL_CALC_FOUND_ROWS
SQL_LOG_OFF
SQL_LOG_UPDATE
SQL_LOW_PRIORITY_UPDATES
SQL_SELECT_LIMIT
SQL_SMALL_RESULT
SQL_WARNINGS
SQLCA
SQLCODE
SQLERROR
SQLEXCEPTION
SQLSTATE
SQLWARNING
SQRT
SSL
STABLE
START
STARTING
STATE
STATEMENT
STATIC
STATISTICS
STATUS
STDDEV_POP
STDDEV_SAMP
STDIN
STDOUT
STORAGE
STRAIGHT_JOIN
STRICT
STRING
STRUCTURE
STYLE
SUBCLASS_ORIGIN
SUBLIST
SUBMULTISET
SUBSTRING
SUCCESSFUL
SUM
SUPERUSER
SYMMETRIC
SYNONYM
SYSDATE
SYSID
SYSTEM
SYSTEM_USER
TABLE
TABLE_NAME
TABLES
TABLESAMPLE
TABLESPACE
TEMP
TEMPLATE
TEMPORARY
TERMINATE
TERMINATED
TEXT
TEXTSIZE
THAN
THEN
TIES
TIME
TIMESTAMP
TIMEZONE_HOUR
TIMEZONE_MINUTE
TINYBLOB
TINYINT
TINYTEXT
TO
TOAST
TOP
TOP_LEVEL_COUNT
TRAILING
TRAN
TRANSACTION
TRANSACTION_ACTIVE
TRANSACTIONS_COMMITTED
TRANSACTIONS_ROLLED_BACK
TRANSFORM
TRANSFORMS
TRANSLATE
TRANSLATION
TREAT
TRIGGER
TRIGGER_CATALOG
TRIGGER_NAME
TRIGGER_SCHEMA
TRIM
TRUE
TRUNCATE
TRUSTED
TSEQUAL
TYPE
UESCAPE
UID
UNBOUNDED
UNCOMMITTED
UNDER
UNDO
UNENCRYPTED
UNION
UNIQUE
UNKNOWN
UNLISTEN
UNLOCK
UNNAMED
UNNEST
UNSIGNED
UNTIL
UPDATE
UPDATETEXT
UPPER
USAGE
USE
USER
USER_DEFINED_TYPE_CATALOG
USER_DEFINED_TYPE_CODE
USER_DEFINED_TYPE_NAME
USER_DEFINED_TYPE_SCHEMA
USING
UTC_DATE
UTC_TIME
UTC_TIMESTAMP
VACUUM
VALID
VALIDATE
VALIDATOR
VALUE
VALUES
VAR_POP
VAR_SAMP
VARBINARY
VARCHAR
VARCHAR2
VARCHARACTER
VARIABLE
VARIABLES
VARYING
VERBOSE
VIEW
VOLATILE
WAITFOR
WHEN
WHENEVER
WHERE
WHILE
WIDTH_BUCKET
WINDOW
WITH
WITHIN
WITHOUT
WORK
WRITE
WRITETEXT
X509
XOR
YEAR
YEAR_MONTH
ZEROFILL
ZONE

Hacker News[1,2]、Reddit[1],[2],[3] *1Lobste.rs、そしてもちろんTwitter上で議論されていますので、ご意見があればお寄せください。

著者は、「SQLスタイルガイドに関する誤解」というタイトルのブログ記事でよくある質問と誤解の多くについての回答に努めています。一読ください。

誤りがあればIssueをオープンするかPull Requestし、改善に協力ください。

SQLスタイルガイド by Simon Holywell は、クリエイティブ・コモンズ表示-継承4.0国際ライセンスの下にあります。原本はhttp://www.sqlstyle.guideです。


  1. [訳注] 行をまたがったスペースのつながり。横方向への視線の動きを妨げるため欧文組版では望ましくないとされる。

*1:はてなブログからはredditへリンクが貼れません。URLは以下です。 www.reddit.com/r/SQL/comments/3efmn0/sql_style_guide_a_consistent_code_guide_ensuring/ www.reddit.com/r/programming/comments/3eri42/sql_style_guide_by_simon_holywell/ www.reddit.com/r/PHP/comments/3efmp7/sql_style_guide_a_consistent_code_guide_ensuring/