SQL- scott(개념 + 실습)5
집합 연산자 : union, minus, intersect
※ UNION - 합집합
1) deptno =10 or deptno=20 사원 조회
SELECT
empno,
ename,
job
FROM
emp
WHERE
deptno = 10
UNION
SELECT
empno,
ename,
job
FROM
emp
WHERE
deptno = 20;
UNION
- 사용시 컬럼명을 동일하게 사용하기
- 중복 값을 알아서 제거
ex) SELECT empno, ename, job FROM emp WHERE deptno = 10
UNION
SELECT mgr, ename, job FROM emp WHERE deptno = 20;
데이터 자료 타입만 맞으면 출력 가능.
empno와 mgr이 넘버 타입이 같기 때문에 출력이 가능함.
그러니 꼭 컬럼명을 확인하고 작성.
※ UNION ALL : 중복 제거 안함
2) deptno =10 or deptno=10 사원 조회
SELECT
empno,
ename,
job
FROM
emp
WHERE
deptno = 10
UNION ALL
SELECT
empno,
ename,
job
FROM
emp
WHERE
deptno = 10;
deptno가 같아서 중복된 숫자가 나옴.
3) deptno =10 or deptno=10 사원 조회
SELECT
empno,
ename,
job
FROM
emp
WHERE
deptno = 10
UNION
SELECT
empno,
ename,
job
FROM
emp
WHERE
deptno = 10;
UNION 만 사용 시 중복값은 제외하고 보여줌
※ MINUS : 차집합
4) 전체 emp 중에서 depno=10 제외
SELECT
empno,
ename,
job,
deptno
FROM
emp
MINUS
SELECT
empno,
ename,
job,
deptno
FROM
emp
WHERE
deptno = 10;
20번, 30번만 출력
※ INTERSECT : 교집합
5) deptno=10만 출력
SELECT
empno,
ename,
job,
deptno
FROM
emp
INTERSECT
SELECT
empno,
ename,
job,
deptno
FROM
emp
WHERE
deptno = 10;
※ 연습문제
1) 사원 이름(ENAME)이 S로 끝나는 사원 데이터를 출력
SELECT
*
FROM
emp
WHERE
ename LIKE '%S';
2) 30번 부서(DEPTNO)에서 근무하고 있는 사원 중에 직책(JOB)이 SALESMAN 인 원의 사원번호, 이름, 직책, 급여, 부서 번호를 출력
SELECT
empno,
ename,
job,
sal,
deptno
FROM
emp
WHERE
deptno = 30
AND job = 'SALESMAN';
3) 20번,30번 부서에 근무하고 있는 사원 중 급여(SAL)가 2000초과인 사원을 다음 두가지 방식의 SELECT 문을 사용하여 사원번호, 이름, 직책, 급여,부서 번호를 출력.
집합 연산자를 사용하지 않는 방식
SELECT
empno,
ename,
sal,
deptno
FROM
emp
WHERE
deptno IN ( 20, 30 )
AND sal > 2000;
집합 연산자를 사용하지 않는 방식 : MINUS
SELECT
empno,
ename,
sal,
deptno
FROM
emp
WHERE
sal > 2000
MINUS
SELECT
empno,
ename,
sal,
deptno
FROM
emp
WHERE
deptno = 10;
4) NOT BETWEEN A AND B 연산자를 쓰지 않고, 급여(SAL) 열 값이 2000 이상 3000이하 범위 이외의 값을 가진 데이터만 출력
SELECT
*
FROM
emp
WHERE
sal < 2000
OR sal > 30000;
5) 사원 이름에 E가 포함되어 있는 30번 부서의 사원 중 급여가 1000 ~ 2000 사이가 아닌 사원 이름, 사원번호, 급여, 부서 번호를 출력
SELECT
ename,
empno,
sal,
deptno
FROM
emp
WHERE
ename LIKE '%E%'
AND deptno = 30
AND sal NOT BETWEEN 1000 AND 2000;
6) 추가 수당이 존재하지 않고 상급자가 있고 직책이 MANAGER,CLERK인 사원 중에서 사원 이름의 두번째 글자가 L이 아닌 사원의 정보를 출력
SELECT
*
FROM
emp
WHERE
comm IS NULL
AND mgr IS NOT NULL
AND job IN ( 'MANAGER', 'CLERK' )
AND ename NOT LIKE '_L%';
※ 연산자 우선 순위
높음 | ( ) | 괄호 | |
* , / | 산술연산자 | ||
+ , - | 산술연산자 | ||
= , =! , ^= , <> , > , >= , < , <= | 대소비교연산자 | ||
IS (NOT) NULL, (NOT)LIKE, (NOT)IN | 비교연산자 | ||
BETWEEN | BETWEEN 연산자 | ||
NOT | 논리 부정 연산자 | ||
AND | 논리연산자 | ||
낮음 | OR | 논리연산자 |