MySQL에서는 하나의 함수를 다른 함수의 인수(argument)로 전달하는 방식으로 여러 함수를 결합할 수 있습니다. 이러한 기법을 함수의 중첩(Nesting)이라고 부르며, SQL 문장을 더 간결하고 효율적으로 작성하는 데 유용하게 활용됩니다.
함수 중첩의 기본 원리
중첩된 함수는 안쪽에 위치한 함수부터 먼저 실행되며, 그 결과값이 바깥쪽 함수의 입력값으로 전달됩니다. 즉, 내부 함수의 반환 값이 외부 함수의 인수가 되는 구조입니다.
아래 예제를 통해 함수 중첩이 실제로 어떻게 동작하는지 확인해 보겠습니다.
mysql> Select UPPER(CONCAT('www.','tutorialspoint','.com')) As Tutorials;
+------------------------+
| Tutorials |
+------------------------+
| WWW.TUTORIALSPOINT.COM |
+------------------------+
1 row in set (0.00 sec)
mysql> Select LOWER(CONCAT('WWW.','TUTORIALSPOINT','.COM')) As Tutorials;
+------------------------+
| Tutorials |
+------------------------+
| www.tutorialspoint.com |
+------------------------+
1 row in set (0.00 sec)예제 분석
위의 두 쿼리는 문자열을 연결하는 CONCAT() 함수를 UPPER() 또는 LOWER() 함수와 결합한 사례입니다.
- 첫 번째 쿼리:
CONCAT()으로 연결된 문자열 'www.tutorialspoint.com'이UPPER()함수에 전달되어 모두 대문자로 변환됩니다. - 두 번째 쿼리: 반대로 대문자로 구성된 문자열이
LOWER()함수에 전달되어 모두 소문자로 변환됩니다.
세 개 이상의 함수 결합
함수 중첩은 두 개에 국한되지 않습니다. 필요에 따라 세 개 이상의 함수도 계층적으로 조합할 수 있습니다. 예를 들어 아래와 같이 활용할 수 있습니다.
mysql> Select UPPER(SUBSTRING(CONCAT('www.','tutorialspoint','.com'), 5)) As Domain;
+------------------+
| Domain |
+------------------+
| TUTORIALSPOINT.COM |
+------------------+
1 row in set (0.00 sec)이처럼 함수를 중첩하면 별도의 임시 테이블이나 복잡한 절차 없이 한 번의 쿼리로 원하는 결과를 얻을 수 있어 코드의 가독성과 처리 효율이 모두 향상됩니다.