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

MySQL LIKE를 IN()처럼 활용하는 쿼리 작성 방법

MySQL에서 LIKE 연산자를 IN()처럼 사용하기

MySQL의 IN()과 유사한 방식으로 여러 패턴을 한 번에 확인하고 싶다면, COUNT() 함수와 IF() 함수를 LIKE 연산자와 함께 조합하여 활용할 수 있습니다. 이 방법을 사용하면 각 패턴별로 일치하는 레코드 수를 하나의 쿼리로 집계할 수 있습니다.

먼저 예제 테이블을 생성해 보겠습니다.

mysql> create table DemoTable
-> (
-> Subject varchar(80)
-> );
Query OK, 0 rows affected (0.58 sec)

샘플 데이터 삽입하기

INSERT 명령을 사용하여 테이블에 몇 개의 레코드를 추가합니다.

mysql> insert into DemoTable values('MySQLMongoDB');
Query OK, 1 row affected (0.86 sec)
mysql> insert into DemoTable values('MySQL');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values('JavaMySQL');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable values('MongoDB');
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable values('Java');
Query OK, 1 row affected (0.19 sec)

저장된 레코드 확인하기

SELECT 문으로 테이블의 모든 레코드를 조회합니다.

mysql> select *from DemoTable;

위 쿼리는 다음과 같은 결과를 출력합니다.

+--------------+
| Subject |
+--------------+
| MySQLMongoDB |
| MySQL |
| JavaMySQL |
| MongoDB |
| Java |
+--------------+
5 rows in set (0.00 sec)

LIKE를 IN()처럼 구현하는 핵심 쿼리

이제 LIKE 연산자를 IN() 방식으로 활용하는 쿼리를 살펴보겠습니다. 각 키워드(MySQL, Java, MongoDB)가 포함된 레코드의 개수를 동시에 집계합니다.

mysql> select
-> count(if(Subject like '%MySQL%',1,NULL)) as MySQLCount,
-> count(if(Subject like '%Java%',1,NULL)) as JavaCount,
-> count(if(Subject like '%MongoDB%',1,NULL)) as MongoDBCount
-> from DemoTable;

쿼리 실행 결과는 다음과 같습니다.

+------------+-----------+--------------+
| MySQLCount | JavaCount | MongoDBCount |
+------------+-----------+--------------+
| 3 | 2 | 2 |
+------------+-----------+--------------+
1 row in set (0.00 sec)

쿼리 동작 원리

위 쿼리의 작동 방식은 다음과 같습니다.

1. IF() 함수의 역할: 각 행마다 Subject 값이 지정한 LIKE 패턴과 일치하면 1을 반환하고, 일치하지 않으면 NULL을 반환합니다.

2. COUNT() 함수의 역할: COUNT()는 NULL이 아닌 값만 계산하기 때문에, 결과적으로 해당 패턴과 일치하는 행의 개수만 집계됩니다.

3. 결과 해석: 'MySQL' 문자열은 3개 행(MySQLMongoDB, MySQL, JavaMySQL)에 포함되어 있고, 'Java'는 2개 행(JavaMySQL, Java), 'MongoDB'는 2개 행(MySQLMongoDB, MongoDB)에 포함되어 있어 위와 같은 결과가 나옵니다.

이 기법은 여러 키워드의 포함 여부를 개별 쿼리로 나누어 실행하지 않고, 단 한 번의 쿼리로 모든 카운트를 얻을 수 있어 성능 면에서도 유용합니다.