[SQL첫걸음]181117
데이터베이스 객체
- 테이블, 뷰, 인텍스 등 데이터베이스 내에 정의하는 모든 것을 일컫는 말
- 이름을 붙일 때 생기는 제약사항
- 기존 이름이나 예약서와 중복하지 않는다.
- 숫자로 시작할 수 없다.
- 언더스코어(_) 이외의 기호를 사용할 수 없다.
- 한글을 사용할 때는 더블쿼트(")로 둘러싼다.
- cf. MySQL에서는 백쿼트(`)
- 시스템이 허용하는 길이를 초과하지 않는다.
- 데이터베이스 객체는 스키마라는 그릇안에서 만들어진다.
- 스키마
- 데이터베이스의 구조와 제약조건에 대한 전반적인 명세를 기술 한 것 (설계도 개념)
- 데이터베이스를 구성하는 개체, 속성, 관계 및 데이터 조작 시 값들이 갖는 전반적인 조건을 정의한 것
- 외부스키마, 개념스키마, 내부스키마로 나뉘어짐
테이블 작성.삭제.변경
- DML(Data Manipulation Language)는 데이터를 조작하는 명령
- SELECT, INSERT, DELETE, UPDATE 등
- DDL(Data Definition Language)는 데이터 정의하는 명령
- 스키마 내의 객체를 관리할 때 사용
- CREATE, DROP, ALTER 등
- CREATE
- 테이블, 뷰 등 우언하는 객체를 생성할 때 이용하는 명령
- CREATE TABLE 테이블명 (
열 정의1,
열 정의2,
...
) - 열 정의란?
- 열의 이름, 자료형, 기본값, NULL허용 여부등의 정보
- 열이름 자료형 [DEFAULT 기본값] [NULL|NOT NULL]
- DROP
- 테이블 삭제할 때 이용. 실수하지 않도록 주의
- DROP TABLE 테이블명
- cf. DELETE 명령에 WHERE 조건을 지정하지 않으면 테이블 전체의 행을 삭제한다. 테이블 정의는 유지된다. (DROP은 테이블 자체를 없애버림)
- 그러나 행이 많으면 DELETE는 느림. 이때 TRUNCATE 명령을 이용할 수 있다. TRUNCATE는 모든 행의 데이터를 날린다. (조건 지정 불가)
- ALTER
- 테이블을 작성한 뒤에 변경이 필요한 경우 사용
- ex. 열 추가, 삭제, 변경 / 제약 추가, 삭제 등
- 기존에 저장 된 데이터는 그대로 남긴 채 구성만 변경 된다.
- 열 추가
- ALTER TABLE 테이블명 ADD 열 정의
- 기존 데이터행이 존재하는 경우 모두 NULL or 기본값이 들어간다.
- 추가되는 열에 NOT NULL제약이 있는 경우 기본값을 지정해야한다.
- 열 속성 변경
- ALTER TABLE 테이블명 MODIFY 열 정의
- 열 이름은 변경 할 수 없다. 자료형, 기본값, NULL 제약 등 변경가능
- 열 정의에서 이름은 바꾸고 싶은 열의 이름을 쓴 뒤 변경되는 제약 적기
- 기본의 데이터행도 변경하는 속성에 따라 변경 된다. 단 이때 기존 데이터와 충돌되면 처리되지 않는다.
- 열 이름 변경
- ALTER TABLE 테이블명 CHANGE [기존 열 이름] [신규 열 정의]
- 열 이름뿐아니라 속성도 변경 할 수 있다.
- 열 삭제
- ALTER TABLE 테이블명 DROP 열명
제약
- 제약을 설정함으로써 저장될 데이터를 원하는데로 제한할 수 있다.
- CREATE TALBE로 테이블을 작성할 때 제약을 같의 정의, ALTER TABLE로 지정, 변경 가능
- NULL, NOT NULL, UNIQUE, PRIMARY KEY 등
- 제약은 스페이스로 연속해서 적는다. (쉼표로 나누지 않는다.)
- ex.
no INTERGER NOT NULL PRIMARY KEY (o)
no INTERGER NOT NULL, PRIMARY KEY (x) - 한개의 제약으로 복수열에 제약을 거는 걸 '테이블 제약'이라고 한다.
- ex. CREATE TABLE sample632 (
no INTEGER NOT NULL,
sub_no INTEGER NOT NULL,
name VARCHAR(30),
PRIMARY KEY (no, sub_no)
); - CONSTRAINT을 이용해 제약에 이름을 붙일 수 있다. 이름이 있으면 나중에 제약관리가 쉬워지니 가능하면 붙이자.
- ex. CREATE TABLE sample632 (
no INTEGER NOT NULL,
sub_no INTEGER NOT NULL,
name VARCHAR(30),
CONSTRAINT pkey_sample PRIMARY KEY (no, sub_no)
); - 제약추가는 ALTER을 이용한다. 열 제약 추가(열 하나만)와 테이블 제약 추가는 명령이 조금 다르다.
- 열 제약 추가는 MODIFY을 이용해서
- ALTER TABLE sample631 MODIFY c VARCHAR(30) NOT NULL;
- 테이블 제약 추가는 ADD을 이용해서
- ALTER TABLE sample631 ADD CONSTRAINT pkey_sample631 PRIMARY KEY(a);
- 제약삭제는 열을 재정의 하거나 DROP 제약명 명령을 이용해 할 수 있다.
- ex.
ALTER TABLE sample631 MODIFY c VARCHAR(30);
>> 원래 NOT NULL이 있었다. 이를 NOT NULL 없이 재정의
ALTER TABLE sample631 DROP CONSTRAINT pkey_sample631;
>> DROP과 제약명을 이용해 제약 삭제
기본키
- 기본키는 테이블의 행 한 개를 특정할 수 있는 검색키이다. 기본키로 설정 된 열은 중복되는 데이터를 가질 수 없다.
- 기본키로 지정 된 열은 NULL값을 가질 수 없다.
- 기본키를 구성하는 열은 복수라도 상관없다. 복수의 열을 기본키로 지정한 경우 키를 구성하는 모든 열을 사용해서 중복값을 체크한다.
- ex.
a, b열을 기본키로 지정했으면
a : 1, b : 1 / a : 1, b : 2 / a : 1, b : 3 과 같은 식의 데이터도 저장이 된다.
a열만 보면 1이라는 데이터가 중복되지만 b까지 보면 중복되지 않기 때문
인덱스 (어려운 개념, 추후 공부)
- 인덱스는 테이블에 붙여진 색인이라 할 수 있다. 검색속도 향상에 목적이 있다.
- 인덱스를 지정하면 SELECT의 성능은 향상되나 INSERT, UPDATE, DELETE의 성능은 떨어진다.
- '이진 탐색'이라는 검색 알고리즘에 인덱스가 필요하다.
- 인덱스 생성: CREATE INDEX 인덱스명 ON 테이블명 (열명1, 열명2, ...)
- 인덱스 삭제: DROP INDEX 인덱스명
뷰
- 뷰도 데이터베이스 객체 중 하나이다.
- '가상 테이블'로 이해하면 좋다. 실제하는 테이블이 아닌 필요에 의해 지정하는 테이블이다. 하지만 쿼리에서는 테이블이랑 비슷하게 사용할 수 있다.
- CREATE VIEW 뷰명 AS SELECT 명령
- ex. CREATE VIEW sample_view_67 AS SELECT * FROM sample54;
SELECT * FROM sample_view_67; - 뷰의 열명은 SELECT 구의 열명과 다르게 지정할 수 있다. (생략하면 동일)
- CREATE VIEW 뷰명 (열명1, 열명2, ...) AS SELECT 명령
- ex. CREATE VIEW sample_view_672(n, v, v2) AS
SELECT no, a, a*2 FROM sample54;
>> no, a, a*2의 열명이 뷰에선 n, v, v2로 지정 됐다. - CPU소모가 커진다는 단점이 있다.
집합 연산
- UNION
- 합집합을 구할 수 있다.
- SELECT 명령의 결과를 집합으로 간주하면 이해하기 쉽다.
ex. SELECT * FROM sample71_a UNION SELECT * FROM sample71_b; - UNION 전후 순서가 달라져도 결과값은 동일하다. 단 순서가 다르다.
- ORDER BY할 때 마지막 SELECT명령에 지정해야 하고 열은 별명을 붙여 ORDER BY구의 지정하는 열과 일치 시켜야 한다.
ex.
SELECT * FROM sample71_a
UNION
SELECT * FROM sample71_b ORDER BY b; (x)
SELECT a AS c FROM sample71_a
UNION
SELECT b AS c FROM sample71_b ORDER BY c; (o) - UNION ALL을 이용하면 중복되는 값도 같이 출력한다.
- 교집합과 차집합은 MYSQL에서 지원하지 않는다.
테이블 결합
- 교차결합
- FROM구에 테이블을 두 개 지정하면 곱집합으로 계산된다.
- SELECT * FROM sample72_x, sample72_y;
- 내부결합
- INNER JOIN을 이용해 내부결합을 할 수 있다.
- SELECT * FROM 테이블명1 INNER JOIN 테이블명2 ON 결합조건
- 외부키를 이용해 데이터를 참조할 때 많이 이용한다.
- 외부결합
- LEFT JOIN, RIGHT JOIN을 이용해 외부결합 할 수 있다.
- 한 쪽 테이블에만 존재하는 행을 결합할 때 이용한다.
- ex. '상품 테이블'과 '재고 테이블'이 상품코드로 결합됨.
새로운 제품이 들어와 '상품'은 있지만 '재고'는 없는 상태.
이때 INNER JOIN을 사용하면 새로운 상품은 제외된다. - 외부결합을 이용하면 새로운 상품의 행도 나온다. 재고는 NULL로 표시
댓글
댓글 쓰기