web-dev-qa-db-ja.com

SQLステートメントのインデントの良い習慣

SQLステートメントをインデントするための一般的な方法は何ですか?たとえば、次のSQLステートメントを考えます。

SELECT column1, column2
FROM table1
WHERE column3 IN
(
SELECT TOP(1) column4
FROM table2
INNER JOIN table3
ON table2.column1 = table3.column1
)

これはどのようにインデントする必要がありますか?どうもありがとう。

67
MagicAndi
SELECT column1
     , column2
FROM table1
WHERE column3 IN
(
    SELECT TOP(1) column4
    FROM table2
    INNER JOIN table3
    ON table2.column1 = table3.column1
)

すべての"、"前にが必要です。この方法では、SQLエディターから行Xでエラーが発生したときにそれらを検索することはありません。


これは、このタイプの書き込みSQLステートメントを使用しないユーザーの例です。どちらにも、コンマが欠落しているというエラーが含まれています。

SELECT sdcolumn123
 , dscolumn234
 , sdcolumn343
 , ffcolumn434
 , sdcolumn543
 , bvcolumn645
  vccolumn754
 , cccolumn834
 , vvcolumn954
 , cvcolumn104
FROM table1
WHERE column3 IN
(
    ...
)

SELECT sdcolumn123, dscolumn234, asdcolumn345, dscolumn456, ascolumn554, gfcolumn645 sdcolumn754, fdcolumn845, sdcolumn954, fdcolumn1054
FROM table1
WHERE column3 IN
(
    ...
)

最初の例では、より簡単かつ迅速に見つかりました。この例が私の視点をもっと示してくれることを願っています。

42
SELECT column1, column2
FROM table
WHERE column3 IN (
    SELECT TOP(1) column4
    FROM table2
    INNER JOIN table3 ON table2.column1 = table3.column1
)

これは非常に短く、読みやすいです。選択されている列または結合条件がさらにある場合は調整します。

25
Bill the Lizard

受け入れられているプラ​​クティスがあるかどうかはわかりませんが、ここで私がそれを行う方法を示します。

SELECT 
    column1, 
    column2 
FROM 
    table1 
WHERE 
    column3 IN 
    ( 
     SELECT TOP(1) 
         column4 
     FROM 
         table2 
         INNER JOIN 
         table3 
             ON table2.column1 = table3.column1 
    )
20
Codewerks

コード内に空白の「川」があるのが好きです。スキャンが少し簡単になります。

SELECT column1,
       column2
  FROM table1
 WHERE column3 IN (SELECT column4
                     FROM table2
                     JOIN table3
                       ON table2.column1 = table3.column1);
19
jalbert

右側のキーワードを並べるjalbertの形式が好きです。また、左側のANDとORが好きだということも付け加えます(一部の人は右側に配置します)。さらに、可能な場合は等号を並べたいと思います。


SELECT column1, 
       column2  
  FROM table1, table2 
 WHERE table1.column1 = table2.column4 
   AND table1.col5    = "hi" 
    OR table2.myfield = 678 
16
Slapout

これは私の個人的な方法です。結合条件の長さに応じて、下の行でインデントすることがあります。

SELECT
  column1,
  column2
FROM
  table1
WHERE
  column3 IN ( 
    SELECT TOP(1)
      column4
    FROM
      table2
      INNER JOIN table3 ON table2.column1 = table3.column1
  )


SELECT
  column1,
  column2
FROM
  table1
WHERE
  column3 IN ( 
    SELECT TOP(1)
      column4
    FROM
      table2
      INNER JOIN table3
        ON table2.column1 = table3.column1 -- for long ones
  )
10
LeppyR64

私は、読みやすさ/「発見可能性」(後者は主にinsert-selectステートメントで有用です)に極端に偏った、当店のコード標準を書きました。

SELECT 
    column1, 
    column2
FROM 
    table1
WHERE 
    column3 IN
    (
        SELECT TOP(1) 
            column4
        FROM 
            table2
            INNER JOIN table3 ON table2.column1 = table3.column1
    )

より複雑なクエリでは、これがどのように役立つかがより明確になります。

SELECT
    Column1,
    Column2,
    Function1
    (
        Column1,
        Column2
    ) as Function1,
    CASE
    WHEN Column1 = 1 THEN
        a
    ELSE
        B
    END as Case1       
FROM
    Table1 t1
    INNER JOIN Table2 t2 ON t1.column12 = t2.column21
WHERE
    (
        FilterClause1
        AND FilterClause2
    )
    OR
    (
        FilterClause3
        AND FilterClause4
    )

ほとんどのクエリで複数の結合を持つシステムに移行すると、垂直スペースを自由に使用することが複雑なSQLの親友であることが私の経験でした。

7
Mike Burton

入力やタブ移動をせずに再フォーマットしたい長いSQLステートメントがある場合は、それを このWebサイト に叩いて、適切にフォーマットされた結果を得ることができます。さまざまな形式を試して、どのテキストが最も読みやすいかを確認できます。

編集: this はSQLフォーマッタの2014年の場所だと思います。

7
DOK

SQLの書式設定は、多くの相違点と意見の相違がある領域です...しかし、私は読みやすさに焦点を当て、読みやすさを低下させる規則に一貫して準拠することは、古い決まり文句が言うように、 「愚かな一貫性」(「愚かな一貫性は単純な心のためのホブゴブリン」)

したがって、それらをルールと呼ぶ代わりに、いくつかのガイドラインがあります。 SQLステートメントの各Major句(Select、Insert、Delete、From、Where、Having、Group BY、Order Byなど)を簡単に識別できる必要があります。それで、私は一般的にそれらを互いに最高レベルでインデントします。次に、各句内で、次の論理サブ構造を均等にインデントします...など。しかし、個々のケースで読みやすい場合は、パターンを自由に変更します(そして頻繁に変更します)。複雑なCaseステートメントが良い例です。水平スクロールを必要とするものはすべて読みやすさを大幅に低下させるため、複数行に複雑な(ネストされた)ケース式を記述することがよくあります。私がそうするとき、私はそのようなステートメントの始まりをSQLステートメントの論理的な場所に基づいてインデントをぶら下げて、残りのステートメント行を数文字インデントしてください...

SQL Databaseコードは、コンピューターが小文字になる前から長い間存在していたため、大文字のキーワードが歴史的に優先されますが、伝統より読みやすさを優先しています...とにかく)

また、エイリアスが混乱を引き起こさない限り、テーブルエイリアスを使用して、クエリの構造を理解するために目がスキャンする必要があるテキストの量を減らします。テーブルが3つまたは4つ未満のクエリでは、1文字のエイリアスは問題ありません。すべてのテーブルが異なる文字で始まる場合は、テーブルの最初の文字を使用します。最後に、データベースでサポートされている場合、キーワードの多くはオプションです(エイリアスの「Inner」、「Outer」、「As」など)。SQLServerでは「Into」(Insert Intoから)はオプションですが、 Oracle)コードがプラットフォームに依存しない必要がある場合は、これを使用することに注意してください...

あなたの例、私は次のように書くでしょう:

Select column1, column2
From table1 T1
Where column3 In (Select Top(1) column4
                  From table2 T2
                     Join table3 T3
                         On T2.column1 = T3.column1)

または

Select column1, column2
From table1 T1
Where column3 In 
     (Select Top(1) column4
      From table2 T2
         Join table3 T3
            On T2.column1 = T3.column1)

Select句にさらに多くの列がある場合、2行目以降の行をインデントします。通常、厳密に(行ごとに1列)種類の規則を順守しません。特に、画面の最初の10列のみにテキストが含まれている場合)

Select column1, column2, Col3, Col4, column5,
    column6, Column7, isNull(Column8, 'FedEx') Shipper,
    Case Upper(Column9) 
       When 'EAST'  Then 'JFK'
       When 'SOUTH' Then 'ATL'
       When 'WEST'  Then 'LAX'
       When 'NORTH' Then 'CHI' End HubPoint
From table1 T1
Where column3 In 
     (Select Top(1) column4
      From table2 T2
         Join table3 T3
            On T2.column1 = T3.column1)

最も読みやすい方法でコードをフォーマットします...

6
Charles Bretana

上記のほとんどが戻り列名を並べているので、表の名前と条件を並べると読みやすくなります。

SELECT 
    column1, 
    column2
FROM 
    table1
WHERE 
    column3 IN
    (
        SELECT TOP(1) 
            column4
        FROM 
            table2 INNER JOIN 
            table3 ON table2.column1 = table3.column1
    )

そして、結合条件が長くなるときのために。

SELECT
    Column1,
    Column2
FROM 
    Table1 JOIN 
    Table2 ON 
        Table1.Column3 = Table2.Column4 JOIN 
    Table3 ON 
        Table2.Column1 = Table3.Column1 and
        Table2.ColumnX = @x and
        Table3.ColumnY = @y
WHERE
    Condition1=xxx and
    Condition2=yyy and
    (
        Condition3=aaa or
        Condition4=bbb
    )
5
Jens Frandsen

クエリのさまざまな部分を縦に並べるのが好きです。 SQLには8スペースのタブサイズを使用する傾向がありますが、これはうまくいくようです。

SELECT  column1, 
        column2
FROM    table1
WHERE   column3 IN
(
        SELECT TOP(1) column4
        FROM    table2
        INNER JOIN table3
        ON      table2.column1  = table3.column1
)
5
Jack Ryan

非常に非常に複雑なSQLのインデントの例:

SELECT 
    produtos_cesta.cod_produtos_cesta, 
    produtos.nome_pequeno,
    tab_contagem.cont,
    produtos_cesta.sku, 
    produtos_kits.sku_r AS sku_kit, 
    sku_final = CASE
        WHEN produtos_kits.sku_r IS NOT NULL THEN produtos_kits.sku_r
        ELSE produtos_cesta.sku
    END,
    estoque = CASE
        WHEN produtos2.estoque IS NOT NULL THEN produtos2.estoque
        ELSE produtos.estoque
    END,
    produtos_cesta.unidades as unidades1, 
    unidades_x_quantidade = CASE
        WHEN produtos.cod_produtos_kits_tipo = 1 THEN CAST(produtos_cesta.quantidade * (produtos_cesta.unidades / tab_contagem.cont) * produtos_kits.quantidade AS int)
        ELSE CAST(produtos_cesta.quantidade * produtos_cesta.unidades AS int)
    END,
    unidades = CASE
        WHEN produtos.cod_produtos_kits_tipo = 1 THEN produtos_cesta.unidades / tab_contagem.cont * produtos_kits.quantidade
        ELSE produtos_cesta.unidades
    END,
    unidades_parent = produtos_cesta.unidades,
    produtos_cesta.quantidade,
    produtos.controla_estoque, 
    produtos.status
FROM 
    produtos_cesta 
INNER JOIN produtos 
    ON (produtos_cesta.sku = produtos.sku) 
INNER JOIN produtos_pacotes 
    ON (produtos_cesta.sku = produtos_pacotes.sku) 
INNER JOIN (
    SELECT 
        produtos_cesta.cod_produtos_cesta,
        cont = SUM(
            CASE
                WHEN produtos_kits.quantidade IS NOT NULL THEN produtos_kits.quantidade
                ELSE 1
            END
        )
    FROM 
        produtos_cesta 
    LEFT JOIN produtos_kits 
        ON (produtos_cesta.sku = produtos_kits.sku) 
    LEFT JOIN produtos 
        ON (produtos_cesta.sku = produtos.sku) 
    WHERE 
        shopper_id = '" + mscsShopperId + @"' 
    GROUP BY 
        produtos_cesta.cod_produtos_cesta, 
        produtos_cesta.sku, 
        produtos_cesta.unidades 
) 
AS tab_contagem
    ON (produtos_cesta.cod_produtos_cesta = tab_contagem.cod_produtos_cesta)
LEFT JOIN produtos_kits 
    ON (produtos.sku = produtos_kits.sku) 
LEFT JOIN produtos as produtos2
    ON (produtos_kits.sku_r = produtos2.sku) 
WHERE 
    shopper_id = '" + mscsShopperId + @"' 
GROUP BY 
    produtos_cesta.cod_produtos_cesta, 
    tab_contagem.cont,
    produtos_cesta.sku, 
    produtos_kits.sku_r, 
    produtos.cod_produtos_kits_tipo, 
    produtos2.estoque,
    produtos.controla_estoque, 
    produtos.estoque, 
    produtos.status, 
    produtos.nome_pequeno, 
    produtos_cesta.unidades, 
    produtos_cesta.quantidade,
    produtos_kits.quantidade
ORDER BY 
    produtos_cesta.sku, 
    produtos_cesta.unidades DESC

これに私の突っ込みがあります:

select column1, column2
    from table1
    where (column3 in (
        select top(1) column4
            from table2
            inner join table3
                on (table2.column1 = table3.column1)
    ))
;
  • 小文字が読みやすいため(また、キーワードを強調するためにコードを強調表示しているため)、すべて小文字で入力するのも簡単です。
  • キーワードのすべての制限またはオプション(selectのfromやjoinのonなど)は、外部キーワードへの依存を示すためにインデントされます
  • 閉じ括弧は、開きと同じインデントレベルにあります。
  • 読みやすさを向上させるために、節と節に括弧を使用します
  • 同じインデントでselect-statementを閉じるセミコロンを使用して、複数のステートメントを区別できるようにします(言語にSAS PROC SQLのようにセミコロンが必要な場合)
  • まだ非常にコンパクトで、ページ全体に広がりません
5
John Doe

もちろん、これは個人的な好みに帰着します。また、チームの設定では、一貫性を保つためにメンバー間で合意する必要があります。しかし、これは私の好みです:

SELECT column1, column2
FROM   table1
WHERE  column3 IN(SELECT     TOP(1) column4
                  FROM       table2
                  INNER JOIN table3 ON
                             table2.column1 = table3.column1
                 )
4
Bullines

私はこのようにフォーマットします:

SELECT
    column1, 
    column2
FROM 
    table1
WHERE 
    column3 IN (SELECT TOP(1) 
                    column4 
                FROM 
                    table2 
                    INNER JOIN table3 ON table2.column1 = table3.column1)

またはこのように:

SELECT
    column1, 
    column2
FROM 
    table1
WHERE 
    column3 IN (SELECT TOP(1) column4 
                FROM table2 
                INNER JOIN table3 ON table2.column1 = table3.column1)
3
Mitch Wheat

私はSQLプリティファイアーにそれを置いたところ、次のようになりました。

SELECT column1, column2
FROM table1
WHERE column3 IN
(
SELECT TOP(1) column4
    FROM table2
            INNER JOIN table3
            ON table2.column1 = table3.column1
)

http://extras.sqlservercentral.com/prettifier/prettifier.aspx

.....しかし、StackOverflowに色を取り込む方法を考え出していない。

2
Phil_Factor

これは私の通常の好みです:

....SELECT column1
........,column2
....FROM table1
....WHERE column3 IN (
........SELECT TOP(1) column4
........FROM table2
........INNER JOIN table3
............ON table2.column1 = table3.column1
....)

Stackoverflowは余分な先行スペースでフォーマットを台無しにしますが、実際のフォーマットを見ることができるようにいくつかの期間を置いています...

2
Cade Roux

このリンクは私が見つけた最高のものです。 http://www.sqlinform.com/free_online_sw.html

2

ええ、これはかなり主観的です...しかし、ここに私の2セントがあります:

SELECT
   Column1,
   Column2
FROM Table1
WHERE 
   Column3 IN (
      SELECT Column4
      FROM Table2
      JOIN Table3 ON
         Table2.Column1 = Table3.Column1
   )

しかし、実際には、おそらくINなしで書き直します。

SELECT
   Column1,
   Column2
FROM Table1
JOIN Table2 ON
   Table1.Column3 = Table2.Column4
JOIN Table3 ON
   Table2.Column1 = Table3.Column1

基本的に、私のルールは次のとおりです。

  • キーワードを大文字にする
  • 列は個々の行に移動しますが、SELECT修飾子(SELECT TOP 100、SELECT DISTINCTなど)または単一の列(SELECT 1、SELECT Id、SELECT *など)は同じ行に移動します
  • JOIN句の下にインデントされた結合条件
  • 内部結合にはJOINを使用し(一般的なものであるため)、その他を完全に指定します(LEFT OUTER JOIN、FULL OUTER JOINなど)
  • 同じ行の括弧を開き、別の行の括弧を閉じます。エイリアスを持っている場合、エイリアスは近い括弧になります。
2
Mark Brackett

標準があるかどうかはわかりませんが、このようにしたいです。

SELECT column1, column2
  FROM table1
WHERE column3 IN
(
    SELECT TOP(1) column4
      FROM table2
    INNER JOIN table3
      ON table2.column1 = table3.column1
)

sQLをよりよく読んで分析できるからです。

1
Nelson Miranda

もちろん、それはクエリに依存します。

単純なクエリの場合、非常に正式なインデントスキームは価値があるだけでなく、実際にコードをless読み取り可能にすることができます。しかし、複雑さが増すにつれて、ステートメントを後で読みやすくするために、ステートメントの構造をより慎重に始める必要があります。

1
Joel Coehoorn
SELECT
    Column1,
    Column2
FROM
    Table1
WHERE
    Column3 IN
    (
        SELECT TOP (1)
            Column4
        FROM 
            Table2
        INNER JOIN 
            Table3
        ON
            Table2.Column1 = Table3.Column1
    )
1
S. Goldberg

私が普段やっていることは

print("SELECT column1, column2
       FROM table1
       WHERE column3 IN (SELECT TOP(1) column4
                         FROM table2 INNER JOIN 
                              table3 ON table2.column1 = table3.column1)");
0
Amy

これは好みの問題です。

これが私の好みです。

SELECT 
  column1
 ,column2
FROM
  table1
WHERE column3 IN (
                 SELECT TOP(1) column4
                 FROM 
                   table2
                   INNER JOIN table3
                 ON table2.column1 = table3.column1
                 )
0
JosephStyons