기존 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 |
…
+-------------+-------------+------------+----------+----------------+
| 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 |
…
+-------------+-------------+------------+----------+----------------+
| 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 |
…
+-------------+------------+--------+----------+----------------+
| 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 |