MySQL에서 리스트(List) 안에 특정 값이 있는지 확인하는 방법은 여러 가지가 있어.
주로 IN(), FIND_IN_SET(), LIKE, JSON_CONTAINS() 등을 사용할 수 있어.
IN() 사용 (컬럼 값이 리스트 안에 있는지 확인)IN()은 특정 값이 여러 값 중 하나와 일치하는지 확인할 때 사용해.
SELECT * FROM employees WHERE department IN ('HR', 'IT', 'Finance');
department 값이 'HR', 'IT', 'Finance' 중 하나와 일치하면 결과 반환.FIND_IN_SET() 사용 (쉼표(,)로 구분된 문자열에서 특정 값 찾기)만약 컬럼 값이 쉼표로 구분된 리스트('1,2,3,4') 형태로 저장되어 있다면 FIND_IN_SET()을 사용하면 돼.
SELECT * FROM users WHERE FIND_IN_SET('admin', roles);
roles 컬럼 값이 'user,admin,editor' 같은 경우 admin이 포함되어 있어서 해당 행이 반환됨.📌 주의할 점:
FIND_IN_SET()은 인덱스를 사용할 수 없어서 속도가 느릴 수 있음.
데이터가 많다면 JSON 또는 정규화된 테이블 구조를 고려하는 게 좋아.
LIKE 사용 (부분 문자열 검색)리스트 값이 하나의 문자열 안에 존재하는지 확인할 때 LIKE을 사용할 수도 있어.
SELECT * FROM products WHERE tags LIKE '%electronics%';
tags 컬럼이 'laptop,electronics,gadgets' 같은 경우 electronics가 포함되어 있어 결과 반환.📌 주의:
LIKE '%값%'은 문자열 검색이지만 인덱스를 사용할 수 없어 대량 데이터에서 속도가 느릴 수 있음.JSON_CONTAINS() 사용 (JSON 배열에서 특정 값 찾기)MySQL 5.7 이상에서는 JSON 데이터 타입을 사용해서 JSON_CONTAINS()로 값을 찾을 수 있어.
SELECT * FROM orders WHERE JSON_CONTAINS(items, '3', '$');
items 컬럼이 ['1', '2', '3', '4'] 같은 JSON 배열일 때 3이 포함되어 있는 행을 반환.📌 장점:
FIND_IN_SET()보다 성능이 더 좋음.| 방법 | 사용 예 | 장점 | 단점 |
|---|---|---|---|
IN() | col IN ('a', 'b', 'c') | 빠름, 인덱스 사용 가능 | 정적인 리스트만 가능 |
FIND_IN_SET() | FIND_IN_SET('x', col) | 간단하게 쉼표(,) 구분 리스트 검색 가능 | 인덱스 사용 불가, 속도 느림 |
LIKE | col LIKE '%word%' | 간단한 문자열 검색 | 전체 문자열 검색 시 느림 |
JSON_CONTAINS() | JSON_CONTAINS(col, 'x', '$') | JSON 데이터에 적합, 성능 좋음 | MySQL 5.7 이상 필요 |
IN(),)로 구분된 문자열 안에 특정 값이 있는지 확인? → FIND_IN_SET()LIKEJSON_CONTAINS()