티스토리 뷰
▶▶ 논리 연산자
– 조건식을 판단하여, 참(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초과"로 범위가 바뀜.
'DB > MySQL' 카테고리의 다른 글
JOIN (Self-Join / 비표준 join) (0) | 2023.02.02 |
---|---|
ORDER BY절 (0) | 2023.02.01 |
비교 연산자(between A and B / IN / LIKE / IS NULL) (0) | 2023.02.01 |
WHERE(조건문)절 / 비교 연산자(관계) (0) | 2023.02.01 |
중복된 값을 제거하는 DISTINCT 키워드 (0) | 2023.02.01 |
- Total
- Today
- Yesterday
- model2
- Dao
- 숫자형
- null
- 문자형
- 내장객체
- 매개변수
- 논리형
- 로컬저장소
- gitbash
- 출력문
- 데이터타입
- mysql
- 다형성
- 인자
- 업캐스팅
- 오버라이딩
- Java
- javascript
- Git
- JSTL
- Object
- 제어문
- github
- 원격저장소
- 주석문
- jsp
- Method
- 단일행함수
- DB
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |