테이블에 행을 삽입
전체 데이터 삽입(전체 컬럼 명시시)
INSERT INTO emp (empno,ename,job,mgr,hiredate,sal,comm,deptno) VALUES (8000,'DENNIS','SALESMAN',7698,'99/01/22',1700,200,30)
SELECT * FROM emp;
전체 데이터 삽입할 때는 컬럼명 생략 가능
INSERT INTO emp VALUES (8001, 'SUNNY','SALESMAN', 7698, '99/03/01',1000,300,30);
SELECT * FROM emp;
NULL 삽입 방법
값이 입력되지 않는 컬럼은 제외
INSERT INTO emp(empno,ename,job, mgr,hiredate,sal,deptno) VALUES (8003,'PETER','CLERK',7698,'22/11/06',1700,20);
SELECT * FROM emp;
값이 입력되지 않는 칼럼을 제외하지 않았을 경우
INSERT INTO emp(empno,ename,job, mgr,hiredate,sal,comm,deptno) VALUES(8004, 'ANNIE','CLERK', 7698, '22/11/06',1800,NULL,30);
날짜의 삽입
INSERT INTO emp(empno,ename,job, mgr,hiredate,sal,comm,deptno) VALUES (8005,'MICHAEL','CLERK', 7698, TO_DATE('22/11/06', 'YY/MM/DD'), 1800,NULL,30);
행 단위로 데이터 갱신
UPDATE emp SET mgr = 7900 WHERE empno = 8000;
UPDATE emp SET ename = 'MARIA' , sal=2500, comm =500 WHERE empno=8000;
WHERE 절을 명시하지 않으면 전체 행의 데이터를 수정한다.
UPDATE emp SET ename='KINGKONG';
ROLLBACK; -- 되돌리기와 비슷한 개념
행 삭제
DELETE FROM emp WHERE empno=7369;
WHERE 절을 명시하지 않으면 모든 행이 삭제된다.
DELETE FROM emp;
1) 트랜잭션의 시작
실행 가능한 SQL문장이 제일 처음 실행될 때
2) 트랜잭션의 종료
COMMIT 이나 ROLLBACK
DDL이나 DCL문장의 실행(자동 COMMIT)
기계 장애 또는 시스템 충돌(crash)
deadlock 발생
사용자가 정상 종료
3) 자동 COMMIT 은 다음의 경우 발생
DDL, DCL 문장이 완료 될 때
명시적인 COMMIT이나 ROLLBACK 없이 SQL*Plus를 정상 종료 했을 경우
4) 자동 ROLLBACK은 다음의 경우 발생
SQL*Plus를 비정상 종료 했을 경우
비정상적인 종료
system failure
사용자가 소유한 테이블의 이름
SELECT table_name FROM user_tables;
사용자가 소유한 개별 객체 유형
SELECT DISTINCT object_type FROM user_objects;
사용자가 소유한 테이블, 뷰, 동의어 및 시퀀스
SELECT * FROM user_catalog;



테이블의 생성
CREATE TABLE employee (
empno NUMBER(6) ,
name VARCHAR2(30) NOT NULL,
salary NUMBER(8,2),
hire_date DATE DEFAULT SYSDATE,
CONSTRAINT employee_pk_empno PRIMARY KEY(empno)
);
테이블에 데이터 입력
INSERT INTO employee(empno,name,salary) VALUES(100,'홍길동',1000.23);
COMMIT;
테이블 생성시 PRIMARY KEY 및 FOREIGN KEY 제약 조건 추가하기
CREATE TABLE SUSER (
id VARCHAR2(20),
name VARCHAR2(30),
CONSTRAINT suser_pk PRIMARY KEY (id)
);
CREATE TABLE SBOARD (
num NUMBER,
id VARCHAR2(20) NOT NULL,
content VARCHAR2(4000) NOT NULL,
CONSTRAINT sboard_pk PRIMARY KEY(num),
CONSTRAINT sboard_fk FOREIGN KEY (id) REFERENCES suser (id)
);
INSERT INTO suser (id,name) VALUES ('dragon', '홍길동');
INSERT INTO suser (id,name) VALUES ('sky', '박문수');
INSERT INTO sboard (num, id, content) VALUES (1,'sky', '오늘은 금요일');
INSERT INTO sboard (num, id, content) VALUES (2,'dragon', '내일은 토요일');
INSERT INTO sboard (num, id, content) VALUES (3,'blue','모레는 일요일'); -- 부모키에 blue가 없기 때문에 데이터 삽입이 불가능하다.
DELETE FROM suser WHERE id = 'sky'; -- 자식 데이터가 존재하기 때문에 삭제가 불가능하다
두개의 테이블 join 작업
SELECT * FROM suser JOIN sboard USING(id);
ALTER TABLE employee ADD (addr VARCHAR(2));
ALTER TABLE employee ADD CONSTRAINT employee_pk PRIMARY KEY (id);
ALTER TABLE employee MODIFY (salary NUMBER(10, 2) NOT NULL);
ALTER TABLE employee RENAME COLUMN salary TO sal;
RENAME employee TO emplyee2;
DROP TABLE employee2;
CREATE TABLE s_member (
id VARCHAR2(20) PRIMARY KEY,
name VARCHAR2(30)
);
CREATE TABLE s_member_detail(
num NUMBER PRIMARY KEY,
content VARCHAR2(4000) NOT NULL,
id VARCHAR2(20) NOT NULL REFERENCES s_member (id) ON DELETE CASCADE
);
INSERT INTO s_member (id, name) VALUES('dragon','홍길동');
INSERT INTO s_member (id,name) VALUES ('sky', '박문수');
INSERT INTO s_member_detail(num,content,id) VALUES (1,'오늘은 금요일','sky');
INSERT INTO s_member_detail(num,content,id) VALUES (2,'내일은 토요일','sky');
INSERT INTO s_member_detail(num,content,id) VALUES (3,'모레는 일요일','sky');
DELETE FROM s_member WHERE id = 'sky';
COMMIT;
CREATE TABLE STUDENT (
id VARCHAR2(10) PRIMARY KEY,
name VARCHAR2(30) NOT NULL,
age NUMBER(3) NOT NULL,
score NUMBER(3) NOT NULL
);
COMMIT;
INSERT INTO student VALUES('dragon','홍길동',21,100);
INSERT INTO student VALUES('sky','장영실',21,99);
INSERT INTO student VALUES('blue','박문수',34,88);
COMMIT;
SELECT SUM(score) FROM student;
논리적으로 하나 이상의 테이블에 있는 데이터의 부분 집합
CREATE OR REPLACE VIew emp10_view
AS SELECT empno id_number, ename name, sal *12 ann_salary FROM emp WHERE deptno =10;
SELECT * FROM emp10_view;
CREATE OR REPLACE VIEW emp_info_view
AS SELECT e.empno, e.ename, d.deptno, d.loc, d.dname FROM emp e, dept d WHERE e.deptno = d.deptno;
SELECT * FROM emp_info_view;
일반적으로 View는 조회용으로 많이 사용되지만 아래와 같이 데이터를 변경할 수 있음
UPDATE emp10_view SET name ='SCOTT' WHERE id_number = 7839;
SELECT * FROM emp10_view;
가상열 때문에 등록이 제한
INSERT INTO emp10_view(id_number,name,ann_salary) VALUES(8000,'JOHN',19000);
CREATE OR REPLACE VIEW emp20_view
AS SELECT empno id_number , ename name, sal * 12 ann_salary FROM emp WHERE deptno = 20 WITH READ ONLY;
UPDATE emp20_view SET NAME='DAVID' WHERE id_number = 7902;
VIEW 수정하기
CREATE OR REPLACE VIEW emp10_view
(id_number, name, sal, department_id)
AS SELECT empno, ename, sal, deptno FROM emp WHERE deptno = 10;
SELECT * FROM emp10_view;
VIEW의 삭제
DROP VIEW emp10_view;
SEQUENCE 생성
시작 값이 1 이고 1씩 증가하고 최대값이 100000이 되는 시퀀스
CREATE SEQUENCE test_seq
START WITH 1
INCREMENT BY 1
MAXVALUE 100000;
SELECT test_seq.NEXTVAL FROM dual;
SELECT test_seq.CURRVAL FROM dual;
sboard 테이블에 데이터를 삽입할 때 시퀀스 활용
INSERT INTO sboard(num,id,content)
VALUES (test_seq.NEXTVAL , 'sky','강남');
SELECT * FROM sboard;
시퀀스 수정
START WITH 수정 불가능
ALTER SEQUENCE test_seq INCREMENT BY 5;
시퀀스 삭제
DROP SEQUENCE test_seq;