A 사설 토토 표현식테이블을 지정합니다. 사설 토토 표현식에는 선택적으로 FROM 절이 포함되어 있습니다. 그 뒤에는 WHERE, GROUP BY 및 HAVING 절이 옵니다. 사소한 테이블 표현식은 단순히 디스크의 테이블, 소위 기본 테이블을 나타냅니다. 테이블이지만 더 복잡한 표현식을 사용하여 수정하거나 다양한 방법으로 기본 테이블을 결합합니다.
테이블의 선택적 WHERE, GROUP BY 및 HAVING 절 표현식은 연속적인 변환의 파이프라인을 지정합니다. FROM 절에서 파생된 테이블에서 수행됩니다. 파생된 이러한 모든 변환을 통해 생성된 테이블은 다음을 제공합니다. 선택 항목에 지정된 대로 출력 행을 계산하는 데 사용되는 입력 행 열 값 표현식 목록입니다.
FROM 절은 하나 이상의 다른 사설 토토에서 사설 토토을 파생합니다. 쉼표로 구분된 사설 토토 참조 목록에 제공된 사설 토토입니다.
발신사설 토토_참조 [, 사설 토토_참조 [, ...]]
테이블 참조는 테이블 이름 또는 파생 테이블일 수 있습니다. 하위 쿼리, 테이블 조인, 복잡한 조합 등 이것들. FROM에 둘 이상의 테이블 참조가 나열되는 경우 절은 파생된 형태를 형성하기 위해 교차 결합됩니다(아래 참조). WHERE에 의해 변환될 수 있는 테이블 GROUP BY 및 HAVING 절은 마지막으로 다음의 결과입니다. 전체 사설 토토 표현식입니다.
테이블 참조가 상위 테이블인 테이블의 이름을 지정할 때 테이블 상속 계층 구조에서 테이블 참조는 다음을 생성합니다. 해당 테이블뿐만 아니라 모든 하위 테이블 후속 항목의 행, 키워드가 테이블 이름 앞에만 나오지 않는 한. 그러나 참조는 명명된 이름에 나타나는 열만 생성합니다. 테이블 --- 하위 테이블에 추가된 모든 열은 무시됩니다.
조인된 테이블은 다른 두 개(실제 또는 파생) 특정 조인 규칙에 따른 테이블 유형. INNER, OUTER, CROSS JOIN이 지원됩니다.
조인 유형
T1교차 조인T2
다음의 각 행 조합에 대해T1그리고T2, 파생 사설 토토은 의 모든 열로 구성된 행을 포함합니다.T1다음의 모든 열이 이어짐T2. 테이블이 있는 경우 각각 N 및 M 행, 조인된 테이블은 N 개를 갖습니다. * M행. 크로스 조인은 다음과 같습니다.TRUE에 대한 내부 조인.
팁: 발신T1교차 조인T2다음과 동일함발신T1, T2.
T1 { [내부] | 왼쪽 | 맞다 | 전체 [외부] 가입T2켜짐boolean_expression
T1 { [내부] | 왼쪽 | 맞다 | 전체 [외부] 가입T2사용 중(열 목록 조인 )
T1자연스러운 [내부] | 왼쪽 | 맞다 | 전체 [외부] 가입T2
말씀내부그리고외부모두 선택사항입니다. 조인합니다.내부기본값입니다.왼쪽, 오른쪽및전체OUTER JOIN을 암시합니다.
그조인 조건이다 ON 또는 USING 절에 지정되거나 암시적으로 자연이라는 단어. 조인 조건에 따라 다음이 결정됩니다. 두 소스 테이블의 행은 다음과 같이 간주됩니다."일치"에 설명된 대로 자세한 내용은 아래에서 확인하세요.
ON 절은 가장 일반적인 종류의 조인입니다 조건: 부울 값 표현식을 사용합니다. WHERE 절에 사용되는 것과 동일한 종류입니다. 한 쌍의 행 ON 표현식이 다음과 같이 평가되면 T1과 T2가 일치합니다. 그들에게는 사실입니다.
USING은 약식 표기법입니다. 조인된 열 이름의 쉼표로 구분된 목록 테이블은 공통점이 있어야 하며 조인 조건을 형성합니다. 이러한 열 쌍 각각의 동일성을 지정합니다. 또한 JOIN USING의 출력에는 하나의 열이 있습니다. 입력 열의 동일한 쌍 각각에 대해 그 뒤에는 각 테이블의 다른 모든 열이 옵니다. 따라서,(a, b, c) 사용이다 에 해당함ON(t1.a = t2.a AND t1.b = t2.b AND t1.c = t2.c)예외는 제외 ON을 사용하면 두 개의 열 a, b 및 결과에는 c가 있지만 USING을 사용하면 각각 하나씩.
마지막으로, 자연적 USING의 단축형입니다. USING 목록을 형성합니다. 다음에 나타나는 열 이름과 정확하게 구성되어 있습니다. 두 입력 테이블 모두. USING과 마찬가지로 다음 열이 나타납니다. 출력 테이블에 한 번만 표시됩니다.
적격한 JOIN의 가능한 유형은 다음과 같습니다:
T1의 각 행 R1에 대해 조인된 테이블에는 다음이 있습니다. 조인을 만족하는 T2의 각 행에 대한 행 R1의 조건.
먼저 INNER JOIN이 수행됩니다. 그런 다음 조인을 만족하지 않는 T1의 각 행 T2의 행에 대한 조건이 있는 경우 조인된 행은 다음과 같습니다. T2의 열에 NULL 값이 반환되었습니다. 따라서, 조인된 테이블에는 무조건 하나 이상의 테이블이 있습니다. T1의 각 행에 대한 행입니다.
먼저 INNER JOIN이 수행됩니다. 그런 다음 조인을 만족하지 않는 T2의 각 행 T1의 행에 대한 조건이 있는 경우 조인된 행은 다음과 같습니다. T1의 열에 NULL 값이 반환되었습니다. 이 왼쪽 조인의 반대: 결과 테이블 무조건 각 행에 대해 행을 갖게 됩니다. T2.
먼저 INNER JOIN이 수행됩니다. 그런 다음 조인을 만족하지 않는 T1의 각 행 T2의 행에 대한 조건이 있는 경우 조인된 행은 다음과 같습니다. T2의 열에 null 값이 반환되었습니다. 또한, 조인을 만족하지 않는 T2의 각 행에 대해 T1의 행에 대한 조건, 다음과 결합된 행 T1 열의 null 값이 반환됩니다.
모든 유형의 조인은 함께 연결되거나 중첩될 수 있습니다. 둘 중 하나 또는 둘 다T1그리고T2테이블을 조인할 수 있습니다. JOIN 절 주위에 괄호를 사용하여 가입 주문. 괄호가 없으면 JOIN 절이 중첩됩니다. 왼쪽에서 오른쪽으로.
파생 테이블을 지정하는 하위 쿼리는 다음으로 묶어야 합니다. 괄호 및반드시AS를 사용하여 이름 지정 조항. (참조섹션 2.2.1.3.)
FROM (SELECT * FROM table1) AS alias_name
이 예는 다음과 같습니다.발신 table1 AS alias_name. 더 흥미로운 사례는 다음과 같습니다. 일반 조인으로 축소할 수 없으며 하위 쿼리가 발생할 때 발생합니다. 그룹화 또는 집계가 포함됩니다.
사설 토토 및 복잡한 사설 토토에 임시 이름을 부여할 수 있습니다. 파생 사설 토토에 대한 참조에 사용되는 참조 추가 처리. 이것을 a라고 합니다.사설 토토 별칭.
발신사설 토토_참조AS별칭
여기,별칭어떤 것이든 가능 일반 식별자. 별칭은 새 이름이 됩니다. 현재 쿼리에 대한 테이블 참조 - 더 이상 그렇지 않습니다. 원래 이름으로 테이블을 참조하는 것이 가능합니다. 따라서
SELECT * FROM my_table AS m WHERE my_table.a 5;
은 유효한 SQL 구문이 아닙니다. 실제로 무슨 일이 일어날 것인가(이것은 는포스트그레SQL확장자 표준)은 암시적 테이블 참조가 FROM 절을 사용하므로 쿼리는 마치 FROM 절인 것처럼 처리됩니다. 다음과 같이 작성됨
SELECT * FROM my_table AS m, my_table AS my_table WHERE my_table.a 5;
사설 토토 별칭은 주로 표기상의 편의를 위한 것이지만 테이블 자체를 조인할 때 이를 사용해야 합니다. 예를 들어,
SELECT * FROM my_table AS a CROSS JOIN my_table AS b ...
또한 테이블 참조인 경우 별칭이 필요합니다. 하위 쿼리입니다.
괄호는 모호성을 해결하는 데 사용됩니다. 다음 문은 별칭을 할당합니다b에 이전 예와 달리 조인 결과:
SELECT * FROM (my_table AS a CROSS JOIN my_table) AS b ...
발신사설 토토_참조 별칭
이 형식은 이전에 처리된 형식과 동일합니다;AS키워드는 소음입니다.
발신사설 토토_참조 [AS] 별명 ( 열1 [, 열2 [, ...]] )
이 양식에서는 테이블 이름을 다음과 같이 바꾸는 것 외에도 위에서 설명한 것처럼 테이블의 열도 제공됩니다. 주변 쿼리에서 사용할 임시 이름입니다. 적은 경우 열 별칭이 실제 테이블보다 지정되었습니다. 열의 경우 나머지 열의 이름은 바뀌지 않습니다. 이 구문 셀프 조인이나 하위 쿼리에 특히 유용합니다.
별칭이 JOIN 절의 출력에 적용될 때, 이러한 형식 중 하나를 사용하면 별칭은 원래 이름을 숨깁니다. JOIN 내에서. 예를 들어,
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.
T1 내부 조인 T2에서 (C)를 사용하여 T1에서 왼쪽 외부 조인 T2에서 (C)를 사용 FROM (T1 오른쪽 외부 조인 T2 ON (T1.C1=T2.C1)) AS DT1 FROM((C)를 사용하는 T1 전체 외부 조인 T2) AS DT1(DT1C1, DT1C2) T1에서 자연 내부 조인 T2 T1에서 자연 왼쪽 외부 조인 T2 T1에서 자연 오른쪽 외부 조인 T2 T1에서 자연 완전 외부 조인 T2 FROM (SELECT * FROM T1) DT1 CROSS JOIN T2, T3 FROM(SELECT * FROM T1) DT1, T2, T3
위는 조인된 테이블과 콤플렉스의 몇 가지 예입니다. 파생 테이블. AS 절이 어떻게 이름을 바꾸거나 이름을 지정하는지 확인하세요. 파생 테이블 및 선택적 쉼표로 구분된 목록 뒤에 오는 열 이름은 열의 이름을 바꿉니다. 마지막 두 FROM 절은 T1, T2 및 T1에서 동일한 파생 테이블을 생성합니다. T3. 하위 쿼리 이름을 DT1로 지정할 때 AS 키워드가 생략되었습니다. OUTER, INNER 키워드는 생략 가능한 노이즈입니다. 그것도.
WHERE 절의 구문은 다음과 같습니다
어디검색_조건
어디에서검색_조건이다 에 정의된 모든 값 표현식섹션 1.3다음 값을 반환합니다. 유형부울.
FROM 절의 처리가 완료된 후, 파생된 사설 토토은 검색 조건에 대해 확인됩니다. 만약에 조건의 결과가 true이면 행은 출력 사설 토토, 그렇지 않은 경우(즉, 결과가 false이거나 NULL)은 폐기됩니다. 검색 조건은 일반적으로 생성된 사설 토토의 일부 열을 참조합니다. FROM 절; 필수는 아니지만 그렇지 않으면 WHERE 조항은 상당히 쓸모가 없습니다.
참고:JOIN 구현 전 구문에서는 조인 조건을 넣어야 했습니다. WHERE 절의 내부 조인. 예를 들어, 이 테이블은 표현식은 동일합니다:
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이들 중 당신이 사용하는 것은 주로 스타일의 문제입니다. FROM 절의 JOIN 구문은 아마도 다음과 같지 않을 것입니다. 다른 제품에 이식 가능합니다. 외부 조인의 경우 어떤 경우든 선택: FROM 절에서 수행되어야 합니다. 에이 외부 조인의 ON/USING 절은 다음과 같습니다.아님WHERE와 동일 조건에 따라 행 추가가 결정되기 때문입니다(예: 일치하지 않는 입력 행) 및 행 제거 최종 결과입니다.
FDT에서 어디에서
C1 5
FDT에서 어디에서
C1 IN(1, 2, 3)
FDT에서 어디에서
C1 IN(T2에서 C1 선택)
FDT에서 어디에서
C1 IN(C2 = FDT.C1 + 10인 경우 T2에서 C3 선택)
FDT에서 어디에서
C1 (C2 = FDT.C1 + 10인 T2에서 C3 선택)과 100 사이
FDT에서 어디에서
존재합니다(C2 FDT.C1인 T2에서 C1 선택)
위의 예에서,FDT이것은 FROM 절에서 파생된 테이블입니다. 충족하지 않는 행 where 절의 검색 조건은 다음에서 제거됩니다.FDT. 스칼라 사용에 주목하세요 값 표현식으로서의 하위 쿼리. 다른 검색어와 마찬가지로 하위 쿼리는 복잡한 사설 토토 표현식을 사용할 수 있습니다. 방법을 알아보세요.FDT은 하위 쿼리에서 참조됩니다. 적격C1asFDT.C1다음의 경우에만 필요합니다.C1또한 파생된 열의 이름입니다. 하위 쿼리의 입력 테이블입니다. 열 이름을 한정하면 추가됩니다. 필요하지 않은 경우에도 명확성을 제공합니다. 이는 열이 어떻게 표시되는지 보여줍니다. 외부 쿼리의 명명 범위는 내부 쿼리로 확장됩니다. 쿼리.
WHERE 필터를 통과한 후 파생된 입력 사설 토토은 GROUP BY 절을 사용하여 그룹화해야 하며, HAVING 절을 사용하여 그룹 행을 제거합니다.
선택select_list발신 ...
[어디에서...]
그룹 기준grouping_column_reference [, grouping_column_reference]...
GROUP BY 절은 행을 그룹화하는 데 사용됩니다. 나열된 모든 열에서 동일한 값을 공유하는 테이블입니다. 는 열이 나열되는 순서는 중요하지 않습니다(예: ORDER BY 절과 반대됨). 목적은 각각을 줄이는 것입니다. 공통 값을 공유하는 행 그룹을 하나의 그룹 행으로 묶습니다. 그룹의 모든 행을 대표합니다. 이는 다음과 같이 수행됩니다. 출력의 중복성을 제거하거나 집계를 얻습니다. 이 그룹에 적용됩니다.
테이블이 그룹화되면 테이블에서 사용되지 않는 열은
집계 표현식을 제외하고는 그룹화를 참조할 수 없습니다.
해당 열의 특정 값이 모호하므로
그룹의 행에서 와야 합니까? 그룹화 기준 열
선택 목록 열 표현식에서 참조될 수 있습니다.
그룹당 알려진 상수 값을 가집니다. 집계 함수
그룹화되지 않은 열은 행 전체에 걸쳐 값을 제공합니다.
전체 테이블이 아닌 그룹입니다. 예를 들어,합계(매출)제품 코드별로 그룹화된 테이블
의 총 판매량이 아닌 각 제품의 총 판매량을 제공합니다.
모든 제품. 그룹화되지 않은 열에서 계산된 집계는 다음과 같습니다.
집단을 대표하는 반면, 개인의 가치는 집단을 대표한다.
그룹화되지 않은 열은 그렇지 않습니다.
예:
SELECT pid, p.name, (sum(s.units) * p.price) AS 판매 FROM 제품 p LEFT JOIN 판매 s USING ( pid ) GROUP BY pid, p.name, p.price;
이 예에서는 열pid,
p.name및p.price이후 GROUP BY 절에 있어야 합니다.
쿼리 선택 목록에서 참조됩니다. 칼럼
s.units는 GROUP BY 목록에 있을 필요가 없습니다.
집계 표현식()에만 사용됩니다.합계()), 영업 그룹을 나타냅니다.
제품의. 각 제품에 대해 요약 행이 반환됩니다.
제품의 모든 판매.
엄격한 SQL에서 GROUP BY는 다음의 열로만 그룹화할 수 있습니다. 소스 테이블이지만포스트그레SQL이를 확장하여 GROUP BY가 선택 열별로 그룹화할 수도 있습니다. 쿼리 선택 목록에서 대신 값 표현식으로 그룹화 간단한 열 이름도 허용됩니다.
선택select_list발신 ... [어디에서 ...] GROUP BY ... HAVINGboolean_expression
테이블이 GROUP BY 절을 사용하여 그룹화되었지만 특정 그룹에만 관심이 있는 경우 HAVING 절은 다음과 같습니다. WHERE 절과 마찬가지로 그룹을 제거하는 데 사용됩니다. 그룹화된 테이블입니다.포스트그레SQLGROUP BY 없이 HAVING 절을 사용할 수 있습니다. 이 경우 다른 WHERE 절처럼 작동하지만 사용 시 요점은 그런 식으로 하는 것은 명확하지 않습니다. 좋은 경험 법칙은 다음과 같습니다. HAVING 조건은 집계 결과를 참조해야 합니다. 기능. 집계와 관련되지 않은 제한은 다음과 같습니다. WHERE 절에서 더 효율적으로 표현됩니다.
예:
"제품"으로 pid 선택,
p.name AS "5000 이상",
(sum(s.units) * (p.price - p.cost)) AS "지난 달 이익"
FROM 제품 p LEFT JOIN 판매 s USING ( pid )
WHERE s.date CURRENT_DATE - 간격 '4주'
GROUP BY pid, p.name, p.price, p.cost
HAVING sum(p.price * s.units) 5000;
위의 예에서 WHERE 절은 행을 선택하는 방법입니다. HAVING 절은 그룹화되지 않은 열을 제한합니다. 총 매출이 5000을 넘는 그룹으로 출력됩니다.