본문 바로가기

IT.DT/SQL.데이터베이스

MySQL 질의어 오개념 정리

문제의 쿼리 다시 보기

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)"와 같은 오류를 반환합니다.

올바른 사용 방법

  1. 서브쿼리를 단일 열로 수정하기:
    • 두 개의 값을 하나의 열로 반환하기 위해 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)을 비교하게 됩니다.
  2. 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 절에서 두 개의 열을 비교하려고 시도하기 때문에 오류 발생.

수정된 쿼리 실행 결과:

  1. UNION 사용:
    • 서브쿼리 결과:height
      200
      150
    • 최종 결과:useridheight
      1 150
      4 200
  2. SELECT userid, height FROM usertbl WHERE height IN ( SELECT max(height) FROM usertbl UNION SELECT min(height) FROM usertbl );
  3. OR 조건 사용:
    • 결과는 동일하게:useridheight
      1 150
      4 200
  4. SELECT userid, height FROM usertbl WHERE height = (SELECT max(height) FROM usertbl) OR height = (SELECT min(height) FROM usertbl);

요약

  • IN 절은 단일 열의 여러 값을 비교할 때 사용됩니다.
  • 서브쿼리가 여러 열을 반환하면 IN 절에서 오류가 발생합니다.
  • 해결 방법으로는 서브쿼리를 단일 열로 수정하거나, OR 조건을 사용하는 방법이 있습니다.