문제의 쿼리 다시 보기
SELECT userid, height FROM usertbl WHERE height IN ( SELECT max(height), min(height) FROM usertbl );
문제의 원인 이해하기
IN 절의 역할:
- IN 절은 특정 열의 값이 목록에 포함되어 있는지를 확인할 때 사용됩니다.
- 이 목록은 단일 열이어야 하며, 여러 행의 값을 가질 수 있습니다.
서브쿼리의 반환값:
- SELECT max(height), min(height) FROM usertbl 은 두 개의 열 (max(height)와 min(height))과 하나의 행을 반환합니다.
- 예를 들어, max(height)가 200이고 min(height)가 150이라면, 서브쿼리는 다음과 같은 결과를 생성합니다:max(height)min(height)
200 150
IN 절과 서브쿼리의 불일치:
- IN 절은 단일 열의 여러 값을 기대하지만, 서브쿼리는 두 개의 열을 반환하고 있습니다.
- MySQL은 IN 절 내에서 다중 열을 처리할 수 없기 때문에 오류가 발생합니다.
예시를 통한 설명
올바르지 않은 사용 예시
sql
Copy code
SELECT userid, height FROM usertbl WHERE height IN ( SELECT max(height), min(height) FROM usertbl );
- 문제점: 서브쿼리가 두 개의 열(max(height)와 min(height))을 반환하지만, IN 절은 단일 열을 기대합니다.
- 결과: MySQL은 "Operand should contain 1 column(s)"와 같은 오류를 반환합니다.
올바른 사용 방법
- 서브쿼리를 단일 열로 수정하기:
- 두 개의 값을 하나의 열로 반환하기 위해 UNION을 사용할 수 있습니다.
SELECT userid, height FROM usertbl WHERE height IN ( SELECT max(height) FROM usertbl UNION SELECT min(height) FROM usertbl );- 설명: UNION을 사용하여 max(height)와 min(height)를 두 개의 개별 행으로 결합합니다.
- 결과: IN 절은 이제 단일 열의 두 개의 값(예: 200과 150)을 비교하게 됩니다.
- OR 조건을 사용하기:
- 별도의 조건을 사용하여 최대값과 최소값을 비교할 수 있습니다.
SELECT userid, height FROM usertbl WHERE height = (SELECT max(height) FROM usertbl) OR height = (SELECT min(height) FROM usertbl);- 설명: height가 최대값이거나 최소값인 경우를 각각 독립적으로 비교합니다.
- 장점: 가독성이 높고, 서브쿼리의 결과를 명확하게 이해할 수 있습니다.
추가 예시로 더 명확하게 이해하기
가상의 데이터 예시:
useridheight
1 | 150 |
2 | 160 |
3 | 170 |
4 | 200 |
원래 쿼리의 문제점:
- 서브쿼리 결과:max(height)min(height)
200 150 - IN 절에서 두 개의 열을 비교하려고 시도하기 때문에 오류 발생.
수정된 쿼리 실행 결과:
- UNION 사용:
- 서브쿼리 결과:height
200 150 - 최종 결과:useridheight
1 150 4 200
- 서브쿼리 결과:height
-
SELECT userid, height FROM usertbl WHERE height IN ( SELECT max(height) FROM usertbl UNION SELECT min(height) FROM usertbl );
- OR 조건 사용:
- 결과는 동일하게:useridheight
1 150 4 200
- 결과는 동일하게:useridheight
-
SELECT userid, height FROM usertbl WHERE height = (SELECT max(height) FROM usertbl) OR height = (SELECT min(height) FROM usertbl);
요약
- IN 절은 단일 열의 여러 값을 비교할 때 사용됩니다.
- 서브쿼리가 여러 열을 반환하면 IN 절에서 오류가 발생합니다.
- 해결 방법으로는 서브쿼리를 단일 열로 수정하거나, OR 조건을 사용하는 방법이 있습니다.
'IT.DT > SQL.데이터베이스' 카테고리의 다른 글
데이터 모델링, 데이터 아키텍처, 자료구조 (0) | 2024.08.29 |
---|