[MySQL] Logical Operators(논리 연산자)

Bpius·2023년 11월 11일
0

MySQL

목록 보기
6/15
post-thumbnail

아래의 가상의 celeb table로 실습을 진행해보자.

mysql> desc celeb;
+-----------+-------------+------+-----+---------+----------------+
| Field     | Type        | Null | Key | Default | Extra          |
+-----------+-------------+------+-----+---------+----------------+
| ID        | int         | NO   | PRI | NULL    | auto_increment |
| NAME      | varchar(32) | NO   |     |         |                |
| BIRTHDAY  | date        | YES  |     | NULL    |                |
| AGE       | int         | YES  |     | NULL    |                |
| SEX       | char(1)     | YES  |     | NULL    |                |
| JOB_TITLE | varchar(32) | YES  |     | NULL    |                |
| AGENCY    | varchar(32) | YES  |     | NULL    |                |
+-----------+-------------+------+-----+---------+----------------+
7 rows in set (0.00 sec)

mysql> select * from celeb;
+----+-----------+------------+------+------+-------------------------+--------------------------+
| ID | NAME      | BIRTHDAY   | AGE  | SEX  | JOB_TITLE               | AGENCY                   |
+----+-----------+------------+------+------+-------------------------+--------------------------+
|  1 | 아이유    | 1993-05-16 |   29 | F    | 가수, 텔런트            | EDAM엔터테이먼트         |
|  2 | 이미주    | 1994-09-23 |   28 | F    | 가수                    | 울림엔터테이먼트         |
|  3 | 송강      | 1994-04-23 |   28 | M    | 텔런트                  | 나무엑터스               |
|  4 | 강동원    | 1981-01-18 |   41 | M    | 영화배우, 텔런트        | YG엔터테이먼트           |
|  5 | 유재석    | 1972-08-14 |   50 | M    | MC, 개그맨              | 안테나                   |
|  6 | 차승원    | 1970-06-07 |   48 | M    | 영화배우, 모델          | YG엔터테이먼트           |
|  7 | 이수현    | 1999-05-04 |   23 | F    | 가수                    | YG엔터테이먼트           |
+----+-----------+------------+------+------+-------------------------+--------------------------+
7 rows in set (0.00 sec)

Logical Operators

아래와 같이 논리 연산자로 데이터를 조회할 수 있다.
비교 연산자는 where 구문에서 사용된다.

실습을 통해 확인해보자.

AND

조건을 모두 만족하는 경우인 데이터를 조회.

ex) 나이가 29세이고 성별이 여성인 데이터 조회.

mysql> select *
    -> from celeb
    -> where age=29 and sex='F';
+----+-----------+------------+------+------+-------------------+------------------------+
| ID | NAME      | BIRTHDAY   | AGE  | SEX  | JOB_TITLE         | AGENCY                 |
+----+-----------+------------+------+------+-------------------+------------------------+
|  1 | 아이유    | 1993-05-16 |   29 | F    | 가수, 텔런트      | EDAM엔터테이먼트       |
+----+-----------+------------+------+------+-------------------+------------------------+
1 row in set (0.00 sec)

ex) 나이가 40세 보다 크고 성별이 남성인 데이터를 나이 역순으로 조회.

mysql> select *
    -> from celeb
    -> where age>40 and sex='M'
    -> order by age desc;
+----+-----------+------------+------+------+-------------------------+----------------------+
| ID | NAME      | BIRTHDAY   | AGE  | SEX  | JOB_TITLE               | AGENCY               |
+----+-----------+------------+------+------+-------------------------+----------------------+
|  5 | 유재석    | 1972-08-14 |   50 | M    | MC, 개그맨              | 안테나               |
|  6 | 차승원    | 1970-06-07 |   48 | M    | 영화배우, 모델          | YG엔터테이먼트       |
|  4 | 강동원    | 1981-01-18 |   41 | M    | 영화배우, 텔런트        | YG엔터테이먼트       |
+----+-----------+------------+------+------+-------------------------+----------------------+
3 rows in set (0.00 sec)

OR

조건들 중 하나라도 만족하는 경우의 데이터 조회

ex) 나이가 25세보다 작거나 30보다 큰 데이터를 나이순으로 조회

mysql> select *
    -> from celeb
    -> where age<25 or age>30
    -> order by age;
+----+-----------+------------+------+------+-------------------------+----------------------+
| ID | NAME      | BIRTHDAY   | AGE  | SEX  | JOB_TITLE               | AGENCY               |
+----+-----------+------------+------+------+-------------------------+----------------------+
|  7 | 이수현    | 1999-05-04 |   23 | F    | 가수                    | YG엔터테이먼트       |
|  4 | 강동원    | 1981-01-18 |   41 | M    | 영화배우, 텔런트        | YG엔터테이먼트       |
|  6 | 차승원    | 1970-06-07 |   48 | M    | 영화배우, 모델          | YG엔터테이먼트       |
|  5 | 유재석    | 1972-08-14 |   50 | M    | MC, 개그맨              | 안테나               |
+----+-----------+------------+------+------+-------------------------+----------------------+
4 rows in set (0.00 sec)

OR, AND

논리 연산자 2개 이상을 한 구문 안에서 섞어서 쓸 수 있다.

시스템은 AND, OR 연산자가 있을 때 AND 연산자부터 연산을 한다.
하지만 가독성 및 쿼리가 길어질 시 혼동할 수가 있으니 괄호'()'를 사용하자.

연산자를 사용할 때, 산술 연산할 때와 같이 괄호'()'를 사용하면 괄호 안이 먼저 연산이 된다.
'순서'를 고려하여 괄호를 잘 활용하도록 한다.

ex) 나이가 29세보다 작고 여자이거나, 나이가 30세 보다 크고 남자인 데이터를 나이와 성별 순으로 정렬하여 조회.
(29 and 여자) or (30 and 남자)인 조건을 조회하면 된다.

mysql> select *
    -> from celeb
    -> where (age<29 and sex='F') or (age>30 and sex='M')
    -> order by age, sex;
+----+-----------+------------+------+------+-------------------------+--------------------------+
| ID | NAME      | BIRTHDAY   | AGE  | SEX  | JOB_TITLE               | AGENCY                   |
+----+-----------+------------+------+------+-------------------------+--------------------------+
|  7 | 이수현    | 1999-05-04 |   23 | F    | 가수                    | YG엔터테이먼트           |
|  2 | 이미주    | 1994-09-23 |   28 | F    | 가수                    | 울림엔터테이먼트         |
|  4 | 강동원    | 1981-01-18 |   41 | M    | 영화배우, 텔런트        | YG엔터테이먼트           |
|  6 | 차승원    | 1970-06-07 |   48 | M    | 영화배우, 모델          | YG엔터테이먼트           |
|  5 | 유재석    | 1972-08-14 |   50 | M    | MC, 개그맨              | 안테나                   |
+----+-----------+------------+------+------+-------------------------+--------------------------+
5 rows in set (0.00 sec)

NOT

해당하는 조건이 '아닌'(만족하지 않는) 경우의 데이터를 조회.

ex) 성별이 여성이 '아닌' 데이터 조회.

mysql> select *
    -> from celeb
    -> where not sex='F';
+----+-----------+------------+------+------+-------------------------+----------------------+
| ID | NAME      | BIRTHDAY   | AGE  | SEX  | JOB_TITLE               | AGENCY               |
+----+-----------+------------+------+------+-------------------------+----------------------+
|  3 | 송강      | 1994-04-23 |   28 | M    | 텔런트                  | 나무엑터스           |
|  4 | 강동원    | 1981-01-18 |   41 | M    | 영화배우, 텔런트        | YG엔터테이먼트       |
|  5 | 유재석    | 1972-08-14 |   50 | M    | MC, 개그맨              | 안테나               |
|  6 | 차승원    | 1970-06-07 |   48 | M    | 영화배우, 모델          | YG엔터테이먼트       |
+----+-----------+------------+------+------+-------------------------+----------------------+
4 rows in set (0.00 sec)

BETWEEN

해당하는 조건 값이 범위 사이에 있는 경우의 데이터를 조회.
and 혹은 or을 섞어쓰면 같은 조회가 가능하지만, 좀더 간편하게 쓸 수 있다는 장점이 있다.

ex) 생년월일이 1980년에서 1995년 사이가 아닌 데이터 조회.

# 1
mysql> select *
    -> from celeb
    -> where birthday not between 19800101 and 19951231;
+----+-----------+------------+------+------+----------------------+----------------------+
| ID | NAME      | BIRTHDAY   | AGE  | SEX  | JOB_TITLE            | AGENCY               |
+----+-----------+------------+------+------+----------------------+----------------------+
|  5 | 유재석    | 1972-08-14 |   50 | M    | MC, 개그맨           | 안테나               |
|  6 | 차승원    | 1970-06-07 |   48 | M    | 영화배우, 모델       | YG엔터테이먼트       |
|  7 | 이수현    | 1999-05-04 |   23 | F    | 가수                 | YG엔터테이먼트       |
+----+-----------+------------+------+------+----------------------+----------------------+
3 rows in set (0.00 sec)

# 2
mysql> select *
    -> from celeb
    -> where birthday<19800101 or birthday>19951231;
+----+-----------+------------+------+------+----------------------+----------------------+
| ID | NAME      | BIRTHDAY   | AGE  | SEX  | JOB_TITLE            | AGENCY               |
+----+-----------+------------+------+------+----------------------+----------------------+
|  5 | 유재석    | 1972-08-14 |   50 | M    | MC, 개그맨           | 안테나               |
|  6 | 차승원    | 1970-06-07 |   48 | M    | 영화배우, 모델       | YG엔터테이먼트       |
|  7 | 이수현    | 1999-05-04 |   23 | F    | 가수                 | YG엔터테이먼트       |
+----+-----------+------------+------+------+----------------------+----------------------+
3 rows in set (0.00 sec)

IN

해당 조건이 목록 안에 존재하는 경우의 데이터를 조회
or 연산자를 사용하면 같은 조회가 가능하지만, 좀 더 간편하게 쓸 수 있다는 장점이 있다.

ex) 나이가 28세, 28세 중 하나인 데이터 조회

# 1
mysql> select *
    -> from celeb
    -> where age in (28, 48);
+----+-----------+------------+------+------+----------------------+--------------------------+
| ID | NAME      | BIRTHDAY   | AGE  | SEX  | JOB_TITLE            | AGENCY                   |
+----+-----------+------------+------+------+----------------------+--------------------------+
|  2 | 이미주    | 1994-09-23 |   28 | F    | 가수                 | 울림엔터테이먼트         |
|  3 | 송강      | 1994-04-23 |   28 | M    | 텔런트               | 나무엑터스               |
|  6 | 차승원    | 1970-06-07 |   48 | M    | 영화배우, 모델       | YG엔터테이먼트           |
+----+-----------+------------+------+------+----------------------+--------------------------+
3 rows in set (0.00 sec)

# 2
mysql> select *
    -> from celeb
    -> where age=28 or age=48;
+----+-----------+------------+------+------+----------------------+--------------------------+
| ID | NAME      | BIRTHDAY   | AGE  | SEX  | JOB_TITLE            | AGENCY                   |
+----+-----------+------------+------+------+----------------------+--------------------------+
|  2 | 이미주    | 1994-09-23 |   28 | F    | 가수                 | 울림엔터테이먼트         |
|  3 | 송강      | 1994-04-23 |   28 | M    | 텔런트               | 나무엑터스               |
|  6 | 차승원    | 1970-06-07 |   48 | M    | 영화배우, 모델       | YG엔터테이먼트           |
+----+-----------+------------+------+------+----------------------+--------------------------+
3 rows in set (0.00 sec)

LIKE

해당 조건이 '패턴'에 맞는 데이터 조회

패턴값

  • % : 0개 이상의 문자열 패턴
  • _(언더바) : 하나의 문자 패턴(2글자면 __(언더바 2개))

ex) 두번째 글자가 'G'로 시작하는 소속사 이름을 가진 데이터 조회.

mysql> select *
    -> from celeb
    -> where agency like '_G%';
+----+-----------+------------+------+------+-------------------------+----------------------+
| ID | NAME      | BIRTHDAY   | AGE  | SEX  | JOB_TITLE               | AGENCY               |
+----+-----------+------------+------+------+-------------------------+----------------------+
|  4 | 강동원    | 1981-01-18 |   41 | M    | 영화배우, 텔런트        | YG엔터테이먼트       |
|  6 | 차승원    | 1970-06-07 |   48 | M    | 영화배우, 모델          | YG엔터테이먼트       |
|  7 | 이수현    | 1999-05-04 |   23 | F    | 가수                    | YG엔터테이먼트       |
+----+-----------+------------+------+------+-------------------------+----------------------+
3 rows in set (0.00 sec)

ex) 직업을 2개 가지는 데이터 조회

mysql> select *
   -> from celeb
   -> where job_title like '%, %';
+----+-----------+------------+------+------+-------------------------+------------------------+
| ID | NAME      | BIRTHDAY   | AGE  | SEX  | JOB_TITLE               | AGENCY                 |
+----+-----------+------------+------+------+-------------------------+------------------------+
|  1 | 아이유    | 1993-05-16 |   29 | F    | 가수, 텔런트            | EDAM엔터테이먼트       |
|  4 | 강동원    | 1981-01-18 |   41 | M    | 영화배우, 텔런트        | YG엔터테이먼트         |
|  5 | 유재석    | 1972-08-14 |   50 | M    | MC, 개그맨              | 안테나                 |
|  6 | 차승원    | 1970-06-07 |   48 | M    | 영화배우, 모델          | YG엔터테이먼트         |
+----+-----------+------------+------+------+-------------------------+------------------------+
4 rows in set (0.00 sec)
profile
데이터 굽는 타자기

0개의 댓글