[데이터베이스] 11-3 MySQL 연산자와 내장 함수 (2)

MySQL의 동등·비동등 비교, REGEXP, LIKE 연산자를 예제와 함께 정리합니다.

MySQLReal MySQL 8.0

11-3-2 MySQL 연산자

Equal

= 기호를 사용하여 비교를 수행합니다.

<=> 연산자는 = 연산자와 비슷하지만 NULL 값에 대한 비교까지 수행합니다.

원문 이미지 20

원문 이미지 20

Not Equal

결과를 반대로 만드는 연산자로 NOT을 사용합니다.

! 연산자를 사용할 수도 있습니다.

원문 이미지 20

원문 이미지 20

원문 이미지 20

원문 이미지 20

REGEXP

문자열 값이 어떤 패턴을 만족하는지 확인하는 연산자입니다.

RLIKE와 동일하게 수행하는 연산자입니다.

문자열을 하나하나 분리하여 조합하기 때문에 index를 사용할 수 없습니다.

원문 이미지 20

LIKE

REGEXP 연산자보다는 훨씬 단순한 문자열 패턴 비교 연산자입니다.

DBMS엣는 LIKE 연산자를 더 많이 사용합니다.

LIKE 연산자는 정규 표현식을 검사하는 것이 아닌 어떤 상수 문자열이 있는지 없는지 정도를 판단하는 연산자입니다.

LIKE에서 사용할 수 있는 와이드카드 문자는 %와 _입니다.

%0또는 1개 이상의 모든 문자에 일치
_정확히 1개의 문자에 일치

LIKE 연산자는 와일드카드 문자가 검색어의 뒤쪽에 있다면 index range scan으로 사용할 수 있습니다.

와일드카드 문자가 검색어의 앞쪽에 있다면 full scan입니다.

where name like 'lee%'index 사용 가능
where name like '%duho'index 사용 불가

100만건의 dummy data SELECT 실험입니다.

mysql> show create table users\G;
*************************** 1. row ***************************
       Table: users
Create Table: CREATE TABLE `users` (
  `name` varchar(400) DEFAULT NULL,
  `nickname` varchar(400) DEFAULT NULL,
  KEY `index_users_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

mysql> explain select * from users where name like 'leeduho%' limit 10;
+----+-------------+-------+------------+-------+------------------+------------------+---------+------+--------+----------+-----------------------+
| id | select_type | table | partitions | type  | possible_keys    | key              | key_len | ref  | rows   | filtered | Extra                 |
+----+-------------+-------+------------+-------+------------------+------------------+---------+------+--------+----------+-----------------------+
|  1 | SIMPLE      | users | NULL       | range | index_users_name | index_users_name | 403     | NULL | 498654 |   100.00 | Using index condition |
+----+-------------+-------+------------+-------+------------------+------------------+---------+------+--------+----------+-----------------------+
1 row in set, 1 warning (0.01 sec)

mysql> explain select * from users where name like '%duho%' limit 10;
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows   | filtered | Extra       |
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+
|  1 | SIMPLE      | users | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 997308 |    11.11 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+
1 row in set, 1 warning (0.00 sec)

mysql> explain select * from users where name like '%1' limit 10;
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows   | filtered | Extra       |
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+
|  1 | SIMPLE      | users | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 997308 |    11.11 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+
1 row in set, 1 warning (0.01 sec)