[FROM x, y]는 Postgres에서 무엇을 의미합니까?


12

Postgres를 시작하고 있습니다. 이 문서를 읽고이 쿼리를 보았습니다.

SELECT title, ts_rank_cd(textsearch, query) AS rank
FROM apod, to_tsquery('neutrino|(dark & matter)') query
WHERE query @@ textsearch
ORDER BY rank DESC
LIMIT 10;

나는이 쿼리에 모든 것을 이해할 수 를 제외하고 이에 대한 : FROM apod, ....

이것은 무엇을 ,의미합니까? FROM쉼표로 구분 된 여러 명령문 에 조인하는 데 익숙하지 않습니다 .

나는 쓸모없는 그물을 검색했습니다. 그것을보고 생각한 후에는 query라는 변수를 선언하여 여러 번 사용할 수있는 것으로 보입니다. 그러나 이것이 사실이라면, 그것은 무엇과 관련이 FROM있습니까?

답변:


10

암시 적을 만듭니다 CROSS JOIN. SQL-89 구문입니다.

여기서는 예제 용으로 pseduo-tables (값 테이블)을 사용 values(1)하고 values(2)생성합니다. 그 후 일이 t(x), 그리고 g(y)이라고 별칭부터 괄호 안에 문자가 열 (대한 별칭입니다 xy각각이). 이것을 테스트하기 위해 테이블을 쉽게 만들 수 있습니다.

SELECT *
FROM (values(1)) AS t(x), (values(2)) AS g(y)

다음은 지금 쓰는 방법입니다.

SELECT *
FROM (values(1)) AS t(x)
CROSS JOIN (values(2)) AS g(y);

거기 INNER JOIN에서 조건을 추가하여 이를 암시 적 으로 만들 수 있습니다 .

SELECT *
FROM (values(1)) AS t(x)
CROSS JOIN (values(1)) AS g(z)
WHERE x = z;

또는 명시적이고 새로운 INNER JOIN구문

SELECT *
FROM (values(1)) AS t(x)
INNER JOIN (values(1)) AS g(z)
  ON ( x = z );

예를 들어 ..

FROM apod, to_tsquery('neutrino|(dark & matter)') query

이것은 본질적으로 새로운 구문과 동일합니다.

FROM apod
CROSS JOIN to_tsquery('neutrino|(dark & matter)') AS query

이 경우 실제로는 동일 to_tsquery()합니다.

SELECT title, ts_rank_cd(
  textsearch,
  to_tsquery('neutrino|(dark & matter)')
) AS rank
FROM apod
WHERE to_tsquery('neutrino|(dark & matter)') @@ textsearch
ORDER BY rank DESC
LIMIT 10;

그러나 위의 내용은 to_tsquery('neutrino|(dark & matter)')두 번 발생할 수 있지만이 경우에는 STABLE (으로 확인 됨 ) to_tsquery로 표시 되지 않습니다 .\dfS+ to_tsquery

STABLE함수는 데이터베이스를 수정할 수 없으며 단일 테이블 스캔에서 동일한 인수 값에 대해 동일한 결과를 일관되게 리턴하지만 결과는 SQL 문에서 변경 될 수 있음을 나타냅니다. 이는 데이터베이스 조회, 매개 변수 (예 : 현재 시간대) 등에 따라 결과가 달라지는 함수에 적합한 선택입니다. (현재 명령으로 수정 된 행을 쿼리하려는 AFTER 트리거에는 적합하지 않습니다.) current_timestamp 함수 계열은 트랜잭션 내에서 값이 변경되지 않으므로 안정적인 것으로 간주됩니다.

SQL-89와 SQL-92의 차이점을 더 완벽하게 비교하려면 여기 내 답변도 참조하십시오.


대단히 감사합니다. 방금 SQL로 시작하고 있습니다. ,단지 직교 곱이므로 비교가 필요하지 않기 때문에 크로스 조인이되는 것이 합리적입니다 . 질문 하나만 더 대답 해 주시겠습니까? 무엇 t(x)(values(1)) AS t(x)???
andrerpena

@andrerpena가 업데이트되었습니다.
Evan Carroll

1
너는 최고야. 맑은 설명. 엄청 고마워.
andrerpena

테이블 별명에 대한 "FROM 별명"이라는 용어를 들어 본 적이 없습니다 . 행이 아닌 값을to_tsquery() 반환합니다 . 함수가 정의 되었다고해서 쿼리 플래너 반복적 인 평가 피하는 것은 아닙니다 . 그것은 할 수 있습니다 . STABLE
Erwin Brandstetter

12

매뉴얼에는 테이블 표현식 장의 목록 에서 쉼표에FROM 대한 자세한 설명이 있습니다 .

FROM절은 쉼표로 구분 테이블 참조 목록에서 지정된 하나 개 이상의 다른 테이블에서 테이블을 유도한다.

FROM table_reference [, table_reference [, ...]]

테이블 참조는 테이블 이름 (아마도 스키마 한정)이거나 하위 쿼리, JOIN구문 또는 이들의 복잡한 조합 과 같은 파생 테이블 일 수 있습니다. FROM절 에 둘 이상의 테이블 참조가 나열 되면 테이블이 교차 결합됩니다 (즉, 행의 카티 전 곱이 형성됩니다 (아래 참조)).

쉼표로 구분 된 테이블 참조가 명시 적 JOIN구문 보다 이전 버전의 SQL 표준에서 정의되었다고 해서 쉼표가 잘못되거나 오래 되지않습니다 . 기술적으로 필요한 경우 (아래 참조) 또는 쿼리 텍스트를보다 명확하게하는 경우 명시 적 조인 구문을 사용하십시오.

매뉴얼 다시 :

FROM T1 CROSS JOIN T2FROM T1 INNER JOIN T2 ON TRUE (아래 참조) 와 동일합니다 . 또한와 동일합니다 FROM T1, T2.

그러나 "동등한" 동일 하지 않다 . 매뉴얼 노트같이 미묘한 차이 가 있습니다 .

참고 쉼표보다 더 밀접하게 바인드
되므로 두 개 이상의 테이블이 표시되면이 후자의 동등성이 정확하게 유지되지 않습니다 JOIN. 예를 들어 첫 번째 경우 는 참조 할 수 있지만 두 번째 경우 는 참조 할 수 없기 때문에 FROM T1 CROSS JOIN T2 INNER JOIN T3 ON condition동일 하지 않습니다.FROM T1, T2 INNER JOIN T3 ON conditionconditionT1

이 관련 질문은 차이점의 관련성을 보여줍니다.

기본적으로, 당신의 관찰은 정확히 맞습니다 :

쿼리라는 변수를 선언하여 여러 번 사용할 수있는 것 같습니다.

목록에서 모든 기능을 "테이블 기능"으로 사용할 수 있습니다 FROM. 그리고 함수 매개 변수는 다음과 같은 표기법 때문에 모든 테이블에서 함수의 왼쪽으로 열을 참조 할 수 있습니다.

FROM apod, to_tsquery('neutrino|(dark & matter)') query

실제로 다음과 같습니다.

FROM apod CROSS JOIN LATERAL to_tsquery('neutrino|(dark & matter)') AS query

LATERAL 쿼리에 대한 매뉴얼 :

나타나는 테이블 함수 FROM앞에 키워드 LATERAL가 올 수도 있지만 함수의 경우 키워드는 선택 사항입니다 . 함수의 인수는 어떤 경우에도 선행 FROM 항목이 제공 한 열에 대한 참조를 포함 할 수 있습니다.

대담한 강조 광산.

키워드는AS 완전히 전에 옵션 잡음 테이블 별칭 (같은 반대 열 별칭 이 생략하지 않는 것이 좋습니다 것, AS가능한 모호성을 피하기 위해). 더 관련 답변 :

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.