a스포츠 토토 표현테이블을 계산합니다. 스포츠 토토 표현에는가 포함됩니다.From선택적으로 뒤 따르는 조항여기서, 그룹 by및조항. 사소한 스포츠 토토 표현식은 단순히 소위베이스 인 디스크의 스포츠 토토을 참조합니다. 표이지만 더 복잡한 표현을 사용하여 수정하거나 기본 스포츠 토토을 다양한 방식으로 결합하십시오.
선택 사항여기서, 그룹 by및스포츠 토토 표현식의 조항은 연속의 파이프 라인을 지정합니다. 에서 파생 된 테이블에서 수행 된 변환From절. 이 모든 변환은 a 전달되는 행을 제공하는 가상 스포츠 토토 쿼리의 출력 행을 계산하려면 목록을 선택하십시오.
theFrom절은 스포츠 토토을 도출합니다 쉼표로 구분 된 스포츠 토토에 주어진 하나 이상의 다른 스포츠 토토에서 참조 목록.
Fromtable_reference[, table_reference[, ...]]
스포츠 토토 참조는 스포츠 토토 이름 일 수 있습니다 (아마도 스키마 자격) 또는 하위 쿼리와 같은 파생 스포츠 토토 스포츠 토토 조인 또는 이들의 복잡한 조합. 둘 이상 스포츠 토토 참조는에 나열되어 있습니다.From조항은 교차 조정 (아래 참조)을 형성합니다 그런 다음 적용 할 수있는 중간 가상 테이블 의 변환여기서, 그룹 by및조항은 마침내 결과입니다 전체 스포츠 토토 표현.
스포츠 토토 참조가 수퍼티블 인 스포츠 토토의 이름을 지정할 때 스포츠 토토 상속 계층 구조의 스포츠 토토 참조가 생성됩니다 그 스포츠 토토뿐만 아니라 모든 미묘한 후계자 행, 핵심 단어가 아니라면전용앞에 스포츠 토토 이름. 그러나 참조는 열만 생성합니다 이름이 지정된 스포츠 토토에 나타납니다 --- 추가 된 열 하위 스포츠 토토은 무시됩니다.
결합 된 스포츠 토토은 다른 두 가지에서 파생 된 스포츠 토토입니다 (Real 또는 파생) 특정 조인의 규칙에 따른 스포츠 토토 유형. 내부, 외부 및 크로스 조인을 사용할 수 있습니다.
타입 조인
T1크로스 조인T2
각 행 조합에 대해T1및T2, 파생 된 스포츠 토토이 있습니다 모든 열로 구성된 행 포함T1T2. 스포츠 토토이있는 경우 n과 m 행에 각각, 결합 된 스포츠 토토은 n을 * m 줄.
FromT1크로스 조인T2FromT1, T2. 또한에 해당합니다.FromT1내부 조인T2on true(아래 참조).
T1[내부] | 왼쪽 | 오른쪽 | 가득한 [외부] joinT2onboolean_expression T1[내부] | 왼쪽 | 오른쪽 | 가득한 [외부] joinT2사용 ( 사용열 목록에 가입)T1천연 [내부] | 왼쪽 | 오른쪽 | 가득한 [외부] joinT2
단어내부and외부는 모두 선택 사항입니다 양식.내부기본값입니다;왼쪽, 오른쪽및Full외부 조인을 암시합니다.
the조건 조건IS 에 지정됨on또는사용조항 또는 암시 적으로 단어천연. 가입 조건은 두 소스의 행을 결정합니다 스포츠 토토은로 간주됩니다."매치", 자세히 설명 된대로 아래에.
theon절이 가장 중요합니다 일반적인 가입 조건 : 부울이 필요합니다 a와 같은 종류의 가치 표현여기서절. 한 쌍의 행 에서T1andT2일치on표현식은 true로 평가됩니다 그들을.
사용는 속기입니다 표기법 : 쉼표로 구분 된 열 목록이 필요합니다 결합 된 스포츠 토토이 공통적으로 가져야하는 이름, 각각의 동등성을 지정하는 결합 조건을 형성합니다 이 쌍의 열. 또한 a의 출력사용하나에 열이 있습니다 각 동일 한 입력 열 쌍, 다음에 각 테이블의 다른 모든 열. 따라서,사용 (A, B, C)동등합니다 에게on (t1.a = t2.a 및 t1.b = t2.b 및 t1.c = t2.c)if 예외on사용됩니다 열a, B및C결과,사용각각 중 하나만있을 것입니다.
마지막으로,자연는 속기 형태의입니다.사용: a를 형성합니다.사용정확히 그것들로 구성된 목록 두 입력 스포츠 토토 모두에 나타나는 열 이름. 와 마찬가지로사용,이 열이 나타납니다 출력 스포츠 토토에서 한 번만.
자격을 갖춘 가입 유형은 다음과 같습니다.
T1의 각 행 R1에 대해 결합 된 테이블에는 조인을 만족시키는 T2의 각 행에 대한 행 R1이있는 상태
먼저 내부 조인이 수행됩니다. 그런 다음 조인을 만족하지 않는 T1의 각 행 T2에 행이있는 상태, 결합 된 행은 T2 열에 널 값이 추가됩니다. 따라서, 결합 된 테이블에는 무조건적으로 하나가 있습니다 T1의 각 행에 대한 행
먼저, 내부 조인이 수행됩니다. 그런 다음 조인을 만족하지 않는 T2의 각 행 T1에 행이있는 상태, 결합 된 행은 T1의 열에 널 값이 추가됩니다. 이것은 왼쪽 결합의 반대 : 결과 테이블 무조건적으로 각 행에 행이 있습니다 T2.
먼저 내부 조인이 수행됩니다. 그런 다음 조인을 만족하지 않는 T1의 각 행 T2에 행이있는 상태, 결합 된 행은 T2 열에 널 값이 추가됩니다. 또한, 조인을 만족하지 않는 T2의 각 행에 대해 T1의 모든 행이있는 상태, 결합 된 행 T1 열의 널 값이 추가됩니다.
모든 유형의 결합은 함께 연결되거나 중첩 될 수 있습니다. 둘 중 하나 또는 둘 다T1andT2결합 된 테이블이있을 수 있습니다. 괄호는 주변에 사용될 수 있습니다Join조인 순서를 제어하기위한 조항. 없을 때 괄호,Join클로즈 둥지 왼쪽에서 오른쪽으로.
이것을 합치려면 스포츠 토토이 있다고 가정합니다T1
Num | 이름 -----+------ 1 | 에이 2 | 비 3 | 기음
andT2
Num | 값 -----+------- 1 | 트리플 엑스 3 | YYY 5 | 쿨쿨
그런 다음 다양한 결과를 얻습니다 조인 :
= 선택 *에서 T1 Cross 조인 T2;Num | 이름 | Num | 값 -----+------+-----+------- 1 | A | 1 | 트리플 엑스 1 | A | 3 | YYY 1 | A | 5 | 쿨쿨 2 | B | 1 | 트리플 엑스 2 | B | 3 | YYY 2 | B | 5 | 쿨쿨 3 | C | 1 | 트리플 엑스 3 | C | 3 | YYY 3 | C | 5 | 쿨쿨 (9 줄)= 선택 * T1에서 t1에서 t2에서 t2를 결합하여 t1.num = t2.num;Num | 이름 | Num | 값 -----+------+-----+------- 1 | A | 1 | 트리플 엑스 3 | C | 3 | YYY (2 줄)= 선택 *에서 t1 내부 join t2를 사용하여 (num);Num | 이름 | 값 -----+------+------- 1 | A | 트리플 엑스 3 | C | YYY (2 줄)= 선택 *에서 T1 Natural Inner 조인 T2;Num | 이름 | 값 -----+------+------- 1 | A | 트리플 엑스 3 | C | YYY (2 줄)= 선택 * T1에서 T1에서 t2를 결합하여 t1.num = t2.num;Num | 이름 | Num | 값 -----+------+-----+------- 1 | A | 1 | 트리플 엑스 2 | B | | 3 | C | 3 | YYY (3 줄)= select * from t1 왼쪽 왼쪽 왼쪽 t2를 사용하여 (num);Num | 이름 | 값 -----+------+------- 1 | A | 트리플 엑스 2 | B | 3 | C | YYY (3 줄)= 선택 *에서 T1에서 T1에 가입하여 t1.num = t2.num;Num | 이름 | Num | 값 -----+------+-----+------- 1 | A | 1 | 트리플 엑스 3 | C | 3 | YYY | | 5 | 쿨쿨 (3 줄)= 선택 * T1 Full Full Join T2 on T1.num = t2.num;Num | 이름 | Num | 값 -----+------+-----+------- 1 | A | 1 | 트리플 엑스 2 | B | | 3 | C | 3 | YYY | | 5 | 쿨쿨 (4 줄)
지정된 조정 조건on그렇지 않은 조건도 포함 할 수도 있습니다 가입과 직접 관련됩니다. 이것은 일부에게 유용 할 수 있습니다 쿼리이지만 신중하게 생각해야합니다. 을 위한 예:
= 선택 * 선택 * T1에서 t1에서 t2를 결합하여 t2 = t2.num 및 t2.value = 'xxx';Num | 이름 | Num | 값 -----+------+-----+------- 1 | A | 1 | 트리플 엑스 2 | B | | 3 | C | | (3 줄)
테이블과 복잡한 테이블에 임시 이름이 제공 될 수 있습니다. 도출 된 테이블에 대한 참조에 사용되는 참조 추가 처리. 이것을 A라고합니다.스포츠 토토 별명.
스포츠 토토 별칭을 만들려면 쓰기
table_referenceasalias
또는
Fromtable_reference 별명
theas키워드는 소음입니다.alias식별자.
일반적인 스포츠 토토 별칭의 적용은 단락을 할당하는 것입니다. 조인 조항을 유지하기 위해 긴 스포츠 토토 이름에 식별자 읽을 수 있습니다. 예를 들어:
선택 *에서 * some_very_long_table_name s onther_fairly_long_name a on s.id = a.num; 가입
별칭은 테이블 참조의 새 이름이됩니다. 현재 쿼리 - 더 이상 원래 이름으로 테이블. 따라서
선택 * My_table에서 my_table.a 5;에서 my_table에서 my_table에서 선택하십시오.
유효한 SQL 구문이 아닙니다. 실제로 일어날 일 (이것은 IS APostgreSQL확장 표준)은 암시 적 테이블 참조가 다음에 추가된다는 것입니다. 그만큼From절은 쿼리입니다 마치 작성된 것처럼 처리
my_table에서 my_table as where my_table.a 5;를 선택하십시오.
이로 인해 크로스 조인이 발생합니다. 당신이 원하는 것.
테이블 별칭은 주로 표기 적 편의를위한 것이지만 테이블에 연결할 때 사용해야합니다. 예 :
선택 *에서 my_table에서 크로스 가입 my_table as b ...
또한 표를 참조하면 별칭이 필요합니다 하위 쿼리입니다 (참조섹션 7.2.1.3).
괄호는 모호성을 해결하는 데 사용됩니다. 다음 명령문은 별칭을 할당합니다Bto 이전 예와 달리 조인의 결과 :
선택 *에서 (my_table as a cross join my_table) b ...
다른 형태의 스포츠 토토 앨리어싱도 임시 이름을 제시합니다 표의 열에 :
Fromtable_reference[as]alias(컬럼 1[, 컬럼 2[, ...]])
더 적은 수의 열 별칭이 실제보다 지정된 경우 스포츠 토토에는 열이 있으며 나머지 열에 이름이 바뀌지 않습니다. 이 구문은 특히자가 요인에 유용합니다 하위 쿼리.
ALIA가 A의 출력에 적용되는 경우Join조항, 이러한 양식을 사용하여 별칭은 내에서 원래 이름을 숨 깁니다.Join. 예를 들어,
선택 a.** my_table에서 a as your_table as b on ...
유효한 SQL이지만
선택 a.*에서 (my_table as as your_table as b on ...) as c
유효하지 않음 : 스포츠 토토 별명a별칭 외부에서 보이지 않습니다C.
파생 된 스포츠 토토을 지정하는 하위 쿼리는 포함되어야합니다 괄호 및필수스포츠 토토 별명을 할당해야합니다 이름. (보다섹션 7.2.1.2.) 예 :
from (select * from table1) as alias_name
이 예제는와 같습니다.Alias_name as table1. 더 흥미로운 경우 평범한 결합으로 축소 할 수 없습니다. 하위 퀘스트가 발생하면 발생합니다. 그룹화 또는 집계가 포함됩니다.
테이블 함수는 행 세트를 생성하는 함수입니다. 기본 데이터 유형 (스칼라 유형) 또는 합성물로 구성 데이터 유형 (테이블 행). 그들은 테이블,보기, 또는 의 하위 퀴어Froma 질문. 스포츠 토토 함수에 의해 반환 된 열은에 포함될 수 있습니다.select, Join또는여기서테이블, 뷰 또는 하위 퀘스트와 같은 방식으로 조항 열.
스포츠 토토 함수가 기본 데이터 유형을 반환하는 경우 단일 결과 열은 함수와 유사합니다. 함수 인 경우 복합 유형을 반환하면 결과 열이 동일하게됩니다. 유형의 개별 속성으로 이름.
테이블 함수는에 별명이 될 수 있습니다.From조항이지만 남을 수도 있습니다 알리 아스. 함수가 사용되는 경우From별명이없는 절, 함수 이름 결과 테이블 이름으로 사용됩니다.
일부 예 :
테이블 foo (FOOD INT, FOOSUBID int, fooname 텍스트) 만들기; function getfoo (int) foo sets foo as 'as'를 반환합니다. FOO에서 * FOO FOOOD = $ 1; '언어 SQL; getfoo (1)에서 *를 t1로 선택하십시오. FOO에서 *를 선택하십시오 여기서 foosubid는 (getfoo (foo.fooid) z에서 foosubid를 선택하십시오 여기서 z.foooid = foo.foooid); getfoo (1)에서 select *로보기 vw_getfoo를 만듭니다. * vw_getfoo;에서 * 선택
경우에 따라 테이블 함수를 정의하는 것이 유용합니다. 다른 열 세트를 반환 할 수 있습니다. 호출. 이를 지원하기 위해 테이블 기능을 선언 할 수 있습니다 유사 형을 되 돌리는 동안레코드. 이러한 함수가 쿼리에서 사용되면 예상 행 구조는 쿼리 자체에 지정되어야합니다. 시스템은 쿼리를 구문 분석하고 계획하는 방법을 알 수 있습니다. 고려하다 이 예 :
선택 * DBLINK에서 ( 'dbname = mydb', 'pg_proc에서 proname, prosrc') T1 (Proname Name, Prosrc 텍스트) Proname과 같은 'Bytea%';
thedblink함수는 a 원격 쿼리 (참조Contrib/DBlink). 반품으로 선언 됨레코드그 이후 모든 종류의 쿼리에 사용될 수 있습니다. 실제 열 세트 구문자가되도록 호출 쿼리에 지정해야합니다. 예를 들어, 무엇을 알고 있습니다*확장.
여기서절 이다
여기서search_condition
여기서search_conditionIS 정의 된 모든 값 표현식섹션 4.2값을 반환합니다 유형부울.
처리 후From조항이 완료되며, 파생 된 가상 테이블의 각 행은 검색 조건에 대해 확인했습니다. 결과의 결과 조건은 사실입니다. 행은 출력 테이블에 보관됩니다. 그렇지 않으면 (즉, 결과가 False 또는 Null이면) 폐기. 검색 조건은 일반적으로 최소한 참조됩니다 에서 생성 된 테이블의 일부 열From절; 이것은 필요하지 않지만 그렇지 않으면 그만큼어디절은 공정하게됩니다 쓸모 없는.
참고 :|Join구문을 넣어야했습니다 내부 조인 조건에 가입여기서절. 예를 들어,이 테이블 표현은 동일합니다 :
a, b에서 b, 여기서 a.id = b.id 및 b.val 5및
A에서 B On (a.id = b.id)에서 b b.val 5에서 b on (a.id = b.id)또는 아마도
자연 조인 B에서 b b.val 5당신이 사용하는 이들 중 어느 것이 주로 스타일의 문제입니다. 그만큼Join구문의From조항은 아마도 휴대용이 아닐 것입니다 다른 SQL 데이터베이스 관리 시스템. 외부 조인 어쨌든 선택의 여지가 없습니다.From절.on/사용조항 외부 조인은아님A와 동등한여기서조건 행 추가를 결정합니다 (타의 추종없는 입력 행의 경우) 최종 결과에서 행을 제거 할뿐만 아니라
다음은의 몇 가지 예입니다.여기서클로즈 :
선택 ... FDT에서 C1 5 선택 ... FDT에서 C1 in (1, 2, 3) 선택 ... FDT에서 C1 in (T2에서 C1 선택) 선택 ... FDT에서 C1 in (T2에서 C3를 선택하십시오. 여기서 C2 = Fdt.c1 + 10) 선택 ... FDT에서 C1 사이의 C1 (T2에서 C3를 선택하여 C2 = FDT.C1 + 10)과 100 선택 ... FDT에서 존재하는 곳 (T2에서 C1을 선택하여 C2 FDT.C1)
FDT에서 파생 된 스포츠 토토입니다From절. 만나지 않는 행 의 검색 조건여기서절 에서 제거됩니다FDT. 주목하십시오 스칼라 하위 쿼리를 값 표현식으로 사용합니다. 어떤 것과 마찬가지로 다른 쿼리, 하위 쿼리는 복잡한 테이블을 사용할 수 있습니다 표현. 또한 어떻게FDTIS 하위 쿼리에서 참조됩니다. 자격C1asfdt.c1전용입니다 필요한 경우C1a 서브 쿼리의 파생 입력 테이블의 열. 하지만 열 이름 자격은 그렇지 않은 경우에도 명확성을 추가합니다. 필요합니다. 이 예제는 열 이름 지정 범위가 외부 쿼리는 내부 쿼리로 확장됩니다.
통과 후어디필터, 파생 입력 테이블은를 사용하여 그룹화 될 수 있습니다.그룹 by조항 및 제거 를 사용하는 그룹 행절.
selectselect_list[어디서 ...] 그룹 byGrouping_Column_Reference[, Grouping_Column_Reference] ...
the그룹 by절은 사용됩니다 동일한 값을 공유하는 테이블로 그 행을 함께 그룹화하십시오. 나열된 모든 열에서. 열이있는 순서 나열된 것은 중요하지 않습니다. 목적은 각 그룹을 줄이는 것입니다 공통 값을 하나의 그룹 행으로 공유하는 행 그룹의 모든 행을 대표합니다. 이것은 끝났습니다 출력 및/또는 계산 골재의 중복성을 제거합니다 이 그룹에 적용됩니다. 예를 들어:
= 선택 *에서 test1;x | 와이 ---+--- A | 3 C | 2 B | 5 A | 1 (4 줄)= X; Test1 Group에서 X를 선택하십시오.x --- 에이 비 기음 (3 줄)
두 번째 쿼리에서 우리는 쓸 수 없었습니다선택 *에서 test1 Group by x가 있기 때문입니다 열에 대한 단일 값 없음y각 그룹과 관련 될 수 있습니다. 그룹화 된 열은 할 수 있습니다 알려진 목록에서 참조됩니다. 그룹당 일정한 가치.
일반적으로 테이블이 그룹화되면 사용되지 않는 열 그룹화에서 집계를 제외하고는 참조 할 수 없습니다 표현. 골재 표현이있는 예는 다음과 같습니다.
= X, SOM (Y) X, Test1 Group에서 X;를 선택하십시오.x | 합집합 ---+----- A | 4 B | 5 C | 2 (3 줄)
여기Sum는 집계 함수입니다 이는 전체 그룹에 걸쳐 단일 값을 계산합니다. 더 사용 가능한 집계 기능에 대한 정보는 다음과 같습니다 에서 발견윈 토토 : 문서 :.
팁 :집계 표현이없는 그룹화 a.의 별개의 값 세트를 효과적으로 계산합니다 열. 이것은 또한를 사용하여 달성 할 수 있습니다.별도의절 (참조섹션 7.3.3).
여기에 또 다른 예가 있습니다. 총 판매량을 계산합니다. 각 제품 (모든 제품의 총 판매가 아닌).
Product_id, P.Name, (sum (s.units) * P.Price)을 판매로 선택하십시오 제품 P에서 왼쪽 왼쪽에 가입 판매 (product_id) Product_id, P.Name, P.Price;의 그룹
이 예에서 열product_id, p.name및P.Price그룹 by조항에서 참조되므로 쿼리 선택 목록. (제품 스포츠 토토의 정확한 방법에 따라 설정되면 이름과 가격이 제품에 완전히 의존 할 수 있습니다. 추가 그룹화는 이론적으로 될 수 있습니다 불필요하지만 아직 구현되지 않았습니다.) 열S.units그룹 byList에서만 사용되므로 골재 표현 (Sum (...)), 제품의 판매를 나타냅니다. 각 제품에 대해 쿼리는 제품의 모든 판매에 대한 요약 행을 반환합니다.
엄격한 SQL,그룹 by할 수 있습니다 소스 스포츠 토토의 열별 그룹이지만PostgreSQL허용하도록 이것을 확장합니다그룹 by목록을 선택하십시오. 단순한 대신 가치 표현식으로 그룹화합니다 열 이름도 허용됩니다.
스포츠 토토이 a를 그룹화 한 경우그룹 by조항이지만 특정 그룹 만 관심이 있습니다,절의 캔 a처럼 사용됩니다.여기서절, to 그룹화 된 테이블에서 그룹을 제거하십시오. 구문은 다음과 같습니다.
selectselect_listFrom ... [어디서 ...] 그룹에 의한 그룹 ...boolean_expression
표현절 그룹화 된 표현식과 그룹화되지 않은 것을 참조 할 수 있습니다 표현식 (반드시 집계가 포함됩니다 기능).
예 :
= SOLECT X, SUM (Y) Test1 Group에서 X를 통해 SUM (y) 3;x | 합집합 ---+----- A | 4 B | 5 (2 줄)= x < 'c';에 의해 test1 그룹에서 x, sum (y)을 선택하십시오.x | 합집합 ---+----- A | 4 B | 5 (2 줄)
다시, 더 현실적인 예 :
Product_id, P.Name, (sum (s.units) * (p.price -p.cost))))) 제품 P에서 왼쪽 왼쪽에 가입 판매 (product_id) 여기서 s.date current_date- 간격 '4 주' product_id, p.name, p.price, p.cost의 그룹 합계 (p.price * s.units) 5000;
위의 예에서여기서절은 그룹화되지 않은 열에 따라 행을 선택합니다 ( 표현은 지난 4 주 동안 판매에만 해당됩니다), 동안조항은 다음을 제한합니다 총 총 매출이 5000 이상인 그룹에 대한 출력. 집계 표현이 반드시 쿼리의 모든 부분에서 동일합니다.