A 질의검색하는 과정입니다 또는 데이터베이스에서 데이터를 검색하는 명령입니다. SQL에서는선택명령은 쿼리를 지정하는 데 사용됩니다. 의 일반 구문선택명령 이다
선택select_list발신배트맨 토토_표현 [정렬_사양]
다음 섹션에서는 선택 항목의 세부정보를 설명합니다.
목록, 배트맨 토토 표현식 및 정렬 사양입니다. 그만큼
가장 간단한 종류의 쿼리 형식은 다음과 같습니다.SELECT * FROM table1;table1이라는 배트맨 토토이 있다고 가정하면 이 명령은 table1에서 모든 행과 모든 열을 검색합니다. (방법은 검색은 클라이언트 애플리케이션에 따라 다릅니다. 예를 들어,psql프로그램은 다음을 표시합니다 화면의 ASCII 아트 테이블, 클라이언트 라이브러리에서 제공 개별 행과 열을 검색하는 기능입니다.) 선택 목록 사양*다음에 있는 모든 열을 의미합니다. 배트맨 토토 표현식이 제공됩니다. 선택 목록에서도 선택할 수 있습니다. 사용 가능한 열의 하위 집합을 선택하거나 심지어 열을 검색하기 전에; 보다섹션 2.2. 예를 들어 table1의 경우 a, b, c(그리고 다른 것들도 가능)라는 이름의 열이 있습니다. 다음 쿼리:
배트맨 토토1에서 a, b + c 선택;(b와 c가 숫자 데이터 유형이라고 가정).
배트맨 토토1에서특히 간단합니다. 일종의 테이블 표현이다. 일반적으로 배트맨 토토 표현식은 다음과 같습니다. 기본 테이블, 조인 및 하위 쿼리의 복잡한 구성. 하지만 당신은 배트맨 토토 표현식을 완전히 생략하고 SELECT를 사용할 수도 있습니다. 계산기로서의 명령:
3 * 4 선택;선택 목록의 표현식이 다음과 같은 경우 더 유용합니다. 다양한 결과를 반환합니다. 예를 들어, 다음과 같은 함수를 호출할 수 있습니다. 방법.
임의 선택();
A 배트맨 토토 표현식을 지정합니다 테이블. 배트맨 토토 표현식에는 다음과 같은 FROM 절이 포함되어 있습니다. 선택적으로 WHERE, GROUP BY 및 HAVING 절이 뒤에옵니다. 간단한 배트맨 토토 표현식은 단순히 디스크의 테이블을 참조합니다. 소위 기본 테이블이지만 더 복잡한 표현식을 사용할 수 있습니다. 다양한 방법으로 기본 테이블을 수정하거나 결합합니다.
다음의 선택적 WHERE, GROUP BY 및 HAVING 절 배트맨 토토 표현식은 연속적인 파이프라인을 지정합니다. FROM에서 파생된 테이블에 대해 수행된 변환 절. 이 모든 것에 의해 생성된 파생 테이블 변환은 출력을 계산하는 데 사용되는 입력 행을 제공합니다. 열 값의 선택 목록에 지정된 행 표현.
FROM 절은 하나 이상의 다른 배트맨 토토에서 배트맨 토토을 파생합니다. 쉼표로 구분된 배트맨 토토 참조 목록에 제공된 배트맨 토토입니다.
발신배트맨 토토_참조 [, 배트맨 토토_참조 [, ...]]
테이블 참조는 테이블 이름 또는 파생 테이블일 수 있습니다.
하위 쿼리, 테이블 조인 또는 이들의 복잡한 조합으로 사용할 수 있습니다. 만약에
둘 이상의 테이블 참조가 FROM 절에 나열되어 있습니다.
CROSS JOIN(아래 참조)을 통해 파생 테이블을 형성합니다.
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의 행이 일치합니다. TRUE로 평가됩니다.
USING은 약식 표기법입니다. 쉼표로 구분된 열 이름 목록입니다. 조인된 테이블에는 공통이 있어야 하며 조인을 형성합니다. 각 쌍의 동일성을 지정하는 조건 열. 또한 JOIN USING의 출력 동일한 입력 쌍 각각에 대해 하나의 열이 있습니다. 열 다음에 다른 모든 열이 옵니다. 각 테이블. 따라서,사용 중(a, b, 기음)다음과 동일함ON(t1.a = t2.a AND t1.b = t2.b AND t1.c = t2.c)와 함께 ON을 사용하면 두 개가 있다는 점은 예외입니다. 결과에 a, b, c 열이 있는 반면 USING을 사용하면 각각 하나씩만 있을 것입니다.
마지막으로 NATURAL은 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그리고T2JOIN된 테이블일 수 있습니다. JOIN 절 주위에 괄호를 사용하여 가입 주문. 괄호가 없으면 JOIN 절 왼쪽에서 오른쪽으로 중첩됩니다.
파생 배트맨 토토을 지정하는 하위 쿼리를 묶어야 합니다. 괄호 안에 및반드시이름을 짓다 AS 절을 사용합니다. (보다섹션 2.1.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 구문이 아닙니다. 실제로 무슨 일이 일어날까요(이것은포스트그레확장 표준)은 암시적 테이블 참조가 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 ...
발신table_reference 별칭이 형식은 이전에 처리된 형식과 동일합니다; 그만큼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 (T1C1=T2C1)) 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 및 T3에서 동일한 파생 테이블입니다. AS 키워드가 생략되었습니다. 하위 쿼리 이름을 DT1로 지정합니다. OUTER 및 INNER 키워드는 다음과 같습니다. 노이즈도 생략 가능합니다.
WHERE 절의 구문은 다음과 같습니다
어디검색_조건어디에서검색_조건아무거나 에 정의된 값 표현식PostgreSQL : 문서 : 7.1 : 값 사설 토토 사이트식유형의 값을 반환하는부울.
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가 어떻게 참조되는지 확인하세요. C1 적격 FDT.C1은 C1이 a의 이름이기도 한 경우에만 필요합니다. 하위 쿼리의 파생 입력 테이블에 있는 열입니다. 적격 열 이름은 필요하지 않은 경우에도 명확성을 더해줍니다. 이것 외부 쿼리의 열 명명 범위가 어떻게 확장되는지 보여줍니다. 내부 쿼리에 포함됩니다.
WHERE 필터를 통과한 후 파생된 입력 배트맨 토토 GROUP BY 절을 사용하여 그룹화될 수 있습니다. HAVING 절을 사용하여 그룹 행을 제거합니다.
선택select_list발신 ... [어디에서 ...] 그룹별grouping_column_reference [, grouping_column_reference]...
GROUP BY 절은 행을 그룹화하는 데 사용됩니다. 나열된 모든 열에서 동일한 값을 공유하는 테이블입니다. 열이 나열되는 순서는 중요하지 않습니다(예: ORDER BY 절과 반대됨). 목적은 각각을 줄이는 것입니다. 공통 값을 공유하는 행 그룹을 하나의 그룹 행으로 묶습니다. 그룹의 모든 행을 대표합니다. 이는 다음과 같이 수행됩니다. 출력의 중복성을 제거하거나 집계를 얻습니다. 이 그룹에 적용됩니다.
테이블이 그룹화되면 테이블에서 사용되지 않는 열은 그룹화는 집계 외에는 참조할 수 없습니다. 해당 열의 특정 값은 다음과 같습니다. 모호함 - 그룹의 어느 행에서 나와야 합니까? 그만큼 그룹화 기준 열은 선택 목록 열에서 참조될 수 있습니다. 표현식은 그룹별로 알려진 상수 값을 갖고 있기 때문입니다. 그룹화되지 않은 열의 집계 함수는 값을 제공합니다. 전체 테이블이 아닌 그룹의 행에 걸쳐 있습니다. 을 위한 예를 들어, a합계(판매)탁자 위에 제품 코드별로 그룹화하면 각 제품의 총 판매량을 알 수 있습니다. 제품 전체 판매량이 아닌 모든 제품의 총 판매량을 의미합니다. 집계 그룹화되지 않은 열에서 계산된 값은 다음을 나타냅니다. 반면 그룹화되지 않은 열의 개별 값은 아니다.
예:
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는 다음의 열로만 그룹화할 수 있습니다. 소스 테이블이지만 Postgres는 이를 확장하여 GROUP BY도 허용합니다. 쿼리 선택 목록에서 선택 열을 기준으로 그룹화합니다. 그룹화 단순한 열 이름 대신 값 표현식을 사용하는 것도 가능합니다. 허용된.
선택select_list발신 ... [어디에서 ...] GROUP BY ... HAVINGboolean_expression
GROUP BY 절을 사용하여 테이블을 그룹화했지만,
특정 그룹에만 관심이 있는 경우 HAVING 절을 사용할 수 있습니다.
그룹화된 테이블에서 그룹을 제거하는 WHERE 절과 유사합니다.
Postgres에서는 GROUP BY 없이 HAVING 절을 사용할 수 있습니다.
이 경우 다른 WHERE 절처럼 작동하지만
그런 식으로 HAVING을 사용하는 것은 명확하지 않습니다. 좋은 경험 법칙은 다음과 같습니다.
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을 넘는 그룹으로 출력됩니다.