[22일차] join, 서브쿼리, 집합연산자, INSERT, UPDATE, DELETE

SOSO·2022년 5월 17일
0

학원

목록 보기
21/59
post-thumbnail

INNER JOIN

내부조인 (inner join)

INNER JOIN이라고 명시할 수 있고 JOIN만 명시도 가능

SELECT e.ename, d.dname
FROM emp e JOIN dept d
ON e.deptno=d.deptno;

부가조건 있으면 WHERE절 사용

SELECT e.ename,d.dname
FROM emp e JOIN dept d
ON e.deptno=d.deptno
WHERE e.ename='ALLEN';

USING

만약 조인 조건에 사용된 컬럼의 이름이 같다면 다음과 같이 USING 절을 사용하여 조인 조건을 정의할 수 있음

SELECT e.ename,d.dname
FROM emp e JOIN dept d
USING(deptno)
WHERE e.ename = 'ALLEN';

주의
USING에 사용된 컬럼은 테이블명 또는 테이블 Alias를 붙이지 않음

SELECT e.ename,deptno,d.dname 
-- e.deptno -> deptno 명시해야 함
FROM emp e JOIN dept d
USING(deptno)
WHERE e.ename = 'ALLEN';

사원이름과 해당 사원의 관리자 이름 구하기
(관리자가 없는 사원은 제외)

SELECT e.ename name, m.ename manager_name
FROM emp e JOIN emp m
ON e.mgr = m.empno;

외부조인(outer join)

누락된 행의 방향 표시

SELECT DISTINCT(e.deptno), d.deptno
FROM emp e RIGHT OUTER JOIN dept d
ON e.deptno=d.deptno;

사원이름과 해당 사원의 관리자 이름 구하기
(관리자가 없는 사원도 표시)

SELECT e.ename name, m.ename manager_name
FROM emp e LEFT OUTER JOIN emp m
ON e.mgr = m.empno;

집합연산자

UNION

합집합, 중복값 제거

SELECT deptno FROM emp
UNION
SELECT deptno FROM dept;

UNION ALL

합집합, 중복된 값까지 반환

SELECT deptno FROM emp
UNION ALL
SELECT deptno FROM dept;

INTERSECT

교집합, 두 행의 집합 중 공통된 행을 반환

SELECT deptno FROM emp
INTERSECT
SELECT deptno FROM dept;

MINUS

차집합, 첫번째 SELECT 문에 의해 반환되는 행 중에서 두 번째
SELECT 문에 의해 반환되는 행에 존재하지 않는 행들을 보여줌

SELECT deptno FROM dept
MINUS
SELECT deptno FROM emp;

서브쿼리(Subquery)

하나의 SQL문장의 절에 내재되어(nested) 있는 SELECT 문장

단일행 서브쿼리

오직 한 개의 행(값)을 반환

SELECT empno,ename,job FROM emp
WHERE job = (SELECT job FROM emp WHERE empno=7369);

다중행 서브쿼리

하나 이상의 행을 반환하는 서브쿼리

IN 연산자의 사용

부서별로 가장 급여를 적게 받는 사원과 동일한 급여를 받는 사원의 정보를 출력

SELECT empno,ename,sal,deptno FROM emp
WHERE sal IN(SELECT MIN(sal) FROM emp GROUP BY deptno);

ANY 연산자의 사용

ANY 연산자는 서브쿼리의 결과값 중 어느 하나의 값이라도 만족이 되면 결과값을 반환

SELECT ename,sal FROM emp
WHERE sal> ANY(SELECT sal FROM emp WHERE job='SALESMAN');

ALL 연산자의 사용

서브쿼리의 결과와 모든 값이 일치

SELECT empno, ename, sal, deptno FROM emp
WHERE sal > ALL(SELECT sal FROM emp WHERE deptno=20);

다중열 서브쿼리

서브퀄리의 결과가 두 개 이상의 컬럼으로 반환되어 메인 쿼리에 전달하는 쿼리

SELECT empno,ename,sal,deptno
FROM emp
WHERE (deptno,sal) IN(SELECT deptno, sal FROM emp WHERE deptno=30);

부서별로 가장 급여를 적게 받는 사원과 동일한 급여를 받는 사원의 정보를 출력

SELECT empno,ename,sal,deptno
FROM emp 
WHERE (deptno,sal) 
IN(SELECT deptno,MIN(sal) FROM emp GROUP BY deptno);

INSERT문

행단위로 데이터를 저장

전체 데이터 삽입

INSERT INTO emp (empno,ename,job,mgr,hiredate,sal,comm,deptno)
VALUES (8000,'DENIS','SALESMAN',7698,'99/01/22',1700,200,30);

전체 데이터를 명시할 때는 컬럼명 생략 가능

INSERT INTO emp 
VALUES (8001,'SUNNY','SALESMAN',7698,'99/03/01',1000,300,30);

NULL 삽입 방법

값이 입력되지 않는 컬럼은 제외

INSERT INTO emp (empno,ename,job,mgr,hiredate,sal,deptno)
VALUES (8002,'PETER','CLERK',7698,'99/05/02',1800,10);

값이 입력되지 않는 컬럼을 제외하지 않았을 경우

INSERT INTO emp (empno,ename,job,mgr,hiredate,sal,comm,deptno)
VALUES (8003,'ANNIE','CLERK',7698,'99/05/02',1800,null,10);

UPDATE문

행단위로 데이터 갱신

UPDATE emp SET mgr=7900 WHERE empno=8000; 
UPDATE emp SET ename='MARIA',sal=2500,comm=500 WHERE empno=8000;

DELETE문

행을 삭제

DELETE FROM emp WHERE empno=8000;

ROLLBACK

저장점 표시자까지 롤백하는 데 사용

ROLLBACK;
profile
한다 열심히

0개의 댓글