A 배트맨 토토 표현식테이블을 계산합니다. 배트맨 토토 표현식에는발신선택적으로 뒤에 오는 절어디, 그룹별및가지고 있는 중절. 사소한 배트맨 토토 표현식은 단순히 디스크의 배트맨 토토, 소위 기본 배트맨 토토을 나타냅니다. 배트맨 토토이지만 더 복잡한 표현식을 사용하여 수정하거나 다양한 방법으로 기본 배트맨 토토을 결합합니다.
선택사항어디, 그룹별및가지고 있는 중배트맨 토토 표현식의 절은 연속적인 파이프라인을 지정합니다. 에서 파생된 테이블에서 수행된 변환발신절. 이러한 모든 변환은 다음을 생성합니다. 전달되는 행을 제공하는 가상 테이블 쿼리의 출력 행을 계산하려면 목록을 선택하세요.
그발신 조항주어진 하나 이상의 다른 배트맨 토토에서 배트맨 토토을 파생합니다. 쉼표로 구분된 배트맨 토토 참조 목록에 있습니다.
발신배트맨 토토_참조 [, table_reference [, ...]]
배트맨 토토 참조는 배트맨 토토 이름일 수 있습니다(아마도 스키마 한정) 또는 하위 쿼리와 같은 파생 배트맨 토토, a가입구성 또는 복합물 이들의 조합. 배트맨 토토 참조가 두 개 이상인 경우 에 나열됨발신절, 배트맨 토토 교차 결합됨(즉, 해당 행의 데카르트 곱) 형성된다; 아래 참조). 결과는발신list는 중간 가상 테이블입니다. 그러면 다음과 같은 방법으로 변환될 수 있습니다.어디에서, 그룹별및하빙절이며 마지막으로 전체 배트맨 토토 표현식의 결과입니다.
배트맨 토토 참조가 상위 배트맨 토토의 이름을 지정할 때 배트맨 토토 상속 계층 구조, 배트맨 토토 참조가 행을 생성합니다. 해당 배트맨 토토뿐만 아니라 해당 배트맨 토토의 모든 하위 배트맨 토토에도 적용됩니다. 핵심 단어만테이블 앞에 위치 이름. 그러나 참조는 다음과 같은 열만 생성합니다. 명명된 테이블에 나타납니다. 하위 테이블에 추가된 모든 열은 무시됩니다.
글을 쓰는 대신만이전 테이블 이름은 쓸 수 있습니다.*이후 하위 테이블이 다음임을 명시적으로 지정하는 테이블 이름 포함됩니다. 쓰기*필요하지 않음 해당 동작이 기본값이므로(변경하지 않은 경우) 의 설정sql_inheritance구성 옵션). 그러나 쓰기*추가적인 내용을 강조하는 데 유용할 수 있습니다. 배트맨 토토이 검색됩니다.
조인된 테이블은 다른 두 개(실제 또는 파생) 특정 조인 규칙에 따른 테이블 유형. 내부, 외부 및 교차 조인을 사용할 수 있습니다. 는 조인된 테이블의 일반 구문은 다음과 같습니다.
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내부 조인T3ON조건왜냐하면조건할 수 있다 참고T1에 첫 번째 경우지만 두 번째 경우는 아닙니다.
T1 { [내부] | 왼쪽 | 맞다 | 전체 [외부] 가입T2켜짐boolean_expression
T1 { [이너] | 왼쪽 | 맞다 | 전체 [외부] 가입T2사용 중(열 목록 조인 )
T1자연스러운 [내부] | 왼쪽 | 맞다 | 전체 [외부] 가입T2
말씀내부그리고외부모두 선택사항입니다. 양식.내부기본값입니다.왼쪽, 오른쪽및전체외부 조인을 암시합니다.
그조인 조건이 에 지정됨켜짐또는사용 중절 또는 암시적으로 단어자연스러운. 조인 조건은 두 소스의 행을 결정합니다. 테이블은 다음으로 간주됩니다."일치", 자세히 설명됨 아래.
적격한 조인의 가능한 유형은 다음과 같습니다.
T1의 각 행 R1에 대해 조인된 테이블에는 다음이 있습니다. 조인을 만족하는 T2의 각 행에 대한 행 R1의 조건.
먼저 내부 조인이 수행됩니다. 그런 다음 조인을 만족하지 않는 T1의 각 행 T2의 행에 대한 조건이 있는 경우 조인된 행은 다음과 같습니다. T2의 열에 Null 값이 추가되었습니다. 따라서, 조인된 테이블에는 항상 하나 이상의 행이 있습니다. T1의 각 행.
먼저 내부 조인이 수행됩니다. 그런 다음 조인을 만족하지 않는 T2의 각 행 T1의 행에 대한 조건이 있는 경우 조인된 행은 다음과 같습니다. T1의 열에 Null 값이 추가되었습니다. 이것은 왼쪽 조인의 반대: 결과 테이블 T2의 각 행에는 항상 하나의 행이 있습니다.
먼저 내부 조인이 수행됩니다. 그런 다음 조인을 만족하지 않는 T1의 각 행 T2의 행에 대한 조건이 있는 경우 조인된 행은 다음과 같습니다. T2의 열에 Null 값이 추가되었습니다. 또한, 조인을 만족하지 않는 T2의 각 행에 대해 T1의 행에 대한 조건, 다음과 결합된 행 T1 열의 null 값이 추가됩니다.
그ON절이 가장 많습니다. 일반적인 종류의 조인 조건: 부울을 사용합니다. a에 사용된 것과 동일한 종류의 값 표현식어디절. 한 쌍의 행 에서T1그리고T2다음과 일치하는 경우켜짐표현식은 true로 평가됩니다.
그사용 중절은 다음을 활용할 수 있는 단축어입니다. 조인의 양측이 조인 열의 이름이 동일합니다. 소요되는 시간 쉼표로 구분된 공유 열 이름 목록 및 동등성을 포함하는 조인 조건을 형성합니다. 각각 비교. 예를 들어 가입T1그리고T2함께사용 중 (a, b)조인 조건 생성ONT1.a =T2.a ANDT1.b =T2.b.
또한 다음의 출력은가입 사용중복 열을 억제합니다. 일치하는 열을 모두 인쇄해야 합니다. 동일한 값을 가져야 합니다. 동안가입 켜짐다음에서 모든 열을 생성합니다.T1다음의 모든 열이 이어짐T2, 다음을 사용하여 가입하나의 출력 열을 생성합니다. 나열된 각 열 쌍에 대해(나열된 순서), 그 다음에는의 나머지 열이 옵니다.T1, 그 뒤에 임의의 항목 의 나머지 열T2.
마지막으로,자연스러운은 의 단축형사용 중: 그것 a를 형성한다사용 중구성된 목록 두 입력 배트맨 토토 모두에 나타나는 모든 열 이름입니다. 마찬가지로사용 중, 이 열 출력 배트맨 토토에 한 번만 나타납니다. 없는 경우 일반적인 열 이름,자연다음과 같이 행동합니다교차 조인.
참고: 사용 중이다 조인된 열 변경으로부터 합리적으로 안전함 나열된 열만 관계이므로 결합되었습니다.자연스러운이다 스키마가 다음으로 변경되므로 훨씬 더 위험합니다. 새로운 일치 열을 발생시키는 관계 이름이 있으면 조인이 결합됩니다. 그 새 열도 마찬가지입니다.
이것을 합치려면 배트맨 토토이 있다고 가정합니다.t1:
번호 | 이름 -----+------ 1 | 에 2 | 비 3 | c
그리고t2:
번호 | 가치 ------+------- 1 | xxx 3 | 이야 5 | zzz
그러면 다양한 항목에 대해 다음과 같은 결과를 얻습니다. 조인:
= SELECT * FROM t1 CROSS JOIN t2;번호 | 이름 | 숫자 | 가치
------+------+------+-------
1 | | 1 | xxx
1 | | 3 | 이야
1 | | 5 | zzz
2 | 비 | 1 | xxx
2 | 비 | 3 | 이야
2 | 비 | 5 | zzz
3 | c | 1 | xxx
3 | c | 3 | 이야
3 | c | 5 | zzz
(9행)= SELECT * FROM t1 INNER JOIN t2 ON t1.num = t2.num;번호 | 이름 | 숫자 | 가치
------+------+------+-------
1 | | 1 | xxx
3 | c | 3 | 이야
(2행)= SELECT * FROM t1 INNER JOIN t2 USING (num);숫자 | 이름 | 가치
------+------+-------
1 | | xxx
3 | c | 이야
(2행)= SELECT * FROM t1 NATURAL INNER JOIN t2;번호 | 이름 | 가치
------+------+-------
1 | | xxx
3 | c | 이야
(2행)= SELECT * FROM t1 LEFT JOIN t2 ON t1.num = t2.num;번호 | 이름 | 숫자 | 가치
------+------+------+-------
1 | | 1 | xxx
2 | 비 | |
3 | c | 3 | 이야
(3행)= SELECT * FROM t1 LEFT JOIN t2 USING (num);번호 | 이름 | 가치
------+------+-------
1 | | xxx
2 | 비 |
3 | c | 이야
(3행)= SELECT * FROM t1 오른쪽 JOIN t2 ON t1.num = t2.num;번호 | 이름 | 숫자 | 가치
------+------+------+-------
1 | | 1 | xxx
3 | c | 3 | 이야
| | 5 | zzz
(3행)= SELECT * FROM t1 FULL JOIN t2 ON t1.num = t2.num;번호 | 이름 | 숫자 | 가치
------+------+------+-------
1 | | 1 | xxx
2 | 비 | |
3 | c | 3 | 이야
| | 5 | zzz
(4행)
다음으로 지정된 조인 조건켜짐또한 다음 조건을 포함할 수 있습니다. 조인과 직접 관련이 있습니다. 이것은 일부에게 유용할 수 있습니다. 질문이 있지만 신중하게 생각해야 합니다. 에 대한 예:
= SELECT * FROM t1 LEFT JOIN t2 ON t1.num = t2.num AND t2.value = 'xxx';번호 | 이름 | 숫자 | 가치 ------+------+------+------- 1 | | 1 | xxx 2 | 비 | | 3 | c | | (3행)
다음에 제한을 두는 것에 주목하세요.어디에서절이 다른 결과를 생성합니다:
= SELECT * FROM t1 LEFT JOIN t2 ON t1.num = t2.num WHERE t2.value = 'xxx';번호 | 이름 | 숫자 | 가치 ------+------+------+------- 1 | | 1 | xxx (1행)
이것은 다음에 제한이 있기 때문입니다.켜짐절이 처리되었습니다이전조인하는 동안 제한사항은어디절이 처리되었습니다이후조인. 그렇지 않다 내부 조인에서는 중요하지만 외부 조인에서는 매우 중요합니다. 조인합니다.
배트맨 토토 및 복잡한 배트맨 토토에 임시 이름을 부여할 수 있습니다. 파생 배트맨 토토에 대한 참조에 사용되는 참조 나머지 쿼리. 이것을 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.2.) 예:
FROM (SELECT * FROM table1) AS alias_name
이 예는 다음과 같습니다.발신 table1 AS alias_name. 더 흥미로운 사례는 다음과 같습니다. 일반 조인으로 축소할 수 없으며 하위 쿼리가 발생할 때 발생합니다. 그룹화 또는 집계가 포함됩니다.
하위 쿼리는 다음과 같을 수도 있습니다.값목록:
FROM (VALUES ('앤', '스미스'), ('밥', '존스'), ('조', '블로우'))
AS 이름(이름, 성)
다시 말하지만, 배트맨 토토 별칭이 필요합니다. 별칭 이름 할당 의 열값목록은 다음과 같습니다 선택 사항이지만 좋은 습관입니다. 자세한 내용은 참조윈 토토 : 문서 : 9.1 : 값 목록.
테이블 함수는 일련의 행을 생성하는 함수입니다. 기본 데이터 유형(스칼라 유형) 또는 복합 데이터 유형으로 구성됨 데이터 유형(테이블 행). 테이블, 뷰 또는 의 하위 쿼리발신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에서;
어떤 경우에는 다음과 같은 테이블 함수를 정의하는 것이 유용합니다. 상태에 따라 다른 열 집합을 반환할 수 있습니다. 호출되었습니다. 이를 지원하기 위해 테이블 함수를 선언할 수 있습니다. 의사 유형을 반환하는 것과 같이기록. 이러한 함수를 쿼리에 사용하면 예상되는 행이 구조는 쿼리 자체에 지정되어야 합니다. 시스템은 쿼리를 구문 분석하고 계획하는 방법을 알 수 있습니다. 고려하다 이 예:
선택 *
FROM dblink('dbname=mydb', 'SELECT proname, prosrc FROM pg_proc')
AS t1(이름, prosrc 텍스트)
'bytea%'와 같은 이름이 있는 곳;
그PostgreSQL : 문서 : 9.1 : 토토 결과함수(일부토토 사이트 : 문서 : 9.1 : DBLINKmodule)은 원격 쿼리를 실행합니다. 복귀를 선언합니다기록이것은 어떤 용도로든 사용될 수 있기 때문에 일종의 쿼리. 실제 열 세트는 예를 들어 파서가 무엇을 알 수 있도록 쿼리를 호출합니다.*다음으로 확장되어야 합니다.
의 구문은WHERE 절이다
어디에서검색_조건
어디에서검색_조건이다 모든 값 표현식(참조섹션 4.236385_36422부울.
처리 후발신절이 완료되면 파생된 가상 테이블의 각 행은 검색 조건과 비교하여 확인했습니다. 의 결과라면 조건이 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 표준. 외부 조인의 경우 선택의 여지가 없습니다. 에서 완료해야 합니다.발신절.켜짐또는사용 중외부 조인의 절은아님동등함 에어디조건, 왜냐하면 행이 추가됩니다(일치하지 않는 입력 행의 경우). 최종 결과에서 행을 제거합니다.
다음은 몇 가지 예입니다.어디에서절:
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이다 하위 쿼리에서 참조됩니다. 적격c1asfdt.c1만 필요한 경우c1또한 다음의 이름입니다. 하위 쿼리의 파생 입력 테이블에 있는 열입니다. 하지만 열 이름을 한정하면 그렇지 않은 경우에도 명확성이 추가됩니다. 필요합니다. 이 예에서는 열 명명 범위가 어떻게 지정되는지 보여줍니다. 외부 쿼리는 내부 쿼리로 확장됩니다.
통과 후어디필터, 파생 입력 테이블은 다음을 사용하여 그룹화될 수 있습니다.그룹별절 및 제거 를 사용하여 그룹 행가지고 있는 중절.
선택select_list발신 ...
[어디에서...]
그룹 기준grouping_column_reference [, grouping_column_reference]...
그그룹 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 :.
팁:집계 표현식 없이 그룹화 효과적으로 고유 값 집합을 계산합니다. 칼럼. 이는 또한 다음을 사용하여 달성할 수 있습니다.독특절(참조섹션 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.name및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를 포함하는 경우에도 마찬가지입니다.가지고 있는 중절, 아무 것도 없이도 집계 함수 호출 또는그룹별절.
쿼리에 창 기능이 포함된 경우(참조섹션 3.5, 섹션 9.19그리고섹션 4.2.8), 이러한 함수는 그룹화 후에 평가됩니다. 집계 및가지고 있는 중필터링은 수행. 즉, 쿼리가 집계를 사용하는 경우,그룹별또는가지고 있는 중, 창에 보이는 행 함수는 원래 배트맨 토토 행이 아닌 그룹 행입니다. 에서발신/어디에서.
다중 창 기능을 사용하면 모든 창 구문적으로 동등한 함수파티션 기준그리고주문 으로창 정의의 절은 다음을 보장합니다. 데이터에 대한 단일 전달로 평가됩니다. 그러므로 그들은 동일한 정렬 순서가 표시됩니다.주문 기준고유하게 결정하지 않습니다. 주문. 그러나 평가에 대한 보장은 없습니다. 다른 기능을 갖는 것파티션 으로또는주문 기준사양. (이러한 경우 일반적으로 다음 사이에 정렬 단계가 필요합니다. 창 함수 평가를 통과했지만 정렬이 실패했습니다. 행의 순서를 유지하는 것이 보장됩니다.주문 기준동등한 것으로 간주됩니다.)
현재 창 기능에는 항상 미리 정렬된 데이터가 필요합니다. 따라서 쿼리 출력은 다음 중 하나에 따라 정렬됩니다. 또 다른 창 기능'파티션 으로/주문 기준절. 그렇지 않다 그러나 이에 의존하는 것이 좋습니다. 명시적인 사용 최상위주문 기준원하는 경우 절 결과가 특정 방식으로 정렬되었는지 확인하세요.