연산자 호출에는 두 가지 가능한 구문이 있습니다.
expression operator expression(이진 중위 연산자) |
operator expression(단항 접두사 연산자) |
여기서 토큰 은 4.1.3절의operator 구문 규칙을 따르 거나 키워드 , , 및 , 또는 형식의 정규화된 연산자 이름 중 하나입니다.ANDORNOT
OPERATOR(schema.operatorname)
어떤 특정 연산자가 존재하고 단항인지 이진인지는 시스템이나 사용자가 정의한 연산자에 따라 다릅니다. 9장 에서는 내장 연산자에 대해 설명합니다.
4.2.6. 함수 호출
함수 호출의 구문은 함수 이름(스키마 이름으로 정규화됨) 뒤에 괄호로 묶인 인수 목록이 옵니다.
function_name([ expression[ , expression... ] ] )
예를 들어 다음은 2의 제곱근을 계산합니다.
제곱미터(2)
내장 함수 목록은 9장 에 있습니다. 다른 기능은 사용자가 추가할 수 있습니다.
일부 사용자가 다른 사용자를 불신하는 데이터베이스에서 쿼리를 발행할 때 함수 호출을 작성할 때 섹션 10.3 의 보안 예방 조치를 준수하십시오.
인수에는 선택적으로 이름이 첨부될 수 있습니다. 자세한 내용은 섹션 4.3 을 참조하십시오.
메모
복합 유형의 단일 인수를 사용하는 함수는 선택적으로 필드 선택 구문을 사용하여 호출할 수 있으며, 반대로 필드 선택은 기능적 스타일로 작성할 수 있습니다. 즉, 표기법 col(table)및 table.col상호 교환 가능합니다. 이 동작은 SQL 표준이 아니지만 " 계산된 필드 " 를 에뮬레이트하는 함수 사용을 허용하기 때문에 PostgreSQL 에서 제공됩니다 . 자세한 내용은 8.16.5절을 참조하십시오 .
4.2.7. 집계 표현식
집계 표현식 은 쿼리에서 선택한 행에 대한 집계 함수의 적용을 나타냅니다 . 집계 함수는 입력의 합계 또는 평균과 같이 여러 입력을 단일 출력 값으로 줄입니다. 집계 표현식의 구문은 다음 중 하나입니다.
aggregate_name( expression[ , ... ] [ order_by_clause] ) [ 필터 ( 장소 filter_clause) ]
aggregate_name( 전체 expression[ , ... ] [ order_by_clause] ) [ 필터 ( 장소 filter_clause) ]
aggregate_name( 구별 expression[ , ... ] [ order_by_clause] ) [ 필터 ( 장소 filter_clause) ]
aggregate_name( * ) [ 필터 ( WHERE filter_clause) ]
aggregate_name( [ expression[ , ... ] ] ) 그룹 내 ( order_by_clause) [ 필터 ( WHERE filter_clause) ]
여기서 aggregate_name는 이전에 정의된 집계(스키마 이름으로 한정될 수 있음)이고 expression은 집계 표현식 또는 창 함수 호출을 포함하지 않는 값 표현식입니다. 선택 사항 order_by_clause이며 filter_clause아래에 설명되어 있습니다.
집계 표현식의 첫 번째 형식은 각 입력 행에 대해 집계를 한 번 호출합니다. ALL두 번째 형식은 기본값 이므로 첫 번째 형식과 동일합니다 . 세 번째 형식은 입력 행에서 찾은 식의 고유한 값(또는 여러 식의 경우 고유한 값 집합)에 대해 집계를 한 번 호출합니다. 네 번째 형식은 각 입력 행에 대해 집계를 한 번 호출합니다. 특정 입력 값이 지정되지 않았기 때문에 일반적으로 count(*)집계 함수에만 유용합니다. 마지막 형식은 아래에서 설명하는 정렬된 집합 집계 함수와 함께 사용됩니다.
대부분의 집계 함수는 null 입력을 무시하므로 하나 이상의 표현식이 null을 생성하는 행이 삭제됩니다. 이것은 달리 지정되지 않는 한 모든 기본 제공 집계에 대해 참으로 간주될 수 있습니다.
예를 들어, count(*)입력 행의 총 수를 산출합니다. null을 무시 하므로 null이 아닌 count(f1)입력 행의 수를 산출합니다 . 의 고유한 null이 아닌 값의 수 를 산출합니다 .f1countcount(distinct f1)f1
일반적으로 입력 행은 지정되지 않은 순서로 집계 함수에 공급됩니다. 많은 경우에 이것은 중요하지 않습니다. 예를 들어, min입력을 받는 순서에 관계없이 동일한 결과를 생성합니다. 그러나 일부 집계 함수(예: array_agg및 string_agg)는 입력 행의 순서에 따라 결과를 생성합니다. 이러한 집계를 사용할 때 선택 사항 order_by_clause을 사용하여 원하는 순서를 지정할 수 있습니다. 7.5 절에서 설명한 것처럼 쿼리 수준 절 order_by_clause과 동일한 구문을 가지고 있습니다. 단, 표현식은 항상 표현식이며 출력 열 이름이나 숫자가 될 수 없습니다. 예를 들어:ORDER BY
SELECT array_agg(a ORDER BY b DESC) FROM 테이블;
다중 인수 집계 함수를 처리할 때 ORDER BY절은 모든 집계 인수 뒤에 옵니다. 예를 들어 다음과 같이 작성하십시오.
SELECT string_agg(a, ',' ORDER BY a) FROM 테이블;
이거 말고:
SELECT string_agg(ORDER BY a, ',') FROM 테이블; -- 잘못된
후자는 구문상 유효하지만 두 개의 키가 있는 단일 인수 집계 함수의 호출을 나타냅니다 ORDER BY(두 번째 것은 상수이기 때문에 다소 쓸모가 없습니다).
DISTINCT가 추가로 지정 되면 order_by_clause모든 ORDER BY표현식은 집계의 일반 인수와 일치해야 합니다. DISTINCT즉, 목록 에 포함되지 않은 표현식은 정렬할 수 없습니다 .
메모
집계 함수에서 DISTINCT및 둘 다 지정하는 기능은 PostgreSQL 확장입니다.ORDER BY
지금까지 설명한 것처럼 집계의 일반 인수 목록에 배치 ORDER BY하는 것은 정렬이 선택 사항인 범용 및 통계 집계에 대한 입력 행을 정렬할 때 사용됩니다. 일반적으로 집계의 계산은 입력 행의 특정 순서와 관련하여만 합리적이기 때문에 필요한 정렬 집합 집계 라고 하는 집계 함수의 하위 클래스가 있습니다. 정렬된 집합 집계의 일반적인 예에는 순위 및 백분위수 계산이 포함됩니다. 정렬된 집합 집계의 경우 위의 최종 구문 대안에 표시된 대로 내부에 작성됩니다 . 의 표현식은 일반 집계 인수와 마찬가지로 입력 행당 한 번 평가되며 다음과 같이 정렬됩니다.order_by_clauseorder_by_clauseWITHIN GROUP (...)order_by_clauseorder_by_clause의 요구 사항에 따라 집계 함수에 입력 인수로 제공됩니다. WITHIN GROUP order_by_clause(이는 집계 함수에 대한 인수로 처리되지 않는 non- 의 경우와 다릅니다 .) 앞에 있는 인수 표현식(있는 경우)은 에 나열된 집계 인수 와 구별하기 위해 직접 인수WITHIN GROUP 라고 합니다 . 일반 집계 인수와 달리 직접 인수는 입력 행당 한 번이 아니라 집계 호출당 한 번만 평가됩니다. 이는 해당 변수가 다음에 의해 그룹화되는 경우에만 변수를 포함할 수 있음을 의미합니다.order_by_clauseGROUP BY; 이 제한은 직접 인수가 집계 표현식 내부에 전혀 없는 경우와 동일합니다. 직접 인수는 일반적으로 집계 계산당 단일 값으로만 의미가 있는 백분위수와 같은 항목에 사용됩니다. 직접 인수 목록은 비어 있을 수 있습니다. 이 경우 ()not 만 작성하십시오 (*). ( PostgreSQL 은 실제로 두 철자 중 하나를 허용하지만 첫 번째 방법만 SQL 표준을 따릅니다.)
순서 집합 집계 호출의 예는 다음과 같습니다.
SELECT percentile_cont(0.5) WITHIN GROUP (ORDER BY 소득) FROM 가구;
백분위수_계속
------------------
50489
income테이블에서 열의 50번째 백분위수 또는 중앙값을 가져옵니다 households. 여기에 0.5직접적인 주장이 있습니다. 백분위수 분수가 행에 따라 달라지는 값이라는 것은 의미가 없습니다.
가 지정 되면 true로 평가 FILTER되는 입력 행만 집계 함수에 제공됩니다. filter_clause다른 행은 버려집니다. 예를 들어:
고르다
count(*) AS 필터링되지 않음,
count(*) FILTER (WHERE i < 5) 필터링된 그대로
FROM 생성 시리즈(1,10) AS s(i);
필터링되지 않은 | 거르는
----------+----------
10 | 4
(1줄)
미리 정의된 집계 함수는 9.21절 에 설명되어 있습니다. 다른 집계 함수는 사용자가 추가할 수 있습니다.
집계 표현식은 명령 의 결과 목록이나 HAVING절 에만 나타날 수 있습니다. SELECT와 같은 다른 절에서는 WHERE집계 결과가 형성되기 전에 해당 절이 논리적으로 평가되기 때문에 금지됩니다.
집계 표현식이 하위 쿼리에 나타날 때( 섹션 4.2.11 및 섹션 9.23 참조) 집계는 일반적으로 하위 쿼리의 행에 대해 평가됩니다. 그러나 집계의 인수( filter_clause있는 경우)에 외부 수준 변수만 포함된 경우 예외가 발생합니다. 그러면 집계는 가장 가까운 외부 수준에 속하고 해당 쿼리의 행에 대해 평가됩니다. 그러면 전체적으로 집계 표현식이 하위 쿼리에 대한 외부 참조가 되며 해당 하위 쿼리에 대한 하나의 평가에 대해 상수 역할을 합니다. 결과 목록 또는 절에만 나타나는 제한은 HAVING집계가 속한 쿼리 수준에 따라 적용됩니다.
'Postgresql_DB_가이드' 카테고리의 다른 글
유형 캐스트 (0) | 2022.07.18 |
---|---|
창 함수 호출 (0) | 2022.07.18 |
4.2. 값 표현식 (0) | 2022.07.18 |
첨자 (0) | 2022.07.18 |
테이블 쿼리 (0) | 2022.07.18 |