Development Tip

SQL 문 들여 쓰기 우수 사례

yourdevel 2020. 11. 6. 20:42
반응형

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
)

어떻게 들여 쓰기해야합니까? 감사합니다.


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
(
    ...
)

첫 번째 예에서 더 쉽고 빠르게 발견했습니다. 이 예가 내 관점을 더 많이 보여주기를 바랍니다.


SELECT column1, column2
FROM table
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 
    )

나는 코드에 공백의 "강"이있는 것을 좋아합니다. 스캔하기가 조금 더 쉽습니다.

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

나는 오른쪽에 키워드를 정렬하는 jalbert의 형식을 좋아합니다. 나는 또한 왼쪽의 AND와 OR를 좋아한다고 덧붙이고 싶습니다. (어떤 사람들은 오른쪽에 넣습니다.) 또한 가능하면 등호를 정렬하는 것을 좋아합니다.


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

이것은 제 개인적인 방법입니다. 조인 조건의 길이에 따라 때때로 아래 줄에서 들여 씁니다.

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
  )

나는 가독성 / "검색 가능성"(후자는 주로 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의 가장 좋은 친구라는 것이 제 경험이었습니다.


모든 타이핑과 탭을 사용하지 않고 형식을 다시 지정하려는 긴 SQL 문 이있는 경우이 웹 사이트에 입력 하여 멋진 형식의 결과를 얻을 수 있습니다. 다양한 형식으로 실험하여 어떤 텍스트가 가장 읽기 쉬운 지 확인할 수 있습니다.

편집 : 이것이 SQL 포맷터의 2014 년 위치 라고 생각합니다 .


SQL 형식화는 많은 차이와 불일치가있는 영역입니다 ... 그러나 fwiw, 저는 가독성에 초점을 맞추고 싶습니다. 그리고 가독성을 감소시키는 모든 규칙을 지속적으로 준수하는 것은 예전의 진부한 것처럼, "어리석은 일관성"( "어리석은 일관성은 단순한 마음을위한 홉 고블린")

따라서 규칙이라고 부르는 대신 몇 가지 지침이 있습니다. SQL 문의 각 주요 절 (Select, Insert, Delete, From, Where, Have, Group BY, Order By, ... I may be missing a few)은 쉽게 식별 할 수 있어야합니다. 그래서 나는 일반적으로 그것들을 모두 최고 수준에서 들여 씁니다. 그런 다음 각 절 내에서 다음 논리 하위 구조를 균등하게 들여 씁니다 ... 등등 .. 그러나 개별 경우에 패턴을 변경하는 것이 더 읽기 쉬운 경우 자유롭게 (그리고 자주 변경합니다) 패턴을 변경합니다 ... 복잡한 Case 문이 좋은 예입니다. 가로 스크롤이 필요한 모든 것은 가독성을 크게 떨어 뜨리기 때문에 저는 종종 여러 줄에 복잡한 (중첩 된) Case 표현식을 작성합니다. 그렇게 할 때 SQL 문에서 논리적 위치에 따라 들여 쓰기를 중단하는 이러한 문의 시작 부분을 유지하려고합니다.

SQL Database 코드는 컴퓨터가 소문자를 사용하기 전부터 오랫동안 사용되어 왔기 때문에 대문자 키워드에 대한 역사적 선호도가 있지만 전통보다 가독성을 선호합니다 ... (그리고 지금은 색상 코드를 사용하는 모든 도구가 키워드를 사용합니다. 어쨌든)

또한 별칭이 혼동을 일으키지 않는 한 테이블 별칭을 사용하여 쿼리의 구조를 파악하기 위해 눈이 스캔해야하는 텍스트 양을 줄입니다. 테이블이 3 개 또는 4 개 미만인 쿼리에서 단일 문자 별칭은 괜찮습니다. 모든 테이블이 다른 문자로 시작하면 테이블의 첫 글자를 자주 사용합니다. 마지막으로 데이터베이스에서 지원하는 경우 많은 키워드가 선택 사항입니다 (예 : "Inner", "Outer", "As"for aliases 등). "Into"(Insert Into에서)는 Sql Server에서 선택 사항이지만 그렇지 않습니다. 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 절에 더 많은 열이있는 경우 두 번째 및 후속 줄을 들여 씁니다 ... 나는 일반적으로 엄격한 (한 행에 한 열) 종류의 규칙을 준수하지 않습니다. 수직으로 스크롤하는 것은 가로로 스크롤하는 것만 큼 가독성이 떨어집니다. 특히 화면의 처음 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)

가장 읽기 쉬운 방식으로 코드를 포맷하십시오.


내 쿼리의 다른 부분을 세로로 정렬하는 것을 좋아합니다. 나는 잘 작동하는 것처럼 보이는 SQL에 8 공백의 탭 크기를 사용하는 경향이 있습니다.

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

매우 매우 복잡한 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
    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
    )

여기에 내 찌르기가 있습니다.

select column1, column2
    from table1
    where (column3 in (
        select top(1) column4
            from table2
            inner join table3
                on (table2.column1 = table3.column1)
    ))
;
  • 소문자를 읽기가 더 쉽기 때문에 (키워드를 강조하기 위해 코드 강조 표시가 있음) 입력하기가 더 쉽기 때문에 모든 것이 소문자입니다.
  • 키워드에 대한 모든 제한 또는 옵션 (예 : 선택의 from 또는 조인의 on)은 외부 키워드에 대한 종속성을 표시하기 위해 들여 쓰기됩니다.
  • 닫는 괄호는 여는 위치와 동일한 들여 쓰기 수준에 있습니다.
  • 가독성을 높이려면 where- 및 on-clauses에 대괄호를 사용하십시오.
  • 세미콜론을 사용하여 동일한 들여 쓰기에서 select 문을 닫아 여러 문을 더 잘 구별 할 수 있습니다 (SAS PROC SQL과 같은 언어로 세미콜론이 필요한 경우).
  • 여전히 매우 작고 페이지 전체에 걸쳐 늘어나지 않습니다.

물론 이것은 개인적인 취향에 달려 있습니다. 그리고 팀 환경에서는 일관성을 위해 구성원간에 합의해야하는 사항입니다. 그러나 이것이 내가 선호하는 것입니다.

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)

또는 다음과 같이 :

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
....)

stackoverflow가 추가 선행 공백으로 서식을 엉망으로 만들지 만 실제 서식을 볼 수 있도록 마침표를 몇 개 넣었습니다.


방금 SQL prettifier를 통해 입력했는데 이렇게 나왔습니다 ....

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 센트가 있습니다.

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 절 아래 들여 쓰기 된 조인 조건
  • INNER JOIN에 JOIN을 사용하고 (일반적인 것이므로) 나머지는 완전히 지정합니다 (LEFT OUTER JOIN, FULL OUTER JOIN 등).
  • 같은 줄에서 괄호를 열고 별도의 줄에서 괄호를 닫습니다. 별칭이있는 경우 별칭은 가까운 괄호와 함께 사용됩니다.

이 링크는 내가 찾은 최고의 링크입니다. http://www.sqlinform.com/free_online_sw.html


물론 쿼리에 따라 다릅니다.

간단한 쿼리를 들어, 매우 형식적인 들여 쓰기 방식은 그것의 가치보다는 단지 더 이상의 문제이고, 실제로 코드를 만들 수 적게 , 읽을 수없는 더. 그러나 복잡성이 증가함에 따라 나중에 다시 읽을 수 있도록 명령문을 구성하는 방법에 더주의를 기울여야합니다.


표준이 있는지는 모르겠지만 이런 식으로하는 것을 좋아합니다.

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

SQL을 더 잘 읽고 분석 할 수 있기 때문입니다.


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

제가 보통하는 일은

print("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
                 )

이것이 우리가 여기서하는 방법입니다.

고르다
        COLUMN1,
        COLUMN2,
        COLUMN5 = 'X'인 경우
                        COLUMN6 = 'Y'
                그다음 '하나'
                COLUMN5가 (
                                'AAA',
                                'BBB'
                        )
                then    'two'
                else    'three'
        end as COLUMN7
from
        TABLE1
where
        COLUMN2 in (
                select top(1)
                        COLUMN4
                from
                        TABLE2
                        inner join
                        TABLE3
                                on
                                        TABLE2.COLUMN1 = TABLE3.COLUMN1
                                        and
                                        TABLE2.COLUMN2
                                                between
                                                        TABLE3.COLUMN2
                                                        and
                                                        TABLE3.COLUMN3
        )

Our idea is: keep sql keywords in lower case and put all changing (and therefore "more interesting") things like table or column names in upper case. The code might look a bit "blown up" here, but it increases readability if you have complex queries with longer names (incl. schema etc.) much longer than in this example. And: indent all objects according to their "level".

참고URL : https://stackoverflow.com/questions/272210/sql-statement-indentation-good-practice

반응형