본문 바로가기
  • 포르쉐타고싶다
인포테인먼트 - development/sql

[MySQL] Insert 할 때 특정 컬럼만 select

by 지오ㄴl 2020. 3. 31.

보통의 INSERT문은

INSERT INTO [TABLE] (COLUMN1, COLUMN2, COLUMN3) VALUES (VALUE1, VALUE2, VALUE3)

 

의 형태로 사용된다.

 

하지만 본인은 쿼리문을 작성 중,

다른 테이블에서 어떠한 조건을 가진 레코드에 대해서, 해당 인덱스에 대해서만 다른 테이블에 그에 대한 정보를 insert해야할 일이 생겼다.

그리고 INSERT해야하는 값 중에는 다른테이블의 값이 아닌 일반 상수도 포함되어야 한다.

 

예를 들어,

학생들 중 점수가 90점이 넘은 학생들만 장학생 테이블에 추가한다고 해보자

 

먼저 학생 테이블 [STUDENT]를 보면

 

STUDENT_IDX STUDENT_NAME STUDENT_SCORE
1 철수 92
2 영희 87
3 민수 95

 

그리고

점수가 90점이 넘은 학생 철수와 민수만

장학생 테이블에 추가하는 것이다.

 

만들고자 하는 장학생 테이블 [SCHOLARSHIP]을 보자

SCHOLAR_IDX SCHOLAR_NAME SCHOLAR_TYPE
33 철수 2
34 민수 2

 

장학금의 타입은 여러가지가 있고 이번 성적의 장학금 타입은 2로 정해서 들어간다고 하자

이렇게

학생테이블을 참고해서 조건에 맞는 학생을 장학생테이블에 추가하려고 하는 것이다.

 

기존의 방식을 사용하면 쿼리문을 크게 두번, 작게 수십번이나 사용해야 하는 불편함, 비효율성이 생긴다.

두번이라함은,

 

1. 

SELECT STUDENT_NAME FROM STUDENT WHERE STUDENT_SCORE>90

 

을 통해 서버로 가져온 결과물을 서버코드 안에서

const studentsToScholarship = await [데이터베이스에서 데이터를 가져오는 함수]

 

이렇게 저장한 뒤 다시 insert를 해줘야 하는데 이 때

반복문을 사용해서

 

2. (3.4.5.6....)

INSERT INTO SCHOLARSHIP (SCHOLAR_NAME, SCHOLAR_TYPE) VALUES (STUDENT_NAME1, 2)
INSERT INTO SCHOLARSHIP (SCHOLAR_NAME, SCHOLAR_TYPE) VALUES (STUDENT_NAME2, 2)
INSERT INTO SCHOLARSHIP (SCHOLAR_NAME, SCHOLAR_TYPE) VALUES (STUDENT_NAME3, 2)
INSERT INTO SCHOLARSHIP (SCHOLAR_NAME, SCHOLAR_TYPE) VALUES (STUDENT_NAME4, 2)
.
.
.

 

이렇게 쿼리를 여러번 날려줘야하는 상당한 비효율성이 생긴다.

이를 쿼리문 하나로, 즉

 

STUDENT 테이블 내에서 조건에 맞는 학생들을 한번에 다른 테이블에 추가하려면

 

INSERT 쿼리문 안에 다른 테이블에서 조건에 맞는 레코드들을 SELECT하고 그대로 insert 해주면 되는데

과연 어떻게 할까

 

INSERT INTO SCHOLARSHIP (SCHOLAR_NAME, SCHOLAR_TYPE)
SELECT STUDENT_NAME, 2 FROM STUDENT WHERE STUDENT_SCORE>90

 

를 통해 한 쿼리로 해결할 수 있는데

잘 보면

1. VALUE ( , , ,)를 사용하지 않고 바로 SELECT를 적용할 수 있고
2. INSERT 하려는 컬럼에 맞춰 SELECT의 컬럼에 상수를 넣어도 잘 insert가 되는 것을 볼 수 있다.

 

반응형

댓글