SELECT절 마지막에 'FOR UPDATE'
SELECT를 실행하면서, 해당 행에 대해서 LOCK을 걸 수 있음
검색하는 동안에 그 누구도 갱신이 불가능함
SELECT문을 실행했음에도 COMMIT을 실행해야지, 접근이 가능함
SELECT ENAME, SAL, DEPTNO
FROM EMP
WHERE ENAME = 'JONES'
FOR UPDATE;
INSERT문 아래에 입력하고자 하는 데이터를 가져오는 서브쿼리 입력
단일 행이 아닌 다중 행을 입력하고자 할때 사용
CREATE TABLE EMP2
AS
SELECT *
FROM EMP;
테이블을 백업할 때 많이 사용되는 쿼리문
CREATE TABLE EMP3
AS
SELECT *
FROM EMP
WHERE 1=2; -- FALSE
데이터 없이 테이블 구조만 복사함
INSERT INTO emp2(empno, ename, sal, deptno)
SELECT empno, ename, sal, deptno
FROM emp
WHERE deptno = 10;
부서 테이블과 같은 구조의 테이블을 DEPT2라는 이름으로 생성하고 부서번호가 20, 30번의 모든 컬럼의 데이터를 DEPT2에 입력
CREATE TABLE DEPT2
AS
SELECT *
FROM DEPT
WHERE 1=2;
INSERT INTO DEPT2
SELECT *
FROM DEPT
WHERE DEPTNO IN (20,30);
SET절에 서브쿼리 작성
UPDATE emp
SET sal = (SELECT sal
FROM emp
WHERE ename = 'ALLEN')
WHERE job= 'SALESMAN';
부서번호가 30번인 사원들의 직업을 MARTIN의 직업으로 변경하세요
UPDATE emp
SET job = (SELECT job
FROM emp
WHERE ename = 'MARTIN')
WHERE DEPTNO = 30;
DELETE FROM emp
WHERE sal > (SELECT sal
FROM emp
WHERE ename = 'SCOTT');
ALTER TABLE dept
ADD sumsal number(10);
sum(sel)에 대한 쿼리문
SELECT deptno, sum(sal)
FROM emp
group by deptno;
MERGE INTO dept d
USING (SELECT deptno, sum(sal) as sumsal -- using 절에 작성함
FROM emp
GROUP BY deptno) v
ON (d.deptno = v.deptno)
WHEN MATCHED THEN
UPDATE SET d.sumsal = v.sumsal;
merge문 작성 시 alias는 매우 중요
into절의 테이블 값(혹은 서브쿼리)
using절의 테이블 값(혹은 서브쿼리)
alias 작성은 구분이 쉽게 되도록 작성
부서 테이블에 cnt라는 칼럼을 추가하고, 해당 부서 번호의 인원수로 값을 갱신하시오
alter table dept
add cnt number(10);
merge into dept d
USING (SELECT deptno, count(*) as cnt
FROM emp
GROUP BY DEPT) c
ON (d.deptno = c.deptno)
WHEN MATCHED THEN
UPDATE SET d.cnt = c.cnt;