- 학습 목표 달성 확인 목록
- [] 키/후보키(최소키)/주키/대안키/인공키의 개념을 이해하는가?


key:데이터를 식별할 때 사용할 수 있는 콜럼들
후보키:데이블에서 각 행을 유일하게 식별할 수 있는 최소한의 속성들의 집합을 말한다
예를들면 주민번호 이름 전화번호 학번이 있다고 치면
이름을 제외한 나머지들이 후보키가 된다
왜냐하면 이름은 동명이인이 존재하나 나머지들은 중복이 되어서는 안되는 데이터들이다.
주키(primary key):pk로 설정되면 해당 콜럼의 값은 변경 할 수 없다
예)아이디
대안키:pk는 아니지만 pk처럼 중복되어서는 안된다 그래서 unipue 컬럼으로 지정한다
예)이메일
인공키:key로 사용할 적절한 컬럼이 없을 때 임의의 컬럼(자동증가번호)을 추가해서 key로 사용한다
예)NO-1,2,3,4..자동으로 부여되는 인덱스
- [] 테이블의 주키를 설정할 수 있는가?
- PK를 지정하기 전:
> create table test1(
name varchar(20),
kor int,
eng int,
math int
);
- 입력 테스트:
> insert into test1(name,kor,eng,math) values('aaa', 100, 100, 100);
> insert into test1(name,kor,eng,math) values('bbb', 90, 90, 90);
> insert into test1(name,kor,eng,math) values('aaa', 100, 100, 100); /* 중복 허용*/
- PK를 지정한 후:
> 컬럼명 타입 primary key
> create table test1(
name varchar(20) primary key,
kor int,
eng int,
math int
);
- 입력 테스트:
> insert into test1(name,kor,eng,math) values('aaa', 100, 100, 100);
> insert into test1(name,kor,eng,math) values('bbb', 90, 90, 90);
> insert into test1(name,kor,eng,math) values('aaa', 100, 100, 100); /* 중복 오류!*/
> insert into test1(kor,eng,math) values(100, 100, 100); /* PK는 기본이 not null 이다. */
- 한 개 이상의 컬럼을 PK로 지정하기
> create table test1(
name varchar(20) primary key,
age int primary key,
kor int,
eng int,
math int
); /* 실행 오류 */
- 두 개 이상의 컬럼을 묶어서 PK로 선언하고 싶다면
각 컬럼에 대해서 개별적으로 PK를 지정해서는 안된다.
- 여러 개의 컬럼을 묶어서 PK로 지정하려면 별도의 문법을 사용해야 한다.
- constraint 제약조건이름 primary key (컬럼명, 컬럼명, ...)
> create table test1(
name varchar(20),
age int,
kor int,
eng int,
math int,
constraint test1_pk primary key(name, age)
);
- [] alter table 문법을 사용하여 주키를 설정할 수 있는가?
> create table test1(
no int,
name varchar(20),
age int,
kor int,
eng int,
math int
);
//새로운 필드를 만들때 pk키를 추가할때
> alter table test1
add constraint test1_pk(지정할 이름) primary key(no),
add constraint test1_uk(지정할 이름) unique (name, age);
//기존에 존재하는 필드로 pk를 만들때
> ALTER TABLE 테이블이름
MODIFY COLUMN CONSTRAINT test1_pk(지정할 이름) PRIMARY KEY (no)
- [] 주키 컬럼에 대해 자동증가 옵션을 설정할 수 있는가?
- 특정 컬럼의 값을 자동으로 증가하게 선언한다.
- 단 반드시 key(primary key 나 unique)여야 한다.
alter table test1 modify column no int not null auto_increment; /* 아직 no가 pk가 아니기 때문에 오류*/
alter table test1 add constraint primary key (no); /* 일단 no를 pk로 지정한다.*/
alter table test1 add constraint unique (no); /* no를 unique로 지정해도 한다.*/
alter table test1 modify column no int not null auto_increment; /* 그런 후 auto_increment를 지정한다.*/
- 입력 테스트 ``` /* auto-increment 컬럼의 값을 직접 지정할 수 있다.*/ insert into test1(no, name) values(1, ‘xxx’);
/* auto-increment 컬럼의 값을 생략하면 마지막 값을 증가시켜서 입력한다.*/ insert into test1(name) values(‘aaa’);
insert into test1(no, name) values(100, ‘yyy’);
insert into test1(name) values(‘bbb’); /* no는 101이 입력된다.*/
insert into test1(name) values(‘ccc’); /* no=102 / insert into test1(name) values(‘ddd’); / no=103 */
/* 값을 삭제하더라도 auto-increment는 계속 앞으로 증가한다.*/ delete from test1 where no=103;
insert into test1(name) values(‘eee’); /* no=104 */
insert into test1(name) values(‘123456789012345678901234’);
/* 다른 DBMS의 경우 입력 오류가 발생하더라도 번호는 자동 증가하기 때문에
- 다음 값을 입력할 때는 증가된 값이 들어간다.
- 그러나 MySQL(MariaDB)는 증가되지 않는다. / insert into test1(name) values(‘fff’); / no=? */ ```
- [] 유니크 컬럼 제약 조건을 설정할 수 있는가?
add constraint test1_pk(지정할 이름) primary key(no),
add constraint test1_uk(지정할 이름) unique (name, age);
- [] 인덱스의 용도와 원리를 이해하는가?
검색 조건으로 사용되는 컬럼인 경우 따로 정렬해 두면 데이터를 찾을 때 빨리 찾을 수 있다
특정 컬럼의 값을 A-Z 또는 Z-A로 정렬시키는 문법이 인덱스이다.
인덱스로 지정된 컬럼의 값이 추가/변경/삭제 될 때 인덱스 정보도 갱신한다
따라서 입력/변경/삭제가 자주 발생하는 테이블에 대해 인덱스 컬럼을 지정하면,
입력/변경/삭제 시 인덱스 정보를 갱신해야 하기 때문에
입력/변경/삭제 속도가 느려지는 문제가 있다.
대신 조회 속도는 빠르다.
- [] 특정 컬럼을 인덱스 컬럼으로 설정할 수 있는가?
- 테이블 생성
create table test1 ( name varchar(3), kor int, eng int, math int, sum int, aver int );
alter table test1 add constraint test1_pk primary key (no), add constraint test1_uk unique (name, age), add fulltext index test1_name_idx (name);//인덱스 컬럼 지정
alter table test1 modify column name varchar(20) not null, modify column age int not null, modify column kor int not null, modify column eng int not null, modify column math int not null, modify column sum int not null, modify column aver float not null;
**- [] 뷰의 역할을 이해하고 생성할 수 있는가?**
조회 결과를 테이블 처럼 사용하는 문법이다
select 문장이 복잡할 때 뷰로 정의해 놓고 사용하면 편리하다
```java
create table test1 (
no int primary key auto_increment,
name varchar(20) not null,
class varchar(10) not null,
working char(1) not null,
tel varchar(20)
);
insert into test1(name,class,working) values('aaa','java100','Y');
insert into test1(name,class,working) values('bbb','java100','N');
insert into test1(name,class,working) values('ccc','java100','Y');
insert into test1(name,class,working) values('ddd','java100','N');
insert into test1(name,class,working) values('eee','java100','Y');
insert into test1(name,class,working) values('kkk','java101','N');
insert into test1(name,class,working) values('lll','java101','Y');
insert into test1(name,class,working) values('mmm','java101','N');
insert into test1(name,class,working) values('nnn','java101','Y');
insert into test1(name,class,working) values('ooo','java101','N');
//생성결과
MariaDB [studydb]> select * from test1;
+----+------+---------+---------+------+
| no | name | class | working | tel |
+----+------+---------+---------+------+
| 1 | aaa | java100 | Y | NULL |
| 2 | bbb | java100 | N | NULL |
| 3 | ccc | java100 | Y | NULL |
| 4 | ddd | java100 | N | NULL |
| 5 | eee | java100 | Y | NULL |
| 6 | kkk | java101 | N | NULL |
| 7 | lll | java101 | Y | NULL |
| 8 | mmm | java101 | N | NULL |
| 9 | nnn | java101 | Y | NULL |
| 10 | ooo | java101 | N | NULL |
+----+------+---------+---------+------+
여기서 직장인들만 골라서 worker라는 가상의 테이블을 만든다
create view worker
as select no, name, class from test1 where working = 'Y';
//결과
MariaDB [studydb]> select * from worker;
+----+------+---------+
| no | name | class |
+----+------+---------+
| 1 | aaa | java100 |
| 3 | ccc | java100 |
| 5 | eee | java100 |
| 7 | lll | java101 |
| 9 | nnn | java101 |
+----+------+---------+
//뷰 삭제
drop view worker;
- [] insert/update/delete 문을 활용하여 데이터의 변경을 다룰 수 있는가?
**insert**
한가지 값 insert
insert into test1(name,tel) values('ccc','333');
여러값 insert
insert into test1(name,tel) values
('aaa', '1111'),
('bbb', '2222'),
('ccc', '3333');
### select 결과를 테이블에 insert하기
create table test2 ( no int not null primary key auto_increment, fullname varchar(20) not null, phone varchar(20) not null, kor int, eng int, math int );
/* select 결과를 테이블에 바로 입력하기 => select 결과의 컬럼명과 insert 테이블의 컬럼명이 같을 필요는 없다. => 그러나 결과의 컬럼 개수와 insert 하려는 컬럼 개수가 같아야 한다. => 결과의 컬럼 타입과 insert 하려면 컬럼의 타입이 같거나 입력 할 수 있는 타입이어야 한다. */ insert into test2(fullname,phone) select name, tel from test1 where addr=’seoul’;
****update****
```java
update 테이블명 set 컬럼명=값, 컬럼명=값, ... where 조건...;
update test1 set pstno='11111', fax='222' where no=3;
update test1 set tel='3030', fax='1212' where no=2;
/* 조건을 지정하지 않으면, 모든 데이터에 대해 변경한다.*/
update test1 set fax='333';
**delete**
delete from 테이블명 where 조건;
delete from test1 where no=2 or no=3;
/* 조건을 지정하지 않으면 모든 데이터가 삭제된다. 주의!*/
delete from test1;
- [] MariaDB에서 제공하는 다양한 함수를 사용할 수 있는가?
- [] 정규화의 목적을 아는가?
- [] 외부키(foreign key)를 이용하여 테이블을 부모/자식 관계로 설정할 수 있는가?
- [] 외부키가 설정된 자식 테이블과 부모 테이블의 데이터를 다룰 수 있는가?
- [] autocommit/commit/rollback의 동작 원리를 이해하는가?
- [] 트랜잭션의 개념과 용도를 이해하는가?
- [] commit/rollback 명령을 사용하여 트랜잭션을 다룰 수 있는가?
- [] select 문을 활용하여 데이터를 조건에 따라 조회할 수 있는가?
- [] selection과 projection의 의미를 이해하는가?