17일차 - SQL 'DDL, 인덱스'
create table
create table 테이블 이름(열 이름 자료형, 열 이름 자료형 · · · );
테이블을 만들 때(생성) 사용한다.
alter table
기존 테이블에 열을 추가, 삭제 또는 수정할 때 사용한다.
열 추가 : alter table 테이블 이름 add 열 이름 자료형;
alter table의 add로 테이블 제약 primary key를 설정할 수 있다.
열 삭제 : alter table 테이블 이름 drop 열 이름;
열 수정 : alter table 테이블 이름 modify 열 이름 자료형;
열 수정 : alter table 테이블 이름 modify 열 이름 자료형 열 제약;
열 수정 : alter table 테이블 이름 change 열 이름 자료형;
*change는 modify 특징 + 열 이름 수정이다.
제약
테이블을 만들 때 자료형 다음에 제약 조건을 적을 수 있다.
- not null -> null값을 넣지 않겠다. => 열 제약
- defalut -> 기본값
- primary key -> 기본키(not null) => 테이블 제약
- foreign key
- check
primary key
테이블에는 꼭 primary key 한 개를 가지고 있어야 한다. 테이블을 만들 때 자료형 뒤에 primary key를 써 주면 된다.
*primary key는 null값을 가질 수 없기 때문에 not null은 꼭 안 써도 된다. 자동으로 not null이 되지만 데이터베이스마다 다를 수 있다. Oracle과 MySQL은 자동
이미 있는 테이블에 primary key를 추가하려면 alter table 테이블 이름 add primary key(열 이름);
primary key를 지정하면 임의로 다른 키로 바꿀 수 없다!
unique 조건
unique 제약은 특정 열에 중복된 값이 생기는 것을 방지할 수 있다.
unique에는 primary key와 달리 null값이 올 수 있다.
인덱스
인덱스의 역할은 검색 속도를 빠르게 하는데 있다.
*종이 위에 인덱스 붙이는 것처럼 테이블 위에 인덱스가 있다고 생각하면 된다.
이진 검색 (binary search) : 인덱스에 쓰이는 검색 알고리즘
1부터 100까지 있는 데이터 중에 원하는 데이터를 검색할 때 최악의 상황은 100번 검색하는 것이다.
이진 검색은 데이터를 반으로 딱 나누고 원하는 데이터를 확인하고 없다면 현재 위치 보다 작은지 큰지로 구분해서
검색 범위를 계속 반씩 줄인다.
운 나쁘게 100번을 검색해야 되는 상황보다 속도가 훨씬 빠르다.
*인덱스는 create, drop 두 가지만 쓴다. 테이블을 삭제하면 인덱스도 같이 삭제된다.
인덱스 생성 : create index 인덱스 이름 on 테이블 이름(열 이름);
인덱스 생성 : drop index 인덱스 이름 on 테이블 이름;
*프라이머리키는 따로 지정 안 해도 인덱스가 들어가있다고 보면 된다.
실제로 인덱스를 사용해서 검색하는지 확인하려면 explain명령을 쓰면 된다.
possible_key칸에 사용될 수 있는 인덱스가 표시되고 key는 사용된 인덱스가 표시된다.
뷰
create view 뷰 이름 as select * from 테이블 이름;
뷰의 열 지정을 따로 지정했다면 select문에도 일일이 지정해야 해서 모든 열을 사용할 경우에는 지정하지 않는게 좋다.
뷰를 만든 뒤에 select로 뷰의 이름을 지정하면 참조할 수 있다.
select * from 뷰 이름;
drop view 뷰 이름;
뷰를 삭제하면 select로 뷰를 참조 할 수 없다.