보통의 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가 되는 것을 볼 수 있다.
'인포테인먼트 - development > sql' 카테고리의 다른 글
[MySQL] MySQL 프로파일링 - 쿼리문 성능 비교 (0) | 2020.04.10 |
---|---|
[MySQL] Can't connect to local MySQL server through socket '/tmp/mysql.sock' 에러 해결 (0) | 2020.04.08 |
[MySQL] 프로시저를 사용한 cursor loop fetch 적용(sql의 for문) (0) | 2020.04.06 |
[MySQL] ORDER BY에 여러가지 기준과 선순위/후순위가 있을 때 (0) | 2020.03.03 |
[MySQL] 여러 테이블 합쳐서 SELECT하기 - JOIN ~ ON ~ (0) | 2020.03.01 |
댓글