이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
다음에 대한 동일한 페이지를 보고 싶을 수도 있습니다.와이즈 토토 4_AAA버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

7.2. 토토 표현식

A 토토 표현식테이블을 계산합니다. 토토 표현식에는발신선택적으로 뒤에 오는 절어디, 그룹별가지고 있는 중절. 간단한 토토 표현식은 단순히 디스크의 테이블, 소위 기본 테이블을 참조하지만, 보다 복잡한 표현식을 사용하여 기본 테이블을 다양한 방식으로 수정하거나 결합할 수 있습니다.

선택사항어디, 그룹별가지고 있는 중11268_11390발신절. 이러한 모든 변환은 쿼리의 출력 행을 계산하기 위해 선택 목록에 전달되는 행을 제공하는 가상 토토을 생성합니다.

7.2.1. 그만큼발신

FROM 절쉼표로 구분된 토토 참조 목록에 제공된 하나 이상의 다른 토토에서 토토을 파생합니다.

발신토토_참조 [, 토토_참조 [, ...]]

토토 참조는 토토 이름(스키마 한정)이거나 하위 쿼리와 같은 파생 토토일 수 있습니다.가입구성 또는 이들의 복잡한 조합. 둘 이상의 토토 참조가에 나열되어 있는 경우발신절, 토토이 교차 결합됩니다(즉, 해당 행의 데카르트 곱이 형성됩니다. 아래 참조). 결과는발신list는 다음에 의해 변환될 수 있는 중간 가상 테이블입니다.어디, 그룹별가지고 있는 중절이며 최종적으로 전체 토토 표현식의 결과입니다.

토토 참조가 토토 상속 계층의 상위 토토을 명명할 때, 토토 참조는 키워드가 아닌 한 해당 토토뿐만 아니라 모든 하위 토토의 행을 생성합니다.토토 이름 앞에 옵니다. 그러나 참조는 명명된 토토에 나타나는 열만 생성하며 하위 토토에 추가된 모든 열은 무시됩니다.

글을 쓰는 대신테이블 이름 앞에 다음과 같이 쓸 수 있습니다.*토토 이름 뒤에 하위 토토이 포함되도록 명시적으로 지정합니다. 글쓰기*해당 동작이 기본값이므로 필요하지 않습니다(설정을 변경하지 않는 한sql_inheritance구성 옵션). 그러나 쓰기*추가 토토이 검색된다는 점을 강조하는 데 유용할 수 있습니다.

7.2.1.1. 조인된 테이블

조인된 테이블은 특정 조인 유형의 규칙에 따라 두 개의 다른(실제 또는 파생) 테이블에서 파생된 테이블입니다. 내부, 외부 및 교차 조인을 사용할 수 있습니다. 조인된 테이블의 일반적인 구문은 다음과 같습니다.

T1 join_type T2 [ join_condition ]

모든 유형의 조인은 함께 연결되거나 중첩될 수 있습니다: 둘 중 하나 또는 둘 다T1그리고T2토토을 조인할 수 있습니다. 주위에 괄호를 사용할 수 있습니다.가입조인 순서를 제어하는 ​​절입니다. 괄호가 없으면,가입절은 왼쪽에서 오른쪽으로 중첩됩니다.

조인 유형

교차 조인
T1교차 조인T2

다음의 가능한 모든 행 조합에 대해T1그리고T2(즉, 데카르트 곱), 조인된 테이블에는 다음의 모든 열로 구성된 행이 포함됩니다.T1다음에 모든 열이 옵니다.T2. 토토에 각각 N 및 M 행이 있는 경우 조인된 토토에는 N * M 행이 있습니다.

발신T1교차 조인T2다음과 동일함발신T1내부 조인T2참으로 설정(아래 참조). 또한 다음과 같습니다.발신T1, T2.

참고:이 후자의 동등성은 두 개 이상의 토토이 나타날 때 정확히 유지되지 않습니다. 왜냐하면가입쉼표보다 더 긴밀하게 바인딩됩니다. 예를 들어발신T1교차 조인T2내부 조인T3켜짐조건다음과 동일하지 않습니다발신T1, T2내부 조인T3켜짐조건왜냐하면조건참조 가능T1첫 번째 경우에는 있지만 두 번째 경우에는 그렇지 않습니다.

적격한 조인
T1 { [내부] |  왼쪽 | 맞다 | 가득한  [외부]  가입T2켜짐boolean_expression
T1 { [내부] |  왼쪽 | 맞다 | 가득한  [외부]  가입T2사용 중(열 목록 조인 )
T1자연스러운  [내부] |  왼쪽 | 맞다 | 가득한  [외부]  가입T2

말씀내부그리고외부모든 형태에서 선택사항입니다.내부기본값입니다.왼쪽, 오른쪽전체외부 조인을 암시합니다.

조인 조건다음에 지정됨켜짐또는사용 중절 또는 단어에 의해 암시적으로자연. 조인 조건은 두 소스 테이블의 어떤 행이 고려되는지 결정합니다."일치", 아래에 자세히 설명되어 있습니다.

적격한 조인의 가능한 유형은 다음과 같습니다:

내부 조인

T1의 각 행 R1에 대해 조인된 테이블에는 T2의 각 행에 대해 R1과의 조인 조건을 충족하는 행이 있습니다.

왼쪽 외부 조인

먼저 내부 조인이 수행됩니다. 그런 다음 T2의 어떤 행과도 조인 조건을 충족하지 않는 T1의 각 행에 대해 T2의 열에 null 값이 있는 조인된 행이 추가됩니다. 따라서 조인된 테이블에는 항상 T1의 각 행에 대해 하나 이상의 행이 있습니다.

오른쪽 외부 조인

먼저 내부 조인이 수행됩니다. 그런 다음 T1의 어떤 행과도 조인 조건을 충족하지 않는 T2의 각 행에 대해 T1의 열에 null 값이 있는 조인된 행이 추가됩니다. 이는 왼쪽 조인의 반대입니다. 결과 테이블에는 항상 T2의 각 행에 대한 행이 있습니다.

완전 외부 조인

먼저 내부 조인이 수행됩니다. 그런 다음 T2의 어떤 행과도 조인 조건을 충족하지 않는 T1의 각 행에 대해 T2의 열에 null 값이 있는 조인된 행이 추가됩니다. 또한 T1의 어떤 행과도 조인 조건을 만족하지 않는 T2의 각 행에 대해 T1의 열에 null 값이 있는 조인된 행이 추가됩니다.

ON절은 가장 일반적인 종류의 조인 조건입니다. a에서 사용되는 것과 동일한 종류의 부울 값 표현식을 사용합니다.어디절. 의 행 쌍T1그리고T2일치하는 경우ON표현식은 true로 평가됩니다.

사용 중절은 조인 양쪽에서 조인 열에 동일한 이름을 사용하는 특정 상황을 활용할 수 있도록 하는 약어입니다. 공유 열 이름의 쉼표로 구분된 목록을 사용하고 각각에 대한 동등 비교를 포함하는 조인 조건을 형성합니다. 예를 들어 가입T1그리고T2함께(a, b) 사용조인 조건 생성ONT1.a =T2.a ANDT1.b =T2.b.

또한 다음의 출력은다음을 사용하여 가입중복 열을 억제합니다. 두 열은 동일한 값을 가져야 하므로 일치하는 두 열을 모두 인쇄할 필요가 없습니다. 하는 동안가입하세요다음의 모든 열을 생성합니다.T1다음의 모든 열이 이어짐T2, 다음을 사용하여 가입나열된 열 쌍 각각에 대해 하나의 출력 열(나열된 순서대로)을 생성하고 그 뒤에 나머지 열이 생성됩니다.T1, 그 뒤에의 나머지 열이 옵니다.T2.

마지막으로,자연스러운는의 약어입니다.사용 중: 그것은 a를 형성합니다사용 중두 입력 토토 모두에 나타나는 모든 열 이름으로 구성된 목록입니다. 마찬가지로사용 중, 이러한 열은 출력 토토에 한 번만 나타납니다. 공통 열 이름이 없는 경우,자연 조인다음과 같이 행동합니다참여 ... ON, 교차곱 조인을 생성합니다.

참고: 사용 중은 나열된 열만 결합되므로 조인된 관계의 열 변경으로부터 합리적으로 안전합니다.자연두 관계에 대한 스키마 변경으로 인해 새로운 일치 열 이름이 존재하게 되면 조인이 해당 새 열도 결합하게 되므로 훨씬 더 위험합니다.

이것을 합치려면 토토이 있다고 가정합니다.t1:

번호 | 이름
-----+------
   1 | 에이
   2 | 비
   3 | 기음

그리고t2:

번호 | 값
------+-------
   1 | 트리플 엑스
   3 | 이야
   5 | 쿨쿨

그러면 다양한 조인에 대해 다음과 같은 결과를 얻습니다.

= SELECT * FROM t1 CROSS JOIN t2;번호 | 이름 | 숫자 | 값
------+------+------+-------
   1 | |   1 | 트리플 엑스
   1 | |   3 | 이야
   1 | |   5 | 쿨쿨
   2 | 비 |   1 | 트리플 엑스
   2 | 비 |   3 | 이야
   2 | 비 |   5 | 쿨쿨
   3 | c |   1 | 트리플 엑스
   3 | c |   3 | 이야
   3 | c |   5 | 쿨쿨
(9행)= SELECT * FROM t1 INNER JOIN t2 ON t1.num = t2.num;번호 | 이름 | 숫자 | 값
------+------+------+-------
   1 | |   1 | 트리플 엑스
   3 | c |   3 | 이야
(2행)= SELECT * FROM t1 INNER JOIN t2 USING (num);번호 | 이름 | 값
------+------+-------
   1 | | 트리플 엑스
   3 | c | 이야
(2행)= SELECT * FROM t1 NATURAL INNER JOIN t2;번호 | 이름 | 값
------+------+-------
   1 | | 트리플 엑스
   3 | c | 이야
(2행)= SELECT * FROM t1 LEFT JOIN t2 ON t1.num = t2.num;번호 | 이름 | 숫자 | 값
------+------+------+-------
   1 | |   1 | 트리플 엑스
   2 | 비 |     |
   3 | c |   3 | 이야
(3행)= SELECT * FROM t1 LEFT JOIN t2 USING (num);번호 | 이름 | 값
------+------+-------
   1 | | 트리플 엑스
   2 | 비 |
   3 | c | 이야
(3행)= SELECT * FROM t1 RIGHT JOIN t2 ON t1.num = t2.num;번호 | 이름 | 숫자 | 값
------+------+------+-------
   1 | |   1 | 트리플 엑스
   3 | c |   3 | 이야
     |      |   5 | 쿨쿨
(3행)= SELECT * FROM t1 FULL JOIN t2 ON t1.num = t2.num;번호 | 이름 | 숫자 | 값
------+------+------+-------
   1 | |   1 | 트리플 엑스
   2 | 비 |     |
   3 | c |   3 | 이야
     |      |   5 | 쿨쿨
(4행)

다음으로 지정된 조인 조건ON또한 조인과 직접 관련되지 않은 조건을 포함할 수 있습니다. 이는 일부 쿼리에 유용할 수 있지만 신중하게 생각해야 합니다. 예를 들어:

= SELECT * FROM t1 LEFT JOIN t2 ON t1.num = t2.num AND t2.value = 'xxx';번호 | 이름 | 숫자 | 값
------+------+------+-------
   1 | |   1 | 트리플 엑스
   2 | 비 |     |
   3 | c |     |
(3행)

다음에 제한을 두는 것에 주목하세요.어디절이 다른 결과를 생성합니다:

= SELECT * FROM t1 LEFT JOIN t2 ON t1.num = t2.num WHERE t2.value = 'xxx';번호 | 이름 | 숫자 | 값
------+------+------+-------
   1 | |   1 | 트리플 엑스
(1행)

이것은 다음에 제한이 있기 때문입니다.켜짐절이 처리되었습니다이전조인, 제한사항이 있는 동안어디에서절이 처리되었습니다이후조인. 내부 조인에서는 중요하지 않지만 외부 조인에서는 매우 중요합니다.

7.2.1.2. 테이블 및 열 별칭

임시 이름은 쿼리의 나머지 부분에서 파생된 토토에 대한 참조에 사용되는 토토 및 복합 토토 참조에 부여될 수 있습니다. 이것을 a라고 합니다.토토 별칭.

토토 별칭을 생성하려면 다음을 작성하십시오.

발신토토_참조AS별칭

또는

발신토토_참조 별칭

AS키워드는 선택적 노이즈입니다.별칭어떤 식별자든 가능합니다.

토토 별칭의 일반적인 적용은 조인 절을 읽을 수 있도록 긴 테이블 이름에 짧은 식별자를 할당하는 것입니다. 예를 들어:

SELECT * FROM some_very_long_table_name s JOIN another_fairly_long_name a ON s.id = a.num;

별칭은 현재 쿼리에 관한 한 테이블 참조의 새 이름이 됩니다. 쿼리의 다른 곳에서 원래 이름으로 테이블을 참조하는 것은 허용되지 않습니다. 따라서 이는 유효하지 않습니다.

SELECT * FROM my_table AS m WHERE my_table.a  5;    -- 잘못된

토토 별칭은 주로 표기상의 편의를 위한 것이지만 테이블을 자체적으로 조인할 때 이를 사용해야 합니다. 예:

SELECT * FROM people AS mother JOIN people AS child ON mother.id = child.mother_id;

또한 테이블 참조가 하위 쿼리인 경우 별칭이 필요합니다(참조섹션 7.2.1.3).

괄호는 모호성을 해결하는 데 사용됩니다. 다음 예에서 첫 번째 문은 별칭을 할당합니다.b두 번째 인스턴스로내_토토, 그러나 두 번째 문은 조인 결과에 별칭을 할당합니다.

SELECT * FROM my_table AS a CROSS JOIN my_table AS b ...
SELECT * FROM (my_table AS a CROSS JOIN my_table) AS b ...

토토 별칭의 또 다른 형태는 테이블 자체뿐만 아니라 테이블의 열에 임시 이름을 부여합니다:

발신토토_참조 [AS] 별칭 ( 열1 [, 열2 [, ...]] )

실제 테이블에 열이 있는 것보다 더 적은 수의 열 별칭이 지정되면 나머지 열의 이름은 바뀌지 않습니다. 이 구문은 셀프 조인이나 하위 쿼리에 특히 유용합니다.

별칭이 a의 출력에 적용될 때가입절, 별칭은 내의 원래 이름을 숨깁니다.가입. 예를 들어:

SELECT a.* FROM my_table AS a JOIN your_table AS b ON ...

유효한 SQL이지만:

SELECT a.* FROM (my_table AS a JOIN your_table AS b ON ...) AS c

유효하지 않습니다. 토토 별칭a별칭 외부에는 표시되지 않습니다.c.

7.2.1.3. 하위 쿼리

파생 토토을 지정하는 하위 쿼리는 괄호로 묶어야 하며반드시토토 별칭 이름이 할당됩니다(예:섹션 7.2.1.2). 예를 들어:

FROM (SELECT * FROM table1) AS alias_name

이 예는FROM table1 AS alias_name. 일반 조인으로 축소할 수 없는 더 흥미로운 사례는 하위 쿼리에 그룹화 또는 집계가 포함될 때 발생합니다.

하위 쿼리는 다음과 같을 수도 있습니다.목록:

FROM (VALUES ('앤', '스미스'), ('밥', '존스'), ('조', '블로우'))
     AS 이름(이름, 성)

다시 말하지만, 토토 별칭이 필요합니다. 의 열에 별칭 이름 할당목록은 선택사항이지만 좋은 습관입니다. 자세한 내용은 참조PostgreSQL : 문서 : 9.5 : 값 롤 토토.

7.2.1.4. 테이블 함수

테이블 함수는 기본 데이터 유형(스칼라 유형) 또는 복합 데이터 유형(테이블 행)으로 구성된 일련의 행을 생성하는 함수입니다. 에서 테이블, 뷰 또는 하위 쿼리처럼 사용됩니다.발신쿼리의 절입니다. 테이블 함수에서 반환된 열은 다음에 포함될 수 있습니다.선택, 가입, 또는어디에서테이블, 뷰 또는 하위 쿼리의 열과 동일한 방식으로 절을 사용합니다.

테이블 함수는 다음을 사용하여 결합될 수도 있습니다.행에서구문, 결과가 병렬 열에 반환됨. 이 경우 결과 행의 수는 가장 큰 함수 결과의 수이며 더 작은 결과는 일치하도록 null 값으로 채워집니다.

function_call [순서 포함] [[AS] table_alias [(column_alias [, ... ])]]
다음 행(function_call [, ... ] ) [순서대로] [[AS] table_alias [(column_alias [, ... ])]]

만약에순서 포함절이 지정되었습니다. 유형의 추가 열입니다.비긴트함수 결과 열에 추가됩니다. 이 열은 1부터 시작하여 함수 결과 집합의 행 번호를 지정합니다. (이것은 SQL 표준 구문을 일반화한 것입니다.UNNEST ... 순서대로.) 기본적으로 순서 열이 호출됩니다.순서, 그러나를 사용하여 다른 열 이름을 할당할 수 있습니다.AS절.

특수 토토 함수UNNEST은(는) 원하는 개수의 배열 매개변수로 호출될 수 있으며, 다음과 같이 해당 개수의 열을 반환합니다.UNNEST (PostgreSQL : 문서 : 9.5 : 스포츠 토토 사이트 함수 및 연산자)는 각 매개변수에 대해 개별적으로 호출되었으며 다음을 사용하여 결합되었습니다.행에서구조물.

UNNEST(배열_표현 [, ... ] ) [순서 포함] [[AS] table_alias [(column_alias [, ... ])]]

아니면table_alias을 지정하면 함수 이름이 토토 이름으로 사용됩니다. a의 경우행에서()구조, 첫 번째 함수의 이름이 사용됩니다.

열 별칭이 제공되지 않으면 기본 데이터 유형을 반환하는 함수의 경우 열 이름도 함수 이름과 동일합니다. 복합 유형을 반환하는 함수의 경우 결과 열은 해당 유형의 개별 속성 이름을 가져옵니다.

일부 예:

CREATE TABLE foo(foid int, foosubid int, fooname 텍스트);

함수 생성 getfoo(int)는 setof foo를 $$로 반환합니다.
    SELECT * FROM foo WHERE fooid = $1;
$$ 언어 SQL;

SELECT * FROM getfoo(1) AS t1;

SELECT * FROM foo에서
    foosubid가 있는 곳(
                        foosid 선택
                        getfoo(foo.foooid) z에서
                        여기서 z.foid = foo.foid
                      );

CREATE VIEW vw_getfoo AS SELECT * FROM getfoo(1);

SELECT * vw_getfoo에서;

어떤 경우에는 호출 방법에 따라 다른 열 집합을 반환할 수 있는 테이블 함수를 정의하는 것이 유용합니다. 이를 지원하기 위해 의사 유형을 반환하도록 테이블 함수를 선언할 수 있습니다.기록아니요아웃매개변수. 이러한 함수가 쿼리에 사용되는 경우 시스템이 쿼리를 구문 분석하고 계획하는 방법을 알 수 있도록 쿼리 자체에 예상되는 행 구조를 지정해야 합니다. 이 구문은 다음과 같습니다.

function_call [AS] 별칭 (열_정의 [, ... ])
function_callAS [별칭] (column_definition [, ... ])
행( ...function_callAS (column_definition [, ... ]) [, ... ] )

다음을 사용하지 않을 때행에서()구문, the열_정의list는 그렇지 않으면 첨부될 수 있는 열 별칭 목록을 대체합니다.발신항목; 열 정의의 이름은 열 별칭 역할을 합니다. 를 사용할 때행에서()구문, a열_정의목록은 각 멤버 함수에 개별적으로 첨부될 수 있습니다. 또는 멤버 함수가 하나만 있고 멤버 함수가 없는 경우순서 포함절, a열_정의다음 열 별칭 목록 대신 목록을 작성할 수 있습니다.행에서().

이 예를 생각해 보세요:

선택 *
    FROM dblink('dbname=mydb', 'SELECT proname, prosrc FROM pg_proc')
      AS t1(이름, prosrc 텍스트)
    'bytea%'와 같은 이름이 있는 곳;

PostgreSQL : 문서 : 9.5 : 사설 토토함수(의 일부PostgreSQL : 문서 : 9.5 : 롤 토토모듈)은 원격 쿼리를 실행합니다. 복귀를 선언합니다기록이것은 모든 종류의 쿼리에 사용될 수 있기 때문입니다. 파서가 예를 들어 무엇을 알 수 있도록 호출 쿼리에 실제 열 집합을 지정해야 합니다.*다음으로 확장되어야 합니다.

이 예에서는 다음을 사용합니다.행에서:

선택 *
행에서부터
    (
        json_to_recordset('["a":40,"b":"foo","a":"100","b":"bar"]')
            AS(a INTEGER, b TEXT),
        generate_series(1, 3)
    ) AS x (p, q, s)
p로 주문하세요;

  피 |  q | 에스
------+------+---
  40 | 푸 | 1
 100 | 바 | 2
     |     | 3

두 개의 기능을 하나로 결합합니다.발신목표.json_to_recordset()첫 번째 열인 두 개의 열을 반환하도록 지시받습니다.정수그리고 두 번째텍스트. 결과는generate_series()직접 사용됩니다. 그만큼주문 기준절은 열 값을 정수로 정렬합니다.

7.2.1.5. 측면하위 쿼리

다음에 나타나는 하위 쿼리발신키워드가 앞에 올 수 있음측면. 이를 통해 이전에 제공된 열을 참조할 수 있습니다.발신항목. (없이측면, 각 하위 쿼리는 독립적으로 평가되므로 다른 하위 쿼리를 상호 참조할 수 없습니다.발신항목.)

다음에 나타나는 테이블 함수발신키워드가 앞에 올 수도 있음측면, 그러나 기능의 경우 키워드는 선택사항입니다. 함수의 인수에는 이전에 제공된 열에 대한 참조가 포함될 수 있습니다.발신어쨌든 항목입니다.

A 측면항목은 다음의 최상위 수준에 나타날 수 있습니다.발신목록 또는 내부가입나무. 후자의 경우 a의 왼쪽에 있는 모든 항목을 참조할 수도 있습니다.가입그것은 오른쪽에 있습니다.

발신항목에 포함측면상호 참조, 평가는 다음과 같이 진행됩니다: 각 행에 대해발신상호 참조 열 또는 여러 행 집합을 제공하는 항목발신열을 제공하는 항목,측면항목은 해당 행 또는 행 세트의 열 값을 사용하여 평가됩니다. 결과 행은 평소와 같이 계산된 행과 결합됩니다. 이는 열 소스 테이블의 각 행 또는 행 집합에 대해 반복됩니다.

사소한 예측면이다

SELECT * FROM foo, LATERAL (SELECT * FROM bar WHERE bar.id = foo.bar_id) ss;

이것은 보다 일반적인 방법과 정확히 동일한 결과를 갖기 때문에 특별히 유용하지 않습니다.

SELECT * FROM foo, bar WHERE bar.id = foo.bar_id;

측면조인할 행을 계산하기 위해 상호 참조된 열이 필요할 때 주로 유용합니다. 일반적인 응용 프로그램은 집합 반환 함수에 대한 인수 값을 제공합니다. 예를 들어, 다음과 같이 가정합니다.정점(다각형)다각형의 꼭지점 집합을 반환하므로 다음을 사용하여 테이블에 저장된 다각형의 서로 가까운 꼭지점을 식별할 수 있습니다.

선택 p1.id, p2.id, v1, v2
FROM 다각형 p1, 다각형 p2,
     측면 정점(p1.poly) v1,
     측면 정점(p2.poly) v2
WHERE (v1 <- v2) < 10 AND p1.id != p2.id;

이 쿼리는 작성할 수도 있습니다.

선택 ​​p1.id, p2.id, v1, v2
다각형 p1에서 CROSS JOIN LATERAL 정점(p1.poly) v1,
     다각형 p2 CROSS JOIN LATERAL 정점(p2.poly) v2
WHERE (v1 <- v2) < 10 AND p1.id != p2.id;

또는 다른 여러 동등한 공식에서. (이미 언급했듯이,측면이 예에서는 키워드가 필요하지 않지만 명확성을 위해 키워드를 사용합니다.)

이것은 특히 다음과 같은 경우에 유용합니다.왼쪽 조인a에게측면하위 쿼리를 사용하여 다음과 같은 경우에도 소스 행이 결과에 표시됩니다.측면하위 쿼리는 해당 행을 생성하지 않습니다. 예를 들어, 만약get_product_names()제조업체에서 만든 제품 이름을 반환하지만 테이블의 일부 제조업체는 현재 제품을 생산하지 않습니다. 어떤 제품이 다음과 같은지 확인할 수 있습니다.

SELECT m.이름
FROM 제조업체 m LEFT JOIN LATERAL get_product_names(m.id) pname ON true
pname이 NULL인 경우;

7.2.2. 그만큼어디에서

의 구문은WHERE 절is

어디검색_조건

어디에서검색_조건모든 값 표현식입니다(참조와이즈 토토 43_4741192_41225부울.

처리 후발신절이 완료되면 파생된 가상 테이블의 각 행을 검색 조건과 비교하여 확인합니다. 조건의 결과가 true이면 해당 행은 출력 테이블에 유지되고, 그렇지 않으면(즉, 결과가 false 또는 null인 경우) 해당 행은 삭제됩니다. 검색 조건은 일반적으로에서 생성된 테이블의 열을 하나 이상 참조합니다.발신절; 이는 필수는 아니지만 그렇지 않으면어디에서절은 상당히 쓸모가 없을 것입니다.

참고:내부 조인의 조인 조건은 다음 중 하나로 작성할 수 있습니다.어디절 또는가입절. 예를 들어 다음 토토 표현식은 동일합니다.

FROM a, b WHERE a.id = b.id AND b.val  5

그리고:

FROM a INNER JOIN b ON (a.id = b.id) WHERE b.val  5

또는 어쩌면:

자연 조인 b WHERE b.val  5

이들 중 당신이 사용하는 것은 주로 스타일의 문제입니다. 그만큼가입구문발신절은 SQL 표준에 있더라도 다른 SQL 데이터베이스 관리 시스템으로 이식 가능하지 않을 수 있습니다. 외부 조인의 경우 선택의 여지가 없습니다. 반드시 다음에서 수행되어야 합니다.발신절. 그만큼켜짐또는사용 중외부 조인의 절은아님a와 동일어디조건, 결과적으로 일치하지 않는 입력 행의 경우 행이 추가되고 최종 결과에서 행이 제거되기 때문입니다.

다음은 몇 가지 예입니다.어디절:

c1  5인 fdt에서 ... 선택

SELECT ... FROM fdt WHERE c1 IN (1, 2, 3)

SELECT ... FROM fdt WHERE c1 IN(t2에서 c1 선택)

SELECT ... FROM fdt WHERE c1 IN (SELECT c3 FROM t2 WHERE c2 = fdt.c1 + 10)

SELECT ... FROM fdt WHERE c1 BETWEEN (SELECT c3 FROM t2 WHERE c2 = fdt.c1 + 10) AND 100

SELECT ... FROM fdt WHERE EXISTS (SELECT c1 FROM t2 WHERE c2  fdt.c1)

fdt다음에서 파생된 테이블입니다발신절. 의 검색 조건을 만족하지 않는 행어디절이 다음에서 제거됨fdt. 값 표현식으로 스칼라 하위 쿼리를 사용하는 것에 주목하세요. 다른 쿼리와 마찬가지로 하위 쿼리도 복잡한 토토 표현식을 사용할 수 있습니다. 방법도 알아보세요.fdt은 하위 쿼리에서 참조됩니다. 적격c1으로fdt.c1다음의 경우에만 필요합니다.c1은 하위 쿼리의 파생 입력 테이블에 있는 열 이름이기도 합니다. 그러나 열 이름을 한정하면 필요하지 않은 경우에도 명확성이 높아집니다. 이 예에서는 외부 쿼리의 열 명명 범위가 내부 쿼리로 확장되는 방식을 보여줍니다.

7.2.3. 그만큼그룹별그리고가지고 있는 중

통과 후어디필터, 파생된 입력 테이블은 다음을 사용하여 그룹화될 수 있습니다.그룹별절 및를 사용하여 그룹 행 제거가지고 있는 중절.

선택select_list발신 ...
    [어디에서...]
    그룹 기준grouping_column_reference [, grouping_column_reference]...

GROUP BY 절는 나열된 모든 열에서 동일한 값을 갖는 테이블의 행을 그룹화하는 데 사용됩니다. 열이 나열되는 순서는 중요하지 않습니다. 그 효과는 공통 ​​값을 갖는 각 행 집합을 그룹의 모든 행을 나타내는 하나의 그룹 행으로 결합하는 것입니다. 이는 해당 그룹에 적용되는 출력 및/또는 계산 집계의 중복성을 제거하기 위해 수행됩니다. 예를 들어:

= SELECT * FROM test1;x | 와이
---+---
 | 3
 c | 2
 비 | 5
 | 1
(4행)= test1 GROUP BY x에서 x 선택;x
---
 에이
 비
 기음
(3행)

두 번째 쿼리에서는 쓸 수 없었습니다.SELECT * FROM test1 GROUP BY x, 열에 단일 값이 없기 때문에y각 그룹과 연결될 수 있습니다. 그룹화 기준 열은 각 그룹에 단일 값을 가지므로 선택 목록에서 참조될 수 있습니다.

일반적으로 테이블이 그룹화되어 있으면 나열되지 않은 열그룹별집계 표현식을 제외하고는 참조할 수 없습니다. 집계 표현식의 예는 다음과 같습니다.

= SELECT x, sum(y) FROM test1 GROUP BY x;x | 합집합
---+-----
 |   4
 비 |   5
 c |   2
(3행)

여기합계은 전체 그룹에 대해 단일 값을 계산하는 집계 함수입니다. 사용 가능한 집계 함수에 대한 자세한 내용은 다음에서 확인할 수 있습니다.PostgreSQL : 문서 : 9.5 : 토토 사이트 함수.

팁:집계 표현식 없이 그룹화하면 열의 고유 값 집합이 효과적으로 계산됩니다. 이는 또한 다음을 사용하여 달성할 수 있습니다.독특절(참조섹션 7.3.3).

여기 또 다른 예가 있습니다: (모든 제품의 총 판매량이 아닌) 각 제품의 총 판매량을 계산합니다:

SELECT product_id, p.name, (sum(s.units) * p.price) AS 판매
    FROM 제품 p LEFT JOIN 판매 s USING (product_id)
    GROUP BY product_id, p.name, p.price;

이 예에서는 열제품_ID, p.이름p.price반드시에 있어야 합니다.그룹별절은 쿼리 선택 목록에서 참조되기 때문입니다(그러나 아래 참조). 칼럼s.units다음에 있을 필요는 없습니다.그룹별집계 표현식에서만 사용되므로 목록입니다(합계(...))는 제품의 판매량을 나타냅니다. 각 제품에 대해 쿼리는 제품의 모든 판매에 대한 요약 행을 반환합니다.

제품 테이블이 다음과 같이 설정되어 있다면,제품_ID기본 키이면 그룹별로 충분할 것입니다.제품_ID위의 예에서 이름과 가격은 다음과 같습니다.기능적으로 종속됨제품 ID에 적용되므로 각 제품 ID 그룹에 어떤 이름과 가격 값을 반환할지 모호함이 없습니다.

엄격한 SQL에서는,그룹별소스 토토의 열로만 그룹화할 수 있지만PostgreSQL또한 허용하도록 확장그룹별선택 목록의 열별로 그룹화합니다. 단순한 열 이름 대신 값 표현식을 기준으로 그룹화하는 것도 허용됩니다.

테이블이 다음을 사용하여 그룹화된 경우그룹별, 그러나 특정 그룹에만 관심이 있습니다.가지고 있는 중절은 다음과 같이 사용할 수 있습니다.어디절, 결과에서 그룹을 제거합니다. 구문은 다음과 같습니다.

선택select_list발신 ... [어디에서 ...] GROUP BY ... HAVINGboolean_expression

표현식가지고 있는 중절은 그룹화된 표현식과 그룹화되지 않은 표현식(반드시 집계 함수를 포함함)을 모두 참조할 수 있습니다.

예:

= SELECT x, sum(y) FROM test1 GROUP BY x HAVING sum(y)  3;x | 합집합
---+-----
 |   4
 비 |   5
(2행)= SELECT x, sum(y) FROM test1 GROUP BY x HAVING x < 'c';x | 합집합
---+-----
 |   4
 비 |   5
(2행)

다시 한 번 더 현실적인 예를 들어보겠습니다.

SELECT product_id, p.name, (sum(s.units) * (p.price - p.cost)) AS 이익
    FROM 제품 p LEFT JOIN 판매 s USING (product_id)
    WHERE s.date  CURRENT_DATE - 간격 '4주'
    GROUP BY product_id, p.name, p.price, p.cost
    HAVING sum(p.price * s.units)  5000;

위의 예에서,어디절은 그룹화되지 않은 열을 기준으로 행을 선택하는 반면(이 표현식은 지난 4주 동안의 판매에만 적용됨),가지고 있는 중절은 총 매출이 5000을 넘는 그룹으로 출력을 제한합니다. 집계 식이 쿼리의 모든 부분에서 반드시 동일할 필요는 없습니다.

쿼리에 집계 함수 호출이 포함되어 있지만 포함되어 있지 않은 경우그룹별절, 그룹화는 여전히 발생합니다. 결과는 단일 그룹 행입니다(또는 단일 행이 다음에 의해 제거되는 경우 전혀 행이 아닐 수도 있습니다.가지고 있는 중). a를 포함하는 경우에도 마찬가지입니다.가지고 있는 중절, 집계 함수 호출이 없더라도 또는그룹별절.

7.2.4. 그룹화 세트, 큐브롤업

다음 개념을 사용하면 위에서 설명한 것보다 더 복잡한 그룹화 작업이 가능합니다.그룹화 세트. 에서 선택한 데이터발신그리고어디에서절은 지정된 각 그룹화 세트에 의해 별도로 그룹화되며 단순 그룹과 마찬가지로 각 그룹에 대해 집계가 계산됩니다.그룹별절을 사용한 후 결과가 반환되었습니다. 예를 들어:

= SELECT * FROM items_sold;브랜드 | 크기 | 매상
--------+------+-------
 푸 | 엘 |  10
 푸 | 남 |  20
 바 | 남 |  15
 바 | 엘 |  5
(4행)= 선택 브랜드, 사이즈, 합계(판매) FROM items_sold GROUP BY GROUPING SETS ((브랜드), (사이즈), ());브랜드 | 크기 | 합집합
------+------+-----
 푸 |      |  30
 바 |      |  20
       | 엘 |  15
       | 남 |  35
       |      |  50
(5행)

각 하위 목록그룹화 세트0개 이상의 열이나 표현식을 지정할 수 있으며 직접적으로 있는 것과 동일한 방식으로 해석됩니다.그룹별절. 빈 그룹화 집합은 위의 집계 함수의 경우에 설명된 대로 모든 행이 단일 그룹(입력 행이 없더라도 출력됨)으로 집계됨을 의미합니다.그룹별절.

그룹화 열 또는 표현식에 대한 참조는 해당 열이 나타나지 않는 그룹화 집합의 결과 행에서 null 값으로 대체됩니다. 특정 출력 행의 결과를 그룹화하려면 다음을 참조하세요.표 9-53.

두 가지 일반적인 그룹화 세트 유형을 지정하기 위한 약칭 표기법이 제공됩니다. 형식의 절

롤업(e1, e2, e3, ... )

은 주어진 표현식 목록과 빈 목록을 포함한 목록의 모든 접두사를 나타냅니다. 따라서 다음과 같습니다.

그룹화 세트(
    (e1, e2, e3, ... ),
    ...
    ( e1, e2 ),
    ( e1 ),
    ( )
)

이것은 일반적으로 계층적 데이터 분석에 사용됩니다. 예: 부서별, 부서별, 전사적 총 급여 총액

양식의 절

큐브 (e1, e2, ... )

은 주어진 목록과 가능한 모든 하위 집합(즉, 거듭제곱 집합)을 나타냅니다. 따라서

큐브(a,b,c)

다음과 동일함

그룹화 세트(
    (a, b, c),
    (a, b),
    (a, c),
    (a),
    (b,c),
    (비),
    (c),
    ( )
)

a의 개별 요소큐브또는롤업절은 개별 표현식이거나 괄호 안에 있는 요소의 하위 목록일 수 있습니다. 후자의 경우 하위 목록은 개별 그룹화 세트를 생성할 목적으로 단일 단위로 처리됩니다. 예를 들어:

CUBE ( (a, b), (c, d) )

다음과 동일함

그룹화 세트(
    (a, b, c, d),
    (a, b),
    (       CD ),
    ( )
)

그리고

롤업( a, (b, c), d )

다음과 동일함

그룹화 세트(
    (a, b, c, d),
    (a, b, c),
    (a),
    ( )
)

큐브그리고롤업구조물은 다음에서 직접 사용할 수 있습니다.그룹별절 또는 a 내부에 중첩됨그룹화 세트절. 하나라면그룹화 세트절이 다른 절 안에 중첩되어 있으면 내부 절의 모든 요소가 외부 절에 직접 작성된 것과 효과가 동일합니다.

여러 그룹화 항목이 단일에 지정된 경우그룹별절, 그룹화 세트의 최종 목록은 개별 항목의 외적입니다. 예를 들어:

GROUP BY a, CUBE (b, c), GROUPING SETS ((d), (e))

다음과 동일함

그룹별 그룹 설정(
    (a, b, c, d), (a, b, c, e),
    (a, b, d), (a, b, e),
    (a, c, d), (a, c, e),
    (a, d), (a, e)
)

참고:구조물(a, b)일반적으로 표현식에서 다음과 같이 인식됩니다.행 생성자. 이내그룹별절, 이는 표현식의 최상위 레벨에는 적용되지 않습니다.(a, b)는 위에서 설명한 대로 표현식 목록으로 구문 분석됩니다. 어떤 이유로든 당신이필요그룹화 표현식의 행 생성자, 사용ROW(a, b).

7.2.5. 윈도우 함수 처리

쿼리에 창 기능이 포함된 경우(참조4800 |6000 사설 토토0 |4800 |6000 사설 토토0 |6000 사설 토토0 |_4800 |6000 사설 토토0 |6000 사설 토토0 |4800 |500 사설 토토0 |4800 |6000 사설 토토0 |6000 사설 토토0 |4800 |4800 |500 사설 토토0 사설 토토0 사설 토토0 |6, PostgreSQL : 문서 : 9.5 : 창 토토 캔그리고섹션 4.2.8), 이러한 함수는 그룹화, 집계 및 후에 평가됩니다.가지고 있는 중필터링이 수행됩니다. 즉, 쿼리가 집계를 사용하는 경우,그룹별또는가지고 있는 중, 그러면 창 함수에 표시된 행은의 원래 토토 행이 아닌 그룹 행입니다.발신/어디에서.

다중 창 함수가 사용될 때 모든 창 함수는 구문적으로 동일합니다.파티션 기준그리고주문 기준57539_57701주문 방법순서를 고유하게 결정하지 않습니다. 그러나 다른 기능의 평가에 대해서는 보장되지 않습니다.파티션 기준또는주문 방법사양. (이러한 경우 일반적으로 창 함수 평가 통과 사이에 정렬 단계가 필요하며 정렬은 해당 행의 순서를 유지한다고 보장되지 않습니다.주문 방법동등한 것으로 간주됩니다.)

현재 창 기능에는 항상 미리 정렬된 데이터가 필요하므로 쿼리 출력은 창 기능 중 하나에 따라 정렬됩니다.'파티션 기준/주문 기준절. 그러나 이에 의존하는 것은 권장되지 않습니다. 명시적인 최상위 수준을 사용하세요.주문 기준결과가 특정 방식으로 정렬되었는지 확인하려는 경우 절.