[SQL] SQL 표준 포맷
SQLSQL 표준 포맷
내 마지막 직장에서, 우리는 매우 데이터베이스 무거운 응용 프로그램에서 일했다, 나는 몇 가지 포맷 표준을 개발 우리가 공통 레이아웃 모든 쓰기 SQL을 것이다 그래야. 우리는 또한 코딩 표준을 개발,하지만 난 여기에 가지 않을 것이다, 그래서이 더 특정 플랫폼에서만 사용할 수 있습니다.
나는 다른 사람들이 SQL은 표준 서식에 사용하는 것을 알고 관심이 있어요. 대부분의 다른 코딩 환경과는 달리, 나는 그들을 위해 온라인 합의의 많은 부분을 발견하지 않았습니다.
주요 질의 유형을 포함합니다 :
select
ST.ColumnName1,
JT.ColumnName2,
SJT.ColumnName3
from
SourceTable ST
inner join JoinTable JT
on JT.SourceTableID = ST.SourceTableID
inner join SecondJoinTable SJT
on ST.SourceTableID = SJT.SourceTableID
and JT.Column3 = SJT.Column4
where
ST.SourceTableID = X
and JT.ColumnName3 = Y
이 라인 피드에 대한 몇 가지 의견 차이는 선택 후였다에서 어디. 선택 행의 의도는 레이아웃을 변경하지 않고 예 : "최고 X"와 같은 다른 사업자를 허용하는 것입니다. 단순히 키 쿼리 요소 후 일관된 줄 바꿈을 유지, 그 다음에 계속되는 것은 가독성 좋은 수준의 결과를 보였다.
에서 어디서 후 줄 바꿈을 삭제하는 것은 이해할 개정 될 것이다. 그러나, 아래의 업데이트와 쿼리에서, 우리는 후에 라인 피드 어디 우리에게 좋은 열 정렬을주는 것을 알 수있다. 마찬가지로하여 그룹화 한 후 라인 피드 또는 순서가 명확하고 읽기 쉬운 우리의 열 레이아웃을 유지합니다.
update
TargetTable
set
ColumnName1 = @value,
ColumnName2 = @value2
where
Condition1 = @test
마지막으로, 삽입 :
insert into TargetTable (
ColumnName1,
ColumnName2,
ColumnName3
) values (
@value1,
@value2,
@value3
)
대부분의 경우, 이러한 그러나 그들이 다른, 그런데 MS SQL 서버 경영진 스튜디오 / SQL 밖으로 쿼리 분석기 쓰기에서 멀리 그것을 벗어나지 않는다.
나는이 주제에 대한 스택 오버플로 지역 사회에서 어떤 합의가 있는지 뵙기를 기대합니다. 나는 끊임없이 많은 개발자들이 다른 언어의 표준 형식을 따르 갑자기 SQL을 타격 할 때 너무 무작위로 갈 수있는 방법을 놀라게하고있다.
해결법
-
==============================
1.난 당신이 쉽게 소스 코드를 읽을 수 있습니다 너무 오래 같은 의견입니다, 형식은 차입니다. 너무 오래 이러한 목적이 달성 될 때 채택 할 수 있습니다 좋은 레이아웃 스타일은 여러 가지가있을 수 있습니다.
난 당신이 쉽게 소스 코드를 읽을 수 있습니다 너무 오래 같은 의견입니다, 형식은 차입니다. 너무 오래 이러한 목적이 달성 될 때 채택 할 수 있습니다 좋은 레이아웃 스타일은 여러 가지가있을 수 있습니다.
나에게 중요한 유일한 다른 측면은 당신이 당신의 가게에서 채택이 지속적으로 모든 코더에 의해 사용되도록 선택하는 것이 어떤 코딩 레이아웃 / 스타일입니다.
그냥 참조를 위해, 여기 당신이 제공 한 예를 들어, 그냥 내 레이아웃 환경을 제공 할 방법이다. 조인으로 특정 참고로 ON 절은 기본이 (가) (즉, 키 일치)에 가입하고, 다른 조건이 where 절에 이동에 조건이 나열되어 가입, 같은 줄에 있습니다.
select ST.ColumnName1, JT.ColumnName2, SJT.ColumnName3 from SourceTable ST inner join JoinTable JT on JT.SourceTableID = ST.SourceTableID inner join SecondJoinTable SJT on ST.SourceTableID = SJT.SourceTableID where ST.SourceTableID = X and JT.ColumnName3 = Y and JT.Column3 = SJT.Column4
하나의 팁은, 자신 레드 게이트에서 프롬프트 SQL의 사본을 얻을. 당신은 당신의 원하는 레이아웃 기본 설정을 사용할 수있는 도구를 사용자 정의 할 수 있으며, 모든 사용할 수 있습니다 가게에서 코더는 같은 코딩 표준을 모두 채택하고 있는지 확인할 수도 있습니다.
-
==============================
2.늦은 대답 만 잘하면 유용합니다.
늦은 대답 만 잘하면 유용합니다.
더 큰 개발 팀의 일원으로 일하고 나의 경험은 당신이 가서 당신이 원하는 기준을 정의 할 수 있지만 문제는 실제로이 집행 또는 매우 쉽게 개발자가 구현하기 위해 그것을하고있다.
개발자로서 우리는 때때로 다음 작품은 "나는 나중에 포맷 할 것이다"라고 뭔가를 만들 수 있지만 나중에 제공하지 않습니다.
처음에, 우리는이에 대한 SQL 프롬프트 (이 좋았어요)를 사용하지만 무료 도구이기 때문에 다음, ApexSQL 팩터로 전환.
-
==============================
3.나는 파티에 늦게 해요,하지만 난 그냥 책과 매뉴얼에서 배운해야했습니다 내 선호하는 서식 스타일을 추가 할 것입니다 : 컴팩트입니다. 다음은 샘플 SELECT 문의 :
나는 파티에 늦게 해요,하지만 난 그냥 책과 매뉴얼에서 배운해야했습니다 내 선호하는 서식 스타일을 추가 할 것입니다 : 컴팩트입니다. 다음은 샘플 SELECT 문의 :
SELECT st.column_name_1, jt.column_name_2, sjt.column_name_3 FROM source_table AS st INNER JOIN join_table AS jt USING (source_table_id) INNER JOIN second_join_table AS sjt ON st.source_table_id = sjt.source_table_id AND jt.column_3 = sjt.column_4 WHERE st.source_table_id = X AND jt.column_name_3 = Y
한마디로 : 8 공간 들여 쓰기, 모자 키워드 (비록 SO 색상은 그들에게 더 나은 경우 소문자), 더 낙타 표기법 (오라클에 무의미), 라인 랩이 필요하지 않을 때.
업데이트 :
UPDATE target_table SET column_name_1 = @value, column_name_2 = @value2 WHERE condition_1 = @test
그리고 INSERT :
INSERT INTO target_table (column_name_1, column_name_2, column_name_3) VALUES (@value1, @value2, @value3)
이제,이 스타일은 그것의 문제가 있음을 인정하는 첫번째가 될 수 있습니다. ORDER BY와 GROUP BY 중 정렬 안 들여 쓰기, 또는 그 자체로 해제하여 단어를 분할하는 8 공간 들여 쓰기 수단. 또한 WHERE 절의 전체 조건을 들여 자연,하지만 것 I 왼쪽 여백에서 일반적으로 정렬 다음 AND 및 OR 연산자. INNER JOIN 선을 래핑 후에 압입하면 다소 임의적이다.
그러나 어떤 이유로, 나는 아직도 쉽게 대안보다 읽기 찾을 수 있습니다.
나는 늦게 서식 스타일을 사용하여 내 더 복잡한 작품 중 하나 마무리 있습니다. 당신이이 일에 SELECT 문 쇼에서 발생하는 것입니다 거의 모든. (또한 그 기원을 위장하기 위해 변경되고, 난 그렇게 오류가 발생했을 수 있습니다.)
SELECT term, student_id, CASE WHEN ((ft_credits > 0 AND credits >= ft_credits) OR (ft_hours_per_week > 3 AND hours_per_week >= ft_hours_per_week)) THEN 'F' ELSE 'P' END AS status FROM ( SELECT term, student_id, pm.credits AS ft_credits, pm.hours AS ft_hours_per_week, SUM(credits) AS credits, SUM(hours_per_week) AS hours_per_week FROM ( SELECT e.term, e.student_id, NVL(o.credits, 0) credits, CASE WHEN NVL(o.weeks, 0) > 5 THEN (NVL(o.lect_hours, 0) + NVL(o.lab_hours, 0) + NVL(o.ext_hours, 0)) / NVL(o.weeks, 0) ELSE 0 END AS hours_per_week FROM enrollment AS e INNER JOIN offering AS o USING (term, offering_id) INNER JOIN program_enrollment AS pe ON e.student_id = pe.student_id AND e.term = pe.term AND e.offering_id = pe.offering_id WHERE e.registration_code NOT IN ('A7', 'D0', 'WL') ) INNER JOIN student_history AS sh USING (student_id) INNER JOIN program_major AS pm ON sh.major_code_1 = pm._major_code AND sh.division_code_1 = pm.division_code WHERE sh.eff_term = ( SELECT MAX(eff_term) FROM student_history AS shi WHERE sh.student_id = shi.student_id AND shi.eff_term <= term) GROUP BY term, student_id, pm.credits, pm.hours ) ORDER BY term, student_id
이 가증 한 학생이 주어진 기간에 풀 타임 또는 파트 타임인지 여부를 계산합니다. 에 관계없이 스타일, 하드 이것의 읽을.
-
==============================
4.늦은, 그러나 나는 반지에 내 모자를 던질거야. 그것은 조금 더 쓰기에 걸리지 만 나는 패턴이 당신이 그것에 익숙해 일단 아주 쉽게 읽을 수 있도록 수직 정렬로 등장 찾을 수 있습니다.
늦은, 그러나 나는 반지에 내 모자를 던질거야. 그것은 조금 더 쓰기에 걸리지 만 나는 패턴이 당신이 그것에 익숙해 일단 아주 쉽게 읽을 수 있도록 수직 정렬로 등장 찾을 수 있습니다.
SELECT ST.ColumnName1, JT.ColumnName2, SJT.ColumnName3, CASE WHEN condition1 = True AND condition2 = True Then DoSomething Else DoSomethingElse END ColumnName4 FROM SourceTable AS ST INNER JOIN JoinTable AS JT ON JT.SourceTableID = ST.SourceTableID INNER JOIN SecondJoinTable AS SJT ON ST.SourceTableID = SJT.SourceTableID AND JT.Column3 = SJT.Column4 LEFT JOIN (SELECT Column5 FROM Table4 QUALIFY row_number() OVER ( PARTITION BY pField1, pField2 ORDER BY oField1 ) = 1 ) AS subQry ON SJT.Column5 = subQry.Column5 WHERE ST.SourceTableID = X AND JT.ColumnName3 = Y
-
==============================
5.좋은. 파이썬 프로그래머로서, 여기 내 환경 설정은 다음과 같습니다 :
좋은. 파이썬 프로그래머로서, 여기 내 환경 설정은 다음과 같습니다 :
뉴 라인 후이 가독성을 위해 필요한 경우에만에서 어디를 선택합니다.
코드를보다 컴팩트하고 동등하게 읽을 수 있습니다 때, 나는 보통보다 컴팩트 한 형태를 선호한다. 한 화면에 더 많은 코드에 맞게 수있는 것은 생산성을 향상시킵니다.
select ST.ColumnName1, JT.ColumnName2, SJT.ColumnName3 from SourceTable ST inner join JoinTable JT on JT.SourceTableID = ST.SourceTableID inner join SecondJoinTable SJT on ST.SourceTableID = SJT.SourceTableID and JT.Column3 = SJT.Column4 where ST.SourceTableID = X and JT.ColumnName3 = Y
궁극적으로,이 코드를 검토 중에 이루어집니다 판단 호출 될 것입니다.
삽입, 나는 다르게 괄호를 배치합니다 :
insert into TargetTable ( ColumnName1, ColumnName2, ColumnName3) values ( @value1, @value2, @value3)
이 형식에 대한 이유는 SQL이 (파이썬 등) 블록 구조에 대한 들여 쓰기를 사용하는 경우, 괄호가 필요하지 않을 것입니다. 들여 쓰기가 어쨌든 사용하는 경우에 따라서, 다음 괄호 레이아웃에 최소한의 효과가 있어야합니다. 이것은 라인의 끝에서 그들을 배치함으로써 달성된다.
-
==============================
6.나는 요한의 제안에 따라 다음 스타일을 제안합니다 :
나는 요한의 제안에 따라 다음 스타일을 제안합니다 :
/* <Query title> <Describe the overall intent of the query> <Development notes, or things to consider when using/interpreting the query> */ select ST.ColumnName1, JT.ColumnName2, SJT.ColumnName3 from -- <Comment why this table is used, and why it's first in the list of joins> SourceTable ST -- <Comment why this join is made, and why it's an inner join> inner join JoinTable JT on ST.SourceTableID = JT.SourceTableID -- <Comment why this join is made, and why it's an left join> left join SecondJoinTable SJT on ST.SourceTableID = SJT.SourceTableID and JT.Column3 = SJT.Column4 where -- comment why this filter is applied ST.SourceTableID = X -- comment why this filter is applied and JT.ColumnName3 = ( select somecolumn from sometable ) ;
장점 : - 댓글은 코드를 읽을을하고 실수를 검출하는 필수적인 부분입니다. - 왼쪽 가입에 내부에서 변경할 때이 피합니다 실수 가입에 -filters "의"-all- 추가. - 줄 바꿈에 세미콜론을 배치하면 쉽게 추가 / 곳의 주석 절을 수 있습니다.
-
==============================
7.
SELECT a.col1 AS [Column1] ,b.col2 AS [Column2] ,c.col1 AS [Column3] FROM Table1 a INNER JOIN Table2 b ON b.Id = a.bId INNER JOIN Table3 c ON c.Id = a.cId WHERE a.col = X AND b.col = Y
용도 훨씬 더 여기에 많은 예제보다 더 라인,하지만 난 그게 이해하기 훨씬 쉽게 느낀다는, 열 / 절 / 테이블을 신속하게 제거 할 수 있습니다. 그것은 수직 중심의 모니터를 활용하는 데 도움이됩니다.
-
==============================
8.내가 그것을 통해 위의 쿼리를 넣어, 그래서 나는 C #에서 오픈 소스 SQL 포매터 (SQL-서버 전용이 단계에서)을 작성하는 작업입니다.
내가 그것을 통해 위의 쿼리를 넣어, 그래서 나는 C #에서 오픈 소스 SQL 포매터 (SQL-서버 전용이 단계에서)을 작성하는 작업입니다.
그것은 각각 '섹션은'그 아래에 들여 쓰기 하위 요소를 가지고 즉 것을, 영업에 비슷한 전략을 사용한다. 필요한 경우, 나는 원조 선명도에 섹션 사이에 공백을 추가 - 더 조인 또는 최소한의 조건이없는 경우이 추가되지 않습니다.
결과:
SELECT ST.ColumnName1, JT.ColumnName2, SJT.ColumnName3 FROM SourceTable ST INNER JOIN JoinTable JT ON JT.SourceTableID = ST.SourceTableID INNER JOIN SecondJoinTable SJT ON ST.SourceTableID = SJT.SourceTableID AND ST.SourceTable2ID = SJT.SourceTable2ID WHERE ST.SourceTableID = X AND JT.ColumnName3 = Y AND JT.Column3 = SJT.Column4 ORDER BY ST.ColumnName1
-
==============================
9.나는 심지어 예컨대, 더 몇 단계를 이동하지만, 당신과 비슷한 레이아웃을 사용하는 경향이 :
나는 심지어 예컨대, 더 몇 단계를 이동하지만, 당신과 비슷한 레이아웃을 사용하는 경향이 :
select ST.ColumnName1 , JT.ColumnName2 , SJT.ColumnName3 from SourceTable ST inner join JoinTable JT on JT.SourceTableID = ST.SourceTableID inner join SecondJoinTable SJT on ST.SourceTableID = SJT.SourceTableID where ST.SourceTableID = X and JT.ColumnName3 = Y and JT.Column3 = SJT.Column4
아마 처음에는 맨 위에 조금 보이지만, 이럴이 방법으로 도표화의 사용은 SQL의 선언적 성격 주어진 깨끗한, 가장 체계적인 레이아웃을 제공합니다.
당신은 아마 여기에 대한 답변의 모든 종류하게 될 겁니다. 결국, 그것은 개인 또는 팀 합의 된 환경 설정 아래입니다.
-
==============================
10.이 스레드에서 많은 좋은 점들이있다. 나는 각 열에 전에 같은 줄에 쉼표를 배치합니다 사용에 사람들을 설득하려고 시도되고 있다는 하나 개의 표준. 그래서 같이 :
이 스레드에서 많은 좋은 점들이있다. 나는 각 열에 전에 같은 줄에 쉼표를 배치합니다 사용에 사람들을 설득하려고 시도되고 있다는 하나 개의 표준. 그래서 같이 :
Select column1 ,column2 ,column3 ,column4 ,Column5 ...ect
반대:
Select column1, column2, column3, ect...
필요한 경우, 당신이 줄을 주석으로 처리 할 수 있으며,뿐만 아니라 주석되는 해당 쉼표의 계정에서 실행 할 때 쉼표 문제가있을 실 거예요 때문에 나는이 연습을 선호하는 이유입니다. 나는뿐만 아니라 이런 짓을했지만 정말 그것을 지적하지 않은 스레드에서 다른 사용자를 본 것을 알고있다. 대화하지만 내 두 센트에 가져다하지 거대한 계시. 감사
-
==============================
11.조인으로 나는 같은 줄에 ON 키워드를 넣어 것을 제외하고 당신과 비슷한 형식을 사용하고 난 그렇게 내 / 가입 선택 기준의 모든 줄 것을 정중하게 라인의 마지막에 넣어 AND 및 OR 연산자.
조인으로 나는 같은 줄에 ON 키워드를 넣어 것을 제외하고 당신과 비슷한 형식을 사용하고 난 그렇게 내 / 가입 선택 기준의 모든 줄 것을 정중하게 라인의 마지막에 넣어 AND 및 OR 연산자.
내 스타일 존 Sansom의 유사하지만, 내가 퍼팅에 대한 동의는 WHERE 절에 조건을 가입 할 수 있습니다. 나는 그것이 조직되어 쉽게 찾을 수 있도록이 조인 된 테이블과 함께해야한다고 생각합니다.
또한 짧은 문장, 나는 그냥 원래 줄에 괄호를 유지할 수 있지만, 그 위에 라인과 그 다음 줄에 들여 쓰기로 정렬 신규 라인에 괄호를 넣어하는 경향이있다. 예를 들면 :
SELECT my_column FROM My_Table WHERE my_id IN ( SELECT my_id FROM Some_Other_Table WHERE some_other_column IN (1, 4, 7) )
CASE 문, 나는 언제와 ELSE 각각의 새로운 라인 들여 쓰기를주고, 나는 CASE에 대한 최종 다시 정렬 :
CASE WHEN my_column = 1 THEN 'one' WHEN my_column = 2 THEN 'two' WHEN my_column = 3 THEN 'three' WHEN my_column = 4 THEN 'four' ELSE 'who knows' END
-
==============================
12.나는이 논쟁에 매우 늦게 오전 실현,하지만 난 내 생각을주고 싶습니다. 나는 라인의 시작 부분에 쉼표 찬성 확실히입니다. 당신이 아담 랄프 말처럼, 필드을 주석 쉽게하고 또한 그들이 처음에있을 때 이것은 큰 문제 같은 소리하지 않는 동안, 실수로 쉼표를 놓치고 더 어렵다 찾을 수 있습니다. 나는 (나는 확신 당신 중 일부는 아마뿐만 아니라 이런 짓을했는지) 나는 실수로 줄 끝에 쉼표를 놓친 긴 T-SQL 절차에서 실수 구문 오류를 추적하려고 과거의 시간을 보냈습니다 . 나는 가능한 한 많이 앨리어싱 찬성도 해요.
나는이 논쟁에 매우 늦게 오전 실현,하지만 난 내 생각을주고 싶습니다. 나는 라인의 시작 부분에 쉼표 찬성 확실히입니다. 당신이 아담 랄프 말처럼, 필드을 주석 쉽게하고 또한 그들이 처음에있을 때 이것은 큰 문제 같은 소리하지 않는 동안, 실수로 쉼표를 놓치고 더 어렵다 찾을 수 있습니다. 나는 (나는 확신 당신 중 일부는 아마뿐만 아니라 이런 짓을했는지) 나는 실수로 줄 끝에 쉼표를 놓친 긴 T-SQL 절차에서 실수 구문 오류를 추적하려고 과거의 시간을 보냈습니다 . 나는 가능한 한 많이 앨리어싱 찬성도 해요.
전반적으로, 그러나, 나는 그것이 일부는 다른 사람을 위해하지 않습니다에 대한 어떤 작품, 개인적인 취향에 대한 모든 다운 실현. 만큼 당신이 쉽게 코드와 각 개발자 프로그램 전반에 걸쳐 자신의 스타일로 일부 일관성을 읽을 수있는, 그게 가장 중요하다고 생각합니다.
-
==============================
13.이것은 내 개인 SQL 스타일 가이드입니다. 그것은 다른 사람의 몇 기반으로하지만 몇 주 문체의 기능을 가지고 있습니다 - 소문자 키워드, 아니없는 키워드 (예를 들어 외부, 내부, ASC), 그리고 "강".
이것은 내 개인 SQL 스타일 가이드입니다. 그것은 다른 사람의 몇 기반으로하지만 몇 주 문체의 기능을 가지고 있습니다 - 소문자 키워드, 아니없는 키워드 (예를 들어 외부, 내부, ASC), 그리고 "강".
예 SQL은 다음과 같습니다 :
-- basic select example select p.Name as ProductName , p.ProductNumber , pm.Name as ProductModelName , p.Color , p.ListPrice from Production.Product as p join Production.ProductModel as pm on p.ProductModelID = pm.ProductModelID where p.Color in ('Blue', 'Red') and p.ListPrice < 800.00 and pm.Name like '%frame%' order by p.Name -- basic insert example insert into Sales.Currency ( CurrencyCode ,Name ,ModifiedDate ) values ( 'XBT' ,'Bitcoin' ,getutcdate() ) -- basic update example update p set p.ListPrice = p.ListPrice * 1.05 , p.ModifiedDate = getutcdate() from Production.Product p where p.SellEndDate is null and p.SellStartDate is not null -- basic delete example delete cc from Sales.CreditCard cc where cc.ExpYear < '2003' and cc.ModifiedDate < dateadd(year, -1, getutcdate())
-
==============================
14.아직 아무도 완료 공통 테이블 식 (CTE를). 아래는 제가 사용하는 몇 가지 다른 스타일과 함께 그것을 통합 :
아직 아무도 완료 공통 테이블 식 (CTE를). 아래는 제가 사용하는 몇 가지 다른 스타일과 함께 그것을 통합 :
declare @tableVariable table ( colA1 int, colA2 int, colB1 int, colB2 nvarchar(255), colB3 nvarchar(255), colB4 int, colB5 bit, computed int ); with getSomeData as ( select st.colA1, sot.colA2 from someTable st inner join someOtherTable sot on st.key = sot.key ), getSomeOtherData as ( select colB1, colB2, colB3, colB4, colB5, computed = case when colB5 = 1 then 'here' when colB5 = 2 then 'there' end from aThirdTable tt inner hash join aFourthTable ft on tt.key1 = ft.key2 and tt.key2 = ft.key2 and tt.key3 = ft.key3 ) insert @tableVariable ( colA1, colA2, colA2, colB1, colB2, colB3, colB4, colB5, computed ) select colA1, colA2, colB1, colB2, colB3, colB4, colB5, computed from getSomeData data1 join getSomeOtherData data2
열팽창 계수 형식에 몇 가지 포인트 :
이 시뮬레이션합니다 :
func getSomeData() { select st.colA1, sot.colA2 from someTable st inner join someOtherTable sot on st.key = sot.key }
열팽창 계수 형식 외에 몇 가지 포인트 :
나는 좀 더 다른 지역에 비해 내 CTE 스타일에 정착하고 있음을 찾을 수 있습니다. 문제 제기 것과 더 유사 스타일로 실험하지 않았습니다. 아마 언젠가을하고 내가 좋아하는 방법을 볼 수 있습니다. 아마 그것을 가지고 재미 저주 비록, 그것은 선택의 환경에있을 저주하고있다.
-
==============================
15.이미 작성된 T-SQL를 변경하고있는 경우 (있는 경우), 그때는 이미 사용 규칙을 따릅니다.
이미 작성된 T-SQL를 변경하고있는 경우 (있는 경우), 그때는 이미 사용 규칙을 따릅니다.
나는 처음부터 쓰고 또는 어떤 규칙이없는 경우 나 키워드에 대한 대문자 (읽기 쉽 단지 개인적인 취향)를 사용하는 것을 선호 제외하고, 그때, 국제 대회 질문에 주어진 팔로우하는 경향이있다.
나는 SQL은 다른 코드 형식의 규칙과 같은 포맷으로 생각하는, 중요한 점은 규칙을 가지고있다, 아니 그 규칙이 무엇인지 (물론 상식의 영역 내에서!)
-
==============================
16.그래 좀 rigourously 정의 된 방식으로 SQL을 레이아웃의 가치, 그러나 확실하게 이름 지정 규칙을 볼 수 있고 의도가 훨씬 더 중요하다. 10 배 더 중요처럼.
그래 좀 rigourously 정의 된 방식으로 SQL을 레이아웃의 가치, 그러나 확실하게 이름 지정 규칙을 볼 수 있고 의도가 훨씬 더 중요하다. 10 배 더 중요처럼.
우리가 그들에게있는 거 테이블과 SP의 알 - 내 애완 동물 혐오가 SP는 접두사 TBL 접두사 테이블 및 저장 프로 시저 것을 기준으로합니다. DB 객체의 명명은 얼마나 많은 공백이보다 훨씬 더 중요하다
그냥 내 $ 0.02 worths
-
==============================
17.나는 SSMS에서 레드 게이트 SQL 리팩토링을 사용하지만, reformating (및 SSMS를 대체) 않는 다른 도구는 에이펙스의 SQL 편집이다. 당신이 게시물에 코드를 찾고 있다면 온라인 간단한 대화를 SQL Prettifier이 있습니다.
나는 SSMS에서 레드 게이트 SQL 리팩토링을 사용하지만, reformating (및 SSMS를 대체) 않는 다른 도구는 에이펙스의 SQL 편집이다. 당신이 게시물에 코드를 찾고 있다면 온라인 간단한 대화를 SQL Prettifier이 있습니다.
-
==============================
18.내가 좋아하는 :
내가 좋아하는 :
SELECT ST.ColumnName1, JT.ColumnName2, SJT.ColumnName3 --leave all selected columns on the same line FROM SourceTable ST INNER JOIN JoinTable JT ON JT.SourceTableID = ST.SourceTableID INNER JOIN SecondJoinTable SJT --only splitting lines when more than 1 condition ON ST.SourceTableID = SJT.SourceTableID AND JT.Column3 = SJT.Column4 WHERE ST.SourceTableID = X and JT.ColumnName3 = Y
작은보기 영역에 더 많은 코드를 얻을 수 있습니다. 또한 키워드는 대문자로해야한다고 생각
-
==============================
19.서로 다른 의견의 수는 무섭다. 이것은 내 조직에서 사용하는 것입니다 :
서로 다른 의견의 수는 무섭다. 이것은 내 조직에서 사용하는 것입니다 :
SELECT ST.ColumnName1, JT.ColumnName2, SJT.ColumnName3 FROM SourceTable ST INNER JOIN JoinTable JT ON JT.SourceTableID = ST.SourceTableID INNER JOIN SecondJoinTable SJT ON ST.SourceTableID = SJT.SourceTableID AND JT.Column3 = SJT.Column4 WHERE ST.SourceTableID = X AND JT.ColumnName3 = Y
8 글자 들여 쓰기를 유지하는 것은 가독성 이럴 열쇠입니다.
-
==============================
20.나는 당신의 프로젝트 내에서 일반적으로 서식 SQL을 표준화하기위한 당신의 노력으로 전체 진심으로 동의합니다.
나는 당신의 프로젝트 내에서 일반적으로 서식 SQL을 표준화하기위한 당신의 노력으로 전체 진심으로 동의합니다.
나는 또한 매우 당신의 서식 선택에 동의합니다. 나는 또한 '참여'문을 들여 저장, 거의 같은 일을 마련, 그리고 그들에게 하나 개 더 들여 쓰기 문 '에'.
당신 그 소리 쳤다 OUT이다 싶어 - 아주 많은 키워드에 소문자 가고 있다는 사실있다. 가독성 만든다 - 나는 또한 사례 테이블 별칭을 절감하는 것을 선호
대단히 작은 들여 쓰기 (4)를 사용한다는 사실있다. 나는 (3)과 함께 할 것입니다.
I는 용어 "내적"를 다음과 같은 '외부'불필요한 닉스.
다음은 SELECT 문을 포맷했을 방법입니다
select st.ColumnName1, jt.ColumnName2, sjt.ColumnName3 from SourceTable st join JoinTable jt on jt.SourceTableID = st.SourceTableID join SecondJoinTable sjt on st.SourceTableID = sjt.SourceTableID and jt.Column3 = sjt.Column4 where st.SourceTableID = X and jt.ColumnName3 = Y ;
이 논의 주셔서 감사합니다.
-
==============================
21.이것은 내가 사용하는 형식입니다. 의견은 더 나은 만들 수 있습니다하십시오.
이것은 내가 사용하는 형식입니다. 의견은 더 나은 만들 수 있습니다하십시오.
CREATE PROCEDURE [dbo].[USP_GetAllPostBookmarksByUserId] @id INT, @startIndex INT, @endIndex INT AS BEGIN SET NOCOUNT ON SELECT * FROM ( SELECT ROW_NUMBER() OVER ( ORDER BY P.created_date ) AS row_num, P.post_id, P.title, P.points, p.estimated_read_time, P.view_count, COUNT(1) AS "total_attempts" -- todo FROM [dbo].[BOOKMARKED] B INNER JOIN [dbo].[POST] P ON B.entity_id = P.post_id INNER JOIN [dbo].[ATTEMPTED] A ON A.entity_id = P.post_id WHERE B.user_id = 1 AND P.is_active = 1 GROUP BY P.post_id, P.title, P.points, p.estimated_read_time, P.view_count ) AS PaginatedResult WHERE row_num >= @startIndex AND row_num < @endIndex ORDER BY row_num END
-
==============================
22.내 대답 11:05에 2월 6일 '09 대답 존 Sansom에 의해 허용 대답과 유사합니다. 레드 게이트에서 프롬프트 SQL와 그의 대답에 반대하지만, 나는 ++ 메모장에서 SQLInForm 플러그인을 사용하여 몇 가지 서식 옵션을 시연 할 예정이다.
내 대답 11:05에 2월 6일 '09 대답 존 Sansom에 의해 허용 대답과 유사합니다. 레드 게이트에서 프롬프트 SQL와 그의 대답에 반대하지만, 나는 ++ 메모장에서 SQLInForm 플러그인을 사용하여 몇 가지 서식 옵션을 시연 할 예정이다.
SQLInForm 플러그인은 설치 할 수있는 5 개 가지 프로파일을 가지고있다. 프로파일 내에서 무료 및 유료 버전 모두에서 사용할 수있는 설정 많이 있습니다. 완전한 목록은 아래에 당신은 온라인으로 플러그인 - 도움말 - 일반 옵션 페이지를 볼 수 있습니다.
대신 내 환경 설정에 대해 두서의 나는 SQLInForm 옵션을 사용할 제시하는 것이 유용 할 것이다 고려했다. 내 환경 설정 중 일부는 아래에 설명되어 있습니다. 내 게시물의 끝에서 포맷 된 SQL 코드가 원래의 게시물에 사용되는 (원본 VS는 VS의 format2를 포맷 1).
나는 몇 가지의 소수 것 같다 here-- 다른 답변을 통해 읽기. 주요 쉼표 (여기에 짧은 비디오)와 같은 내가 - IMO, 새로운 필드가 선택 될 때 훨씬 더 쉽게 읽을 수 있습니다. 또한 나는 LINEBREAK로하지 옆에 SELECT 내 열 1을 좋아합니다.
다음은 SELECT 문을 고려 내 환경 설정 노트의 일부에 대한 개요입니다. 나는 모든 (13 개) 섹션의 스크린 샷을 추가합니다; 하지만 그 스크린 샷을 많이하고 난 그냥 형식 컨트롤을 스크린 샷을 걸릴 무료 edition-- 당신을 격려하고, 테스트 것입니다. 나는 곧 프로 버전을 테스트 할 것입니다; 정말 도움이되고 단지 $ 20가 될 것 같은하지만 옵션에 따라이 보인다.
원래 쿼리 형식입니다.
select ST.ColumnName1, JT.ColumnName2, SJT.ColumnName3 from SourceTable ST inner join JoinTable JT on JT.SourceTableID = ST.SourceTableID inner join SecondJoinTable SJT on ST.SourceTableID = SJT.SourceTableID and JT.Column3 = SJT.Column4 where ST.SourceTableID = X and JT.ColumnName3 = Y
희망 전환 FORMAT (옵션 # 1 : 더 LINEBREAK 가입 없음)
SELECT ST.ColumnName1 , JT.ColumnName2 , SJT.ColumnName3 FROM SourceTable ST inner join JoinTable JT on JT.SourceTableID = ST.SourceTableID inner join SecondJoinTable SJT on ST.SourceTableID = SJT.SourceTableID and JT.Column3 = SJT.Column4 WHERE ST.SourceTableID = X and JT.ColumnName3 = Y
희망 전환 FORMAT (옵션 # 2 : LINEBREAK에 가입)
SELECT ST.ColumnName1 , JT.ColumnName2 , SJT.ColumnName3 FROM SourceTable ST inner join JoinTable JT on JT.SourceTableID = ST.SourceTableID inner join SecondJoinTable SJT on ST.SourceTableID = SJT.SourceTableID and JT.Column3 = SJT.Column4 WHERE ST.SourceTableID = X and JT.ColumnName3 = Y
도움이 되었기를 바랍니다.
-
==============================
23.내 SQL 같은 그래도 한 의도가 쉽게 읽을 수있는 한, 대부분의 모든 형식이 작동합니다, 그래서 같은 형식합니다. 나는 정말 방법이 있음을 왼쪽으로 다음 쿼리 디자이너에서 생성 문을보고 싫어. 나는 등 다른 사람 절차 /보기 / 기능 / 트리거를 편집하고, 내가 (정말 나쁜 않는 한, 나는이 모든 일을 포맷합니다)에 이미 사용 된 서식을 유지하려고합니다.
내 SQL 같은 그래도 한 의도가 쉽게 읽을 수있는 한, 대부분의 모든 형식이 작동합니다, 그래서 같은 형식합니다. 나는 정말 방법이 있음을 왼쪽으로 다음 쿼리 디자이너에서 생성 문을보고 싫어. 나는 등 다른 사람 절차 /보기 / 기능 / 트리거를 편집하고, 내가 (정말 나쁜 않는 한, 나는이 모든 일을 포맷합니다)에 이미 사용 된 서식을 유지하려고합니다.
Select 문
SELECT ST.ColumnName1, JT.ColumnName2, SJT.ColumnName3 FROM SourceTable ST INNER JOIN JoinTable JT ON JT.SourceTableID = ST.SourceTableID INNER JOIN SecondJoinTable SJT ON ST.SourceTableID = SJT.SourceTableID AND JT.Column3 = SJT.Column4 WHERE (ST.SourceTableID = X) AND (JT.ColumnName3 = Y);
UPDATE 문
UPDATE TargetTable SET ColumnName1 = @value, ColumnName2 = @value2 WHERE (Condition1 = @test);
삽입 문
INSERT INTO TargetTable ( ColumnName1, ColumnName2, ColumnName3 ) values ( @value1, @value2, @value3 );
-
==============================
24.난 당신이 쉽게 파악하고 수정 버그 수 있기 때문에 서식 좋은을 가진 규칙이 정말 중요하다고 생각합니다. 그것의 말처럼 - 항상 좋은 서식에 약간의 시간을 보낼 수 있도록, "넌 코드를 작성 한 번,이 코드는 10000000 번으로 읽습니다." 주요 목표는 :
난 당신이 쉽게 파악하고 수정 버그 수 있기 때문에 서식 좋은을 가진 규칙이 정말 중요하다고 생각합니다. 그것의 말처럼 - 항상 좋은 서식에 약간의 시간을 보낼 수 있도록, "넌 코드를 작성 한 번,이 코드는 10000000 번으로 읽습니다." 주요 목표는 :
일부 규칙은 항상 사용
예를 들어, 여기에 내가이 문제의 예제로 사용 쿼리의 형식을 줄 방법 :
select ST.ColumnName1, JT.ColumnName2, SJT.ColumnName3 from <schema>.SourceTable as ST inner join <schema>.JoinTable as JT on ST.SourceTableID = JT.SourceTableID inner join <schema>.SecondJoinTable as SJT on SJT.SourceTableID = ST.SourceTableID and SJT.Column4 = JT.Column3 where ST.SourceTableID = X and JT.ColumnName3 = Y
그리고 "학생"쿼리 :
select term, student_id, case when (ft_credits > 0 and credits >= ft_credits) or (ft_hours_per_week > 3 and hours_per_week >= ft_hours_per_week) then 'F' else 'P' end as [status] from ( select a.term, a.student_id, pm.credits as ft_credits, pm.[hours] as ft_hours_per_week, sum(a.credits) as credits, sum(a.hours_per_week) as hours_per_week from ( select e.term, e.student_id, NVL(o.credits, 0) credits, case when NVL(o.weeks, 0) > 5 then (NVL(o.lect_hours, 0) + NVL(o.lab_hours, 0) + NVL(o.ext_hours, 0)) / NVL(o.weeks, 0) else 0 end as hours_per_week from enrollment as e inner join offering as o using (term, offering_id) inner join program_enrollment as pe on pe.student_id = e.student_id and pe.term = e.term and pe.offering_id = e.offering_id where e.registration_code Not in ('A7', 'D0', 'WL') ) as a inner join student_history as sh using (student_id) inner join program_major as pm on pm._major_code = sh.major_code_1 and pm.division_code = sh.division_code_1 where sh.eff_term = ( select max(eff_term) from student_history as shi where shi.student_id = sh.student_id and shi.eff_term <= term ) group by a.term, a.student_id, pm.credits, pm.[hours] ) as a order by term, student_id
-
==============================
25.나의 선호하는 스타일 :
나의 선호하는 스타일 :
SELECT ST.ColumnName1, JT.ColumnName2, SJT.ColumnName3 FROM SourceTable ST INNER JOIN JoinTable JT ON JT.SourceTableID = ST.SourceTableID INNER JOIN SecondJoinTable SJT ON ST.SourceTableID = SJT.SourceTableID WHERE ST.SourceTableID = X AND JT.ColumnName3 = Y AND JT.Column3 = SJT.Column4
-
==============================
26.
SELECT st.ColumnName1 ,jt.ColumnName2 ,sjt.ColumnName3 FROM SourceTable st JOIN JoinTable jt ON jt.SourceTableID = st.SourceTableID JOIN SecondJoinTable sjt ON SstT.SourceTableID = sjt.SourceTableID AND jt.Column3 = sjt.Column4 WHERE st.SourceTableID = X AND jt.ColumnName3 = Y
나는 액션 단어를 모두 대문자를 사용하여 조인 절, 그들은 더 눈에 띄는. INNER이 INNER이 기입 할 필요가 없습니다 있도록 가입으로 가입 쓰기 OUTER은 JOIN 또는 당신이 그것을 필요로 할 때 왼쪽 가입, 그것은 가정한다 동일합니다. 나는 또한 내 별명에 대한 lowere 케이스를 사용합니다. 전면 원인 밖으로 공통 당신은 마지막 열 위 쉼표로 붙어 쿼리가 실패를 주석 처리합니다.
-
==============================
27.여기에 백 답변 이미,하지만 훨씬 toing 후 수년에 걸쳐 froing, 이것은 내가에 정착 한 것입니다 :
여기에 백 답변 이미,하지만 훨씬 toing 후 수년에 걸쳐 froing, 이것은 내가에 정착 한 것입니다 :
SELECT ST.ColumnName1 , JT.ColumnName2 , SJT.ColumnName3 FROM SourceTable ST JOIN JoinTable JT ON JT.SourceTableID = ST.SourceTableID JOIN SecondJoinTable SJT ON ST.SourceTableID = SJT.SourceTableID AND JT.Column3 = SJT.Column4 WHERE ST.SourceTableID = X AND JT.ColumnName3 = Y
나는 하나의 여분의 표는 코드의 재 들여 쓰기 많은 라인에 저를 일으킬 수 있기 때문에이 지저분 차이점에 대해 할 수 있습니다 알고 있지만처럼 읽기의 내 용이합니다.
-
==============================
28.안하는 것보다 늦게하는 것이 낫다. 나는 다른 스타일을 사용하고 내가 함께 작업에 사용되는 아주 좋은 SQL 개발자에서을 채택했다. I 오른쪽 정렬 키워드와 I는 입력의 편의를 위해 대문자 문자를 사용하지 마십시오. 키워드 에디터에 의해 강조되고 당신이 키워드 강조 기능을 지원하지 않습니다 텍스트 편집기에서 편집을 많이하지 않는 한 그들을 대문자로 위해 내가 필요 표시되지 않습니다. 나는 소형, 오히려 더 읽기와 가능한 한 수직으로 정렬 만들려고하지 않습니다. 여기가 내 형식으로 작성 @BenLaan 답에서 가져온 선택의 예입니다 :
안하는 것보다 늦게하는 것이 낫다. 나는 다른 스타일을 사용하고 내가 함께 작업에 사용되는 아주 좋은 SQL 개발자에서을 채택했다. I 오른쪽 정렬 키워드와 I는 입력의 편의를 위해 대문자 문자를 사용하지 마십시오. 키워드 에디터에 의해 강조되고 당신이 키워드 강조 기능을 지원하지 않습니다 텍스트 편집기에서 편집을 많이하지 않는 한 그들을 대문자로 위해 내가 필요 표시되지 않습니다. 나는 소형, 오히려 더 읽기와 가능한 한 수직으로 정렬 만들려고하지 않습니다. 여기가 내 형식으로 작성 @BenLaan 답에서 가져온 선택의 예입니다 :
select st.ColumnName1 , jt.ColumnName2 , sjt.ColumnName3 from SourceTable st inner join JoinTable jt on jt.SourceTableID = st.SourceTableID inner join SecondJoinTable sjt on st.SourceTableID = sjt.SourceTableID and st.SourceTable2ID = sjt.SourceTable2ID where st.SourceTableID = X and jt.ColumnName3 = Y and jt.Column3 = sjt.Column4 order by st.ColumnName1
같은 서식 패턴을 따르는 모든 팀을 준수하기 위해 노력하는 것은 어려운 일이다. 다른 사람들이 같은 방식을 따른다면 나는 어떤 형식을 따를 것입니다,하지만 같은 이야기 적이있다.
최신 정보: 이전 글에서 언급 한 복잡한 쿼리 중 하나를 다시 쓰기 :
select term , student_id , case when((ft_credits > 0 and credits >= ft_credits) or (ft_hours_per_week > 3 and hours_per_week >= ft_hours_per_week)) then 'F' else 'P' end as status from (select term , student_id , pm.credits AS ft_credits , pm.hours AS ft_hours_per_week , SUM(credits) AS credits , SUM(hours_per_week) AS hours_per_week from (select e.term , e.student_id , nvl(o.credits, 0) credits , case when nvl(o.weeks, 0) > 5 then (nvl(o.lect_hours, 0) + nvl(o.lab_hours, 0) + nvl(o.ext_hours, 0)) / nvl(o.weeks, 0) else 0 end as hours_per_week from enrollment as e inner join offering as o using (term, offering_id) inner join program_enrollment as pe on e.student_id = pe.student_id and e.term = pe.term and e.offering_id = pe.offering_id where e.registration_code not in ('A7', 'D0', 'WL') ) inner join student_history as sh using (student_id) inner join program_major as pm on sh.major_code_1 = pm._major_code and sh.division_code_1 = pm.division_code where sh.eff_term = (select max(eff_term) from student_history as shi where sh.student_id = shi.student_id and shi.eff_term <= term) group by term, student_id, pm.credits, pm.hours ) order by term, student_id
-
==============================
29.그것은 단지 800 × 600을 지원하는 모니터에서 계속 일을 당신의 대부분을 나타납니다. 나는 오른쪽으로 모든 공간을 사용할 수 있도록 내 모니터는 1920 × 1080 할 것입니다.
그것은 단지 800 × 600을 지원하는 모니터에서 계속 일을 당신의 대부분을 나타납니다. 나는 오른쪽으로 모든 공간을 사용할 수 있도록 내 모니터는 1920 × 1080 할 것입니다.
이건 어때요:
select col1, col2, col3 , case when x = 1 then 'answer1' else 'answer2' end , col4, col5, col6, col7 from table1 t1 inner join table2 t2 on t1.col1 = t2.col1 and t1.col2 and t2.col2 where t1.col5 = 19 and t1.col7 = 'Bill Gates'
from https://stackoverflow.com/questions/519876/sql-formatting-standards by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL은 같은 테이블에 여러 열 조인 (0) | 2020.06.22 |
---|---|
[SQL] SQL Server에서 삭제 최적화 (0) | 2020.06.22 |
[SQL] 임의의 순서로 반환 행 [중복] (0) | 2020.06.22 |
[SQL] PostgreSQL의 : INSERT INTO ... (SELECT * ...) (0) | 2020.06.22 |
[SQL] 가입과 WHERE 쿼리를 필터링의 차이? (0) | 2020.06.22 |