서브쿼리의 결과로 여러 건이 나온다. 즉 행이 여러개가 결과로 나오는 것이다.
"부서별 최소 급여를 받는 사원 중에서 사원번호와 이름을 출력하세요" 라는 문제가 있다. 이 문제에서는 부서별로 값을 구해야해서 여러 행의 값이 나온다.
이때는 = 을 사용할 수 없으므로 IN을 사용해서 여러 값을 비교해주어야한다.
SELECT ENO, ENAME
FROM EMPLOYEE
WHERE SALARY IN(SELECT MIN(SALARY)
FROM EMPLOYEE
GROUP BY DNO );
IN안에 들어가야하는 쿼리 문은 GROUP BY가 있는 쿼리 문을 넣어야한다. 왜냐하면 IN 안에는 여러개의 값이 반환되는 것이 와야하기 때문이다.
DBA 또는 개발자가 실무에서 가장 많이 사용하는 용어이다.
쉽게 말해 만들고, 조회하고, 수정하고, 지우는 것을 말한다.
각각 INSERT, SELECT, UPDATE, DELETE 명령어를 이용하여 조작한다.
자릿수를 넘는 데이터를 입력하면 들어갈 수 없다. 단, 날짜형은 자릿수가 없고 그냥 사용하면된다.
또 만약 NUMBER 자료형에도 자릿수를 적지 않으면 무한정 값을 넣을 수 있다. 그리고 NUMBER는 자릿수를 (7,2)이렇게 두개 적을수 있는데, 여기서 7은 정수 자리고, 2는 소수자리이다.
CREATE TABLE DEPT(
DNO NUMBER(2),
DNAME VARCHAR2(14),
LOC VARCHAR2(13)
);
DEPT라는 이름의 테이블이 생겼다.
데이터는 INSERT로 넣어줘야하지만 넣지 않아 값이 아직 없다.
원본 테이블을 건들이지 못할때 테스트 테이블로 복사해서 테스트를 해보는 용으로 사용하고 싶을때 이용할 수 있다.
CREATE TABLE DEPT_COPY
AS
SELECT * FROM DEPARTMENT;
복사한 테이블이다.
원래 테이블과 값까지 같은 모습을 볼 수 있다.

데이터를 가져오지 않고 컬럼만 가져오고 싶을 경우가 있다. 이때는 WHERE에 거짓 조건을 주면 된다.
CREATE TABLE DEPT_COPY2
AS
SELECT * FROM DEPARTMENT
WHERE 1=2;
거짓조건을 줌으로 컬럼만 가져왔다.
데이터가 없는 것을 볼 수 있다.
COMMENT ON TABLE DEPT IS '부서정보';
테이블 주석 확인 코드
SELECT comments
FROM all_tab_comments
WHERE table_name = 'DEPT';
주석이 잘 달린것을 확인 할 수 있다.
테이블 열에서 컬럼 주석을 확인 할 수 있는데 지금은 아무것도 없다.
COMMENT ON COLUMN DEPT.DNO IS '부서번호';
COMMENT ON COLUMN DEPT.DNAME IS '부서명';
COMMENT ON COLUMN DEPT.LOC IS '부서위치';
주석이 생긴 것을 확인할 수 있다.
테이블을 만들었으니 삭제 해보자
DROP TABLE DEPT_COPY;
DEPT_COPY테이블이 삭제 되었다.
데이터를 조작하는 명령문이다.
INSERT를 통해서 테이블에 데이터를 삽입할 수 있다.
INSERT INTO DEPT_COPY(DNO, DNAME, LOC)
VALUES(10, 'ACCOUNTING', 'NEW YORK');
위와같이 넣으면 된다.
값이 잘 들어간 것을 확인 할 수 있다.
데이터를 삽입했을때 이걸 확정해야지 DB에 영구 저장된다. 그 전에는 삽입 취소를 할 수 있는데 이때 사용하는 명령어가 ROLLBACK이다.
ROLLBACK;
그냥 이것만 적어주면 전의 했던 삽입을 취소해준다.
이런 메세지가 뜨면 성공이다.
이걸 안 해주면 다른 유저는 DB에서 우리가 삽입한 데이터를 확인 할 수 없다.
이렇게만 해주면 데이터 삽입이 확정이 된다.
COMMIT;
커밋완료가 뜨면 성공이다.
INSERT INTO DEPT_COPY(DNO, DNAME)
VALUES(30, 'SALES');
특정 컬럼을 추가하지 않고 일부만 추가하면 다음과 같이 널이 자동으로 들어간다.
테이블을 삭제할때 조건없이 모두 삭제하는 명령어가 있다. 이건 빠르게 삭제하므로 취소를 하지 못하므로 신중하게 해야한다.
TRUNCATE TABLE EMP_COPY;
위 메세지가 나오면 성공이다.
기존의 테이블에 다른 테이블의 데이터를 복사해서 가지고 올 수도 있다.
INSERT TABLE DEPT_COPY
AS
SELECT * FROM DEPARTMENT;
일반 복사는 CREATE였지만 이건 INSERT이고, 테이블이 미리 만들어져 있어야한다는 차이가 있다.
데이터의 값을 수정하는 기능이다.
10 번 부서의 값을 'ACCOUNTING'에서 'PROGRAMMING'으로 바꿔보자.
UPDATE DEPT_COPY
SET
DNAME = 'PROGRAMMING'
WHERE DNO = 10;
10 번 부서의 값을 'ACCOUNTING'에서 'PROGRAMMING'으로 바뀌었다.