SQL 표준 가이드
Copyright ⓒ KNU & PLAYTOGETHER Co., Ltd. 플레이투게더 및 강원대학교의 사전 승인 없이 본 내용의 전부 또는 일부에 대한 복사, 배포 및 사용을 금합니다.
개정 사항
목 차 2.1. SQL 명명규칙(Naming Convention) 2.1.5. 서술적인 접두어(prefix)의 사용 자제 2.2. SQL 코딩규칙(Coding Convention) 3.1.5. SQL Stored Procedure의 사용 권장 4.1. DDL(Data Definition Language) 작성 지침 4.1.1. Default 값은 데이터 타입과 일치하는 값을 사용 4.1.2. Data Type 중 문자 타입은 일관성을 유지 4.1.3. 테이블 생성시 주키(Primary Key)를 가장 위에 배치 4.1.4. 컬럼을 논리적인 순서로 배열 및 논리적인 그룹 지정 4.1.6. 수치형 컬럼은 범위 제약사항을 두도록 고려 4.1.7. 실수형 타입(REAL, FLOAT 등)은 사용 자제 4.1.9. 속성(Attribute)을 쪼개거나 합하지 말 것 4.2. DML(Data Manipulation Language) 작성 지침 5.2.2. 보안성을 높이려면 뷰(View)을 사용할 것 5.2.3. 데이터에 대한 검증을 위해서 뷰(View)을 사용할 것 5.2.4. 사용자의 요구로 인한 복잡성을 줄이기 위해 뷰(View)을 사용 5.2.5. 2차 데이터를 도출할 때 뷰(View)을 사용하면 도움이 된다. 5.2.6. 테이블의 컬럼명이 복잡하거나 어려울 때 뷰(View)을 사용할 것 5.2.7. 복잡한 제약사항을 단순화하기 위해 뷰(View)을 사용할 것 5.2.8. 뷰를 생성하려면 그에 합당한 이유가 있어야 한다.
1. 개요본 가이드는 강원대학교의 SQL 작성 표준 가이드입니다. 본 문서에서는 개발 단계에서 개발표준과 최적화에 고려해야 할 사항에 초점을 맞추어 내용을 기술 하였습니다. 기준이 되는 데이터베이스는 오라클(Oracle)로 제한하였으나 명명규칙등 일반적인 사항은 데이터베이스 시스템에 종속되지 않으므로 본 가이드를 적용할 수 있습니다. 본 문서는 아래와 같은 구조로 되어 있습니다. · SQL 공통 표준 o SQL 명명규칙(Naming Convention) o SQL 코딩규칙(Coding Convention) · SQL 작성 표준 o SQL 작성시 기본 지침 o SQL 작성시 기본 절차 · SQL 작성 지침 o SQL 작성지침 - DDL(Data Definition Language) o SQL 작성지침 - DML(Data Manipulation Language) · SQL 사용 지침 o 인덱스(Index) 사용하기 o 뷰(View) 사용하기 2. SQL 공통 표준2.1. SQL 명명규칙(Naming Convention)2.1.1. ID 길이· 원칙
· 설명
2.1.2. ID 구성문자· 원칙
· 설명
2.1.3. 대소문자 사용규칙· 원칙
· 설명
2.1.4. 국제 명명규칙 표준 준수· 원칙
· 설명
2.1.5. 서술적인 접두어(prefix)의 사용 자제서술적인 접두어(prefix)는 SQL문을 읽거나 분석할 때 도움이 되지 않는 경우가 많으며 오히려 그 반대의 경우가 더 많다. · 원칙
· 설명
2.1.6. 표준 접미어(postfix)를 지정ID의 주체가 되는 오브젝트의 형식을 나타내는 접두어(prefix) 대신 해당 오브젝트의 속성을 나타내는 접미어(postfix)을 지정하여 사용하는 것이 낫다. (데이터베이스 명명규칙 참조) 2.1.7. 테이블, 뷰(view)의 이름· 원칙
2.1.8. 별칭(alias)
2.1.9. 관계성이 함축된 이름
2.1.10. 메타데이터 성격을 가진 이름
2.1.11. 데이터 요소 명명 시 피해야 할 사항
2.1.12. 대소문자 사용
2.2. SQL 코딩규칙(Coding Convention)여기서는 SQL 코딩 시 가독성 향상을 위해 지켜야 할 문자, 문장의 배치 등 외형을 중심으로 기술하였습니다. 2.2.1. 공백(space)사용
2.2.2. 줄 간격
2.2.3. 들여쓰기(indentation)
2.2.4. 일반적인 마침법의 준수
2.2.5. 예약어(Reserved Word) 사용
2.2.6. SQL 수직 배치SQL문장이 여러 줄에 걸쳐 기술되어 있을 경우, 좌우로 지그재그형태로 생긴 모양은 최대한 배제하고, 다음을 원칙으로 한다.
2.2.7. 주석(comment) 사용
3. SQL 작성 표준3.1. SQL 작성시 기본적인 지침3.1.1. 표준기능의 사용
3.1.1.1. OUTER JOIN 표기법 (권장)
3.1.1.2. ISO표준 기간 표기법
3.1.2. 간결한 표기법을 사용3.1.2.1. 필요 없는 괄호의 사용다음과 같이 불필요한 괄호는 사용하지 않는 것이 좋다.
3.1.2.2. CASE 문 사용시 주의 사항
3.1.2.3. 불필요한 비교문다음과 같이 불필요한 비교문은 사용하지 않는다.
3.1.2.4. 수식을 간소화하여 사용
3.1.3. 주석 사용시 주의사항
3.1.4. 옵티마이저用 힌트(Hint)의 사용자제
3.1.5. SQL Stored Procedure의 사용 권장
3.1.6. UNION은 사용 자제아직도 대부분 옵티마이저는 UNION을 최적화하는데 어려움을 겪고 있다. 따라서 가능하다면 UNION ALL 만을 사용하고 나머지는 사용하지 않는 것이 좋다. 3.1.7. 정렬과 관련된 SQL문의 남용 금지다음과 같이 Sort 가 발생하는 SQL 문은 최대한 자제한다.
3.1.8. WHERE 절에 긍정적 조건의 사용
3.2. SQL 작성시 기본적인 절차3.2.1. SQL 테스트
3.2.2. SQL 수행비용 검증
3.2.3. OLAP 성격의 업무 개발시 주의사항OLTP 성격의 업무에서 아래와 같은 SQL 문에 대해서는 반드시 해당 SQL문의 개선 작업을 수행한다.
4. SQL 작성 지침4.1. DDL(Data Definition Language) 작성 지침4.1.1. Default 값은 데이터 타입과 일치하는 값을 사용당연한 말이지만, 의외로 많은 개발자가 이 원칙을 지키지 않는다. 예를 들면
4.1.2. Data Type 중 문자 타입은 일관성을 유지
4.1.3. 테이블 생성시 주키(Primary Key)를 가장 위에 배치가독성을 높이기 위해 키에 해당되는 속성은 가장 위에 위치시키는 것이 좋다. 왜냐하면 키라는 의미 자체가 해당 엔터티의 대표값을 나타내기 때문이다. 4.1.4. 컬럼을 논리적인 순서로 배열 및 논리적인 그룹 지정단, 스키마가 완성된 이후에 컬럼을 추가할 때 성능에 영향을 미치는지 고려해야 하는데,다음 순서대로 컬럼을 배치하면 성능에 도움이 된다.
4.1.5. 제약조건 이름은 명확하게 기술제약조건은 ”CONSTRAINT <name>” 형태로 기술하는데, 제약조건 명을 기술하지 않으면 에러 상황이 발생하였을 때 시스템에서 정한 임의의 이름으로 에러메시지가 발생하므로 오류를 찾기 어렵게 되므로 제약조건의 이름은 명확하게 기술한다. 단, PRIMARY KEYS, UNIQUE, FOREIGN KEY 제약 조건에 대한 이름은 생략한다. 4.1.6. 수치형 컬럼은 범위 제약사항을 두도록 고려데이터베이스는 기업에서 유일하게 신뢰할 수 있는 “저장소”이므로, 비즈니스 룰을 강제할 수 있는 방편으로 제약사항을 두게 된다. 대개는 테이블의 필드가 0(zero)보다 크도록 제약사항을 두는 경우가 많다.
4.1.7. 실수형 타입(REAL, FLOAT 등)은 사용 자제하드웨어나 OS, DBMS등에 따라 실수가 표현할 수 있는 정확도, 의미 등이 달라질 수 있으므로 과학적 수치 또는 통계 값 외에는 REAL, FLOAT 대신 DECIMAL 타입을 사용하는 것이 좋다. 4.1.8. 가능하면 모든 테이블이 키를 갖도록 설계키와 관련하여 주의할 사항은 아래와 같다.
4.1.9. 속성(Attribute)을 쪼개거나 합하지 말 것속성을 쪼개거나 뭉치는 나쁜 사례로 아래와 같은 것이 대표적이다.
4.2. DML(Data Manipulation Language) 작성 지침4.2.1. NULL 사용 지침
4.2.2. IN 사용 지침
4.2.3. MIN, MAX 사용 지침
4.2.4. UNION, UNION ALL 사용 지침
4.2.5. MINU 함수의 활용
4.2.6. OR 사용시 주의사항
4.2.7. 부정형 사용 금지 원칙
4.2.8. NVL 활용 원칙
4.2.9. OUTER JOIN 활용 방안
5. SQL 사용 지침5.1. 인덱스(Index) 사용5.1.1. 인덱스 사용지침
5.1.2. 인덱스 적용 원칙5.1.2.1. 인덱스 컬럼은 원형 그대로 사용할 것인덱스 컬럼은 비교되기 전에 변형이 일어나면 인덱스가 사용되지 않기 때문에 되도록이면 WHERE절에서 인덱스 컬럼을 원형 그대로 사용하는 것이 바람직하다.
5.1.2.2. 인덱스 사용시 부정형을 사용 금지인덱스 컬럼을 부정형(NOT, <>)으로 비교할 때도 인덱스가 사용되지 않는다.
5.1.2.3. 인덱스 컬럼을 NULL과 비교 금지인덱스 컬럼을 NULL과 비교하여도 해당 인덱스가 사용되지 않는다.
5.2. 뷰(View) 사용5.2.1. 뷰(View) 명명법뷰의 명명법은 기본적으로 테이블에 대한 명명법과 동일하다. 다만 뷰의 이름을 'vw’ 또는 'v’로 시작하는 것은 피하는 것이 좋다. 이유는 다음과 같다.
5.2.2. 보안성을 높이려면 뷰(View)을 사용할 것5.2.3. 데이터에 대한 검증을 위해서 뷰(View)을 사용할 것5.2.4. 사용자의 요구로 인한 복잡성을 줄이기 위해 뷰(View)을 사용사용자 또는 SQL 초보프로그래머를 위해 복잡한 SQL조회 결과를 뷰(View)로 미리 만들어 놓으면 추후 작업할 때 일을 대폭 줄여줄 수 있다 5.2.5. 2차 데이터를 도출할 때 뷰(View)을 사용하면 도움이 된다.기존 테이블의 데이터를 근간으로 2차 데이터를 도출하여 사용할 때 뷰를 정의하여 사용하면 프로그래머의 부담이 줄어든다. 5.2.6. 테이블의 컬럼명이 복잡하거나 어려울 때 뷰(View)을 사용할 것테이블의 컬럼명이 복잡하고 애매할 경우 간결한 컬럼명을 가지는 뷰를 생성하면 기존 컬럼명을 수정하지 않고도 동일한 효과를 얻을 수 있다. 5.2.7. 복잡한 제약사항을 단순화하기 위해 뷰(View)을 사용할 것DBMS 마다 테이블에 대한 복잡한 제약사항을 지원하는데 한계가 있으며, 이 한계는 DBMS마다 다르다. 이를 극복하기 위하여 뷰(View)을 사용하면 큰 도움이 된다. 5.2.8. 뷰를 생성하려면 그에 합당한 이유가 있어야 한다.5.2.9. 뷰를 남용하지 말 것 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
'DBMS/Oracle'에 해당되는 글 4건
- 2013.07.25 SQL 표준 가이드(스압)
- 2013.07.25 로또
- 2013.07.25 달력
- 2013.07.25 구구단
2013. 7. 25. 17:05
2013. 7. 25. 17:01
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | SELECT CHR(64+P) P , MIN (DECODE (rnum, 1, lottono)) AS N1 , MIN (DECODE (rnum, 2, lottono)) AS N2 , MIN (DECODE (rnum, 3, lottono)) AS N3 , MIN (DECODE (rnum, 4, lottono)) AS N4 , MIN (DECODE (rnum, 5, lottono)) AS N5 , MIN (DECODE (rnum, 6, lottono)) AS N6 FROM ( SELECT P, lottono , ROW_NUMBER() OVER(PARTITION BY P ORDER BY DBMS_RANDOM.VALUE) rnum FROM ( SELECT LEVEL AS P FROM dual CONNECT BY LEVEL <= 5) , ( SELECT LEVEL AS lottono FROM dual CONNECT BY LEVEL <= 45)) WHERE rnum <= 7 GROUP BY P ORDER BY P; P N1 N2 N3 N4 N5 N6 - -- -- -- -- -- -- A 28 1 36 37 24 17 B 26 19 3 41 45 13 C 34 21 37 24 41 38 D 20 15 39 3 32 25 E 15 36 38 45 10 40 P N1 N2 N3 N4 N5 N6 - -- -- -- -- -- -- A 41 20 33 11 13 7 B 3 9 14 32 2 26 C 37 24 13 12 15 40 D 15 35 12 32 41 40 E 24 3 11 35 42 22 |
'DBMS > Oracle' 카테고리의 다른 글
SQL 표준 가이드(스압) (0) | 2013.07.25 |
---|---|
달력 (0) | 2013.07.25 |
구구단 (0) | 2013.07.25 |
2013. 7. 25. 17:00
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | SELECT * FROM ( SELECT MIN (DECODE(TO_CHAR(YM + LEVEL - 1, 'd' ), '1' , LEVEL )) AS SUN , MIN (DECODE(TO_CHAR(YM + LEVEL - 1, 'd' ), '1' , LEVEL )) AS MON , MIN (DECODE(TO_CHAR(YM + LEVEL - 1, 'd' ), '1' , LEVEL )) AS TUE , MIN (DECODE(TO_CHAR(YM + LEVEL - 1, 'd' ), '1' , LEVEL )) AS WED , MIN (DECODE(TO_CHAR(YM + LEVEL - 1, 'd' ), '1' , LEVEL )) AS THU , MIN (DECODE(TO_CHAR(YM + LEVEL - 1, 'd' ), '1' , LEVEL )) AS FRI , MIN (DECODE(TO_CHAR(YM + LEVEL - 1, 'd' ), '1' , LEVEL )) AS SAT FROM ( SELECT TO_DATE(TO_CHAR(SYSDATE, 'YYYYMM' ), 'YYYYMM' ) YM FROM DUAL CONNECT BY LEVEL <= LAST_DAY(YM) - YM + 1 GROUP BY TRUNC(YM + LEVEL , 'iw' ) ORDER BY 7) SUN MON TUE WED THU FRI SAT ---- --- --- --- ---- ---- ---- NULL 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 NULL NULL NULL |
'DBMS > Oracle' 카테고리의 다른 글
SQL 표준 가이드(스압) (0) | 2013.07.25 |
---|---|
로또 (0) | 2013.07.25 |
구구단 (0) | 2013.07.25 |
2013. 7. 25. 17:00
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | SELECT MAX (DECODE(L1, 2, L1|| ' * ' ||L2|| ' = ' ||(L1*L2), NULL )) AS "2단" , MAX (DECODE(L1, 3, L1|| ' * ' ||L2|| ' = ' ||(L1*L2), NULL )) AS "3단" , MAX (DECODE(L1, 4, L1|| ' * ' ||L2|| ' = ' ||(L1*L2), NULL )) AS "4단" , MAX (DECODE(L1, 5, L1|| ' * ' ||L2|| ' = ' ||(L1*L2), NULL )) AS "5단" , MAX (DECODE(L1, 6, L1|| ' * ' ||L2|| ' = ' ||(L1*L2), NULL )) AS "6단" , MAX (DECODE(L1, 7, L1|| ' * ' ||L2|| ' = ' ||(L1*L2), NULL )) AS "7단" , MAX (DECODE(L1, 8, L1|| ' * ' ||L2|| ' = ' ||(L1*L2), NULL )) AS "8단" , MAX (DECODE(L1, 9, L1|| ' * ' ||L2|| ' = ' ||(L1*L2), NULL )) AS "9단" FROM ( SELECT LEVEL AS L1 FROM DUAL CONNECT BY LEVEL < 10) A, ( SELECT LEVEL AS L2 FROM DUAL CONNECT BY LEVEL < 10) B GROUP BY L2 ORDER BY L2; 2단 3단 4단 5단 6단 7단 8단 9단 ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- 2 * 1 = 2 3 * 1 = 3 4 * 1 = 4 5 * 1 = 5 6 * 1 = 6 7 * 1 = 7 8 * 1 = 8 9 * 1 = 9 2 * 2 = 4 3 * 2 = 6 4 * 2 = 8 5 * 2 = 10 6 * 2 = 12 7 * 2 = 14 8 * 2 = 16 9 * 2 = 18 2 * 3 = 6 3 * 3 = 9 4 * 3 = 12 5 * 3 = 15 6 * 3 = 18 7 * 3 = 21 8 * 3 = 24 9 * 3 = 27 2 * 4 = 8 3 * 4 = 12 4 * 4 = 16 5 * 4 = 20 6 * 4 = 24 7 * 4 = 28 8 * 4 = 32 9 * 4 = 36 2 * 5 = 10 3 * 5 = 15 4 * 5 = 20 5 * 5 = 25 6 * 5 = 30 7 * 5 = 35 8 * 5 = 40 9 * 5 = 45 2 * 6 = 12 3 * 6 = 18 4 * 6 = 24 5 * 6 = 30 6 * 6 = 36 7 * 6 = 42 8 * 6 = 48 9 * 6 = 54 2 * 7 = 14 3 * 7 = 21 4 * 7 = 28 5 * 7 = 35 6 * 7 = 42 7 * 7 = 49 8 * 7 = 56 9 * 7 = 63 2 * 8 = 16 3 * 8 = 24 4 * 8 = 32 5 * 8 = 40 6 * 8 = 48 7 * 8 = 56 8 * 8 = 64 9 * 8 = 72 2 * 9 = 18 3 * 9 = 27 4 * 9 = 36 5 * 9 = 45 6 * 9 = 54 7 * 9 = 63 8 * 9 = 72 9 * 9 = 81 |
혹은
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | SELECT MIN (DECODE (A, 2, gugu)) AS "2단" , MIN (DECODE (A, 3, gugu)) AS "3단" , MIN (DECODE (A, 4, gugu)) AS "4단" , MIN (DECODE (A, 5, gugu)) AS "5단" , MIN (DECODE (A, 6, gugu)) AS "6단" , MIN (DECODE (A, 7, gugu)) AS "7단" , MIN (DECODE (A, 8, gugu)) AS "8단" , MIN (DECODE (A, 9, gugu)) AS "9단" FROM ( SELECT A, B, A || ' * ' || B || ' = ' || A * B AS gugu FROM ( SELECT mod( LEVEL -1 ,9) + 1 AS A, trunc(( LEVEL - 1)/9) + 1 AS B FROM dual CONNECT BY LEVEL <= 81 ) ) GROUP BY B ORDER BY B; |
'DBMS > Oracle' 카테고리의 다른 글
SQL 표준 가이드(스압) (0) | 2013.07.25 |
---|---|
로또 (0) | 2013.07.25 |
달력 (0) | 2013.07.25 |