본문 바로가기
DB & SQL/이것이 MySQL이다

테이블

by k-mozzi 2022. 5. 20.
반응형
Preface

 

이번 장에선 SQL문을 이용해 테이블을 조작하는 방법을 공부했다.

 

앞선 장에서부터 별 생각 없이 사용하던 문장들을 막상 하나 하나 나열하니 내용이 정말 많다고 느껴졌다.

 

또, 여러 제약 조건들을 고려하며 테이블을 정의하고 수정하는 것은 정말 복잡한 것 같다는 생각이 들었다.

 

그래도 책을 공부하며 한 번, 블로그를 업로드하며 한 번 SQL문을 작성하다보니 나름 익숙해져서 내가 원하는 간단한 작업은 큰 어려움 없이 진행할 수 있게 되었다.

 

 

 

아, 그리고 오늘 달력을 보던 도중 알게 되었는데 내가 개발 공부를 시작한지 벌써 1년이 넘었다.

 

그동안 나름 꾸준히 한다고 한 것 같긴 한데 음... 아직 한참 부족한 것 같다.

 

부족한 부분에 스트레스를 받기 보단 간단한 코드라도 짤 수 있게 된 것, 무지했던 IT 세상의 지식을 조금이라도 알게 된 것에 의의를 두자.

 

내년이면 벌써 스물 네 살이고 8월이면 대학교도 졸업이다.

 

스물 다섯이 가기 전엔 무조건 개발자로서의 커리어를 시작하고 싶은데, 아직 갈 길이 멀다.

 

나태해지지 말고 남들보다 더 노력해보자.

 

기업들 딱 대 ㅋㅋ


 

1. SQL을 이용한 테이블 생성

 

 

- 간단한 쇼핑몰 DB 생성

drop database if exists tabledb;
create database tabledb;

use tabledb;
drop table if exists buytbl, usertbl;

create table usertbl				-- 회원 테이블
( userID	char(8) not null primary key,	-- 사용자 아이디
  username	varchar(10) not null,		-- 이름
  birthYear int not null,			-- 출생년도
  addr		char(2) not null,		-- 지역(경기, 서울, 경남 등으로 글자만 입력)
  mobile1	char(3) null,			-- 휴대폰의 국번
  mobile2	char(8) null,			-- 휴대폰의 나머지 전화번호
  height	smallint null,			-- 키
  mDate		date null			-- 회원 가입일
);

create table buytbl			-- 구매 테이블
( num		int  auto_increment not null primary key,	-- 순번(PK)
  userid	char(8) not null,	-- 아이디(FK)
  prodName	char(6) not null,	-- 물품명
  groupName	char(4) null,		-- 분류
  price		int not null,		-- 단가
  amount	smallint not null,	-- 수량
  foreign key(userid) references usertbl(userID)
);


insert into usertbl values('LSG', '이승기', 1987, '서울', '011', '11111111', 182, '2008-8-8');
insert into usertbl values('KBS', '김범수', 1979, '경남', '011', '22222222', 173, '2012-4-4');
insert into usertbl values('KKH', '김경호', 1971, '전남', '019', '33333333', 177, '2007-7-7');
insert into usertbl values('JYP', '조용필' ,1950, '경기', '011', '44444444', 166, '2009-4-4');
insert into usertbl values('SSK', '성시경', 1979, '서울', null, null, 186, '2013-12-12');
insert into usertbl values('LJB', '임재범', 1963, '서울', '016', '66666666', 182, '2009-9-9');
insert into usertbl values('YJS', '윤종신', 1969, '경남', null, null, 170, '2005-5-5');
insert into usertbl values('EJW', '은지원', 1972, '경북', '011', '88888888', 174, '2014-3-3');
insert into usertbl values('JKW', '조관우', 1965, '경기', '018', '99999999', 172, '2010-10-10');
insert into usertbl values('BBK', '바비킴', 1973, '서울', '010', '00000000', 176, '2013-5-5');
insert into buytbl values(null, 'KBS', '운동화', null, 30, 2);
insert into buytbl values(null, 'KBS', '노트북', '전자', 1000, 1);
insert into buytbl values(null, 'JYP', '모니터', '전자' ,200, 1);
insert into buytbl values(null, 'BBK', '모니터', '전자', 200, 5);
insert into buytbl values(null, 'KBS', '청바지', '의류', 50, 3);
insert into buytbl values(null, 'BBK', '메모리', '전자', 80, 10);
insert into buytbl values(null, 'SSK', '책', '서적', 15, 5);
insert into buytbl values(null, 'EJW', '책', '서적', 15, 2);
insert into buytbl values(null, 'EJW', '청바지', '의류', 50, 1);
insert into buytbl values(null, 'BBK', '운동화', null, 30, 2);
insert into buytbl values(null, 'EJW', '책', '서적', 15, 1);
insert into buytbl values(null, 'BBK', '운동화', null, 30, 2);

 


 

2. 제약 조건

 

 

- 제약 조건: 데이터의 무결성을 지키기 위한 제한된 조건

→ 특정 조건을 만족했을 때만 데이터가 입력되도록 제약하는 것


1. 기본 키(PRIMARY KEY) 제약 조건

 

- 기본 키: 테이블에 존재하는 많은 행의 데이터를 구분할 수 있는 식별자

 

 

- 기본 키에 입력되는 값은 중복될 수 없으며, null 값이 입력될 수 없다.

 

 

- 기본 키로 생성한 것은 자동으로 클러스터형 인덱스가 생성된다.

 

 

- 두 개의 열을 합쳐서 기본 키로 설정할 수 있다.

 

 

- 기본 키를 지정하는 방법

create table usertbl
( userID	char(8) not null primary key,
  username	varchar(10) not null,
  birthYear int not null
);

 

 

- 테이블의 정보를 보기 위한 방법

describe usertbl;
desc usertbl;
show index from 테이블이름;

 

 

- 기본 키를 지정하면서 키의 이름을 지어주는 방법

-- 짧은 테이블 생성
create table usertbl
( userID	char(8) not null,
  username	varchar(10) not null,
  birthYear int not null,
  constraint primary key PK_userTBL_userID (userID)
  -- constraint는 생략 가능
  -- 이름을 지정할 필요가 없다면 'primary key (userID)'만 써도 됨
);

 

-- alter table 구문을 사용하는 방법
create table usertbl
( userID	char(8) not null,
  username	varchar(10) not null,
  birthYear int not null
);
alter table usertbl
	add constraint PK_userTBL_userID
    	primary key (userID);

→ MySQL은 primary key로 지정하면 항상 키 이름을 PRIMARY로 보여주므로, 기본 키의 이름을 직접 지정하는 것이 의미 없다. 하지만, foreign key는 하나의 테이블에 여러 개가 생성될 수 있으므로 이름을 지정해서 관리하는 것이 좋다.

 

 

- 테이블에 지정된 키를 보는 방법

show keys from 테이블이름;

 

 

- 두 개 이상의 열을 합쳐 기본 키로 구성하는 방법

drop table if exists prodTbl;
create table prodTbl
( prodCode	char(3) not null,
  prodID	char(4) not null,
  prodDate	datetime not null,
  prodCur	char(10) null
/* constraint PK_prodTbl_proCode_proID
		primary key (prodCode, prodID) */
);
alter table prodTbl
	add constraint PK_prodTbl_proCode_proID
		primary key (prodCode, prodID) ;

 


 

2. 외래 키(FOREIGN KEY) 제약 조건: 두 테이블 사이의 관계를 선언함으로써 데이터의 무결성을 보장

 

- 외래 키 테이블에 데이터를 입력할 때는 기준 테이블에 이미 데이터가 존재해야 한다.

 

 

- 외래 키 테이블이 참조하는 기준 테이블의 열은 반드시 primary key이거나 unique 제약 조건이 설정되어 있어야 한다.

 

 

- 외래 키를 생성하는 방법

create table buytbl
( num		int  auto_increment not null primary key,
  userid	char(8) not null,
  prodName	char(6) not null,
  foreign key(userid) references usertbl(userID)
);

 

 

- 외래 키를 지정하면서 키의 이름을 지어주는 방법

create table buytbl
( num		int  auto_increment not null primary key,
  userid	char(8) not null,
  prodName	char(6) not null,
  constraint FK_userTBL_buyTBL foreign key(userid) references usertbl(userID)
);

 

 

-- alter table 구문을 사용하는 방법
create table buytbl
( num		int  auto_increment not null primary key,
  userid	char(8) not null,
  prodName	char(6) not null
);
alter table buytbl
	add constraint FK_userTBL_buyTBL
    foreign key (userID)
    references userTBL (userID);

→ 기준 테이블의 열 이름과 외래 키 테이블의 열 이름이 달라도 관계는 없다.

 


 

3. UNIQUE 제약 조건: 중복되지 않는 유일한 값을 입력해야 하는 조건

→ PRIMARY KEY와 거의 비슷하지만, null 값을 허용한다.

 

- 제약 조건의 일반적인 이름 지정 방식

1) primary key: PK

2) foreign key: FK

3) unique: AK(Alternate Key)

 


 

4. CHECK 제약 조건: 입력되는 데이터를 점검하는 기능

 

- check 제약 조건 설정 방법

-- 출생년도가 1900년 이후 그리고 2023년 이전, 이름은 반드시 넣어야 함
create table usertbl
( userID	char(8) primary key,
  username	varchar(10),
  birthYear int check (birthYear >= 1900 and birthYear <= 2023),
  mobile1	char(3) null,
  constraint CK_name check (name is not null)
);

 

-- alter table 구문을 사용하는 방법
alter table usertbl
	add constraint CK_mobile1
    check (mobile1 in ('010', '011', '016', '017', '018', '019')) ;

→ check 제약 조건을 만들되 작동하지 않도록 하는 방법: 제약 조건의 제일 뒤에 NOT ENFORCED구문을 추가

 


 

5. DEFAULT 정의: 값을 입력하지 않았을 때, 자동으로 입력되는 기본 값을 정의하는 방법

 

- default 값 설정 방법

create table usertbl
( userID	char(8) not null primary key,
  username	varchar(10) not null,
  birthYear int not null default -1,
  addr		char(2) not null default '서울',
  mobile1	char(3) null,
  mobile2	char(8) null,
  height	smallint null default 170,
  mDate		date null
);

 

-- alter table 구문을 사용하는 방법
create table usertbl
( userID	char(8) not null primary key,
  username	varchar(10) not null,
  birthYear int not null,
  addr		char(2) not null,
  mobile1	char(3) null,
  mobile2	char(8) null,
  height	smallint null,
  mDate		date null
);
alter table usertbl
	alter column birthYear set default -1;
alter table usertbl
 	alter column addr set default '서울';
alter table usertbl
 	alter column height set default 170;

 

 

- 디폴트 값이 설정된 열에 데이터를 입력하는 방법

1) default 문은 DEFAULT로 설정된 값을 자동 입력한다.

2) 열 이름이 명시되지 않으면 DEFAULT로 설정된 값을 자동 입력한다.

3) 값이 직접 명기되면 DEFAULT로 설정된 값은 무시된다.

 


 

6. Null 값 허용: null 값을 허용하려면 'null'을, 허용하지 않으려면 'not null'을 사용하면 된다.

→ 기본 키가 설정된 열은 자동으로 not null이 적용된다.


 


 

3. 테이블 압축

 

 

- 테이블 압축: 대용량 테이블의 공간을 절약

→ 테이블을 생성할 때만 지정하면 그 이후로는 일반 테이블과 사용법이 동일하다.

 

 

- 테이블 압축 방법

create database if not exists compressDB;
use compressDB;
create table normalTBL( emp_no int, first_name varchar(14));
create table compressTBL( emp_no int, first_name varchar(14))
	row_format=compressed;

insert into normalTBL
	select emp_no, first_name from employees.employees;
insert into compressTBL	-- 데이터가 압축되며 입력되므로 조금 더 오래 걸림
	select emp_no, first_name from employees.employees;
    
show table status from compressDB;	-- 테이블의 상태 확인

drop database if exists compressDB;

 


 

4. 임시 테이블

 

 

- 임시 테이블: 임시로 잠깐 사용되는 테이블

 

 

- 임시 테이블 생성 방법

create temporary table [if not exists] 테이블이름
( 열 정의 )
-- table 위치에 temporary table이라고 써주면 됨

 

 

- 임시 테이블의 특징

1) 생성 구문만 약간 다를 뿐, 나머지 사용법은 일반 테이블과 동일하다.

2) 세션 내에서만 존재하며, 세션이 닫히면 자동으로 삭제된다.

3) 생성한 클라이언트에서만 접근이 가능하며, 다른 클라이언트는 접근할 수 없다.

4) DB 내의 다른 테이블과 이름을 동일하게 만들 수 있다.

→ 기존의 테이블은 임시 테이블이 있는 동안에 접근이 불가능하며, 무조건 임시 테이블로 접근한다.

 

 

- 임시 테이블이 삭제되는 시점

1) 사용자가 drop table로 직접 삭제

2) Workbench를 종료하거나 MySQL 클라이언트를 종료하면 삭제

3) MySQL 서비스가 재시작 되면 삭제

 


 

5. 테이블 삭제

 

 

- 테이블 삭제 방법

drop table 테이블이름;

 

 

- 외래 키 제약 조건의 기준 테이블은 삭제할 수 없다.

→ 먼저 외래 키가 생성된 외래 키 테이블을 삭제해야 한다.

 

 

- 여러 개의 테이블을 동시에 삭제하려면 콤마(,)를 사용해 나열하면 된다.

 


 

6. 테이블 수정

 

 

- 열의 추가

1) 열을 추가하면 기본적으로 가장 뒤에 추가된다.

2) 순서를 지정하려면 제일 뒤에 'FIRST' 또는 'AFTER 열 이름'을 지정하면 된다.

use tabledb;
alter table usertbl
	add homepage varchar(30)	-- 열 추가
		default 'http:/www.hanbit.co.kr'	-- 디폴트 값
        	null;	-- null 허용

 

 

- 열의 삭제

alter table usertbl
	drop column mobile1;

 

 

- 열의 이름 및 데이터 형식 변경

alter table usertbl
	change column username uname varchar(20) null;

 

 

- 열의 제약 조건 추가 및 삭제

alter table usertbl
	drop primary key;
alter table buytbl
	drop foreign key 외래키이름;
    -- 외래 키 이름은 Navigator에서 테이블 아래 Foreign key를 확장하여 확인

 

 

- 외래 키 제약 조건을 비활성화 시킨 후, 데이터를 모두 입력한 후에 다시 활성화 시키는 방법

set foreign_key_checks = 0;
update usertbl set userID = 'VVK' where userID = 'BBK';
set foreign_key_checks = 1;

1) foreign_key_check: 시스템 변수로 외래 키 체크 여부를 설정하는데 기본 값은 1(on)이며, 0은 off이다.

2) 함부로 외래 키 제약 조건을 끊고 데이터를 수정하면 제약 조건에 어긋나는 데이터가 입력되어 원하는 값을 얻지 못할 수도 있다.

 

 

- alter table은 테이블의 속성을, update는 테이블의 행 값을 수정한다.

 

 

- 기존 테이블의 PRIMARY KEY에 변경이 생길 때 이와 관련되는 참조 테이블의 FOREIGN KEY도 자동으로 변경시키는 방법

alter table buytbl
	drop foreign key FK_usertbl_buytbl;
alter table buytbl
	add constraint FK_usertbl_buytbl
	foreign key (userID)
    references usertbl (userID)
    on update cascade	-- 회원 테이블의 userID가 바뀌면 구매 테이블의 userID도 자동 변경
    on delete cascade;	-- 회원 테이블의 userID가 삭제되면 구매 테이블의 userID 관련 항목도 자동 삭제

 

 

- 참조되는 테이블에서 튜플을 삭제할 경우

1) ON DELETE NO ACTION: 튜플을 삭제하지 못하게 한다. (디폴트)

2) ON DELETE CASCADE: 관련 튜플을 함께 삭제한다.

3) ON DELETE SET NULL: 관련 튜플의 외래키 값을 NULL로 변경한다.

4) ON DELETE SET DEFAULT: 관련 튜플의 외래키 값을 미리 지정한 기본 값으로 변경한다.

 

 

- 참조되는 테이블에서 튜플을 변경할 경우

1) ON UPDATE NO ACTION: 튜플을 변경하지 못하도록 한다. (디폴트)

2) ON UPDATE CASCADE: 관련 튜플에서 외래키 값을 함께 변경한다.

3) ON UPDATE SET NULL: 관련 튜플의 외래키 값을 NULL로 변경한다.

4) ON UPDATE SET DEFAULT: 관련 튜플의 외래키 값을 미리 지정한 기본 값으로 변경한다.

 

 

- MySQL은 check 제약 조건이 설정된 열은 제약 조건을 무시하고 제거한다.

alter table usertbl
	drop column birthYear;

 

728x90
반응형

'DB & SQL > 이것이 MySQL이다' 카테고리의 다른 글

인덱스 (1)  (0) 2022.05.24
  (0) 2022.05.21
SQL 프로그래밍  (0) 2022.05.17
SQL 고급 (2)  (0) 2022.05.15
SQL 고급 (1)  (1) 2022.05.10

댓글