MySQL에서 LOCATE() 함수를 WHERE 절과 함께 사용하면 특정 문자열이 포함된 행만 손쉽게 필터링할 수 있습니다. 이때 첫 번째 인수로 찾고자 하는 부분 문자열을, 두 번째 인수로 테이블의 컬럼 이름을 지정하고, 비교 연산자를 사용해 조건을 작성합니다.
LOCATE() 함수와 WHERE 절의 기본 구조
기본적인 문법은 다음과 같습니다.
SELECT 컬럼명, LOCATE('찾을문자열', 컬럼명) FROM 테이블명 WHERE LOCATE('찾을문자열', 컬럼명) 비교연산자 값;LOCATE() 함수는 부분 문자열이 발견된 위치(인덱스)를 반환하며, 문자열이 존재하지 않으면 0을 반환합니다. 따라서 WHERE 절에서 이 반환값을 비교 연산자와 함께 사용하면 원하는 조건의 데이터만 조회할 수 있습니다.
예제: Student 테이블 활용하기
'Student' 테이블에 다음과 같은 데이터가 저장되어 있다고 가정해 보겠습니다.
mysql> Select * from Student; +------+---------+---------+-----------+ | Id | Name | Address | Subject | +------+---------+---------+-----------+ | 1 | Gaurav | Delhi | Computers | | 2 | Aarav | Mumbai | History | | 15 | Harshit | Delhi | Commerce | | 20 | Gaurav | Jaipur | Computers | | 21 | Yashraj | NULL | Math | +------+---------+---------+-----------+ 5 rows in set (0.02 sec)
1. 특정 문자열이 포함된 행 조회하기
이름에 'av'가 포함된 학생만 조회하려면 WHERE 절에서 LOCATE()의 반환값이 0보다 큰 경우를 조건으로 지정합니다.
mysql> Select Name, LOCATE('av',name) As Result from student where LOCATE('av',Name) > 0;
+--------+--------+
| Name | Result |
+--------+--------+
| Gaurav | 5 |
| Aarav | 4 |
| Gaurav | 5 |
+--------+--------+
3 rows in set (0.00 sec)결과를 보면 'Gaurav'와 'Aarav'처럼 이름에 'av'가 포함된 학생만 조회되었으며, Result 컬럼에는 해당 문자열이 시작되는 위치가 출력됩니다. 예를 들어 'Gaurav'의 경우 다섯 번째 위치에서 'av'가 시작됩니다.
2. 특정 문자열이 포함되지 않은 행 조회하기
반대로 이름에 'av'가 포함되어 있지 않은 학생을 조회하려면 LOCATE()의 반환값이 0인 경우를 조건으로 지정합니다.
mysql> select name, LOCATE('av',name) As Result from student where LOCATE('av',Name)=0 ;
+---------+--------+
| name | Result |
+---------+--------+
| Harshit | 0 |
| Yashraj | 0 |
+---------+--------+
2 rows in set (0.00 sec)'Harshit'과 'Yashraj'는 이름에 'av'가 없으므로 LOCATE()가 0을 반환하며, 이 두 행만 결과로 출력됩니다.
정리
LOCATE() 함수를 WHERE 절과 함께 사용하면 LIKE 연산자와 유사하게 문자열 검색 조건을 만들 수 있지만, 문자열의 정확한 위치까지 확인할 수 있다는 장점이 있습니다. 반환값이 0보다 크면 문자열이 존재하는 것이고, 0이면 존재하지 않는 것입니다. 이를 응용하면 대소문자 구분 검색, 위치 기반 필터링 등 다양한 조건 처리가 가능합니다.