2011-08-06 3 views
4

어제 동료가 나에게 다음과 같은 포스트그레스 쿼리를 보였다.SELECT * 대 SELECT *

내가 최근에 또 다른 언어에 대한 파서를 코딩 때문에
SELECT* FROM mytable; 

, 나는 더 깊이 이해하려고 노력하는 이유 쿼리 "컴파일"을 SELECT * FROM mytable;과 같은 결과를 반환하고 우리는이 일 것을 모두 놀랐다. 아마도이 때문에 어휘 분석하는 동안 유효한 쿼리로 인식되고

, 포스트 그레스는 토큰으로 입력에서 SELECT 읽은 다음이 *로 발견 다음 토큰, 검색 등 - 그게 더 많거나 적은 것 여기 가니?

또한 postgres lexer/parser는이 쿼리를 이해하기에 충분히 강하거나 다른 데이터베이스가 비슷한 SELECT* 쿼리를 이해합니까?

+1

작품. – Jacob

+0

APEX과 관련이 있는지 확실하지 않습니다. –

+0

간격에 관계없이 DB가 "SELECT *"를 허용한다는 사실에 혼란 스럽습니까, 간격에 관계없이 "SELEcT *"가 허용되는지 궁금하십니까? 후자는 일반적으로 프로그래밍 언어의 표준입니다. 공백은 일반적으로 선택 사항입니다. 나는 "SELECT *"가 데이터베이스 벤더들 사이에 얼마나 흔한 지 모르지만, 분명히 밝혀졌습니다. –

답변

5

보통 렉서는 현재 토큰에 속할 수없는 문자를 발견 할 때까지 현재 토큰에 문자를 추가 한 다음 이전에 계속할 수 없었던 곳에서 끝나고 다시 시작합니다.

는 그래서 여기에 무슨 일하면 렉서는 SELECT을 먹는다 및 다음 문자는 단어를 수집하고 있기 때문에, SELECT에 속할 수 없습니다하는 * 것을 볼 수 있다는 것입니다. 그래서 멈추고, 키워드 인 것으로 밝혀진 SELECT을 분석하고, 인식하는 *으로 시작합니다. 다른 프로그래밍 언어에서 42*22 * 2에서 모두 가져 오는 것과 같은 이유입니다.

다른 데이터베이스에서 작동하는지 여부는 어휘 분석기의 세부 사항과 문법 규칙에 따라 다릅니다.

2

내가 아는 한 SQL 스킵은 공백을 파싱하므로 SELECT*FROM or SELECT * FROM은 기본적으로 동일합니다.

무엇이 무엇인지 이해하려면 `'도 사용합니다. 따라서 SELECT * FROM myTable WHERE id = my string은와에서 "문자열"이 이해되지 않기 때문에 잘못된 쿼리가됩니다.

+0

정말입니까? 예를 들어 cularis는이 구문이 적어도 하나의 오라클에서 작동하지 않는다고 지적했습니다. –

3

분명히 tokenizer는 공백과 산술에 사용 된 특수 문자를 토큰 화합니다.

다음 SELECT 문의 BNF는 다음과 같습니다 h2database.com :하지 오라클 APEX 너무 MySQL을

SELECT [ TOP term ] [ DISTINCT | ALL ] selectExpression [,...] 
FROM tableExpression [,...] [ WHERE expression ] 
[ GROUP BY expression [,...] ] [ HAVING expression ] 
[ { UNION [ ALL ] | MINUS | EXCEPT | INTERSECT } select ] [ ORDER BY order [,...] ] 
[ LIMIT expression [ OFFSET expression ] [ SAMPLE_SIZE rowCountInt ] ] 
[ FOR UPDATE ]