오늘은 CRUD를 할 때 많이 써먹는 sql의 insert 문에 대해서 간단하게 알아보겠습니다. 보통, 저는 테이블에 레코드를 추가하는 것을 아래와 같이 작성합니다.

 

 이제 예제를 보도록 하겠습니다.

 

 


 저는 DBeaver에 mysql을 연동해서 실습을 해 보도록 하겠습니다. 먼저, 테이블 t의 정보를 보겠습니다.

 

 

 a라는 컬럼과 b라는 컬럼이 있습니다. 그리고, 저는 이 둘에 아무런 제약 조건을 걸어놓지 않았습니다. 이제 테이블 t(a,b)에 ('A','A')와 ('A',('B')를 추가하도록 하겠습니다.

 

 

 그러면 위와 같이 작성하시면 됩니다. insert into t(a,b) values ('A','A'), ('A','B'); 이것은 a가 'A'이고 b가 'A'인 레코드와, a가 'A'이고, b가 'B'인 레코드를 테이블 t에 추가하는 쿼리입니다.

 

 

 그러면 updated Rows가 2라고 찍히는 것을 알 수 있는데요. 테이블의 내용을 확인해 보겠습니다.

 

 

 그러면, ('A', 'A')와 ('A', 'B')가 추가되었음을 알 수 있습니다. mybatis에서는 for each 등으로 쿼리를 생성하기도 하니, 패턴 정도는익혀두시는 게 좋겠습니다. 이제 심화 내용으로 들어가 보겠습니다.

 


 

 먼저, 3번째 줄부터 4번째 줄까지의 쿼리는 결과 ('A', 'C'), ('A', 'D'), 이렇게 레코드 2개를 리턴합니다. 이 둘을 넣겠다는 의미입니다.

 

 

 실제로 이 쿼리문을 수행하면 update rows가 2가 뜹니다.

 

 

 확인해 보면, ('A', 'C')와 ('A', 'D')가 추가되었음을 알 수 있습니다. 여기서 질문. 만약에, ('A', 'B')와 ('A', 'B') 2개를 추가하려면 어떻게 해야할까요? 단순하게 서브 쿼리에서 union을 써 버리면, pair의 값 자체가 같기 때문에 하나의 row밖에 추가되지 않습니다. 그러면 어떻게 해야 할까요? union all을 쓰시면 됩니다. 이것은 결과 값에서 중복을 유지하기 때문입니다.

 


 

 이제, where절까지 고려해 보겠습니다. where 절은 조건절이라고 합니다. 그래서 그 절이 참일 때 결과 값에서 나타나고, 그렇지 않으면 결과 값에 나타나지 않습니다. 예를 들자면, select * from t where a = 1 쿼리를 생각해 봅시다. 필드 a의 값이 1이고, b의 값이 3인 것은 어떤가요? 이것은 a가 1이기 때문에, where 절의 조건이 참이 됩니다. 따라서, (1, 3)은 결과에 나타납니다.

 

 그렇지만, 필드 a의 값이 3이고, b의 값이 1인 것은 나타나지 않습니다. 이는 a = 1 이라는 조건에 맞지 않기 때문입니다. 보통 where 절에 1을 쓰면, 참을 리턴합니다만

 

 

 이것 보다는 1 = 1을 넣는 게 더 좋은 듯 싶습니다. 1 = 1은 1과 1이 같느냐를 물어보는 질문인데요. 당연하게도 참입니다. 그렇기 때문에, where 1 = 1 이렇게 걸어버리면, where 절의 조건이 참이 됩니다. 하여튼, 저 경우에는, where 1이 참이기 때문에, ('A', 'B')라는 것이 결과값으로 나타나게 됩니다.

 

 그 다음에는 별 게 없습니다. 서브 쿼리 바깥에 있는 문장이 insert 문이기 때문에, 테이블 t에 추가됩니다.

 

 

 결과는 위와 같습니다. 반대로, where 0은 어떨까요?

 

 

 where에 걸린 조건이 거짓입니다. 그러므로, update Rows는 0이 됩니다. 사실 이것보다는, where 0 = 1과 같은 것이 더 좋아보이긴 합니다.