AND / OR / NOT 연산자

정하윤·2023년 2월 1일
0
  • 기존 WHERE절에 1개의 조건식에 추가로 조건식을 조합하여 결과를 출력하고 싶을 때 사용할 수 있는 문법

  • WHERE A조건 AND|OR B조건

AND

  • 나열한 조건식을 모두 만족하는 값을 가진 행을 출력

  • 급여가 10000 이상 그리고 job_id에 'MAN'의 문자열이 포함하는 조건을 둘 다 동시에 만족하는 값을 가진 행을 출력

  • mysql>SELECTemployee_id, last_name, job_id, salary
    ->FROMemployees
    ->WHEREsalary >= 10000ANDjob_idLIKE'%MAN%';

    +-------------+-----------+--------+----------+

| 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 |

| 147 | Errazuriz | SA_MAN | 12000.00 |

| 148 | Cambrault | SA_MAN | 11000.00 |

| 149 | Zlotkey | SA_MAN | 10500.00 |

| 201 | Hartstein | MK_MAN | 13000.00 |

+-------------+-----------+--------+----------+

7 rows in set (0.00 sec)

OR

  • 나열한 조건식 중 하나라도 만족하는 경우 결과로 출력

  • 급여가 10000 이상이거나 또는 job_id의 값에 'MAN' 문자열이 포함된 값을 가진 행을 출력

  • mysql>SELECTemployee_id, last_name, job_id, salary
    ->FROMemployees
    ->WHEREsalary >= 10000ORjob_idLIKE'%MAN%';

+-------------+-----------+---------+----------+

| employee_id | last_name | job_id | salary |

+-------------+-----------+---------+----------+

| 100 | King | AD_PRES | 24000.00 |

| 101 | Kochhar | AD_VP | 17000.00 |

| 102 | De Haan | AD_VP | 17000.00 |

| 108 | Greenberg | FI_MGR | 12000.00 |

| 114 | Raphaely | PU_MAN | 11000.00 |

| 120 | Weiss | ST_MAN | 8000.00 |

| 121 | Fripp | ST_MAN | 8200.00 |

| 122 | Kaufling | ST_MAN | 7900.00 |

| 123 | Vollman | ST_MAN | 6500.00 |

| 124 | Mourgos | ST_MAN | 5800.00 |

| 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 |

| 156 | King | SA_REP | 10000.00 |

| 162 | Vishney | SA_REP | 10500.00 |

| 168 | Ozer | SA_REP | 11500.00 |

| 169 | Bloom | SA_REP | 10000.00 |

| 174 | Abel | SA_REP | 11000.00 |

| 201 | Hartstein | MK_MAN | 13000.00 |

| 204 | Baer | PR_REP | 10000.00 |

| 205 | Higgins | AC_MGR | 12000.00 |

+-------------+-----------+---------+----------+

24 rows in set (0.00 sec)

  • 급여가 10000 이상이면서 그리고 job_id에 'MAN' 또는 'REP'를 포함하는 값을 가진 행을 출력

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

  • 아래의 조건식 조합은
    급여가 10000 이상이고 job_id의 값에 'MAN'을 포함하거나 또는 job_id의 값에 'REP'를 포함하는 행을 출력하는 형태로 동작하므로 의도한 결과가 나오지 않는다.

  • mysql>SELECTemployee_id, last_name, job_id, salary
    ->FROMemployees
    ->WHEREsalary >= 10000ANDjob_idLIKE'%MAN%'ORjob_idLIKE'%REP%';

+-------------+------------+--------+----------+

| 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 |

| 147 | Errazuriz | SA_MAN | 12000.00 |

| 148 | Cambrault | SA_MAN | 11000.00 |

| 149 | Zlotkey | SA_MAN | 10500.00 |

| 150 | Tucker | SA_REP | 10000.00 |

| 151 | Bernstein | SA_REP | 9500.00 |

| 152 | Hall | SA_REP | 9000.00 |

| 153 | Olsen | SA_REP | 8000.00 |

| 154 | Cambrault | SA_REP | 7500.00 |

| 155 | Tuvault | SA_REP | 7000.00 |

| 156 | King | SA_REP | 10000.00 |

| 157 | Sully | SA_REP | 9500.00 |

| 158 | McEwen | SA_REP | 9000.00 |

| 159 | Smith | SA_REP | 8000.00 |

| 160 | Doran | SA_REP | 7500.00 |

| 161 | Sewall | SA_REP | 7000.00 |

| 162 | Vishney | SA_REP | 10500.00 |

| 163 | Greene | SA_REP | 9500.00 |

| 164 | Marvins | SA_REP | 7200.00 |

| 165 | Lee | SA_REP | 6800.00 |

| 166 | Ande | SA_REP | 6400.00 |

| 167 | Banda | SA_REP | 6200.00 |

| 168 | Ozer | SA_REP | 11500.00 |

| 169 | Bloom | SA_REP | 10000.00 |

| 170 | Fox | SA_REP | 9600.00 |

| 171 | Smith | SA_REP | 7400.00 |

| 172 | Bates | SA_REP | 7300.00 |

| 173 | Kumar | SA_REP | 6100.00 |

| 174 | Abel | SA_REP | 11000.00 |

| 175 | Hutton | SA_REP | 8800.00 |

| 176 | Taylor | SA_REP | 8600.00 |

| 177 | Livingston | SA_REP | 8400.00 |

| 178 | Grant | SA_REP | 7000.00 |

| 179 | Johnson | SA_REP | 6200.00 |

| 201 | Hartstein | MK_MAN | 13000.00 |

| 202 | Fay | MK_REP | 6000.00 |

| 203 | Mavris | HR_REP | 6500.00 |

| 204 | Baer | PR_REP | 10000.00 |

+-------------+------------+--------+----------+

40 rows in set (0.00 sec)

  • 아래의 조건식 조합은
    급여가 10000 이상이고 job_id의 값에 'REP'을 포함하거나 또는 job_id의 값에 'MAN'를 포함하는 행을 출력하는 형태로 동작하므로 의도한 결과가 나오지 않는다.

  • mysql>SELECTemployee_id, last_name, job_id, salary
    ->FROMemployees
    ->WHEREjob_idLIKE'%MAN%'ORjob_idLIKE'%REP%'ANDsalary >= 10000;

+-------------+-----------+--------+----------+

| employee_id | last_name | job_id | salary |

+-------------+-----------+--------+----------+

| 114 | Raphaely | PU_MAN | 11000.00 |

| 120 | Weiss | ST_MAN | 8000.00 |

| 121 | Fripp | ST_MAN | 8200.00 |

| 122 | Kaufling | ST_MAN | 7900.00 |

| 123 | Vollman | ST_MAN | 6500.00 |

| 124 | Mourgos | ST_MAN | 5800.00 |

| 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 |

| 156 | King | SA_REP | 10000.00 |

| 162 | Vishney | SA_REP | 10500.00 |

| 168 | Ozer | SA_REP | 11500.00 |

| 169 | Bloom | SA_REP | 10000.00 |

| 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)

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

  • mysql>SELECTemployee_id, last_name, job_id, salary
    ->FROMemployees
    ->WHERE(job_idLIKE'%MAN%'ORjob_idLIKE'%REP%')ANDsalary >= 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 |

| 147 | Errazuriz | SA_MAN | 12000.00 |

| 148 | Cambrault | SA_MAN | 11000.00 |

| 149 | Zlotkey | SA_MAN | 10500.00 |

| 150 | Tucker | SA_REP | 10000.00 |

| 156 | King | SA_REP | 10000.00 |

| 162 | Vishney | SA_REP | 10500.00 |

| 168 | Ozer | SA_REP | 11500.00 |

| 169 | Bloom | SA_REP | 10000.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)

NOT 연산자

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

  • NOT BETWEEN 10000 AND 15000은
    10000미만 15000초과에 해당하는 조건으로 동작하게 된다.
    mysql>SELECTemployee_id, last_name, job_id, salary, commission_pct
    ->FROMemployees
    ->WHEREjob_idNOTIN('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 |

| 104 | Ernst | IT_PROG | 6000.00 | NULL |

  • mysql>SELECTemployee_id, last_name, job_id, salary, commission_pct
    ->FROMemployees
    ->WHEREsalaryNOTBETWEEN10000AND15000;

+-------------+-------------+------------+----------+----------------+

| 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 |

| 103 | Hunold | IT_PROG | 9000.00 | NULL |

| 104 | Ernst | IT_PROG | 6000.00 | NULL |

  • mysql>SELECTemployee_id, last_name, job_id, salary, commission_pct
    ->FROMemployees
    ->WHERElast_nameNOTLIKE'%A%';

+-------------+-------------+------------+----------+----------------+

| employee_id | last_name | job_id | salary | commission_pct |

+-------------+-------------+------------+----------+----------------+

| 100 | King | AD_PRES | 24000.00 | NULL |

| 103 | Hunold | IT_PROG | 9000.00 | NULL |

| 104 | Ernst | IT_PROG | 6000.00 | NULL |

  • mysql>SELECTemployee_id, last_name, job_id, salary, commission_pct
    ->FROMemployees
    ->WHEREcommission_pctISNOTNULL;

+-------------+------------+--------+----------+----------------+

| 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 |

  • NOT 연산자의 위치를 조건식의 바깥에 두고 식을 ()로 묶어서 사용하는게 가능하다.

  • mysql>SELECTemployee_id, last_name, job_id, salary, commission_pct
    ->FROMemployees
    ->WHERENOT(commission_pctISNULL);

+-------------+------------+--------+----------+----------------+

| 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 |

| 147 | Errazuriz | SA_MAN | 12000.00 | 0.30 |

0개의 댓글