# SQL 스타일 가이드 ## Overview 여러분은 이 가이드라인들을 이용하거나, [fork][fork] 하거나, 여러분만의 가이드라인을 만들 수 있습니다. 여기서 핵심은 일관된 스타일을 선택하고 그것을 고수하는 것입니다. 가이드라인의 변경을 제안하거나 버그를 수정하려면 GitHub에서 [issue][issue] 또는 [pull request][pull]를 여십시오. 이 가이드라인들은 Joe Celko의 [SQL Programming Style][celko] 책 내용과 호환되어 이미 해당 책을 읽은 팀들이 더 채택하기 쉽도록 설계되었습니다. 이 가이드는 일부분에서는 조금 주관적이며, 일부분에서는 대중적입니다. 이 가이드는 각 규칙을 설정한 배경에 대한 일화와 추론을 글로 풀어낸 [Celko의 책][celko]에 비해서는 확실히 간결합니다. 이 가이드를 [Markdown 형식][dl-md]으로 프로젝트 코드 베이스의 일부로 포함하거나, 프로젝트의 모든 참여자가 자유롭게 읽을 수 있도록 이 글을 참조하는 것은 실제 책을 읽는 것보다 훨씬 더 쉽습니다. [Simon Holywell][simon]의 SQL style guide는 [Creative Commons Attribution-ShareAlike 4.0 International License][licence]에 따라 사용이 허가되었습니다. [https://www.sqlstyle.guide/][sqlstyleguide]의 작업을 기반으로 합니다. ## General ### Do * 일관적이고 기술적인(descriptive) 식별자와 이름을 사용하라. * 가독성을 위해 공백과 들여쓰기를 신중하게 사용하라. * [ISO 8601][iso-8601]를 따르는 시간 및 날짜 정보를 저장하라. (`YYYY-MM-DD HH:MM:SS.SSSSS`) * 이식성을 위해 벤더-특화된 함수 대신 표준 SQL 함수만을 사용하라. * 불필요한 따옴표나 괄호, 다른 구문을 통해 파생될 수 있는 `WHERE`절과 같은 불필요한 SQL을 피하고 간결하게 유지하라. * 필요한 경우 SQL 코드에 주석을 포함하라. 가능한 경우 주석 앞에 C 스타일의 주석 열기(`/*`)와 주석 닫기(`*/`)를 사용하라. 가능하지 않은 경우 주석 앞에 `--`를 붙이고, 새로운 줄로 마무리하라. ```sql SELECT file_hash -- stored ssdeep hash FROM file_system WHERE file_name = '.vimrc'; ``` ```sql /* Updating the file record after writing to the file */ UPDATE file_system SET file_modified_date = '1980-02-22 13:19:01.00000', file_size = 209732 WHERE file_name = '.vimrc'; ``` ### Avoid * CamelCase. — 빠르게 스캔하기 어렵다. * 설명 접두사 또는 `sp_`, `tbl`과 같은 헝가리안 표기법. * 복수. — 가능한 경우 더 자연스러운 집합 명사를 사용하라. 예를 들어, `employees` 대신 `staff`를, `individuals` 대신 `people`을 사용하라. * Quoted identifiers — 사용해야 하는 경우, 이식성을 위해 SQL-92 큰 따옴표를 사용하라. (벤더에 따라 이를 지원하기 위해 SQL 서버를 구성해야 할 수도 있다.) * SQL이나 데이터베이스 구조에 객체지향 설계 원칙이 적용되어서는 안된다. ## Naming conventions ### General * 이름이 고유하며, [예약어][reserved-keywords]가 아닌지 확인하라. * 길이는 최대 30 bytes로 유지하라. — multi-byte 문자셋을 사용하지 않는 한 30자이다. * 이름은 문자로 시작해야하며, 밑줄(_)로 끝나지 않는다. * 이름에는 문자, 숫자, 밑줄만 사용하라. * 여러 개의 연속된 밑줄의 사용을 피하라. — 가독성이 좋지 않을 수 있다. * 이름에 자연스럽게 포함되는 공백에 밑줄을 사용하라. (first name은 `first_name`이 된다.) * 약어를 피하라. 약어를 사용해야 한다면, 일반적으로 이해되는지 확인하라. ```sql SELECT first_name FROM staff; ``` ### Tables * 집합명사를 사용하라. 어려운 경우 덜 이상적이지만 복수 형식을 사용하라. 예를 들어, (선호도 순서대로) `staff`, `employees` 이다. * `tbl` 또는 그 외 다른 설명 접두사 또는 헝가리안 표기법을 접두사로 사용하지 말라. * 테이블명을 해당 테이블을 구성하는 테이블 컬럼명과 동일하게 지정하지 말라. * 가능한 경우, 두 개의 테이블 이름을 연결하여 관계 테이블의 이름을 만들지 말라. (`cars_mechanics` 보다 `services`를 선호한다.) ### Columns * 항상 단수명사를 사용하라. * 가능한 경우, 단순히 `id`를 테이블의 기본 식별자로 사용하지 말라. * 해당 테이블명과 동일한 이름의 컬럼을 추가하지 말라. * 고유명사와 같은 경우가 아니라면, 항상 소문자를 사용하라. ### Aliasing or correlations * 별칭을 붙이는 개체 또는 표현과 어떤 식으로든 관련있어야 한다. * 일반적으로 correlation 이름은 개체 이름에 포함된 각 단어의 첫 글자가 되어야 한다. * 이미 같은 이름의 correlation이 있는 경우, 번호를 붙인다. * 항상 `AS` 키워드를 붙인다. — 명시적이므로 가독성이 좋다. * 계산된 값(`SUM()` or `AVG()`)이 스키마에 정의된 컬럼일 경우 이름을 부여하라. ```sql SELECT first_name AS fn FROM staff AS s1 JOIN students AS s2 ON s2.mentor_id = s1.staff_num; ``` ```sql SELECT SUM(s.monitor_tally) AS monitor_total FROM staff AS s; ``` ### Stored procedures * 이름에 동사가 포함되어야만 한다. * `sp_` 또는 기타 설명 접두사와 헝가리안 표기법을 사용하지 말라. ### Uniform suffixes 아래의 접미사들은 SQL 코드에서 컬럼을 쉽게 읽고 이해할 수 있도록 하는 보편적인 의미를 가지고 있습니다. 적절한 곳에 올바른 접미사를 사용하십시오. * `_id` — 기본키와 같은 고유 식별자. * `_status` — flag 값 또는 기타 다른 유형의 상태값 (ex. `publication_status`). * `_total` — 어떤 값들의 합계(sum) 또는 총합(total) * `_num` — 필드에 어떤 종류의 숫자들이 포함되어 있음을 나타냅니다. * `_name` — 이름을 나타냅니다. (ex. `first_name`) * `_seq` — 연속적인 값의 시퀀스를 나타냅니다. * `_date` — 날짜가 포함된 컬럼을 나타냅니다. * `_tally` — 카운트. * `_size` — 크기. (ex. file_size 또는 clothing의 크기) * `_addr` — 물리적인 주소이거나 `ip_addr`와 같은 무형의 주소일 수 있습니다. ## Query syntax ### Reserved words `SELECT`, `WHERE`와 같은 [예약어][reserved-keywords]들은 항상 대문자를 사용하십시오. 축약된 키워드의 사용을 피하고, 가능한 경우 전체 길이의 키워드를 사용하는 것이 좋습니다. (`ABS` 보다 `ABSOLUTE`를 선호) 동일한 기능을 수행하는 ANSI SQL 키워드가 있는 경우 특정 데이터베이스 서버 특화된 키워드를 사용하지 마십시오. 이는 코드의 이식성을 높이는 데 도움이 될 것입니다. ```sql SELECT model_num FROM phones AS p WHERE p.release_date > '2014-09-30'; ``` ### White space 코드를 더욱 읽기 쉽게 하기 위해서 올바른 위치에 공백을 사용하는 것이 중요합니다. 코드를 복잡하게 하거나 단어간 자연스러운 공백을 제거하지 마십시오. #### Spaces 공백은 각 줄의 첫 키워드가 같은 문자 경계에서 끝날 수 있게 코드를 정렬하기 위해서 사용되어야 합니다. 이러한 중간에 강이 흐르는 것과 같은 형태는 독자들이 코드를 쉽게 스캔하고 구현 세부사항과 예약어를 분리하여 읽을 수 있도록 도와줍니다. 이 같은 강(River)은 [타이핑할 때는 좋지 않지만][rivers], 가독성 측면에서는 도움이 됩니다. ```sql (SELECT f.species_name, AVG(f.height) AS average_height, AVG(f.diameter) AS average_diameter FROM flora AS f WHERE f.species_name = 'Banksia' OR f.species_name = 'Sheoak' OR f.species_name = 'Wattle' GROUP BY f.species_name, f.observation_date) UNION ALL (SELECT b.species_name, AVG(b.height) AS average_height, AVG(b.diameter) AS average_diameter FROM botanic_garden_flora AS b WHERE b.species_name = 'Banksia' OR b.species_name = 'Sheoak' OR b.species_name = 'Wattle' GROUP BY b.species_name, b.observation_date); ``` `SELECT`, `FROM` 등은 모두 우측 정렬되며, 컬럼명과 구현과 관련된 세부사항은 좌측 정렬되는 것에 주목하십시오. 모든 경우에 해당되지는 않지만, 아래의 경우는 항상 공백을 사용합니다. * 등호(`=`) 전, 후 * 쉼표(`,`) 뒤 * apostrophes(`'`) 전, 후 (괄호 안 또는 쉼표나 세미콜론이 뒤에 오는 경우는 제외) ```sql SELECT a.title, a.release_date, a.recording_date FROM albums AS a WHERE a.title = 'Charcoal Lane' OR a.title = 'The New Danger'; ``` #### Line spacing 다음의 경우는 항상 새로운 줄/수직 공백을 사용합니다. * `AND` 또는 `OR` 전 * 세미콜론 뒤 (쿼리를 구분하여 가독성이 좋습니다.) * 각 키워드 정의 후 * 쉼표 뒤 (여러 개의 컬럼을 논리적 그룹으로 구분할 때) * 큰 코드 덩어리(large chunks of code)의 가독성을 향상시키기 위해 코드를 관련된 부분으로 분리할 때 키워드를 우측 정렬, 값을 좌측 정렬하면 쿼리 중간에 일정한 간격이 생성됩니다. 이 또한 쿼리의 정의를 빠르게 스캔하기 더 쉽게 만들어줍니다. ```sql INSERT INTO albums (title, release_date, recording_date) VALUES ('Charcoal Lane', '1990-01-01 01:01:01.00000', '1990-01-01 01:01:01.00000'), ('The New Danger', '2008-01-01 01:01:01.00000', '1990-01-01 01:01:01.00000'); ``` ```sql UPDATE albums SET release_date = '1990-01-01 01:01:01.00000' WHERE title = 'The New Danger'; ``` ```sql SELECT a.title, a.release_date, a.recording_date, a.production_date -- grouped dates together FROM albums AS a WHERE a.title = 'Charcoal Lane' OR a.title = 'The New Danger'; ``` ### Indentation SQL 코드를 가독성있게 하려면 아래의 들여쓰기 표준을 지키는 것이 중요합니다. #### Joins Join은 강(River)의 반대쪽으로 들여써야 하며, 필요한 경우 새로운 줄을 이용해 그룹화해야 합니다. ```sql SELECT r.last_name FROM riders AS r INNER JOIN bikes AS b ON r.bike_vin_num = b.vin_num AND b.engine_tally > 2 INNER JOIN crew AS c ON r.crew_chief_last_name = c.last_name AND c.chief = 'Y'; ``` #### Subqueries 서브쿼리 또한 강(River)의 우측에 정렬되어야 하며, 다른 쿼리와 동일한 스타일을 따라 작성합니다. 때때로 닫는 괄호를 새로운 줄의 여는 괄호의 문자 위치와 동일한 위치에 작성하는 것이 좋을 수도 있습니다. — 이는 특히 중첩된 서브쿼리가 있는 경우에 더욱 그렇습니다. ```sql SELECT r.last_name, (SELECT MAX(YEAR(championship_date)) FROM champions AS c WHERE c.last_name = r.last_name AND c.confirmed = 'Y') AS last_championship_year FROM riders AS r WHERE r.last_name IN (SELECT c.last_name FROM champions AS c WHERE YEAR(championship_date) > '2008' AND c.confirmed = 'Y'); ``` ### Preferred formalisms * 가능한 경우, 여러 개의 `AND` 구문을 결합하기 보다는 `BETWEEN`을 사용하라. * 비슷한 맥락으로, 여러 개의 `OR` 구문을 결합하기 보다는 `IN()`을 사용하라. * 데이터베이스단에서 값을 해석해야하는 경우, `CASE` 구문을 사용하라. CASE 구문을 중첩하여 보다 복잡한 논리적 구조를 형성할 수 있다. * 가능한 한 `UNION` 구문과 임시 테이블의 사용을 피하라. 스키마를 최적화함으로써 UNION, 임시 테이블의 기능을 대체할 수 있다면 그렇게 해야 할 것이다. ```sql SELECT CASE postcode WHEN 'BN1' THEN 'Brighton' WHEN 'EH1' THEN 'Edinburgh' END AS city FROM office_locations WHERE country = 'United Kingdom' AND opening_time BETWEEN 8 AND 9 AND postcode IN ('EH1', 'BN1', 'NN1', 'KW1'); ``` ## Create syntax 스키마 정보를 선언할 때에도 사람이 읽기 좋은 코드를 유지하는 것은 중요합니다. 이를 가능하게 하기 위해서는 컬럼 정의 부분을 정렬하고 적절하게 그룹화해야 합니다. `CREATE` 구문 내에서 컬럼을 정의할 때에는 4개의 공백을 이용하여 들여쓰기 합니다. ### Choosing data types * 가능한 경우, 벤더 특화된 데이터 타입을 사용하지 말라. — 이는 이식성이 좋지 않으며, 동일한 벤더의 구 버전 소프트웨어에서 이용가능하지 않을 수도 있다. * 엄격한 부동 소수점 연산이 필요한 경우에만 `REAL` 또는 `FLOAT` 타입을 사용하라. 그렇지 않은 경우 항상 `NUMERIC` 또는 `DECIMAL` 타입을 선호하라. 부동 소수점 반올림 오류는 성가신 일이다! ### Specifying default values * 기본값은 항상 컬럼의 데이터 타입과 동일해야 한다. — 만약 컬럼이 `DECIMAL`로 선언되어 있다면, `INTEGER` 타입의 기본값을 설정하지 마라. * 기본값은 데이터 타입 선언 뒤에 작성해야 하며, `NOT NULL` 문 앞에 작성되어야 합니다. ### Constraints and keys 제약조건과 제약조건의 부분집합, 키(key)들은 데이터베이스 정의에서 매우 중요한 구성요소입니다. 이들은 읽고 추론하기 어려워질 수 있으므로 아래의 표준 가이드라인들을 지키는 것이 중요합니다. #### Choosing keys 키가 될 컬럼을 결정하는 것은 성능과 데이터 무결성에 영향을 끼칠 수 있으므로 신중하게 고려되어야 합니다. 1. 키는 어느 정도 고유해야 합니다. 2. 스키마 전체에 걸쳐서 데이터 유형 측면에서 일관성이 있으며, 미래에도 변경될 가능성이 작아야 합니다. 3. 표준 형식(ISO에서 발표한 형식)에 대해 값을 검증할 수 있어야 합니다. 2번 항목을 준수해야 합니다. 4. 키는 가능한 한 단순하게 유지하면서, 필요한 경우 복합키를 사용합니다. 이는 데이터베이스 정의에서 수행되어야 하는 합리적으로 깊게 고려된 균형있는 항목입니다. 미래에 요구사항이 변경되는 경우, 이 항목들을 준수하면서 데이터베이스 정의를 변경할 수 있습니다. #### Defining constraints 키로써 사용할 컬럼이 결정되면 필드 값 유효성 검사와 제약조건을 이용해 시스템 상에서 키를 정의할 수 있습니다. ##### General * 테이블에는 하나 이상의 키가 있어야 완전하고 유용합니다. * 데이터베이스 벤더에서 일반적으로 충분히 이해할 수 있는 이름을 자동적으로 제공하는 `UNIQUE`, `PRIMARY KEY`, `FOREIGN KEY`를 제외한 제약조건에는 사용자 지정 이름이 부여되어야 합니다. ##### Layout and order * `CREATE TABLE` 구문 바로 뒤에는 기본키를 지정하십시오. * 제약조건은 대응하는 컬럼 바로 아래에 정의되어야 합니다. 제약조건이 컬럼명 오른쪽에 정렬되도록 들여쓰십시오. * 만약 다중 컬럼에 대한 제약조건인 경우, 가능한 한 두 컬럼의 정의 모두에 가깝게 배치하고 어려운 경우 마지막 수단으로 `CREATE TABLE` 정의 끝에 작성하는 것을 고려하십시오. * 테이블 전체에 적용되는 테이블 수준의 제약조건의 경우, 맨 끝에 정의되어야 합니다. * 알파벳 순서로 작성하십시오. (`ON DELETE`가 `ON UPDATE` 앞에 와야 합니다.) * 가능한 경우 쿼리의 각 요소를 동일한 문자 위치로 정렬하십시오. 예를 들어, 모든 `NOT NULL` 구문을 동일한 문자 위치에서 시작하는 것입니다. 이는 어렵지도 않고 빠르지만, 코드를 훨씬 읽고 스캔하기 쉽게 만들어줍니다. ##### Validation * `LIKE`와 `SIMILAR TO` 제약조건을 사용하여 형식이 정해진 문자열의 무결성을 보장합니다. * 수치값의 최대 범위가 정해져 있는 경우, 잘못된 값이 데이터베이스에 입력되거나 컬럼 정의에 맞지 않는 데이터가 자동으로 잘리는 것을 방지하기 위해 범위를 `CHECK()`로 작성해야 합니다. 대부분의 경우 최소한 값이 0 이상인지 확인해야 합니다. * `CHECK()` 제약조건은 디버깅을 쉽게 하기 위해 별도의 구문에 작성해야 합니다. ##### Example ```sql CREATE TABLE staff ( PRIMARY KEY (staff_num), staff_num INT(5) NOT NULL, first_name VARCHAR(100) NOT NULL, pens_in_drawer INT(2) NOT NULL, CONSTRAINT pens_in_drawer_range CHECK(pens_in_drawer BETWEEN 1 AND 99) ); ``` ### Designs to avoid * 객체지향 설계 원칙은 관계형 데이터베이스 설계로 효과적으로 변환될 수 없습니다. — 이러한 함정을 피하십시오. * 한 컬럼에는 값을 다른 컬럼에는 단위를 저장하는 것. 추후 응용 프로그램에서 두 컬럼을 결합해야 하는 것을 방지하기 위해서 단위를 자명하게 지정해야 합니다. `CHECK()`를 이용하여 유효한 데이터가 컬럼에 삽입되는지 확인해야 합니다. * [Entity–Attribute–Value][eav] (EAV) 테이블 — 이러한 스키마없는 데이터를 다루기 위해서는 전문 제품을 사용하십시오. * 시간에 따른 아카이빙 또는 다국적 조직 내 위치와 같은 고민 때문에 한 테이블에 있어야 하는 데이터를 여러 테이블로 분할하는 것. 이는 이후에 단순히 하나의 테이블에 대해 쿼리하는 것이 아닌 `UNION`과 함께 여러 테이블에 걸쳐 동작합니다. ## Appendix ### Reserved keyword reference ANSI SQL (92, 99 and 2003), MySQL 3 to 5.x, PostgreSQL 8.1, MS SQL Server 2000, MS ODBC and Oracle 10.2의 예약어 목록입니다. ```sql A ABORT ABS ABSOLUTE ACCESS ACTION ADA ADD ADMIN AFTER AGGREGATE ALIAS ALL ALLOCATE ALSO ALTER ALWAYS ANALYSE ANALYZE AND ANY ARE ARRAY AS ASC ASENSITIVE ASSERTION ASSIGNMENT ASYMMETRIC AT ATOMIC ATTRIBUTE ATTRIBUTES AUDIT AUTHORIZATION AUTO_INCREMENT AVG AVG_ROW_LENGTH BACKUP BACKWARD BEFORE BEGIN BERNOULLI BETWEEN BIGINT BINARY BIT BIT_LENGTH BITVAR BLOB BOOL BOOLEAN BOTH BREADTH BREAK BROWSE BULK BY C CACHE CALL CALLED CARDINALITY CASCADE CASCADED CASE CAST CATALOG CATALOG_NAME CEIL CEILING CHAIN CHANGE CHAR CHAR_LENGTH CHARACTER CHARACTER_LENGTH CHARACTER_SET_CATALOG CHARACTER_SET_NAME CHARACTER_SET_SCHEMA CHARACTERISTICS CHARACTERS CHECK CHECKED CHECKPOINT CHECKSUM CLASS CLASS_ORIGIN CLOB CLOSE CLUSTER CLUSTERED COALESCE COBOL COLLATE COLLATION COLLATION_CATALOG COLLATION_NAME COLLATION_SCHEMA COLLECT COLUMN COLUMN_NAME COLUMNS COMMAND_FUNCTION COMMAND_FUNCTION_CODE COMMENT COMMIT COMMITTED COMPLETION COMPRESS COMPUTE CONDITION CONDITION_NUMBER CONNECT CONNECTION CONNECTION_NAME CONSTRAINT CONSTRAINT_CATALOG CONSTRAINT_NAME CONSTRAINT_SCHEMA CONSTRAINTS CONSTRUCTOR CONTAINS CONTAINSTABLE CONTINUE CONVERSION CONVERT COPY CORR CORRESPONDING COUNT COVAR_POP COVAR_SAMP CREATE CREATEDB CREATEROLE CREATEUSER CROSS CSV CUBE CUME_DIST CURRENT CURRENT_DATE CURRENT_DEFAULT_TRANSFORM_GROUP CURRENT_PATH CURRENT_ROLE CURRENT_TIME CURRENT_TIMESTAMP CURRENT_TRANSFORM_GROUP_FOR_TYPE CURRENT_USER CURSOR CURSOR_NAME CYCLE DATA DATABASE DATABASES DATE DATETIME DATETIME_INTERVAL_CODE DATETIME_INTERVAL_PRECISION DAY DAY_HOUR DAY_MICROSECOND DAY_MINUTE DAY_SECOND DAYOFMONTH DAYOFWEEK DAYOFYEAR DBCC DEALLOCATE DEC DECIMAL DECLARE DEFAULT DEFAULTS DEFERRABLE DEFERRED DEFINED DEFINER DEGREE DELAY_KEY_WRITE DELAYED DELETE DELIMITER DELIMITERS DENSE_RANK DENY DEPTH DEREF DERIVED DESC DESCRIBE DESCRIPTOR DESTROY DESTRUCTOR DETERMINISTIC DIAGNOSTICS DICTIONARY DISABLE DISCONNECT DISK DISPATCH DISTINCT DISTINCTROW DISTRIBUTED DIV DO DOMAIN DOUBLE DROP DUAL DUMMY DUMP DYNAMIC DYNAMIC_FUNCTION DYNAMIC_FUNCTION_CODE EACH ELEMENT ELSE ELSEIF ENABLE ENCLOSED ENCODING ENCRYPTED END END-EXEC ENUM EQUALS ERRLVL ESCAPE ESCAPED EVERY EXCEPT EXCEPTION EXCLUDE EXCLUDING EXCLUSIVE EXEC EXECUTE EXISTING EXISTS EXIT EXP EXPLAIN EXTERNAL EXTRACT FALSE FETCH FIELDS FILE FILLFACTOR FILTER FINAL FIRST FLOAT FLOAT4 FLOAT8 FLOOR FLUSH FOLLOWING FOR FORCE FOREIGN FORTRAN FORWARD FOUND FREE FREETEXT FREETEXTTABLE FREEZE FROM FULL FULLTEXT FUNCTION FUSION G GENERAL GENERATED GET GLOBAL GO GOTO GRANT GRANTED GRANTS GREATEST GROUP GROUPING HANDLER HAVING HEADER HEAP HIERARCHY HIGH_PRIORITY HOLD HOLDLOCK HOST HOSTS HOUR HOUR_MICROSECOND HOUR_MINUTE HOUR_SECOND IDENTIFIED IDENTITY IDENTITY_INSERT IDENTITYCOL IF IGNORE ILIKE IMMEDIATE IMMUTABLE IMPLEMENTATION IMPLICIT IN INCLUDE INCLUDING INCREMENT INDEX INDICATOR INFILE INFIX INHERIT INHERITS INITIAL INITIALIZE INITIALLY INNER INOUT INPUT INSENSITIVE INSERT INSERT_ID INSTANCE INSTANTIABLE INSTEAD INT INT1 INT2 INT3 INT4 INT8 INTEGER INTERSECT INTERSECTION INTERVAL INTO INVOKER IS ISAM ISNULL ISOLATION ITERATE JOIN K KEY KEY_MEMBER KEY_TYPE KEYS KILL LANCOMPILER LANGUAGE LARGE LAST LAST_INSERT_ID LATERAL LEADING LEAST LEAVE LEFT LENGTH LESS LEVEL LIKE LIMIT LINENO LINES LISTEN LN LOAD LOCAL LOCALTIME LOCALTIMESTAMP LOCATION LOCATOR LOCK LOGIN LOGS LONG LONGBLOB LONGTEXT LOOP LOW_PRIORITY LOWER M MAP MATCH MATCHED MAX MAX_ROWS MAXEXTENTS MAXVALUE MEDIUMBLOB MEDIUMINT MEDIUMTEXT MEMBER MERGE MESSAGE_LENGTH MESSAGE_OCTET_LENGTH MESSAGE_TEXT METHOD MIDDLEINT MIN MIN_ROWS MINUS MINUTE MINUTE_MICROSECOND MINUTE_SECOND MINVALUE MLSLABEL MOD MODE MODIFIES MODIFY MODULE MONTH MONTHNAME MORE MOVE MULTISET MUMPS MYISAM NAME NAMES NATIONAL NATURAL NCHAR NCLOB NESTING NEW NEXT NO NO_WRITE_TO_BINLOG NOAUDIT NOCHECK NOCOMPRESS NOCREATEDB NOCREATEROLE NOCREATEUSER NOINHERIT NOLOGIN NONCLUSTERED NONE NORMALIZE NORMALIZED NOSUPERUSER NOT NOTHING NOTIFY NOTNULL NOWAIT NULL NULLABLE NULLIF NULLS NUMBER NUMERIC OBJECT OCTET_LENGTH OCTETS OF OFF OFFLINE OFFSET OFFSETS OIDS OLD ON ONLINE ONLY OPEN OPENDATASOURCE OPENQUERY OPENROWSET OPENXML OPERATION OPERATOR OPTIMIZE OPTION OPTIONALLY OPTIONS OR ORDER ORDERING ORDINALITY OTHERS OUT OUTER OUTFILE OUTPUT OVER OVERLAPS OVERLAY OVERRIDING OWNER PACK_KEYS PAD PARAMETER PARAMETER_MODE PARAMETER_NAME PARAMETER_ORDINAL_POSITION PARAMETER_SPECIFIC_CATALOG PARAMETER_SPECIFIC_NAME PARAMETER_SPECIFIC_SCHEMA PARAMETERS PARTIAL PARTITION PASCAL PASSWORD PATH PCTFREE PERCENT PERCENT_RANK PERCENTILE_CONT PERCENTILE_DISC PLACING PLAN PLI POSITION POSTFIX POWER PRECEDING PRECISION PREFIX PREORDER PREPARE PREPARED PRESERVE PRIMARY PRINT PRIOR PRIVILEGES PROC PROCEDURAL PROCEDURE PROCESS PROCESSLIST PUBLIC PURGE QUOTE RAID0 RAISERROR RANGE RANK RAW READ READS READTEXT REAL RECHECK RECONFIGURE RECURSIVE REF REFERENCES REFERENCING REGEXP REGR_AVGX REGR_AVGY REGR_COUNT REGR_INTERCEPT REGR_R2 REGR_SLOPE REGR_SXX REGR_SXY REGR_SYY REINDEX RELATIVE RELEASE RELOAD RENAME REPEAT REPEATABLE REPLACE REPLICATION REQUIRE RESET RESIGNAL RESOURCE RESTART RESTORE RESTRICT RESULT RETURN RETURNED_CARDINALITY RETURNED_LENGTH RETURNED_OCTET_LENGTH RETURNED_SQLSTATE RETURNS REVOKE RIGHT RLIKE ROLE ROLLBACK ROLLUP ROUTINE ROUTINE_CATALOG ROUTINE_NAME ROUTINE_SCHEMA ROW ROW_COUNT ROW_NUMBER ROWCOUNT ROWGUIDCOL ROWID ROWNUM ROWS RULE SAVE SAVEPOINT SCALE SCHEMA SCHEMA_NAME SCHEMAS SCOPE SCOPE_CATALOG SCOPE_NAME SCOPE_SCHEMA SCROLL SEARCH SECOND SECOND_MICROSECOND SECTION SECURITY SELECT SELF SENSITIVE SEPARATOR SEQUENCE SERIALIZABLE SERVER_NAME SESSION SESSION_USER SET SETOF SETS SETUSER SHARE SHOW SHUTDOWN SIGNAL SIMILAR SIMPLE SIZE SMALLINT SOME SONAME SOURCE SPACE SPATIAL SPECIFIC SPECIFIC_NAME SPECIFICTYPE SQL SQL_BIG_RESULT SQL_BIG_SELECTS SQL_BIG_TABLES SQL_CALC_FOUND_ROWS SQL_LOG_OFF SQL_LOG_UPDATE SQL_LOW_PRIORITY_UPDATES SQL_SELECT_LIMIT SQL_SMALL_RESULT SQL_WARNINGS SQLCA SQLCODE SQLERROR SQLEXCEPTION SQLSTATE SQLWARNING SQRT SSL STABLE START STARTING STATE STATEMENT STATIC STATISTICS STATUS STDDEV_POP STDDEV_SAMP STDIN STDOUT STORAGE STRAIGHT_JOIN STRICT STRING STRUCTURE STYLE SUBCLASS_ORIGIN SUBLIST SUBMULTISET SUBSTRING SUCCESSFUL SUM SUPERUSER SYMMETRIC SYNONYM SYSDATE SYSID SYSTEM SYSTEM_USER TABLE TABLE_NAME TABLES TABLESAMPLE TABLESPACE TEMP TEMPLATE TEMPORARY TERMINATE TERMINATED TEXT TEXTSIZE THAN THEN TIES TIME TIMESTAMP TIMEZONE_HOUR TIMEZONE_MINUTE TINYBLOB TINYINT TINYTEXT TO TOAST TOP TOP_LEVEL_COUNT TRAILING TRAN TRANSACTION TRANSACTION_ACTIVE TRANSACTIONS_COMMITTED TRANSACTIONS_ROLLED_BACK TRANSFORM TRANSFORMS TRANSLATE TRANSLATION TREAT TRIGGER TRIGGER_CATALOG TRIGGER_NAME TRIGGER_SCHEMA TRIM TRUE TRUNCATE TRUSTED TSEQUAL TYPE UESCAPE UID UNBOUNDED UNCOMMITTED UNDER UNDO UNENCRYPTED UNION UNIQUE UNKNOWN UNLISTEN UNLOCK UNNAMED UNNEST UNSIGNED UNTIL UPDATE UPDATETEXT UPPER USAGE USE USER USER_DEFINED_TYPE_CATALOG USER_DEFINED_TYPE_CODE USER_DEFINED_TYPE_NAME USER_DEFINED_TYPE_SCHEMA USING UTC_DATE UTC_TIME UTC_TIMESTAMP VACUUM VALID VALIDATE VALIDATOR VALUE VALUES VAR_POP VAR_SAMP VARBINARY VARCHAR VARCHAR2 VARCHARACTER VARIABLE VARIABLES VARYING VERBOSE VIEW VOLATILE WAITFOR WHEN WHENEVER WHERE WHILE WIDTH_BUCKET WINDOW WITH WITHIN WITHOUT WORK WRITE WRITETEXT X509 XOR YEAR YEAR_MONTH ZEROFILL ZONE ``` ### Column data types 데이터베이스 엔진간의 최대 호환성을 위해 사용할 수 있는 몇 가지 권장되는 컬럼 데이터 유형입니다. #### Character types: * CHAR * CLOB * VARCHAR #### Numeric types * Exact numeric types * BIGINT * DECIMAL * DECFLOAT * INTEGER * NUMERIC * SMALLINT * Approximate numeric types * DOUBLE PRECISION * FLOAT * REAL #### Datetime types * DATE * TIME * TIMESTAMP #### Binary types: * BINARY * BLOB * VARBINARY #### Additional types * BOOLEAN * INTERVAL * XML [simon]: https://www.simonholywell.com/?utm_source=sqlstyle.guide&utm_medium=link&utm_campaign=md-document "SimonHolywell.com" [issue]: https://github.com/treffynnon/sqlstyle.guide/issues "SQL style guide issues on GitHub" [fork]: https://github.com/treffynnon/sqlstyle.guide/fork "Fork SQL style guide on GitHub" [pull]: https://github.com/treffynnon/sqlstyle.guide/pulls/ "SQL style guide pull requests on GitHub" [celko]: https://www.amazon.com/gp/product/0120887975/ref=as_li_ss_tl?ie=UTF8&linkCode=ll1&tag=treffynnon-20&linkId=9c88eac8cd420e979675c815771313d5 "Joe Celko's SQL Programming Style (The Morgan Kaufmann Series in Data Management Systems)" [dl-md]: https://raw.githubusercontent.com/treffynnon/sqlstyle.guide/gh-pages/_includes/sqlstyle.guide.md "Download the guide in Markdown format" [iso-8601]: https://en.wikipedia.org/wiki/ISO_8601 "Wikipedia: ISO 8601" [rivers]: https://practicaltypography.com/one-space-between-sentences.html "Practical Typography: one space between sentences" [reserved-keywords]: #reserved-keyword-reference "Reserved keyword reference" [eav]: https://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model "Wikipedia: Entity–attribute–value model" [sqlstyleguide]: https://www.sqlstyle.guide/ "SQL style guide by Simon Holywell" [licence]: https://creativecommons.org/licenses/by-sa/4.0/ "Creative Commons Attribution-ShareAlike 4.0 International License"