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
'Development Tip' 카테고리의 다른 글
특정 파일 목록 만 재 동기화하는 방법은 무엇입니까? (0) | 2020.11.06 |
---|---|
릴리스 빌드를 수행하기 위해 Gradle 및 Android Studio를 설정하는 방법은 무엇입니까? (0) | 2020.11.06 |
.NET의 SOAP 클라이언트-참조 또는 예제? (0) | 2020.11.06 |
Cygwin Make bash 명령을 찾을 수 없습니다. (0) | 2020.11.06 |
Django에서 사용자를 만드는 방법은 무엇입니까? (0) | 2020.11.06 |