SQL 쿼리에서 시작 전 선택이 왜 필요한가요? [닫은] 필드를 지정한 다음 원하는

이것은 학교에서 나를 많이 괴롭힌 것입니다.

5 년 전, SQL을 배울 때 항상 원하는 필드를 지정한 다음 원하는 위치를 지정해야하는 이유가 항상 궁금했습니다.

내 생각에 따르면 다음과 같이 작성해야합니다.

From Employee e
Select e.Name

그렇다면 왜 표준이 다음을 말합니까?

Select e.Name -- Eeeeek, what does e mean?
From Employee e -- Ok, now I know what e is

SQL을 이해하는 데 몇 주가 걸렸으며 잘못된 순서의 요소가 많은 시간을 소비했다는 것을 알고 있습니다.

C #으로 작성하는 것과 같습니다.

string name = employee.Name;
var employee = this.GetEmployee();

따라서 역사적인 이유가 있다고 가정합니다. 왜?



답변

원래 SQL 언어는 속편 불렀다 서에 대한

  • 구조적 영어 쿼리 언어는
    온 강조와 함께 영어 로 철자 가까이 그것을 가정, 자연 언어.

이제 영어 문장을 철자 할 때이 두 문장의 철자를 쓰십시오.

  1. “직원 테이블에서 e 열 이름 선택”
  2. “열 e.Name from Employee 테이블 e”를 선택하십시오.

두 번째는 자연 영어에 가깝게 들리므로 표준으로 설정됩니다.

BTW 같은 추론 Where등-SQL 문은 의도적으로 자연어에 가깝게 들리도록 설계되었습니다.


답변

SELECT 문에 SELECT가 필요하고 FROM이 필요하지 않기 때문입니다.

Select 'This String'

물론 SQL 문을 구문 분석하여 FROM 이후에 SELECT, DELETE, UPDATE를 찾을 수는 있지만 실제로 그렇게 큰 문제입니까?

이것은 모두 지능 이전에 수행되었다는 것을 기억하십시오. 그렇게 복잡하지 않습니다.

편집 : 아마도 SQL 인터프리터가 두 가지를 모두 수행 할 수있는 이유는 없습니다.


답변

내가 참조하여 백업 할 수있는 답을 알고,하지만 난 추측이 있다면하지 마십시오 : SQL이있다 선언적 언어 와 같은 언어의 문을 설명 무엇 반대로 당신이하고 싶은 방법 당신이 그것을하고 싶습니다.

따라서 “FROM Y SELECT X”를 작성하는 것과 달리 “SELECT X FROM Y”는 “데이터베이스에서 무엇을 선택하고 싶은지”라고 대답하는보다 적절한 방법으로 들립니다.

또한 SQL에서 SELECT / UPDATE / INSERT는 수행하려는 작업 유형을 지정하며 FROM은 데이터베이스의 올바른 테이블에서 선택하는 데 도움이되는 절입니다. 다시, 무엇을 당신이 데이터를하고있는 것은보다 우선 어떻게 당신이 달성하려고 정확히.


답변

SQL은 영어 사용자를 대상으로하는 구조화 된 쿼리 언어입니다. SELECT, INSERT, UPDATE 및 DELETE는 필수 명령입니다. 영어 명령은 문장이나 문장을 시작합니다. 비교:

West young man go!

Go west young man!

SQL은 두 번째 (제한적) 형식을 따릅니다. 또한 네 개의 명령형 명령은 세 가지 형식이 크게 다릅니다. 치다:

FROM    employees a,
        accounts b
UPDATE  ...

또는

INTO    customers a
SELECT  ...

수행중인 조치를 알고 있으면 올바른 형식을 선택하는 것이 더 쉽습니다.

선택의 경우 원하는 속성을 결정한 다음 해당 속성이있는 테이블을 추가하십시오. 선택 기준을 작성할 때 테이블을 추가 할 수 있습니다. 기준을 동적으로 추가하는 경우 일반적으로 쿼리의 정적 부분 끝에서 수행 할 수 있습니다.


답변

SQL 문은 동사로 시작합니다. 그것은 언어 디자이너의 선택이었고 많은 프로그래밍 언어가 그렇게 작동합니다. 의미 상 다음과 같은 프로그래밍 언어를 보는 것은 드문 일이 아닙니다.

verb(noun, noun, noun);

또한, 예를 들어 SELECT 문을 제공하는 경우 제안 된 구문은 오브젝트를 명령문에서 가장 먼저 배치합니다. VSO (동사, 주제, 객체) 문장 순서 대신 OVS를 사용하면 자연 언어와 비교할 때 매우 이상합니다. SVO (예 : 영어), VSO (예 : 아랍어) 및 SOV (예 : 라틴어)는 사람의 말에 대한보다 합리적인 근사치입니다.


답변

구문 분석, 특히 하위 쿼리와 같이 구문 분석이 크게 복잡해질 것이라고 생각합니다.

  FROM Foo f
  JOIN (FROM Bar b
        WHERE b.ID = f.ID
        UPDATE b
           SET b.Wibble = 1) x
    ON x.ID = f.ID
SELECT f.XYZ

이것을 파싱하는 것이 더 복잡합니다. FROM 절을 구문 분석 할 때까지 UPDATE가 구문 오류임을 알 수 없었으며 구문 분석기는 서브 쿼리를 구문 분석하고 있음을 알기 위해 충분한 컨텍스트를 기억해야합니다. 어쨌든 하위 쿼리에서는 업데이트가 허용되지 않는다고 생각하지만 (RETURNING 절이있을 수 있음) SELECT 문을 구문 분석 할 때까지 이것이 유효하지 않다고 말할 수 없습니다.

이것은 문법에 대해 적어도 k (lookahead)를 증가시키고 최악의 상황에서는 문맥에 민감하게 만듭니다. 그러나 이것은 대학에서 다소 어둡게 기억되는 컴파일러 디자인 논문의 범위를 확장하고 있습니다.


답변