정미나, "유선배 SQL 개발자(SQLD) 과외노트", 시대고시기획
해당 책을 바탕으로 작성하였습니다.
그냥 개인적으로 다시 보고 공부하려고 만들었습니다.😀
Data Manipulation Language
데이터를 입력하고 입력된 데이터를 수정, 삭제, 조회하는 명령어.
데이터 삽입.
이 경우 명시되지 않은 컬럼에는 NULL값이 입력되는데 PK나 NOT NULL 제약조건이 걸린 컬럼에는 NULL 값이 입력될 수 없다.
이 경우 전체 컬럼에 대한 데이터가 테이블의 컬럼 순서대로 빠짐없이 나열되어야 하는데 순서가 바뀌어 데이터 유형이 맞지 않거나 누락된 데이터가 있어 전체 컬럼 갯수와 맞지 않을 경우 에러.
이미 저장된 데이터를 수정.
where 조건 절이 없으면 모든 데이터가 수정됨.
이미 저장된 데이터를 삭제.
만약 where 절 없이 정말 테이블 전체 데이터를 삭제하고자 하는 경우 DELETE보다 TRUNCATE가 시스템 부하 측면에서 유리. TRUNCATE는 별도의 로그를 쌓지 않아 ROLLBACK이 불가능하며 DELETE는 COMMIT 전에 ROLLBACK이 가능.
INSERT, UPDATE, DELETE
명령어를 날리고 별도의 COMMIT 명령어를 실행해야 데이터가 반영되며 ROLLBACK도 가능.MSSQL의 경우 AUTO COMMIT 됨.
테이블에 새로운 데이터를 입력하거나 이미 저장되어 있는 데이터에 대한 변경 작업을 가능하게 함.
예시)
MERGE
INTO user_backup ub
USING user u
ON (ub.id = u.id)
WHEN MATCHED THEN
UPDATE
SET ub.name = u.name
ub.email = u.email
...
WHEN NOT MATCHED THEN
INSERT(ub.id, ub.name, ub.email...)
VALUES(u.id, u.name, u.email...);
Transaction Control Language
트랜잭션을 제어하는 명령어.
INSERT, DELETE, UPDATE 후 변경된 내용을 확정, 반영하는 명령어.
COMMIT을 실행하지 않으면 메모리까지만 반영이 되는데 메모리는 휘발성이기 때문에 언제든 사라질 수 있고 다른 사용자는 변경된 값을 조회할 수 없다.
COMMIT을 해야 최종적으로 데이터 파일에 기록이 되고 비로소 트랜잭션이 완료되는 것.
UPDATE 한 뒤 오랜 시간 동안 COMMIT이나 ROLLBACK을 하지 않았을 경우 Lock에 걸려 다른 사용자가 변경할 수 없는 상황이 발생할 수 있으니 주의.
INSERT, DELETE, UPDATE 후 변경된 내용을 취소하는 명령어. ROLLBACK을 하면 변경하기 이전 값으로 복구. 위와 마찬가지로 Lock이 걸릴 수 있으니 주의.
ROLLBACK을 수행할 때 전체 작업을 되돌리지 않고 일부만 되돌릴 수 있게 하는 기능을 가진 명령어.
ROLLBACK 뒤에 특정 SAVEPOINT를 지정해주면 그 지점까지만 데이터가 복구.
Data Definition Language
데이터 정의어.
| 유형 | 데이터타입 |
|---|---|
| 문자 | CHAR, VARCHAR, CLOB |
| 숫자 | NUMBER |
| 날짜 | DATE |
CHAR, VARCHAR 차이
CAHR은 고정길이, VARCHAR은 가변길이
CHAR에서 'Jennie' = 'Jennie '
VARCHAR에서 'Jenni' != 'Jenni '
테이블을 생성하기 위한 명령어.
예시
create table teacher(
teacher_no number not null,
teacher_name varchar2(20) not null,
subject_id varchar(5) not null,
mobile_no varchar2(15),
address varchar2(100),
constraint teacher_pk primary key (teacher_no),
constraint teacher_fk foreign key (subject_id) references subject(subject_id)
);
지키지 않으면 에러 발생
- 테이블명은 고유해야 함.
- 한 테이블 내에서 컬럼명은 고유해야 함.
- 컬럼명 뒤에 데이터 유형과 데이터 크기가 명시돼야 함.
- 컬럼에 대한 정의는 괄호() 안에 기술.
- 각 컬럼들은 ','로 구분.
- 테이블명과 컬럼명은 숫자로 시작 불가.
- 마지막은 ';'로 끝남.
안 지켜도 되지만 지키는 것을 권장
- 테이블은 각각의 정체성을 나타내는 이름을 가져야 함. 정체 모를 이름의 테이블명은 지양.
- 컬럼명을 정의할 때는 다른 테이블과 통일성이 있어야 함. 같은 데이터를 저장하는 컬럼이 A 테이블에서는 USER_ID이고 B 테이블에서는 MEMBER_ID면 안 됨.
테이블에 저장될 데이터의 무결성, 즉 데이터의 정확성과 일관성을 유지하고 데이터에 결손과 부정합이 없음을 보증하기 위해 작성.
초기에 정의하는 것이 바람직.
참조 무결성 규정 관련 옵션
- CASCADE : Parent 값 삭제 시 Child 값 같이 삭제
- SET NULL : Parent 값 삭제 시 Child의 해당 컬럼 NULL 처리
- SET DEFAULT : Parent 값 삭제 시 Child의 해당 컬럼 DEFAULT 값으로 변경
- RESTRICT : Child 테이블에 해당 데이터가 PK로 존재하지 않는 경우에만 Parent 값 삭제 및 수정 가능
- NO ACTION : 참조 무결성 제약이 걸려있는 경우 삭제 및 수정 불가
기존에 존재하던 테이블을 복사해서 생성하고 싶은 경우
- create table user_backup as select * from user;
컬럼별로 데이터 유형을 다시 명시하지 않아도 되지만 제약 조건이 모두 복사되는 것이 아니라 NOT NULL 조건만 복사되며 나머지 PK, UK, CHECK 등의 조건은 초기화되므로 필요 시 별도로 ALTER 명령어를 써서 정의해야 함.
보통 한 번 생성된 테이블의 구조는 변경하지 않는 것이 일반적. 하지만 불가피하게 변경할 경우 사용.
새로운 컬럼 추가.
추가된 컬럼의 위치는 맨 끝. 별도로 위치 지정 불가.
기존에 있던 컬럼 삭제.
복구 불가.
기존에 있던 컬럼명 변경.
데이터 유형, DEFAULT 값, NOT NULL 조건 변경 가능.
기존 컬럼에 저장된 데이터가 바꾸려는 데이터의 크기보다 크다면 변경 불가.
DEFAULT 값 변경 시에는 변경 이후 저장되는 데이터에만 적용.
현재 NULL 값이 저장되어 있지 않은 컬럼에만 NOT NULL 조건 추가 가능.
기존에 있던 컬럼명 변경.
제약조건 추가.
테이블 삭제. 해당 테이블을 참조하고 있는 다른 테이블이 존재하는 경우 CASCADE 옵션을 명시하지 않으면 삭제되지 않는다.
CASCADE CONSTRAINT는 참조 제약조건도 함께 삭제한다는 뜻.
테이블에 저장되어 있는 데이터를 모두 제거.
저장 공간이 재사용되도록 초기화 됨.
ROLLBACK이 불가해 DDL로 분류.
Data Control Language
USER를 생성, USER에게 데이터를 컨트롤할 수 잇는 권한을 부여하거나 회수.
하나의 DB에는 여러 USER를 가질 수 있다.
사용자를 생성. CREATE USER 권한이 있어야 수행 가능.
사용자를 변경.
사용자를 삭제.
사용자에게 권한을 부여.
사용자에게 권한을 회수.
특정 권한들을 하나의 세트처럼 묶는 것.
create table smp1 (col1 number);
insert into smp1 values(1);
create table smp2 (col1 number);
insert into smp2 values(1);
rollback;
insert into smp2 values(2);
select count(*) from smp1;
=> 1
=> 모두 문법상 가능.
트랜잭션 동작 중 일부만 ROLLBACK 될 수 있다?
X
트랜잭션의 특성 중 하나인 원자성. 이는 일부만 ROLLBACK 될 수 없음을 의미. 만약 트랜잭션 중간에 SAVEPOINT를 지정한다면 하위 트랜잭션이 생성되는 것. 그리고 그 트랜잭션 단위로 ROLLBACK이 되는 것임.
create table smp (col1 number, col2 varchar(1));
모두 가능하다 왜? 암시적인 형변환 즉 데이터베이스가 내부적으로 알아서 데이터 유형을 변환하기 때문에.
이건 안 됨 왜? A는 숫자가 아니므로 암시적 형변환 불가.