데이터 리터러시를 위한 발자취

[부트캠프] 데이터분석 학습일지 7주차 본문

부트캠프/[패스트캠퍼스] 데이터분석 9기

[부트캠프] 데이터분석 학습일지 7주차

wosole 2023. 8. 3. 19:02

데이터분석 부트캠프 학습일지 7주차입니다-!
이번주부터 SQL 강의가 시작되었는데요. 
 
부트캠프 사전 지원을 통해 SQL 강의를 미리 들어둔 게 많이 도움되고 있습니다. 
그 때 열심히 들어둔 보람있네요..ㅋㅋ 
 
SQL 관련 내용은 SQL 학습후기에서도 언급한 적이 있기 때문에 중복되지 않는 부분에 대해 기록할까 합니다 :) 

# 데이터분석 부트캠프 7주차
1. COPY TABLE
2. 기본키 & 외래키
3. 체크 제약조건
4. 유니크 제약조건
5. NOT NULL 제약조건

1. COPY TABLE


  
# 테이블 구조 및 데이터 복제
CREATE TABLE TEMP_BAK -- TEMP 테이블을 TEMP_BAK로 복제함
AS TABLE TEMP;

※ 단, 기존 테이블이 가지고 있는 PRIMARY KEY, UNIQUE, NOT NULL 등 제약조건은 가지고 오지 못함
- 테이블, 컬럼명, 컬럼 데이터 타입, 컬럼값만 복제하여 반영해줌
- 제약조건은 테이블 복사 후, 별도 추가해야함

MySQL Workbench 기준, 원본 테이블과 복사본 테이블 구조 차이


2. 기본키 & 외래키

# 기본키(PRIMARY KEY, PK)
- 테이블 내 고유하게 행 식별하는데 사용되는 컬럼 또는 컬럼 조합
- 테이블 생성 과정에서 PRIMARY KEY 설정 가능함
- 또한, CONSTRAINT '제약조건명' PRIMARY KEY ('컬럼명') 을 통해 제약조건 명명도 가능함


  
# 테이블 생성 & 기본키 지정(예제)
CREATE TABLE TB_USER (
USER_NO INT,
USER_NM VARCHAR(50) NOT NULL,
BIRTH_DE DATE NOT NULL,
ADRES VARCHAR (200) NULL,
     PRIMARY KEY (USER_NO) -- USER_NO를 PK로 지정
    -- CONSTRAINT PK_TB_USER PRIMARY KEY (USER_NO) -- 제약조건명 PK_TB_USER로 설정
);
# 테이블 생성 & SERIAL 형식 기본키 추가
CREATE TABLE TB_VENDOR (
VENDOR_NM VARCHAR(255)
);
ALTER TABLE TB_VENDOR ADD COLUMN VENDOR_ID SERIAL PRIMARY KEY;
-- VENDOR_ID 컬럼 추가 및 기본키 설정, 'SERIAL'을 통해 자동으로 번호 부여해줌(1...5)
# 기본키 제약조건 제거
ALTER TABLE TB_VENDOR DROP CONSTRAINT
TB_VENDOR_PKEY; -- 기본키 제약조건 제거(컬럼 및 데이터값 유지됨)

# 외래키(FOREIGN KEY, FK)
- (부모) 테이블의 기본키를 참조하는 (자식)테이블의 컬럼 또는 컬럼 조합

예제코드 1(부모 테이블, 자식 테이블 생성)

- 상기 예제코드의 구조를 해석하자면 아래와 같음
: 자식테이블(TB_CONTACT) 경우, 부모테이블인 TB_CUST(CUST_NO)를 참조하여 외래키(FK)로 지정,
  제약조건명은 FK_CUST_NO_TB_CUST로 명명함
- NO ACTION 경우, 자식이 가지고 있는 부모행을 삭제 시도 시 삭제 불가하도록 옵션 설정함 (ON DELETE NO ACTION)
: TB_CUST에서 참조 중인 CUST_NO 값을 삭제하려는 쿼리 작성 시, 'NO ACTION' 옵션 때문에 삭제 불가 및 에러 발생함


ON DELETE SET NULL 예제코드

- SET NULL 옵션은 자식이 가진 부모행 삭제 시, 자식행 값을 NULL로 반환해줌 (ON DELETE SET NULL)
: line 50 기준, 부모테이블의 CUST_NO '1' 또는 '3' 값 삭제 시, 자식테이블 CUST_NO 중 1,3인 행은 NULL로 표기됨 


- CASCADE은 자식이 가진 부모행 삭제 시, 자식행도 같이 삭제함 (ON DELETE CASCADE)
: line 50 기준, 부모테이블의 CUST_NO '1' 또는 '3' 값 삭제 시, 자식테이블 CUST_NO 중 1,3인 행은 삭제됨


3. 체크 제약조건

- 체크 제약조건은 컬럼 값에 제약 설정하는 것으로 테이블 생성 과정에서 주로 사용
- 아래 예제코드 기준, BIRTH_DE가 1950-01-01 이후여야  데이터 입력 가능(INSERT INTO)
 * 조건 불만족 시, 에러 발생


  
# 테이블 생성 & 체크 제약조건(예제)
CREATE TABLE TB_USER (
USER_NO INT,
USER_NM VARCHAR(50) NOT NULL,
BIRTH_DE DATE CHECK (BIRTH_DE > '1950-01-01') -- BIRTH_DE가 1950-01-01이후여야 함
ADRES VARCHAR (200) NULL,
);

4. 유니크 제약조건

- 컬럼 혹은 컬럼 조합에 대해 UNIQU 제약 지정함
- 제약조건을 어길 경우, 에러 발생


  
# 테이블 생성 & 유니크 제약조건(예제) - 단일조건
CREATE TABLE TB_USER (
USER_NO INT UNIQUE, -- USER_NO 값은 각 행이 모두 유일한 값으로 지정함
USER_NM VARCHAR(50) NOT NULL,
BIRTH_DE DATE NOT NULL
ADRES VARCHAR (200) NULL,
);
# 테이블 생성 & 유니크 제약조건(예제) - 다중조건
CREATE TABLE TB_USER (
USER_NO INT,
USER_NM VARCHAR(50) NOT NULL,
BIRTH_DE DATE NOT NULL
ADRES VARCHAR (200) NULL,
    UNIQUE(USER_NO,ADRES) -- USER_NO, ADRES의 값은 모두 유일한 값으로 지정함
);

5. NOT NULL 제약조건

※ NULL은 알 수 없거나 정보가 누락되었음을 의미하며, 빈 문자열이나 숫자 0과는 다름(헷갈리기 쉬움) 
- NOT NULL은 특정 컬럼에 NULL이 들어오는 것을 차단함
- NOT NULL 제약조건 위반 시, 에러 발생 


  
# 테이블 생성 & NOT NULL 제약조건(예제)
CREATE TABLE TB_USER (
USER_NO INT,
USER_NM VARCHAR(50) NOT NULL,
BIRTH_DE DATE NOT NULL,
ADRES VARCHAR (200) NULL,
);
# 특정 컬럼에 NOT NULL 제약조건 추가하기(ALTER TABLE 이용)
ALTER TABLE TB_USER ALTER COLUMN FIRST_NM SET NOT NULL;
ALTER TABLE TB_USER ALTER COLUMN LAST_NM SET NOT NULL;

# 참고사항
- DESC '테이블명' : 테이블 내 데이터 타입, 구조, NULL 제약조건 유무, key 유무(PK,FK) 조회 명령어

MySQL Workbench 기준, DESC 명령어 실행 결과

- SHOW INDEX FROM '테이블명' : 제약조건명, 컬럼명 등 index 조회 명령어

MySQL Workbench 기준, SHOW INDEX FROM 명령어 실행 결과


  
# 테이블 구조, 타입, Null, key 등 조회
DESC 테이블명;
# 인덱스 확인
SHOW INDEX FROM 테이블명;
# 인덱스 추가 (CREATE, ALTER로 추가 가능)
CREATE INDEX 인덱스명 ON 테이블명 (컬럼명);
ALTER TABLE 테이블명 ADD INDEX 인덱스명 (컬럼명);
# 인덱스 삭제
ALTER TABLE 테이블명 DROP INDEX 인덱스명;

Python도 그랬지만, SQL도 공부할 수록 외워야 할 쿼리 문법이 참 많습니다..ㅎㅎㅎ
아직까진 기초 단계라 쉽게 느껴지기도 하지만.. 실시간 강의 외에도 온라인 강의로 이것 저것 들어보고 있습니다.
 
패스트캠퍼스에서 제공하는 온라인 강의가 생각보다 알찬게 많아서요.
들을 수 있는게 많은 편이라 과연 수료 때까지 얼마나 많이 들을 수 있을까 싶지만.. 그래도 시간 날때 틈틈이 들어보려합니다!
 
개인적으론 데이터 모델링 실습하는 것도 익혀볼까 싶네요.
엔지니어 쪽을 고려하는 건 아니지만, 알아두면 두고두고 쓸 일이 있지 않을까 싶어요 ㅎㅎ
 
요새 날이 너무 더워서 매일 폭염주의보 문자가 날라오는데 다들 더위 조심하시길 바랍니다 :)
그럼 남은 기간도 화이팅입니다-! 

 
 
금주 실시간 강의 범위 부분 참고 차, SQL 강의 학습 당시 기록해둔 2,3주차 링크 남겨둡니다!

Comments