-- 집합 연산자
-- ## UNION
-- 1. 합집합 연산의 의미입니다.
-- 2. 첫번째 쿼리와 두번째 쿼리의 중복정보는 한번만 보여줍니다.
-- 3. 첫번째 쿼리의 열의 개수와 타입이 두번째 쿼리의 열수와 타입과 동일해야 함.
-- 4. 자동으로 정렬이 일어남 (첫번째 컬럼 오름차가 기본값)
SELECT
emp_no,emp_nm, birth_de
FROM tb_emp
WHERE birth_de BETWEEN '19600101' AND '19691231'
UNION
SELECT
emp_no, emp_nm, birth_de
FROM tb_emp
WHERE birth_de BETWEEN '1970101' AND '19791231'
;
-- ======
SELECT
emp_nm, birth_de
FROM tb_emp
WHERE birth_de BETWEEN '19600101' AND '19691231'
UNION
SELECT
emp_nm, birth_de
FROM tb_emp
WHERE birth_de BETWEEN '1970101' AND '19791231'
-- 70년생 사원 중 이관심이 중복이 되어있다.
-- 사원번호로 분리 하다가 사원번호를 뺀후 UNION 실행하니 중복된 이관심 하나가 없어짐.
-- 정렬은 첫번째 컬럼 오름차로 되었다.
;
SELECT
emp_nm EN, birth_de BD -- 별칭을 준후 UNION 하면?
FROM tb_emp
WHERE birth_de BETWEEN '19600101' AND '19691231'
UNION
SELECT
emp_nm EN2, birth_de BD2
FROM tb_emp
WHERE birth_de BETWEEN '1970101' AND '19791231'
ORDER BY BD DESC -- 자동정렬 : 첫열의 오름차 / 다르게 정렬하고 싶으면 UNION 끝나는 지점에 작성
;
-- 별칭을 주지 않으면 컬럼명으로 나오는데 별칭이 있는 경우 위에 있는 별칭을 쓴다.
-- ## UNION ALL
-- 1. UNION과 같이 두 테이블로 수직으로 합쳐서 보여줍니다.
-- 2. UNION과는 달리 중복된 데이터도 한번 더 보여줍니다.
-- 3. 자동 정렬 기능을 지원하지 않아 성능상 유리합니다.
SELECT
emp_no,emp_nm, birth_de
FROM tb_emp
WHERE birth_de BETWEEN '19600101' AND '19691231'
UNION ALL -- UNION과 달리 정렬이 되지 않았다.
SELECT
emp_no, emp_nm, birth_de
FROM tb_emp
WHERE birth_de BETWEEN '1970101' AND '19791231'
;
SELECT
emp_nm, birth_de
FROM tb_emp
WHERE birth_de BETWEEN '19600101' AND '19691231'
UNION ALL -- 중복 제거가 되지 않았고, 정렬도 되지 않았다.
SELECT
emp_nm, birth_de
FROM tb_emp
WHERE birth_de BETWEEN '1970101' AND '19791231'
;
-- ===
-- ## INTERSECT
-- 1. 첫번째 쿼리와 두번째 쿼리에서 중복된 행만을 출력합니다.
-- 2. 교집합의 의미입니다.
SELECT
A.emp_no, A.emp_nm, A.addr
, B.certi_cd, C.certi_nm
FROM tb_emp A
JOIN tb_emp_certi B
ON A.emp_no = B.emp_no
JOIN tb_certi C
ON B.certi_cd = C.certi_cd
WHERE C.certi_nm = 'SQLD'
INTERSECT
SELECT
A.emp_no, A.emp_nm, A.addr
, B.certi_cd, C.certi_nm
FROM tb_emp A
JOIN tb_emp_certi B
ON A.emp_no = B.emp_no
JOIN tb_certi C
ON B.certi_cd = C.certi_cd
WHERE A.addr LIKE '%용인%';
SELECT
A.emp_no, A.emp_nm, A.addr
, B.certi_cd, C.certi_nm
FROM tb_emp A
JOIN tb_emp_certi B
ON A.emp_no = B.emp_no
JOIN tb_certi C
ON B.certi_cd = C.certi_cd
WHERE A.addr LIKE '%용인%'
AND C.certi_nm = 'SQLD'
;
-- ## MINUS(EXCEPT)
-- 1. 두번째 쿼리에는 없고 첫번째 쿼리에만 있는 데이터를 보여줍니다.
-- 2. 차집합의 개념입니다.
SELECT emp_no, emp_nm, sex_cd, dept_cd FROM tb_emp
MINUS
SELECT emp_no, emp_nm, sex_cd, dept_cd FROM tb_emp WHERE dept_cd = '100001'
MINUS
SELECT emp_no, emp_nm, sex_cd, dept_cd FROM tb_emp WHERE dept_cd = '100004'
MINUS
SELECT emp_no, emp_nm, sex_cd, dept_cd FROM tb_emp WHERE sex_cd = '1'
;
'데이터베이스' 카테고리의 다른 글
데이터베이스_SQL기본(계층형 쿼리)_예제_ 22.06.27(day06) (0) | 2022.06.27 |
---|---|
데이터베이스_SQL기본(계층형 쿼리)_교안_ 22.06.27(day06) (0) | 2022.06.27 |
데이터베이스_SQL기본(OUTERJOIN)_예제_ 22.06.24(day05) (0) | 2022.06.24 |
데이터베이스_SQL기본(JOIN)_예제2_ 22.06.24(day05) (0) | 2022.06.24 |
데이터베이스_SQL기본(JOIN)_예제_ 22.06.24(day05) (0) | 2022.06.24 |