[DB] Structured Query Language
SQL Data Type
*SQL은 대, 소문자 구별하지 않는다!
pure relational algebra - removes all duplicates
multiple relational algebra, SQL - ratains duplicates
relation algebra to SQL
select A1, A2, .., An
from r1, r2, .., rm
where P
sql to relation algebra
→ π A1, A2, .., An ( σ p ( r1 x r2 x .. x rm ) )
// select엔 group by에 쓴 애트리뷰트 + aggregation만 쓸 수 있음
select A1, A2, sum(A3)
from r1, r2, .., rm
where p
group by A1, A2
→ A1, A2 G sum(A3) ( σ p ( r1 x r2 x .. x rm) )
select A1, sum(A3)
from r1, r2, .., rm
where p
group by A1, A2
→ π A1, sumA3 ( A1, A2 G sum(A3) as sumA3 ( σ p ( r1 x r2 x .. x rm) )
projection 명시를 해주지 않으면 A1, A2, sumA3이 나옴
Structured Query Language
DDL (Data-definition Language)
데이터 정의어
CREATE, ALTER, DROP, RENAME, TRUNCATE - 테이블과 같은 데이터 구조를 정의하는데 사용되는 명령어들로 데이터 구조와 관련된 명령어 (생성, 변경, 삭제, 이름변경)
DML (Data-manipulation Language)
데이터 조작어
SELECT - 데이터베이스에 들어있는 데이터를 조회하거나 검색하기 위한 명령어
INSERT, UPDATE, DELETE - 데이터베이스의 테이블에 들어있는 데이터에 변형을 가하는 종류의 명령어
DCL (Data-Control Language)
데이터 제어어
GRANT, REVOKE - 데이터베이스에 접근하고 객체들을 사용하도록 권한을 주고 회수하는 명령어
TCL (Transaction Control Language)
트랜잭션 제어어
논리적인 작업의 단위를 묶어서 DML에 의해 조작된 결과를 작업단위 별로 제어하는 명령어
DDL (Data-definition Language)
DDL은 rollback이 되지 않는다!
- CREATE TABLE: 테이블 생성
- ALTER TABLE: 테이블 스키마(등) 관련 변경
- DROP TABLE: 테이블 삭제
- RENAME: 이름 변경
- TRUNCATE: 테이블의 모든 데이터 삭제
- COMMENT: 테이블에 설명 추가
- CREATE TABLE
CREATE TABLE book // 테이블 이름 (
bookno NUMBER(5),
title VARCHAR(50),
author VARCHAR(10),
pubdata DATE
); // **세미콜론!**
Subquery를 이용한 테이블 생성
create table temp_account like account*
Subquery의 결과와 동일한 테이블 생성됨
NOT NULL 제약조건만 상속됨
CREATE TABLE empSALES
AS
// Subquery
SELECT * FROM emp
WHERE job = 'SALES';
Data type Description
VARCHAR2(size) | 가변길이 문자열 (최대 4000byte) |
CHAR(size) | 고정길이 문자열 (최대 2000byte) |
NUMBER(p, s) | 가변길이 숫자, 전체 P자리 중 소수점 이하 S 자리 |
자리수 지정없으면 NUMBER(38) | |
DATE | 고정길이 날짜+시간 |
- VARCHAR2 와 CHAR의 차이점
- INT, FLOAT 등의 ANSI Type도 내부적으로 NUMBER(38)로 변환됨
- 다른 데이터 타입 참고
- ALTER TABLE (ROLL BACK의 대상이 아니기때문에 주의하자!)
- 컬럼 추가 ADD (컬럼명 datatype)pubs 라는 새로운 칼럼이 옆에 붙음
- ALTER TABLE book ADD (pubs VARCHAR2(50));
- 컬럼 수정 MODIFY (컬럼명 데이터타입)
- ALTER TABLE book MODIFY (title VARCHAR2(100));
- 컬럼 삭제 DROP
- ALTER TABLE book DROP author;
- 테이블 삭제 DROP TABLE테이블의 모든 데이터 + 스키마 삭제
- DROP TABLE book;
- (테이블의 모든) 데이터만 삭제
- TRUNCATE TABLE book;
- RENAME
- RENAME book TO article; // 전체테이블을 rename ALTER TABLE book RENAME COLUMN bookno TO bookid;
제약조건
(Integrity) Constraint
데이터베이스 테이블 레벨에서 특정한 규칙을 설절해둠
예상치 못한 데이터의 손실이나 일관성을 위반하는 데이터의 추가, 변경 등을 예방
칼럼 제약조건: [CONSTRAINT 이름] constraint_type
테이블 제약조건: [CONSTRAINT 이름] constraint_type(column,..)
- NOT NULL칼럼형태로만 제약조건을 정의할 수 있음 - 테이블 제약조건 불가
- CREATE TABLE book ( bookno NUMBER(5) NOT NULL // 칼럼 제약조건 이름을 생략한 경우 );
- NULL 값이 존재할 수 없음
- UNIQUE복합 컬럼에 대해서도 정의 가능
CREATE TABLE book ( // 방법1 bookno NUMBER(5) CONSTRANINT c_book_u UNIQUE // 방법2 bookno NUMBER(5) UNIQUE // 방법3 CONSTRAINT [제약조건명] UNIQUE (bookno) );
- 자동적으로 인덱스 생성
- 중복된 값을 허용하지 않음 (NULL은 존재할 수 있음)
- PRIMARY KEY테이블 당 하나만 존재할 수 있음
CREATE TABLE book ( ssn1 NUMBER(9), ssn2 NUMBER(9), // 방법 1 PRIMARY KEY (ssn1, ssn2) // 방법 2 CONSTRAINT [제약조건이름] PRIMARY KEY(ssn1, ssn2) );
- 복합 컬럼에 대해서 정의 가능
- NOT NULL + UNIQUE (인덱스 자동 생성)
- FOREIGN KEY일반적으로 REFERENCE되는 테이블의 PK를 참조REFERENCE 되는 테이블의 레코드 삭제 시 동작 방식
- ON DELETE NO ACTION
- 해당하는 FK를 가진 참조행 삭제 시도시에 오류 발생 및 DELETE 문 ROLLBACK
- ON DELETE CASCADE
- 해당하는 FK를 가진 참조행도 삭제
- ON DELETE (default) → ON DELETE NO ACTION
- 지정하지 않을 시 NO ACTION이 기본값으로 사용됨
- ON DELETE SET NULL
CREATE TABLE book ( ... author_id NUMBER(10), CONSTRAINT c_book_fk FOREIGN KEY (author_id) REFERENCES author(id) ON DELETE SET NULL );
- 해당하는 FK를 NULL로 바꿈, NULL이 허용되어야 가능
- ON DELETE SET DEFAULT해당 컬럼에 DEFAULT가 정의되어 있어야 함
- 해당 컬럼에 NULL이 허용되고, DEFAULT 값이 정의되어 있지 않은 경우, NULL이 묵시적 기본값
- 해당하는 FK를 DEFAULT로 설정된 값으로 바꿈
- REFERENCE 되는 테이블에 없는 값은 삽입 불가
- 참조 무결성 제약
- CHECK
CREATE TABLE book ( rate NUMBER CHECK (rate IN (1, 2, 3, 4, 5)) );
- 임의의 조건 검사, 조건식이 참이어야 변경 가능
제약조건 추가
ALTER TABLE emp ADD CONSTRAINT emp_mgr_fk
FOREIGN KEY (mgr) REFERENCES emp(empno);
NOT NULL은 추가 못함
DML (Data-manipulation Language)
Data Manipulation Language
INSERT INTO … VALUES …
UPDATE … SET …
DELETE … FROM
- Add new row(s)
- INSERT INTO 테이블이름 [(컬럼리스트)] VALUES (값리스트);
- Modify existing rows
- UPDATE 테이블이름 SET 변경내용 [WHERE 조건];
- Remove existing rows
- DELETE FROM 테이블이름 [WHERE 조건];
트랜잭션의 대상 - 트랜잭션은 DML의 집합으로 이루어짐
INSERT
- 묵시적 방법: 컬럼 이름, 순서 지정하지 않음, 테이블 생성시 정의한 순서에 따라 값 지정
- INSERT INTO dept VALUES (777, 'MARKETING', NULL);
- 명시적 방법: 컬럼 이름 명시적 사용, 지정되지 않은 컬럼 NULL/Default 자동 입력
- INSERT INTO dept(dname, deptno) VALUES ('MARKETING', 777);
- Subquery 이용: 타 테이블로부터 데이터 복사 (테이블은 이미 존재하여야 함)
- INSERT INTO deptusa SELECT deptno, dname FROM dept WHERE country = 'USA';
UPDATE
- 조건을 만족하는 레코드를 변경
UPDATE emp SET sal = sal + 100, comm = 0 WHERE deptno = 10;
- 10번 부서원의 월급 100인상, 수수료 0으로 변경
- WHERE 절이 생략되면 모든 레코드에 적용
UPDATE emp SET sal = sal * 1.1;
- 모든 직원의 월급 10% 인상
- Subquery를 이용한 변경
UPDATE emp SET sal = (SELECT MAX(sal) FROM emp) WHERE job = (SELECT job FROM emp WHERE ename = 'SCOTT');
- 답당업무가 ‘SCOTT’과 같은 사람들의 월급을 부서 최고액으로 변경
DELETE
- 조건을 만족하는 레코드 삭제
- DELETE FROM emp WHERE ename = 'SCOTT';
- 조건이 없으면 모든 레코드 삭제
DELETE FROM emp;
- 모든 직원 정보 삭제
- Subquery를 이용한 DELETE
DELETE FROM emp WHERE deptno = (SELECT deptno FROM dept WHERE dname = 'SALES');
- ‘SALES’ 부서의 직원 모두 삭제
DELETE와 TRUNCATE의 차이점 DELETE는 Rollback 가능 (대량의 log를 유발), TRUNCATE보다 느림
SELECT
SELECT [ALL | DISTINCT] 열_리스트
[FROM 테이블_리스트]
[WHERE 조건]
[GROUP BY 열_리스트 [HAVING 조건]]
[ORDER BY 열_리스트 [ASC | DESC]];
projection- 원하는 컬럼 선택 selection- 원하는 튜플 선택
SELECT *| {[DISTINCT] column | expression [alias], … }
FROM table;
*: 모든 컬럼 반환 (ALL)
DISTINCT: 중복된 결과 제거
SELECT 컬럼명: Projection
FROM: 대상 테이블
ALIAS: 컬럼 이름 변경 (as) A as A’
Expression: 기본적인 연산 및 함수 사용 가능
NULL
아무런 값도 정해지지 않았음을 의미, 어떠한 데이터 타입에도 사용 가능
NOT NULL이나 Primary Key 컬럼에는 사용할 수 없음 (UNIQUE + NOT NULL)
→ Primary Key: NOT NULL + UNIQUE
NULL을 포함한 산술식은 일반적으로 NULL
[연산1]
SELECT sal, comm, (sal+comm)*12 FROM emp;
NVL(expr1, expr2)
expr1이 NULL이면 expr2를 반환한다 (데이터 타입이 호환가능하여야 함)
[연산2]
SELECT sal, comm, (sal + NVL(comm, 0))*12 FROM emp;
Alias (컬럼의 제목을 변경)
SELECT ename name FROM emp;
SELECT ename as name FROM emp;
SELECT ename “as” FROM emp; // 컬럼 이름을 as 로
SELECT (sal+comm) “Annual Salary” FROM emp; // 큰 따옴표를 사용하여 alias 내에 공백이나 특수문자 포함 가능
WHERE
- IN: 집합에 포함되는가?
- LIKE: 문자열 부분 검색
GROUP BY
SELECT deptno, AVG(sal) FROM emp;