9. where절에 여러 조건문 작성하기- AND, OR 논리연산자
-java와 달리 AND 연산자 기호 대신 ‘AND’로 입력한다.
AND
- WHERE A조건 AND B조건
- AND를 끼고 있는 두 조건에 대해서 모두 조건을 만족하는 값을 가진 행을 출력한다.
- 두 조건 중 하나라도 만족하지 않는 경우 결과로 출력되지 않는다.
- salary의 값이 10000이 넘고 job_id의 컬럼에 ‘MAN’을 포함하는 값을 가진 행을 출력
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 |
| 146 | Partners | SA_MAN | 13500.00 |
...
7 rows in set (0.01 sec)
OR
- A OR B
- A 또는 B로 두 조건 중 하나 이상에 대하여 참인 경우 결과로 출력된다.
- 급여가 10000달러가 넘거나 job_id가 'MAN'을 포함하는 조건 둘 중 하나 이상을 만족하는 경우 결과로 출력된다.
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 |
| 102 | De Haan | AD_VP | 17000.00 |
...
24 rows in set (0.00 sec)
3 이상의 조건 조합하기
- AND나 OR에 대한 조합 횟수 제한은 없다.
- 다만, AND, OR간에 AND가 우선순위가 높아 OR과 함께 조합되는 경우 AND로 묶인 조건들이 먼저 연산이 실행된다.
- AND와 OR이 조합된 조건식들에서 연산 순서의 조정이 필요한 경우 ()괄호를 활용하여 우선순위를 바꿀 수 있다.
연산자 우선순위
- ( ) > AND > OR
- 위치 상관없이 연산자 우선순위대로 계산
- employees 테이블에서 급여가 10000이상이고 그리고 job_id에 'MAN' 또는 'REP'를 포함하는 값을 가진 행의 employee_id, last_name, job_id, salary를 출력해라.
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 |
...
14 rows in set (0.00 sec)
연습문제 풀이
- employees 테이블로부터 2000년도에 입사한 모든 사원의 last_name과 hire_date를 출력하시오.
mysql> SELECT last_name, hire_date
-> FROM employees
-> WHERE hire_date LIKE '2000%';
+------------+------------+
| last_name | hire_date |
+------------+------------+
| Markle | 2000-03-08 |
| Philtanker | 2000-02-06 |
| Zlotkey | 2000-01-29 |
mysql> SELECT last_name, hire_date
-> FROM employees
-> WHERE hire_date BETWEEN '2000-01-01' AND '2000-12-31';
+------------+------------+
| last_name | hire_date |
+------------+------------+
| Markle | 2000-03-08 |
| Philtanker | 2000-02-06 |
| Zlotkey | 2000-01-29 |
mysql> SELECT last_name, hire_date
-> FROM employees
-> WHERE hire_date >= '2000-01-01' AND hire_date <= '2000-12-31';
+------------+------------+
| last_name | hire_date |
+------------+------------+
| Markle | 2000-03-08 |
| Philtanker | 2000-02-06 |
| Zlotkey | 2000-01-29 |
10. 비교연산자에 NOT(논리연산자)이 조합으로 사용된 경우
NOT 연산자
- 단독사용 불가 (WHERE과 함께 사용)
- 기존 연산자 조건에 대한 참/거짓의 결과를 반대로 만들어주는 연산자이다.
BETWEEN 1 AND 3
NOT BETWEEN 1 AND 3
→ 위 세개 코드는 NOT의 위치가 컬럼명 뒤 , 비교연산자 앞
→ 마지막 코드의 NOT 위치는 IS NOT NULL → 영문법 맞춤
- job_id 컬럼의 값이 ‘AC_ACCOUNT’, ‘AD_VP’의 값이 아닌 행을 출력
mysql> SELECT last_name, job_id, salary, commission_pct
-> FROM employees
-> WHERE job_id NOT IN ('AC_ACCOUNT', 'AD_VP');
+-------------+------------+----------+----------------+
| last_name | job_id | salary | commission_pct |
+-------------+------------+----------+----------------+
| King | AD_PRES | 24000.00 | NULL |
| Hunold | IT_PROG | 9000.00 | NULL |
| Ernst | IT_PROG | 6000.00 | NULL |
...
104 rows in set (0.00 sec)
- salary 컬럼의 값이 10000 미만, 15000 초과
mysql> SELECT last_name, job_id, salary, commission_pct
-> FROM employees
-> WHERE salary NOT BETWEEN 10000 AND 15000;
+-------------+------------+----------+----------------+
| last_name | job_id | salary | commission_pct |
+-------------+------------+----------+----------------+
| King | AD_PRES | 24000.00 | NULL |
| Kochhar | AD_VP | 17000.00 | NULL |
| De Haan | AD_VP | 17000.00 | NULL |
...
91 rows in set (0.00 sec)
- last_name 컬럼의 값에 ’A’가 포함되지 않은 행을 출력
*MySQL은 대소문자 구별x
mysql> SELECT last_name, job_id, salary, commission_pct
-> FROM employees
-> WHERE last_name NOT LIKE '%A%';
+-------------+------------+----------+----------------+
| last_name | job_id | salary | commission_pct |
+-------------+------------+----------+----------------+
| King | AD_PRES | 24000.00 | NULL |
| Hunold | IT_PROG | 9000.00 | NULL |
| Ernst | IT_PROG | 6000.00 | NULL |
...
51 rows in set (0.00 sec)
- commission_pct 컬럼의 값이 NULL값이 아닌 행을 출력
mysql> SELECT last_name, job_id, salary, commission_pct
-> FROM employees
-> WHERE commission_pct IS NOT NULL;
+------------+--------+----------+----------------+
| last_name | job_id | salary | commission_pct |
+------------+--------+----------+----------------+
| Russell | SA_MAN | 14000.00 | 0.40 |
| Partners | SA_MAN | 13500.00 | 0.30 |
| Errazuriz | SA_MAN | 12000.00 | 0.30 |
...
35 rows in set (0.00 sec)
4-1. 조건식을 괄호에 넣고 NOT연산자를 조합하게 되면 괄호안의 연산에 대해서 true /false의 값이 반대로 바뀌게 되어 기존 NOT 연산자와 동일한 기능을 할 수 있다.
mysql> SELECT last_name, job_id, salary, commission_pct
-> FROM employees
-> WHERE NOT (commission_pct IS NULL);
+------------+--------+----------+----------------+
| last_name | job_id | salary | commission_pct |
+------------+--------+----------+----------------+
| Russell | SA_MAN | 14000.00 | 0.40 |
| Partners | SA_MAN | 13500.00 | 0.30 |
| Errazuriz | SA_MAN | 12000.00 | 0.30 |
...
35 rows in set (0.00 sec)
→ 위 코드의 장점 : 복잡함 ↓ 사용 방법이 단순해짐
'DB > MySQL' 카테고리의 다른 글
[Mysql] JOIN, SELF-JOIN, table alias (0) | 2023.09.16 |
---|---|
[Mysql] ORDER BY절(정렬) (0) | 2023.09.16 |
[Mysql] ★where절(조건문)과 연산자(1) (0) | 2023.09.14 |
[Mysql] DISTINCT (0) | 2023.09.14 |
[Mysql] SELECT구문의 모든 것 (0) | 2023.09.14 |