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 절을 사용하여 조인 조건을 정의할 수 있음
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;
누락된 행의 방향 표시
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;
합집합, 중복값 제거
SELECT deptno FROM emp
UNION
SELECT deptno FROM dept;
합집합, 중복된 값까지 반환
SELECT deptno FROM emp
UNION ALL
SELECT deptno FROM dept;
교집합, 두 행의 집합 중 공통된 행을 반환
SELECT deptno FROM emp
INTERSECT
SELECT deptno FROM dept;
차집합, 첫번째 SELECT 문에 의해 반환되는 행 중에서 두 번째
SELECT 문에 의해 반환되는 행에 존재하지 않는 행들을 보여줌
SELECT deptno FROM dept
MINUS
SELECT deptno FROM emp;
하나의 SQL문장의 절에 내재되어(nested) 있는 SELECT 문장
오직 한 개의 행(값)을 반환
SELECT empno,ename,job FROM emp
WHERE job = (SELECT job FROM emp WHERE empno=7369);
하나 이상의 행을 반환하는 서브쿼리
부서별로 가장 급여를 적게 받는 사원과 동일한 급여를 받는 사원의 정보를 출력
SELECT empno,ename,sal,deptno FROM emp
WHERE sal IN(SELECT MIN(sal) FROM emp GROUP BY deptno);
ANY 연산자는 서브쿼리의 결과값 중 어느 하나의 값이라도 만족이 되면 결과값을 반환
SELECT ename,sal FROM emp
WHERE sal> ANY(SELECT sal FROM emp WHERE job='SALESMAN');
서브쿼리의 결과와 모든 값이 일치
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 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);
값이 입력되지 않는 컬럼은 제외
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 emp SET mgr=7900 WHERE empno=8000;
UPDATE emp SET ename='MARIA',sal=2500,comm=500 WHERE empno=8000;
행을 삭제
DELETE FROM emp WHERE empno=8000;
저장점 표시자까지 롤백하는 데 사용
ROLLBACK;