본문 바로가기

개발일지(일간)

22년 12월 5일 SQL?

sql 형식의 데이터베이스에 표를 와 값을 만들어 넣고, 값을 찾아오고, 값을 바꾸고, 값을 삭제하는 법을 배웠다.

그리고 예제를 풀어보았다.

예제는 다음과 같다.

 

 

1. 수강생을 관리하는 MANAGER 테이블을 만들어보세요.

  • 컬럼은 총 id, name, student_code 입니다.
  • id는 bigint 타입이며 PK입니다.
  • name은 최소 2자 이상, varchar 타입, not null 입니다.
  • student_code는 STUDENT 테이블을 참조하는 FK이며 not null 입니다.
  • FK는 CONSTRAINT 이름을 ‘manager_fk_student_code’ 로 지정해야합니다.
  • comment를 사용해서 컬럼과 테이블에 설명을 추가합니다.
CREATE TABLE IF NOT EXISTS MANAGER
(
    id bigint primary key comment 'PK',
    name varchar(100) not null comment '매니저명',
    student_code varchar(100) not null comment '수강생코드',
    CONSTRAINT manager_fk_student_code foreign key(student_code) references student(student_code)
);
COMMENT ON TABLE MANAGER IS '매니저';

 

 

 

2. ALTER, MODIFY를 이용하여 MANAGER 테이블의 id 컬럼에 AUTO_INCREMENT 기능을 부여하세요.

ALTER TABLE MANAGER ALTER COLUMN id bigint auto_increment;

ALTER COLUMN을 이용해 primary key 인 id에 1씩 자동으로 증가하여 고유번호를 부여해주는 AUTO_INCREMENT기능을 부여해 주었다.

 

 

3.INSERT를 이용하여 수강생 s1, s2, s3, s4, s5를 관리하는 managerA와 s6, s7, s8, s9를 관리하는 managerB를 추가하세요.

INSERT INTO MANAGER(name, student_code) VALUES('managerA', 's1');
INSERT INTO MANAGER(name, student_code) VALUES('managerA', 's2');
INSERT INTO MANAGER(name, student_code) VALUES('managerA', 's3');
INSERT INTO MANAGER(name, student_code) VALUES('managerA', 's4');
INSERT INTO MANAGER(name, student_code) VALUES('managerA', 's5');

INSERT INTO MANAGER(name, student_code) VALUES('managerB', 's6');
INSERT INTO MANAGER(name, student_code) VALUES('managerB', 's7');
INSERT INTO MANAGER(name, student_code) VALUES('managerB', 's8');
INSERT INTO MANAGER(name, student_code) VALUES('managerB', 's9');

앞서 추가한 AUTO_INCREMENT기능으로 id는 자동으로 부여되니 넣어야하는 값의 항목만 지정해 주고 넣어주었다.

 

 

4. JOIN을 사용하여 managerA가 관리하는 수강생들의 이름과 시험 주차 별 성적을 가져오세요.

SELECT s.name, e.exam_seq, e.score
FROM MANAGER m JOIN STUDENT S on m.student_code  = s.student_code
JOIN EXAM e on m.student_code  = e.student_code WHERE m.name = 'managerA';

순차적으로 진행한다. 우선, 가져올 값을 써야한다.  가져올 것은 student의 name, exam의 exam_seq, exam의 score이다.

다음, MANAGE 테이블과 STUDENT테이블의 외래키인 student_code를 join을 통해 대조해서 가져온다.

그렇게 해서 가져온 외래키인 student_code를  EXAM테이블에 조인을 통해 대조한다. 그다음, 그렇게 연결한 외래키중, managerA의 외래키를 고른다.

그럼 manageA가 가지고 있는 외래키의 name, exam_seq, score가 출력되게 된다.

 

 

5.STUDENT 테이블에서 s1 수강생을 삭제했을 때 EXAM에 있는 s1수강생의 시험성적과 MANAGER의 managerA가 관리하는 수강생 목록에 자동으로 삭제될 수 있도록 하세요.

ALTER TABLE EXAM DROP CONSTRAINT exam_fk_student_code;
ALTER TABLE EXAM ADD CONSTRAINT exam_fk_student_code FOREIGN KEY(student_code) REFERENCES STUDENT(student_code) ON DELETE CASCADE;
ALTER TABLE MANAGER DROP CONSTRAINT manager_fk_student_code;
ALTER TABLE MANAGER ADD CONSTRAINT manager_fk_student_code FOREIGN KEY(student_code) REFERENCES STUDENT(student_code) ON DELETE CASCADE;

DELETE FROM STUDENT WHERE student_code = 's1';

DELETE명령어만 내리면 실행되지 않는다. 연관된 데이터가 있기 때문이다. 

우선 DROP을 통해 외래키를 날려버린 후, DELETE CASCADE를 통해 삭제할 준비가 된 상태로 다시 생성해준다.

그런후에 DELETE를 하면 잘 삭제가 된다.

 

 

 

오늘 한 예제를 내가 이해한대로 정리했는데 맞는지 모르겠다.

강의 자체가 불친절해서 왜 이런 것을 썼는지에 대해서 추론해야 했다.

이전에 SQL자료 탐색을 잠깐 배웠던것 같은데 그게 이해하는데 조금 도움이 되었던것 같다.