수정시 바로 값을 바꾸는 것이 아니라 다른 컬럼의 값으로 바꾸고 싶을때, 다른 컬럼의 확인 없이 SUBQUERY를 이용해서 한번에 값을 바꿀 수 있다.
UPDATE DEPT_COPY
SET
LOC = (SELECT LOC
FROM DEPT_COPY
WHERE DNO = 20)
WHERE DNO = 10;
이렇게 하면 괄호안에서 조회된 값이 DNO가 10일때 LOC의 값이 된다.
20과 10의 지역이 같아졌다.
업데이트 할 컬럼이 여러개면 SUBQUERY를 여러개 만들지 말고 하나에 여러 컬럼을 넣어서 만들 수 있다.
UPDATE DEPT_COPY
SET
(DNAME, LOC) = (SELECT DNAME, LOC
FROM DEPT_COPY
WHERE DNO = 30)
WHERE DNO = 10;
이렇게 하나의 SUBQUERY만 만드는 것이 더 좋은 성능을 가진다.
TRUNCATE보다는 느리지만 대신 부분삭제와 취소가 가능하다.
DELETE FROM DEPT_COPY
WHERE DNO = 10;
SELECT * FROM DEPT_COPY;

DNO가 10인 행이 모두 사라졌다.
삭제할때 주의할 점은 자식 테이블에서 삭제에 관련된 행을 먼저 삭제하고 부모의 행을 삭제해야한다.
데이터 탭에서 수정을 할 수 있다. +모양이 추가, X가 삭제 체크표시가 COMMIT이다.
테이블에 새로운 컬럼을 만들때 사용한다.
ALTER TABLE DEPT20
ADD(BIRTH DATE);

새로운 날짜형식의 컬럼이 생성되었다.
컬럼에 들어갈 데이터의 최대 크기를 변경할 수 있다.
ALTER TABLE DEPT20
MODIFY DNAME VARCHAR2(30);
크기가 30으로 바뀐 것을 확인 할 수 있다.
컬럼을 삭제해보자.
ALTER TABLE DEPT20
DROP COLUMN BIRTH;
BIRTH컬럼이 삭제되었다.
테이블 명을 바꿔보자.
RENAME DEPT20 TO DEPT30;
20에서 30으로 바꼈다
테이블에 입력될 값으 제한하는 조건을 말한다.
유일한 값만 들어갈 수 있고 중복이 금지 된다. 단 NULL값은 들어갈 수 있다.
CREATE TABLE CUSTOMER(
ID VARCHAR2(20) UNIQUE
PWD VARCHAR2(20) NOT NULL
NAME VARCHAR2(20) NOT NULL
PHONE VARCHAR2(30)
ADDRESS VARCHAR2(1000)
);
테이블 생성시 자료형 뒤에 공백 후 넣어주면된다.
SQL탭에서 확인이 가능하다.
NULL은 들어올 수 없게 조건을 거는 것이다.
CREATE TABLE CUSTOMER(
ID VARCHAR2(20) UNIQUE
PWD VARCHAR2(20) NOT NULL
NAME VARCHAR2(20) NOT NULL
PHONE VARCHAR2(30)
ADDRESS VARCHAR2(1000)
);
테이블 생성시 자료형 뒤에 공백 후 넣어주면된다.
NOT NULL은 여기서도 확인이 가능하다. 기본적으로 NOT NULL을 하지 않으면 NULLABLE은 YES이다.
기본키 (Primary Key):
참조키 (Foreign Key):
유일한 값만 입력되면서 동시에 NOT NULL이 되는 조건이다.
추가적으로 인텍스도 자동생성 되어 조회속도를 올릴 수 있다.
CREATE TABLE CUSTOMER(
ID VARCHAR2(20) ,
PWD VARCHAR2(20) NOT NULL,
NAME VARCHAR2(20) NOT NULL,
PHONE VARCHAR2(30),
ADDRESS VARCHAR2(1000),
CONSTRAINT PK_CUSTOMER2_ID PRIMARY KEY(ID)
);
"CONSTRAINT 제약조건이름 PRIMARY KEY(컬럼명)"을 테이블을 만들때 마지막에 넣어주면 된다. 주로 제약조건에는 "제약조건테이블명컬럼"으로 짓는다.
참조키는 두 테이블 간에 부모와 자식관계를 형성시켜주어서, 부모의 값 범위 안에서만 자식에도 값을 줄수있게 제약을 줄 수 있다.
예를 들어 부모 테이블에 부서번호가 10~40의 수만 올 수 있다고 하면 자식도 그 사이의 값만 들어올수 있게 하는 것이다.
CREATE TABLE EMP_SECOND(
ENO NUMBER(4) CONSTRAINT PK_EMP_SECOND_ENO PRIMARY KEY,
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
DNO NUMBER(2) CONSTRAINT FK_EMP_SECOND_DNO FOREIGN KEY(DNO) REFERENCES DEPARTMENT
);
가장 밑이나 참조키 사용할 컬럼 옆에 "CONSTRAINT 제약조건이름 FOREIGN KEY(컬럼) REFERENCES 부모테이블"을 해주면된다.
기본키 / 외래키 제약조건을 이용해 데이터에 결점이 없게 할 수 있다.
컬럼에서 허용 가능한 데이터 범위 또는 조건을 지정할 수 있음
CREATE TABLE EMP_SECOND(
ENO NUMBER(4) CONSTRAINT PK_EMP_SECOND_ENO PRIMARY KEY
,SALARY NUMBER(7,2) CONSTRAINT CK_EMP_SECOND_SALARY CHECK(SALARY>0) -- 양수값만 넣기
);
"CONSTRAINT 제약조건이름 CHECK(조건식)"을 해주면된다.
NULL이 들어오면 자동으로 특정값으로 값을 생성한다.
CREATE TABLE EMP_SECOND(
ENO NUMBER(4) CONSTRAINT PK_EMP_SECOND_ENO PRIMARY KEY
,SALARY NUMBER(7,2) DEFAULT 1000
);
컬럼 뒤에 DEFAULT 와 값만 넣어주면된다.
SALARY에 아무 값도 넣지않았는데 1000이 들어갔다.
어떤 테이블에 어떤 제약조건을 걸었는디 명령어로 확인 할 수 있다.
SELECT TABLE_NAME, CONSTRAINT_NAME
FROM USER_CONSTRAINTS -- ORACLE에서 제공하는 테이블로 여기에 모든 제약조건이 저장된다.
WHERE TABLE_NAME IN ('EMPLOYEE', 'DEPARTMENT')
ORDER BY TABLE_NAME;
FROM USER_CONSTRAINTS 는 ORACLE에서 제공하는 테이블로 여기에 모든 제약조건이 저장된다.
테이블을 복사할때 제약조건은 따로 걸어주어야한다.
CREATE TABLE DEPT_COPY
AS
SELECT * FROM DEPARTMENT;
CREATE TABLE EMP_COPY
AS
SELECT * FROM EMPLOYEE;


두 테이블 다 제약조건은 복사되지 않았다.
ALTER TABLE EMP_COPY -- 기본키 제약조건 부여
ADD CONSTRAINT PK_EMP_COPY_ENO PRIMARY KEY(ENO);
ALTER TABLE EMP_COPY -- 외래키 제약조건 부여
ADD CONSTRAINT FK_EMP_COPY_DNO
FOREIGN KEY(DNO) REFERENCES DEPT_COPY(DNO);
이렇게 하면 제약조건이 추가가 된다.
잘 추가 되었다.
-- 1) 외래키(참조키:FK) 삭제하기
-- 사용법) ALTER TABLE 테이블명 DROP CONSTRAINT 제약조건명;
ALTER TABLE EMP_COPY DROP CONSTRAINT FK_EMP_COPY_DNO;
-- 2) 기본키 삭제하기
ALTER TABLE DEPT_COPY DROP PRIMARY KEY;
DROP CONSTRAINT로 삭제해준다. PRIMARY는 하나밖에 없으니 굳이 이름을 안 적어 주어도 된다.
실행될 때마다 자동적으로 숫자를 증가시켜주어서 이걸 인덱스에 주면 자동으로 index를 형성할 수 있게 해준다.
주로 기본키 용도로 사용한다. 기본키는 not null에다가 중복도 안되야 하므로 1씩 증가하는 sequence를 사용하면 null도 아닌데다가, 수가 증가하니 중복도 되지 않는다.
CREATE SEQUENCE SAMPLE_SEQ
INCREMENT BY 10
START WITH 1;
1부터 10씩 증가하는 시퀀스를 만들었다.
여기서 만든 시퀀스를 확인할 수 있고, 최대 최소값을 지정하지 않으면 다음과 같이 설정된다.
SELECT SAMPLE_SEQ.NEXTVAL FROM DUAL;


1부터 시작해서 실행할때마다 10씩 증가한다.
현재 시퀀스 값을 보는 코드이다.
SELECT SAMPLE_SEQ.CURRVAL FROM DUAL;
값을 확인 할 수 있다.
테이블에 값을 넣을때 자동으로 특정 컬럼의 값이 증가하게 만들 수 있다.
-- 1) 시퀀스 생성 : 초기값 1, 증가값 1
CREATE SEQUENCE DEPT_TEMP_SEQ
INCREMENT BY 1
START WITH 1;
--2) INSERT문에 사용하기
INSERT INTO DEPT_TEMP(DNO, DNAME, LOC)
VALUES(DEPT_TEMP_SEQ.NEXTVAL, 'ACCOUNTING', 'NEW YOURK');
1씩 증가하는 시퀀스를 만들었고 INSERT문에서 DNO의 값에 "시퀀스명.NEXTVAL"을 해주었다.
행이 추가될 때마다 값이 증가하는 것을 확인 할 수 있다.