hyperskill - Set operations 원문
가끔, 당신은 같은 구조를 가진 여러 개의 쿼리의 결과를 결합하고 싶을 겁니다.
그리고, 그 결과를 반환하고 싶을 겁니다.
이를 수행하기 위해서, set operations (set 연산자)를 사용해야 합니다.
한 번 이 연산자가 SQL 에서 어떻게 구현되었는지 살펴봅시다.
Set operations - 집합 연산자들
Set 연산자들은 여러 SELECT 문법의 결과 집합에서 나온 줄들을 결합합니다.
여러 개의 Set 연산자들이 있으며, 이를 수행하는 서로 다른 방식을 제공합니다.
SQL 에서는, 이들은 UNION, UNION ALL, INTERSECT, EXCEPT or MINUS 입니다.
이러한 set 연산자들은 SELECT
문법이 같은 수의 컬럼, 알맞는 모든 컬럼들이 비슷한 데이터 타입을 가졌는지, 모든 컬럼들이 같은 순서로 선택되었을 때만 사용 될 수 있습니다.
UNION - UNION 연산자
UNION 연산자는 두 개 혹은 그 이상의 결과들을 병합하며, 모든 중복 줄들을 제거합니다.
두 개의 테이블이 있다고 가정하겠습니다 : teachers, administrative_staff
teachers
테이블은 밑의 컬럼을 가지고 이미 테이블이 형성되어 있습니다.
name VARCHAR(40)
subject VARCHAR(30)
name | subject |
---|---|
Ginevra Holmes | Geography |
Carl Robinson | Math |
Tamara Fetch | IT |
Robert Starmk | English |
administrative_staff
테이블은 밑의 컬럼을 가지고 이미 테이블을 형성했습니다.
position VARCHAR(40)
name VARCHAR(40)
position | name |
---|---|
headmaster | Tomas Jones |
deputy head | Tamara Fetch |
senior deputy head | Ann Brown |
우리는 UNION
연산자로 결합된 두 개의 쿼리를 가지고
이러한 두 개의 테이블로부터 모든 학교의 직원들을 선택 할 수 있습니다.
SELECT name FROM teachers
UNION
SELECT name FROM administrative_staff;
이 쿼리의 실행 결과는 이러합니다 :
name |
---|
Ginevra Holmes |
Carl Robinson |
Tamara Fetch |
Robert Stark |
Tomas Jones |
Ann Brown |
UNION ALL - UNION ALL 연산자
UNION ALL 연산자는 UNION과 거의 똑같지만, 모든 중복값들을 유지합니다.
밑의 쿼리는 모든 선생님과 행정 관리자를 포함하는데, 어느 곳이던 중복 값을 포함합니다.
SELECT name FROM teachers
UNION ALL
SELECT name FROM administrative_staff;
우리 쿼리의 경우 결과는 이와 같습니다 :
name |
---|
Ginevra Holmes |
Carl Robinson |
Tamara Fetch |
Robert Stark |
Tomas Jones |
Tamara Fetch |
Ann Brown |
INTERSECT - INTERSECT 연산자
INTERSECT 연산자는 중복을 제거하고, 모든 컴포넌트 쿼리들의 공통 요소인 레코드를 반환합니다.
INTERSECT 를 통해, 우리는 행정 직책을 가지고 있는 모든 선생님들을 선택할 수 있습니다. :
SELECT name FROM teachers
INTERSECT
SELECT name FROM administrative_staff;
위의 쿼리 결과 집합은 단 하나의 줄만 가집니다.
name |
---|
Tamara Fetch |
MySQL과 같은 일부 DBMS 구문에서는, INTERSECT 연산자를 지원하지 않습니다.
MINUS or EXCEPT - MINUS 혹은 EXCEPT 연산자
EXCEPT 연산자는 첫 번째 결과 집합에 속하지만, 두 번째 결과 집합은 아닌 줄들만 반환합니다.
이는 모든 중복을 생략합니다.
추가적인 행정 직책을 가지지 않은 모든 선생님들을 선택 해 봅시다 :
SELECT name FROM teachers
EXCEPT
SELECT name FROM administrative_staff
여기에서 우리는 EXCEPT
연산자를 사용하지만,
다른 몇몇 관리 시스템에서는 EXCEPT
연산자는 MINUS 연산자로 불립니다.
따라서, 이와 같은 쿼리를 EXCEPT 혹은 MINUS 로 재배치 하면 됩니다.
결과는 이렇습니다 :
name |
---|
Ginevra Holmes |
Carl Robinson |
Robert Stark |
UNION
, UNION ALL
, INTERSECT
쿼리에서는, 컴포넌트 쿼리의 순서에 상관하지 않습니다.
만약 우리가 EXCEPT
, MINUS
쿼리에서의 컴포넌트 쿼리들의 순서가 바뀐다면,
쿼리의 의미와 결과 집합이 바뀝니다.
쿼리가 2개보다 많은 경우, 괄호가 실행되는 연산자들의 순서를 바꾸는 데 쓰입니다.
밑의 쿼리는 선생님으로서 일하지 않는 모든 행정 직원들을 반환합니다.
SELECT name FROM administrative_staff
EXCEPT
SELECT name FROM teachers;
위 쿼리의 결과는 두 개의 줄만 가집니다 :
name |
---|
Tomas Jones |
Ann Brown |
Conclusion - 결론
이 템플릿을 사용하여 set 연산자를 쉽게 사용 할 수 있습니다 :
SELECT
column_1_1,
column_1_2,
...,
column_1_n
FROM
table_1
[WHERE logical_expression]
SET_OPERATOR
SELECT
column_2_1,
colunn_2_2,
...,
column_2_n
FROM
table_2
[WHERE logical_expression]
[SET_OPERATOR
...]
당신이 사용하는 SQL 구문에 조심하세요 :
모든 DBMS는 UNION, UNION ALL 을 지원하지만,
INTERSECT, MINUS, EXCEPT 는 불가능 할 수도 있습니다.
'Hyperskill - 컴퓨터 CS 및 영어 독해 > Introducing to SQL' 카테고리의 다른 글
Date & Time data types - 날짜와 시간 데이터 타입 (1) | 2024.05.01 |
---|---|
Consistency constraints - 일관성 제약 조건 (0) | 2024.04.30 |
Subqueries - 서브쿼리 (0) | 2024.04.29 |
GROUP BY statement - GROUP BY 문법 (0) | 2024.04.28 |
Aggregate functions - 집계 함수들 (0) | 2024.04.27 |