본문 바로가기
DB/MySQL

BNF

by 가므자 2012. 2. 28.

모든 SQL 명련문과 공통 요소의 구문을 설명하기 위해서 형식적 표현 방법을 사용하였다.
이러한 표현 법을 Backus Naur Form(BNF)라고 한다.
BNF는 일련의 기호로 구성된 치환 규칙 또는 생성 규칙의 언어를 사용하고 있다. 하나의 기호는 각 생성 규칙으로 정의되닌다. 예를 들면, SQL 명령문에서 기호는 테이블 또는 콜론(:)이라 할 수 있다.
단말 기호는 기호의 특별한 종류이다.
단말 기호를 제외한 모든 기호는 생성 규칙에서 다른 기호의 항목으로 정의된다. 단말 기호의 예는 단어 CLOSE와 세미콜론이다.

< 와 > 기호
비단말 기호는 <>으로 표현된다. 생성 규칙은 모든 비단말 기호를 갖고 있다. 이러한 비단말 기호 명칭은 소문자로 나타낸다.
비단말 기호의 예는 <select statement>와 <table name>이다.

::= 기호
::= 기호는 생성 규칙에서 정의로부터 정의된 비단말 기호를 분리하기 위해서 사용된다. ::= 기호를 읽을 때는 "으로 정의된다"라고 한다.
<close statement> ::= CLOSE <cusor name>
설명 : CLOSE 명령문은 단말 기호 CLOSE와 그 다음에 있는 비단말 기호인 cursor name 이름으로 구성되어 있다. 여기에는 <cursor name>에 대한 생성 규칙이 있다.

| 기호
선택은 |기호로 표현된다.

[ 와 ] 기호
대괄호 내부에는 무엇인가 위치하면 사용할 수도 있다는 것이다. 다시 말하면 필요 없다면 생략할 수도 있다.
<Rollback statement> ::= ROLBACK [WORK}
ROLLBACK 명령문은 항상 ROLLBACK이라는 단어로 구성되고 선택으로 WORK라는 단어를 사용할 수 있다.

... 기호
생략 기호는 무엇인가 한번 이상 반복되는다는 것

{ 와 } 기호
중괄호로 감싼 모든 기호는 그룹을 구성한다. 예를 들면, | 기호와 함께 중괄호는 선택 대상이 무엇인지 명확하게 보여준다.

" 기호
" 기호와 같은 일부 메타 기호는 SQL 명령문 자체의 특별한 부분이다. 잘못 이해 하는 것을 피하기 위해서 이 기호는 이중 인용 부호로 감싼다.

::=

왼쪽의 항목은 오른쪽과 같이 정의

<element>

다른곳에 정의되어 있는 항목

[]

생략가능

{…|…}

여러항목중에 하나를 선택

…n

여러 번 반복 가능

Name,

Expression

이름 , 연산식등으로 대치시킬곳


테이블 정의
<테이블 정의> ::= create table <테이블명> ( <테이블요소> [ { , <테이블요소> } ... ] )
<테이블 요소> ::= <속성정의> | <테이블 제약정의>
<속성 정의> ::= <컬럼명> <데이터형> [ <컬럼제약> ]
<컬럼 제약> ::= not null [ unique | primary key ]
<테이블 제약 정의> ::= unique | primary key ( <컬럼명> [ { , <컬럼명> } ... ] )
<데이터형> 정의는 생략. 다음과 같이 사용함
char(size)
varchar(size)
number(size)
date
number(size,d) 

질의
<select> ::= select [ all | distinct ] [ <수식> [ { , <수식> } ... ] | * ] <from 구> [<where 구> ] [ <group 구> ] [ <having 구> ] [ <order 구>]
<from 구> ::= from <테이블 지정> [ { , <테이블 지정> } ... ]
<테이블 지정> ::= <테이블명> [ join <테이블명> on <결합 조건> ]
<결합조건> ::= <컬럼 지정> = <컬럼 지정>
<where 구> ::= where <검색조건>
<group 구> ::= group by <컬럼 지정> [ asc | desc ]
<having 구> ::= having <검색조건>
<order 구> ::= order by <컬럼 지정> [ asc | desc ] [ { , <컬럼 지정> [ asc | desc ] } ... ]
<수식> ::= <항> | <수식> + <항> | <수식> + <항>
<항> ::= <인자> | <항> * <인자> | <항> / <인자>
<인자> ::= [ + | - ] <1차인자>
<1차인자> ::= <값지정> | <컬럼 지정> | <집합함수 지정> | ( <수식> )
<속성 지정> ::= [ <테이블명> . ] <컬럼 명>
<집합함수지정> ::= count(*) | <distinct 집합함수> | <all 집합함수>
<distinct 집합함수> ::= { avg | max | min | sum | count } ( distinct <컬럼 명> )
<all 집합함수> ::= { avg | max | min | sum } ( [ all ]<컬럼 명> )
<검색조건> ::= <BOOL항> | <검색조건> or <BOOL항>
<BOOL항> ::= <BOOL인자> | <BOOL항> and <BOOL항>
<BOOL인자> ::= [ not ] <BOOL1차인자>
<BOOL1차인자> ::= <술어> | ( <검색조건> )
<술어> ::= <비교술어> | <between 술어> | <in 술어> | <like 술어> | <null 술어> | <한정술어> | <exists 술어>
<비교술어> ::= <수식> <비교연산자> { <수식> | <부질의> }
<비교연산자> ::= <> | = | < | > | <= | >=
<between 술어> ::= <수식> [ not ] between <수식> and <식>
<in 술어> ::= <수식> [ not ] in { <한정값 리스트} | <부질의> }
<한정값 리스트> ::= <값지정> [ { , <값지정> } ... ]
<like 술어> ::= <속성 지정> [ not ] like <패턴>
<패턴> ::= <값지정>
<null 술어> ::= <컬럼 지정> is [ not ] null
<한정술어> ::= <수식> <비교연산자> <한정자> <부질의>
<한정자> ::= all | <some 술어>
<some 술어> ::= some | any
<exists 술어> ::= exists <부질의>

부질의
<질의지정> ::= select [ all | distinct ]  { <수식> | * }  <from 구>  [ <where 구> ]  [ <group 구> ]  [ <having 구> ] 

복수질의
<질의 지정> ::= select [ all | distinct ] [ <수식> [ { , <수식> } ... ] | * ] <from 구> [ <where 구> ] [ <group 구> ] [ <having 구> ] [ <order 구> ] 

insert문
<insert문> ::= insert into <테이블명> [ { <삽입 컬럼 리스트>} ] { values ( <삽입값 리스트> | <질의 지정> }
<삽입 컬럼 리스트> ::= <컬럼명> [ { , <컬럼명> } ...
<컬럼값 리스트> ::= <추가값> [ { , <추가값> } ...
<추가값> ::= <값지정> | null 

update문
< update문 > ::= update <테이블명> set <설정구:검색> [ { , <설정구:검색> } ... ] [ where <검색조건> ]
<설정구:검색> ::= <대상 컬럼:검색> = { <수식> | null }
<대상 컬럼:검색> ::= <컬럼명>
 
delete문
< delete문 > ::= delete from <테이블명> [ where <검색조건> ] 

기호의 의미
::= : 정의
| : 또는
{} : 0번 이상의 반복
[] : 선택사항(없어도 됨)

'DB > MySQL' 카테고리의 다른 글

테이블 생성 및 삭제하기  (0) 2012.03.02
6장 SELECT 명령문과 공통 요소  (0) 2012.03.02
5장 테이블 생성  (0) 2012.02.28
4장 연습 문제  (0) 2012.02.23
4.3.4 질의(Query)  (0) 2012.02.23

댓글