티스토리 뷰

DB/MySQL

논리 연산자 (AND / OR / NOT)

태로미 2023. 2. 1. 13:34

 

 

 

 

 

   논리 연산자

–  조건식을 판단하여, 참(true)이면 1을 반환, 거짓(false)이면 0을 반환.

 

 

 

1.   AND 

2.   OR 

3.   NOT

 

 

 

 

 

 

 

 

 

 

▶   AND / OR 연산자

–  기존 WHERE절의 1개의 조건식에 추가로 조건식을 조합하여 결과를 출력하고 싶을 때 사용할 수 있는 문법.
–  여러 조건문 작성 가능(횟수 제한 없음)

 

 

 

 

 

 

 

1.   AND 연산자

–  WHERE + A조건 + AND + B조건
–  나열한 조건식을 모두 만족하는 값을 가진 행(row값)을 출력함.

AND
입력 출력
A조건 B조건 해당 행의 출력 여부
불만족 불만족 X
만족 불만족 X
불만족 만족 X
만족 만족 O

EX   )

mysql> SELECT employee_id, last_name, job_id, salary
    -> FROM employees
    -> WHERE salary >= 10000
    -> AND job_id LIKE '%MAN%';
+-------------+-----------+--------+----------+
| employee_id | last_name | job_id | salary   |
+-------------+-----------+--------+----------+
|         114 | Raphaely  | PU_MAN | 11000.00 |
|         145 | Russell   | SA_MAN | 14000.00 |
...
|         201 | Hartstein | MK_MAN | 13000.00 |
+-------------+-----------+--------+----------+
7 rows in set (0.00 sec)

→   salary가 10000이상, 동시에 job_id에 MAN의 문자열이 포함된 행만 출력함.

 

 

 

 

 

 

 

2.   OR 연산자

–  WHERE + A조건 + OR + B조건
–  나열한 조건식 중 하나라도 만족하는 경우 결과로 출력

OR
입력 출력
A조건 B조건 해당 행의 출력 여부
불만족 불만족 X
만족 불만족 O
불만족 만족 O
만족 만족 O

EX   )

mysql> SELECT employee_id, last_name, job_id, salary
    -> FROM employees
    -> WHERE salary >= 10000
    -> OR job_id LIKE '%MAN%';
+-------------+-----------+---------+----------+
| employee_id | last_name | job_id  | salary   |
+-------------+-----------+---------+----------+
|         100 | King      | AD_PRES | 24000.00 |
|         101 | Kochhar   | AD_VP   | 17000.00 |	// 급여가 10000이 넘음
...
|         123 | Vollman   | ST_MAN  |  6500.00 |	// ID에 MAN이 포함됨
|         124 | Mourgos   | ST_MAN  |  5800.00 |
|         145 | Russell   | SA_MAN  | 14000.00 |	// 급여 10000, ID MAN 모두 포함됨
...
|         204 | Baer      | PR_REP  | 10000.00 |
|         205 | Higgins   | AC_MGR  | 12000.00 |
+-------------+-----------+---------+----------+
24 rows in set (0.00 sec)

→   조건 중 하나만 만족해도 결과값이 출력되기 때문에 위의 AND연산자 보다 나오는 행의 수가 많음.

 

 

 

 

 

 

 

 

 

 

▶   연산자 우선순위      (  )  >  AND  >  OR 

–  AND연산자가 1순위, 그 다음이 OR연산자.
–  괄호로 묶어주면 연산 순위를 높힐 수 있음.
–  괄호 안에 괄호, 안 쪽의 괄호일수록 최우선순위.


EX   )   급여가 10000 이상이면서, job_id에 'MAN' 또는 'REP'를 포함하는 값을 가진 행 출력하기.

A1   )   오답

mysql> SELECT employee_id, last_name, job_id, salary
    -> FROM employees
    -> WHERE salary >= 10000 AND job_id LIKE '%MAN%' OR job_id LIKE '%REP%';
+-------------+------------+--------+----------+
| employee_id | last_name  | job_id | salary   |
+-------------+------------+--------+----------+
|         114 | Raphaely   | PU_MAN | 11000.00 |	// MAN인 경우, 무조건 10000이 넘음
|         145 | Russell    | SA_MAN | 14000.00 |
|         146 | Partners   | SA_MAN | 13500.00 |
|         147 | Errazuriz  | SA_MAN | 12000.00 |
|         148 | Cambrault  | SA_MAN | 11000.00 |
|         149 | Zlotkey    | SA_MAN | 10500.00 |
|         150 | Tucker     | SA_REP | 10000.00 |	// REP는 10000이 넘는 경우도 있고
|         151 | Bernstein  | SA_REP |  9500.00 |	   안 넘는 경우도 있음
...
|         203 | Mavris     | HR_REP |  6500.00 |
|         204 | Baer       | PR_REP | 10000.00 |
+-------------+------------+--------+----------+
40 rows in set (0.00 sec)

   1순위 AND [ salary >= 10000 AND job_id LIKE '%MAN%' ]
       2순위 OR  [ OR job_id LIKE '%REP%'; ]
   아래의 조건식 조합은 급여가 10000 이상이고 job_id의 값에 'MAN'을 포함하거나,
       또는 job_id의 값에 'REP'를 포함하는 행을 출력하는 형태로 동작하므로 의도한 결과가 나오지 않음.

 

 

A2   )   오답

mysql> SELECT employee_id, last_name, job_id, salary
    -> FROM employees
    -> WHERE job_id LIKE '%MAN%' OR job_id LIKE '%REP%' AND salary >= 10000;
+-------------+-----------+--------+----------+
| employee_id | last_name | job_id | salary   |
+-------------+-----------+--------+----------+
|         114 | Raphaely  | PU_MAN | 11000.00 |
|         120 | Weiss     | ST_MAN |  8000.00 |		// MAN은 10000이 안 넘는 경우 있음
...
|         169 | Bloom     | SA_REP | 10000.00 |		// REP는 무조건 10000이 넘음
|         174 | Abel      | SA_REP | 11000.00 |
|         201 | Hartstein | MK_MAN | 13000.00 |
|         204 | Baer      | PR_REP | 10000.00 |
+-------------+-----------+--------+----------+
19 rows in set (0.00 sec)

  1순위 AND [ job_id LIKE '%REP%' AND salary >= 10000 ]
      2순위 OR  [ job_id LIKE '%MAN%' OR ]
  아래의 조건식 조합은 급여가 10000 이상이고 job_id의 값에 'REP'을 포함하거나,
      또는 job_id의 값에 'MAN'를 포함하는 행을 출력하는 형태로 동작하므로 의도한 결과가 나오지 않음.

 

 

A3   )   정답

mysql> SELECT employee_id, last_name, job_id, salary
    -> FROM employees
    -> WHERE (job_id LIKE '%MAN%' OR job_id LIKE '%REP%') AND salary >= 10000;
+-------------+-----------+--------+----------+
| employee_id | last_name | job_id | salary   |
+-------------+-----------+--------+----------+
|         114 | Raphaely  | PU_MAN | 11000.00 |
|         145 | Russell   | SA_MAN | 14000.00 |
|         146 | Partners  | SA_MAN | 13500.00 |
...
|         174 | Abel      | SA_REP | 11000.00 |
|         201 | Hartstein | MK_MAN | 13000.00 |
|         204 | Baer      | PR_REP | 10000.00 |
+-------------+-----------+--------+----------+
14 rows in set (0.00 sec)

   괄호를 통하여 OR의 연산 순위를 높여 AND 보다 먼저 동작하도록 하면 의도한 결과값이 출력됨.

 

 

 

 

 

 

 

 

 

 

▶   NOT 연산자

–  조건식을 만족하는 값을 가진 행을 출력하지 않고, 만족하지 않는 값을 가진 행을 출력하는 연산자.

NOT
입력 조건식 출력
만족 출력 X
불만족 출력 O

EX1   )

mysql> SELECT employee_id, last_name, job_id, salary, commission_pct
    -> FROM employees
    -> WHERE job_id NOT IN ('AC_ACCOUNT', 'AD_VP');
+-------------+-------------+------------+----------+----------------+
| employee_id | last_name   | job_id     | salary   | commission_pct |
+-------------+-------------+------------+----------+----------------+
|         100 | King        | AD_PRES    | 24000.00 |           NULL |
|         103 | Hunold      | IT_PROG    |  9000.00 |           NULL |
...
|         175 | Hutton      | SA_REP     |  8800.00 |           0.25 |
|         176 | Taylor      | SA_REP     |  8600.00 |           0.20 |
...
|         204 | Baer        | PR_REP     | 10000.00 |           NULL |
|         205 | Higgins     | AC_MGR     | 12000.00 |           NULL |
+-------------+-------------+------------+----------+----------------+
104 rows in set (0.00 sec)

   job_id 가 'AC_ACCOUNT', 'AD_VP' 인 것 제외한 모든 job_id 출력

 

 

 

EX2   )

mysql> SELECT employee_id, last_name, job_id, salary, commission_pct
    -> FROM employees
    -> WHERE last_name NOT LIKE '%A%';
+-------------+-------------+------------+----------+----------------+
| employee_id | last_name   | job_id     | salary   | commission_pct |
+-------------+-------------+------------+----------+----------------+
|         100 | King        | AD_PRES    | 24000.00 |           NULL |
|         103 | Hunold      | IT_PROG    |  9000.00 |           NULL |
...
|         151 | Bernstein   | SA_REP     |  9500.00 |           0.25 |
|         153 | Olsen       | SA_REP     |  8000.00 |           0.20 |
...
|         205 | Higgins     | AC_MGR     | 12000.00 |           NULL |
|         206 | Gietz       | AC_ACCOUNT |  8300.00 |           NULL |
+-------------+-------------+------------+----------+----------------+
51 rows in set (0.00 sec)

   last_name 중에서 앞 뒤로 "A"라는 문자가 포함되지 않은 모든 last_name출력

 

 

 

EX3   )

mysql> SELECT employee_id, last_name, job_id, salary, commission_pct
    -> FROM employees
    -> WHERE commission_pct IS NOT NULL;
+-------------+------------+--------+----------+----------------+
| employee_id | last_name  | job_id | salary   | commission_pct |
+-------------+------------+--------+----------+----------------+
|         145 | Russell    | SA_MAN | 14000.00 |           0.40 |
|         146 | Partners   | SA_MAN | 13500.00 |           0.30 |
...
|         178 | Grant      | SA_REP |  7000.00 |           0.15 |
|         179 | Johnson    | SA_REP |  6200.00 |           0.10 |
+-------------+------------+--------+----------+----------------+
35 rows in set (0.00 sec)

   IS NOT NULL에서  IS NULL은 가운데에 NOT을 넣음. (영문법때매 저런것 같음ㅎ)

   commission_pct에서 null값이 아닌 모든 값 출력.

 

 

 

EX3–1   )

mysql> SELECT employee_id, last_name, job_id, salary, commission_pct
    -> FROM employees
    -> WHERE NOT (commission_pct IS NULL);
+-------------+------------+--------+----------+----------------+
| employee_id | last_name  | job_id | salary   | commission_pct |
+-------------+------------+--------+----------+----------------+
|         145 | Russell    | SA_MAN | 14000.00 |           0.40 |
|         146 | Partners   | SA_MAN | 13500.00 |           0.30 |
...
|         178 | Grant      | SA_REP |  7000.00 |           0.15 |
|         179 | Johnson    | SA_REP |  6200.00 |           0.10 |
+-------------+------------+--------+----------+----------------+
35 rows in set (0.00 sec)

→   WHERE commission_pct IS NOT NULL   →   WHERE NOT (commission_pct IS NULL)
       NOT 연산자의 위치를 조건식의 바깥에 두고 식을 ( )로 묶어서 사용 가능.

       비교적 좀 더 직관적으로 해석이 가능함.

 

 

 

 

 

 

 

 

 

 

▶   BETWEEN   A  AND  B 연산자의 NOT

–  BETWEEN은 구간을 의미하므로, 앞에 NOT이 붙으면 해당 구간을 제외한 전체 범위가 됨

–  이상이하의 범위였다면 미만초과의 범위로 바뀜 

–   파란색 범위   →     10000  <=  x  <=  15000  

–   빨간색 범위   →      x < 10000,   x > 15000


EX   )

mysql> SELECT employee_id, last_name, job_id, salary, commission_pct
    -> FROM employees
    -> WHERE salary NOT BETWEEN 10000 AND 15000;
+-------------+-------------+------------+----------+----------------+
| employee_id | last_name   | job_id     | salary   | commission_pct |
+-------------+-------------+------------+----------+----------------+
|         100 | King        | AD_PRES    | 24000.00 |           NULL |
|         101 | Kochhar     | AD_VP      | 17000.00 |           NULL |
|         102 | De Haan     | AD_VP      | 17000.00 |           NULL |
...
|         175 | Hutton      | SA_REP     |  8800.00 |           0.25 |
|         176 | Taylor      | SA_REP     |  8600.00 |           0.20 |
|         177 | Livingston  | SA_REP     |  8400.00 |           0.20 |
...
|         206 | Gietz       | AC_ACCOUNT |  8300.00 |           NULL |
+-------------+-------------+------------+----------+----------------+
91 rows in set (0.00 sec)

   WHERE salary NOT BETWEEN 10000 AND 15000
       NOT을 붙임으로써 "10000미만 15000초과"로 범위가 바뀜.

 

 

 

 

 

 

 

 

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함