web-dev-qa-db-ja.com

どのSQLコーディング標準に従っていますか?

広く使用されているSQLコーディング標準はありますか? SQLは、C/C++タイプのプログラミング言語とは少し異なります。読みやすくするために最適なフォーマットを設定する方法はわかりません。

48
thebat

コーディング標準とは呼ばない-コーディングスタイルに近い

SELECT
    T1.col1,
    T1.col2,
    T2.col3
FROM
    table1 T1
    INNER JOIN ON Table2 T2 ON T1.ID = T2.ID
WHERE
    T1.col1 = 'xxx'
    AND T2.Col3 = 'yyy'
  • 予約語を大文字にする
  • 新しい行の主なキーワード
  • 列の前のコンマに慣れることができません
  • 常に意味のある短いテーブルエイリアスを使用する
  • ビューの前にvを付ける
  • ストアドプロシージャの前にspを付けます(ただし、組み込みプロシージャ用に予約されている「sp_」は使用しないでください)
  • テーブルにプレフィックスを付けない
  • テーブル名単数
51
DJ.

私はこれが長いことを知っていますが、私と一緒に耐えてください、それは重要です。この質問は、ワームのクールな缶を開きました。データベースブロックが気に入らない場合は、読み進めてください。

そして、誰かが私の応答をノックダウンすることを考える前に、くださいロックと再コンパイルに関する次の記事とそれに関連する記事を参照してください。 SQLデータベースで最も有害なリソースヒットの2つ。

http://support.Microsoft.com/kb/263889

私はかなりすばやく入力できますが、次の人以外は入力したくありません。しかし、以下のポイントは、タイピングが多い場合でも非常に厳密に続きます。あまりにも多くのことで、独自のSPアプリを作成してくれました。

私が取り上げるポイントは本当に重要です! 「冗談ですか、それは問題ではない」と自分自身に言うこともできますが、その後、上記の記事を読んでいませんでした。 [〜#〜] and [〜#〜]、M $がこれらのポイントをメモとして入れるのは完全にモロニックです。私にとってこれらの問題は、大胆かつ悲鳴を上げるべきです。

また、開発をスピードアップするためにC#アプリケーションを使用して基本的なスクリプトを構築するために多くのコーディングを行います。これらのプラクティスは、SPのスクリプト作成をより簡単かつ特に高速にするために非常に適切です(10年分の価値があります)。

これ以上のものがありますが、これは私がすべての最初の60%に対して行うことです。


ベストプラクティス

  • オブジェクトを囲む括弧を使用して、クエリエンジンがフィールドを見つけたときにそれを明示的に認識するようにします
  • 同じオブジェクトをテーブルオブジェクト名とフィールド名として使用する
  • アプリケーションからSPを呼び出すときは、正しい所有者と大文字と小文字の完全修飾[dbo]。[procName]を使用します。冗談じゃない!上記の記事を読んでください!
  • オブジェクトの所有者を参照して、セキュリティが明示的に認識され、把握する必要がないようにします
  • これはシステムストアドプロシージャ、およびオーバーヘッドを指すため、「sp_」を使用しないでください。
  • SET NOCOUNT ONおよびSET NOCOUNT OFFを使用して、必要な場合を除き、ストアドプロシージャで更新されるレコード数を追跡するための余分なオーバーヘッドを排除します。通常、そうではなく、パフォーマンスを大幅に向上させることができます。

設定

  • ストアドプロシージャにプレフィックスを付ける
  • SEL、UPD、DEL、INS(またはSELECT、UPDATE、DELETE、INSERT)ですべてのストアドプロシージャをサフィックスします。
  • 予約語を大文字にする
  • 新しい行の主なキーワード(スクリプト)
  • 列の前にコンマを使用する(スクリプト作成)
  • Vwを使用したプレフィックスビュー
  • テーブルにプレフィックスを付けない
  • テーブル名単数
  • ストックSPのバリエーションの「_ByPK」、「_ OrderByLastName」、「_ Top15Orders」などの標準名にサフィックスを追加します

選択する

CREATE PROC [dbo].[procTable_SEL]
AS
SET NOCOUNT ON
SELECT
    [Column1] = T1.[col1]
  , [Column2] = T1.[col2]
  , [Column3] = T2.[col3]
FROM [dbo].[Table] T1    
INNER JOIN ON [dbo].[Table2] T2 ON T1.ID = T2.ID
WHERE
      T1.[col1] = 'xxx'
  AND T2.[Col3] = 'yyy'
SET NOCOUNT OFF
GO

更新

CREATE PROC [dbo].[procTable_UPD]
AS
SET NOCOUNT ON
UPDATE t1 SET
    [Column1] = @Value1
  , [Column2] = @Value2
  , [Column3] = @Value3
FROM [dbo].[Table1] T1
INNER JOIN ON [dbo].[Table2] T2 ON T1.[ID] = T2.[ID]
WHERE
      T1.[col1] = 'xxx'
  AND T2.[Col3] = 'yyy'
SET NOCOUNT OFF
GO

インサート

CREATE PROC [dbo].[procTable_INS]
AS
SET NOCOUNT ON
INSERT INTO [Table1] (
[Column1]
  , [Column2]
  , [Column3]
)
VALUES (
    @Value1
  , @Value2
  , @Value3
)
SET NOCOUNT OFF
GO

OR

CREATE PROC dbo.procTable_INS
AS
SET NOCOUNT ON
INSERT INTO [table1] (
    [Column1]
  , [Column2]
  , [Column3]
)
SELECT
    [Column1] = T1.col1
  , [Column2] = T1.col2
  , [Column3] = T2.col3
FROM dbo.Table1 T1    
INNER JOIN ON Table2 T2 ON T1.ID = T2.ID
WHERE
      T1.[col1] = 'xxx'
  AND T2.[Col3] = 'yyy'
SET NOCOUNT OFF
GO

削除する

CREATE PROC dbo.procTable_DEL
AS
SET NOCOUNT ON
DELETE
FROM [dbo].[Table1] T1
INNER JOIN ON [dbo].[Table2] T2 ON T1.[ID] = T2.[ID]
WHERE
      T1.[col1] = 'xxx'
  AND T2.[Col3] = 'yyy'
SET NOCOUNT OFF
GO
13
SnapJag

私はコンマの前の方法が好きです:

SELECT
      column1
    , column2
    , column3
    , COALESCE(column4,'foo') column4
FROM
    tablename
WHERE
    column1 = 'bar'
ORDER BY 
      column1
    , column2

私の意見では読みやすく、デバッグしやすくなっています。

13
Ryan Guill
7
Rob Prouse

PostgreSQLに関する非常に素晴らしいブログからですが、このトピックは一般的に適用可能です:

維持可能なクエリ-私の視点(depesz.com)

...保守可能なクエリを作成するための優先順位を決定しました。

  1. 無駄なタイピングを避けてください。

  2. テーブル/ビューのエイリアスを使用します。常に。そして、それらを適切なエイリアスにします。

  3. 何らかの方法でコードをインデントします。

  4. 引用を避けます(はい、これが私がDjangoを嫌う理由です)

  5. 結合構文を使用する

私は、予約語と他のすべての識別子の大文字化に同意しますが、自分のものは除きます。

4
Alex. S.

個人的に、ストアドプロシージャ名の前にsp_を付けるのは好きではありません。IMOという冗長なものです。代わりに、「機能単位」識別子をプレフィックスに追加するのが好きです。例えば私はsprocsを呼び出して、order_Save、order_GetById、order_GetByCustomerなどの注文を処理します。これらはすべて管理スタジオで論理的にグループ化され、間違ったものを選択しにくくします。 (GetOrderByProduct、GetCustomerByIdなど)

もちろん、それは個人的な好みであり、他の人はすべてのGet sproc、すべてのSave sprocなどを持つことを好むかもしれません。

ちょうど私の2c。

4
ZombieSheep
SELECT c.id
     , c.name
     , c.folder
     , cs.num_users active_members
     , cs.num_videos

  FROM campaign c
  JOIN campaign_stats cs
    ON cs.campaign_id = c.id
  JOIN (SELECT _c.id
             , _c.name

          FROM campaign _c
         WHERE _c.type = 9) t_c 
    ON t_c.id = c.id

 WHERE c.id IN (1,2,3)
   AND cs.num_videos > 10

これは私たちにとっては非常に有効です。

この実際のクエリは、例としてすばやく作成しようとしたため、あまり意味がありませんが、それはポイントではありません。

  • t_cは、カテゴリテーブルサブクエリまたは「一時カテゴリ」を表します。
  • _サブクエリ内のもののアンダースコア。
  • クエリのコンテキストで意味のあるエイリアス列名。例えば「active_members」
  • 新しい行の先頭にコンマを挿入すると、動的クエリを簡単に作成できます。

    $sql .= ", c.another_column"
    
  • 他のすべては簡単です。

2
adamJLev

私が20年近く使ってきたコーディングスタイルがこのリストに載っていないことに驚いています。

  SELECT column1,
         column2,
         column3,
         COALESCE(column4, 'foo') AS column4
    FROM tablename
   WHERE column1 = 'bar'
ORDER BY column1,
         column2

これは絶対に最も読みやすいと思いますが、入力するのは面倒です。キーワードの右揃えが多すぎる場合は、左揃えを選択します。

SELECT   column1,
         column2,
         column3,
         COALESCE(column4, 'foo') AS column4
FROM     tablename
WHERE    column1 = 'bar'
ORDER BY column1,
         column2
2
mzedeler

私は通常、行ごとにほとんど保持しません、すなわち:

select
    col1,
    col2,
    col3
from
    some_table tabl1
where
    col1 = 'some'
and 
(
    col2 = 'condition'
or  col2 = 'other'
)
2
Robin

Google for SQL pretty printerまたはlook here 。私は自分で試したことはありませんが、良いスタートを切ることができます。 Toadのようなほとんどの商用ツールには、「フォーマット」オプションもあります。

2
Thorsten

www.sqlinform.com をいじってみてください- ANSI-92標準 を使用することをお勧めします。

2

青の部分はすべて大文字のSELECTDELETEGOなどです。

テーブル名は、顧客を保持するテーブルが顧客テーブルであるように単数形です

リンクテーブルはtablename_to_tablename

使用する _テーブル名とパラメーターの作品間

BEGIN
    SELECT
        Company.ID AS Company_ID,
        Company.Client_Name,
        Company.Website,
        Office.Office_Name
    FROM
        Company_Office WITH(NOLOCK)
        INNER JOIN Company WITH(NOLOCK) ON Company_Office.Company_ID = Company.ID
    WHERE
END
2
Bob The Janitor

使用するデータ型:次のデータ型のみを使用する必要があります。

  • INT
  • ビッグ
  • 小型
  • VARCHAR
  • ビット
  • 日付時刻

BITデータ型のデフォルト値を指定します。 nullを許可することはできません。テーブル名と列名を小文字にすることはできません。目的を説明する必要があります。短い形式の使用は避けてください。テーブルFKとPKを作成する際、よく考えて定義します。変数名は、小文字のデータ型を示す1文字または2文字で始まる必要があります。たとえばINT変数はiで始まる必要があります。名前はわかりやすく、短い形式は避けてください。各Wordは大文字で始まり、すべての小文字が続く必要があります。

例えば。

正しい方法:– iTotalCount

間違った方法:– xyz

ストアドプロシージャ内で "WHERE"句で使用されるテーブル列には、インデックス/キーが必要です。これにより、データ処理の速度が向上します。 WHERE句のパラメーターの順序は適切に行われる必要があります。主キー/インデックスはビット変数の前に置く必要があります。例:-列の組み合わせでインデックスが作成されます(REF_ID、T_TYPE_STR、CNUMBER、TLOG_ID)

—インデックスキーが「WHERE」句で順番に使用される正しい方法

SELECT REF_ID,T_TYPE_STR,C_NUMBER,TLOG_ID

FROM T_T_DATA_tbl

WHERE REF_ID = 1

AND LOG_ID = ‘4042654’

AND T_TYPE_STR = ‘SA’

AND CNUMBER = ‘10702’

–Incorrect way

SELECT REF_ID, T_TYPE_STR, CNUMBER, LOG_ID

FROM T_T_DATA_tbl

WHERE LOG_ID = ‘4042654’

AND T_TYPE_STR = ‘SA’

ストアドプロシージャを記述している間、冒頭にAuthorを含む説明セクションが必要です。

作成日:

説明:

Spが変更された場合、このセクションに追加する必要があります

によって変更:

変更日:

説明:

ROW_INSERTION_DATE_TIMEおよびROW_UPDATION_DATE_TIME列には、GETDATE()のデフォルト値が必要です。

詳細: http://www.writeulearn.com/sql-database-coding-standards/

0
bhupesh