Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL 스칼라 하위 쿼리의 반환값과 사용 시 제한 사항 완벽 정리

MySQL의 스칼라 하위 쿼리(scalar subquery)는 단 하나의 행에서 정확히 하나의 열(column) 값만을 반환하는 하위 쿼리입니다. 따라서 단일 열 값이 허용되는 위치라면 어디에서든 활용할 수 있습니다. 다만 스칼라 하위 쿼리가 항상 하나의 값을 반환하는 것은 아니며, 반환되는 행의 개수에 따라 결과가 달라집니다.

케이스 1 – 결과가 0행일 때

하위 쿼리가 0개의 행을 반환하는 경우, 스칼라 하위 쿼리 표현식의 값은 NULL이 됩니다.

케이스 2 – 결과가 두 개 이상의 행일 때

하위 쿼리가 두 개 이상의 행을 반환하는 경우, 스칼라 하위 쿼리의 본질적인 특성 때문에 MySQL은 오류(error)를 발생시킵니다.

이러한 동작 방식은 아래 예제 테이블의 데이터를 통해 쉽게 이해할 수 있습니다.

mysql> Select * from Customers;
+-------------+----------+
| Customer_Id | Name     |
+-------------+----------+
| 1           | Rahul    |
| 2           | Yashpal  |
| 3           | Gaurav   |
| 4           | Virender |
+-------------+----------+
4 rows in set (0.00 sec)

mysql> Select * from Reservations;
+------+-------------+------------+
| ID   | Customer_id | Day        |
+------+-------------+------------+
| 1    | 1           | 2017-12-30 |
| 2    | 2           | 2017-12-28 |
| 3    | 2           | 2017-12-29 |
| 4    | 1           | 2017-12-25 |
| 5    | 3           | 2017-12-26 |
+------+-------------+------------+
5 rows in set (0.00 sec)

다음 쿼리는 하위 쿼리가 정확히 한 행의 한 열 값을 반환하는 정상적인 경우입니다.

mysql> Select Name from Customers WHERE customer_id = (Select Customer_id FROM reservations where id = 3);
+---------+
| Name    |
+---------+
| Yashpal |
+---------+
1 row in set (0.00 sec)

반면, 하위 쿼리가 0개의 행을 반환하면 스칼라 하위 쿼리 표현식의 값은 NULL이 됩니다. 아래 쿼리를 통해 확인할 수 있습니다.

mysql> Select Name from Customers WHERE customer_id = (Select Customer_id FROM reservations where id = 10);
Empty set (0.00 sec)

위 결과 집합에서 알 수 있듯이, id가 10인 데이터가 존재하지 않아 하위 쿼리가 NULL을 반환했기 때문에 MySQL은 빈 집합(empty set), 즉 0개의 행을 반환합니다.

MySQL 쿼리에서 스칼라 하위 쿼리 사용 시 제한 사항

스칼라 하위 쿼리를 MySQL 쿼리와 함께 사용할 때의 가장 큰 제약은, 리터럴(literal) 값만 허용되는 구문에는 스칼라 하위 쿼리를 사용할 수 없다는 점입니다. 대표적인 예로, LIMIT 절은 리터럴 정수 인수만 받아들이기 때문에 스칼라 하위 쿼리를 통해 LIMIT에 필요한 값을 공급하는 것은 불가능합니다.