1. WHERE절 → 필수에 가까운 옵션
- 테이블의 전체 행 데이터에서 출력할 행을 정할 수 있는 조건식을 작성하는 절
- 행을 제한한다라는 표현을 쓰기도 함
💡 1) 리터럴 문자
- 리터럴 문자란? 쿼리구문에 포함된 일반 문자, 숫자, 날짜 값
- 문자나 날짜 리터럴은 작은 따옴표로 묶어서 작성해야함
- Null ⇒ Null
- ‘Null’ ⇒ 문자 ‘Null’
- MySQL은 작은따옴표, 큰따옴표 모두 허용하나, 다른 DBMS가 작은따옴표만 허용하는 경우가 많으니 작은따옴표로 기억하는 것을 권장함
- 문자 : MySQL은 대소문자 구분하지 않음 (DBMS에 따라 다름 ←통일된 양식X )MySQL 다른 DBMS
대문자 = 소문자 대문자 ≠ 소문자 - 날짜 : MySQL 은 년-월-일 순서로 작성해야 함(DBMS 에 따라 다름 ←통일된 양식X )
비교 연산자
- 값들을 비교하여 참/거짓의 여부로 행의 출력을 결정하는 연산자
- 데이터들 간 비교 시 기본적으로 동일한 데이터 타입 간 비교를 해야 한다.
- 데이터 타입이 다른 경우 형 변환 규칙을 활용하여 변환 후 비교를 할 수 있다. → 함수 파트
SELECT …
FROM …
WHERE 기준 연산자 조건값
- 부등식의 개념을 활용하는 연산자
- ‘=’ → 같은 값 비교
WHERE SQL 절이 포함된 구문 예제
1. 숫자 데이터 비교
mysql> SELECT employee_id, last_name, job_id, department_id
-> FROM employees
-> WHERE department_id = 90;
+-------------+-----------+---------+---------------+
| employee_id | last_name | job_id | department_id |
+-------------+-----------+---------+---------------+
| 100 | King | AD_PRES | 90 |
| 101 | Kochhar | AD_VP | 90 |
| 102 | De Haan | AD_VP | 90 |
+-------------+-----------+---------+---------------+
3 rows in set (0.00 sec)
2. 문자열 데이터 비교 (’문자열’)
mysql> SELECT last_name, job_id, department_id
-> FROM employees
-> WHERE last_name = 'Whalen';
+-----------+---------+---------------+
| last_name | job_id | department_id |
+-----------+---------+---------------+
| Whalen | AD_ASST | 10 |
+-----------+---------+---------------+
1 row in set (0.00 sec)
- 'Whalen' → 'whalen’ 대문자를 소문자로 바꿔도 결과는 똑같음
- MySQL 기준 동일한 스펠링을 가진 문자열인 경우 대소문자 상관없이 일치한 값을 인정해준다.
- DBMS에서는 대소문자를 구분하기 때문에 주의해야 한다.
3. 날짜 데이터 비교
-DATE(날짜) : 년, 월, 일
-TIME(시간) : 시, 분, 초
-DATETIME(날짜+시간) : 년, 월, 일, 시, 분, 초
💡 날짜 데이터 비교
- 날짜 데이터의 경우 날짜 양식을 갖춘 문자열도 데이터베이스에서는 날짜 데이터로 자동 변환해주기 때문에 날짜, 문자열 간 비교가 가능하다.
- 다만, 국가, 언어, 클라이언트, 설정에 따라 날짜의 양식이 다를 수 있으므로, 가능하면 함수를 통한 날짜 데이터를 사용하는 것이 좋다.
-사원의 고용일이 1996년 02월 17일인 사원을 출력
- '1996-02-17' ← 날짜 양식 문자열 → 날짜로 인식
*조건과 출력이 같아야 할 필요는 없다.
mysql> SELECT last_name
-> FROM employees
-> WHERE hire_date = '1996-02-17'; -- 날짜 양식 문자열
+-----------+
| last_name |
+-----------+
| Hartstein |
+-----------+
1 row in set (0.00 sec)
-WHERE hire_date = '1996-02-17';
⇒이 방식은 추천x (명시적 형변환) - 문법은 바뀔 수 있기 때문 → 함수 이용
-조건(날짜)은 DB가 알고 있는 양식으로 해야 함. (DB가 알고 있는 양식 : 1996-02-17)
-문자열로 적었지만 날짜로 동작 되는 이유 : DB가 알고 있는 양식을 사용했기 때문.
4. 부등식의 개념을 활용하는 연산자
부등식 | = | ≠ | > | < | ≥ | ≤ |
비교 | = | ! = | > | < | > = | < = |
뜻 | 같은 값 비교 | 같지 않은 값 비교 | 크다. 초과 | 작다. 미만 | 크거나 같다. 이상 | 작거나 같다. 이하 |
-사원 번호가 110 미만인 값을 가진 행을 출력
mysql> SELECT employee_id, last_name
-> FROM employees
-> WHERE **employee_id < 110;
+-------------+-----------+
| employee_id | last_name |
+-------------+-----------+
| 100 | King |
| 101 | Kochhar |
| 102 | De Haan |
| 103 | Hunold |
| 104 | Ernst |
| 105 | Austin |
| 106 | Pataballa |
| 107 | Lorentz |
| 108 | Greenberg |
| 109 | Faviet |
+-------------+-----------+
10 rows in set (0.00 sec)**
-월급이 15000 이상인 값을 가진 행을 출력
mysql> SELECT employee_id, salary
-> FROM employees
-> WHERE salary >= 15000;
+-------------+----------+
| employee_id | salary |
+-------------+----------+
| 100 | 24000.00 |
| 101 | 17000.00 |
| 102 | 17000.00 |
+-------------+----------+
3 rows in set (0.01 sec)
- 문자열 'Whalen' 보다 더 큰 last_name의 값을 가진 행을 출력
mysql> SELECT last_name
-> FROM employees
-> WHERE last_name >= 'Whalen';
+-----------+
| last_name |
+-----------+
| Zlotkey |
| Whalen |
+-----------+
2 rows in set (0.00 sec)
- last_name 컬럼의 값이 'B'보다 작은 값을 가진 행을 출력
- 'A'로 시작하는 문자열들은 'B'보다 작으므로 결과로 출력된다.
mysql> SELECT last_name
-> FROM employees
-> WHERE last_name < 'B';
+-----------+
| last_name |
+-----------+
| Austin |
| Atkinson |
| Ande |
| Abel |
+-----------+
4 rows in set (0.00 sec)
mysql> SELECT employee_id, last_name
-> FROM employees
-> WHERE employee_id = 100;
+-------------+-----------+
| employee_id | last_name |
+-------------+-----------+
| 100 | King |
+-------------+-----------+
1 row in set (0.00 sec)
mysql> SELECT employee_id, last_name
-> FROM employees
-> WHERE last_name != 'King';
+-------------+-------------+
| employee_id | last_name |
+-------------+-------------+
| 101 | Kochhar |
| 102 | De Haan |
| 103 | Hunold |
| 104 | Ernst |
...
105 rows in set (0.00 sec)
mysql> SELECT employee_id, hire_date
-> FROM employees
-> WHERE department_id = 60;
+-------------+------------+
| employee_id | hire_date |
+-------------+------------+
| 103 | 1990-01-03 |
| 104 | 1991-05-21 |
| ***105 | 1997-06-25*** |
| 106 | 1998-02-05 |
| 107 | 1999-02-07 |
+-------------+------------+
5 rows in set (0.00 sec)
위 코드 결과 값의 세번째 결과값을 참고하여
mysql> SELECT employee_id, hire_date
-> FROM employees
-> WHERE hire_date > '1997-06-25';
+-------------+------------+
| employee_id | hire_date |
+-------------+------------+
| 106 | 1998-02-05 |
| 107 | 1999-02-07 |
| 110 | 1997-09-28 |
| 111 | 1997-09-30 |
...
66 rows in set (0.00 sec)
-'1997-06-25' 이후 hire_date 날짜 데이터를 가진 행을 출력
-날짜데이터는 이후 날짜가 이전 날짜보다 큰 값이므로 '1997-06-25' 이후 입사자들만 출력되었음.
mysql> SELECT employee_id, hire_date
-> FROM employees
-> WHERE hire_date < '1990-01-01';
+-------------+------------+
| employee_id | hire_date |
+-------------+------------+
| 100 | 1987-06-17 |
| 101 | 1989-09-21 |
| 200 | 1987-09-17 |
+-------------+------------+
3 rows in set (0.00 sec)
5. Between A and B 비교연산자
- A, B 사이 구간에 속하는 값을 비교하여 출력해주는 연산자
- A : 구간의 최소값
- B : 구간의 최대값
- salary의 값이 2500 이상 3500이하인 값을 가진 행을 출력한다.
mysql> SELECT last_name, salary
-> FROM employees
-> WHERE salary BETWEEN 2500 AND 3500;
+-------------+---------+
| last_name | salary |
+-------------+---------+
| Khoo | 3100.00 |
| Baida | 2900.00 |
| Tobias | 2800.00 |
...
33 rows in set (0.00 sec)
mysql> SELECT last_name
-> FROM employees
-> WHERE last_name BETWEEN 'Baida' AND 'Fay';
+------------+
| last_name |
+------------+
| De Haan |
| Ernst |
| Faviet |
...
24 rows in set (0.00 sec)
last_name의 값이 'A' 이상 'C' 이하인 행들을 출력
mysql> SELECT last_name
-> FROM employees
-> WHERE last_name BETWEEN 'A' AND 'C';
+-----------+
| last_name |
+-----------+
| Austin |
| Baida |
| Bissot |
...
13 rows in set (0.00 sec)
- hire_date의 값이'1994-01-01' 이상 '1994-12-31'이하인 행을 출력
mysql> SELECT employee_id, hire_date
-> FROM employees
-> WHERE hire_date BETWEEN '1994-01-01' AND '1994-12-31';
+-------------+------------+
| employee_id | hire_date |
+-------------+------------+
| 108 | 1994-08-17 |
| 109 | 1994-08-16 |
| 114 | 1994-12-07 |
...
7 rows in set (0.00 sec)
6. IN 비교연산자 (다중행 비교연산자)
-IN 연산자는 다중행비교연산자로 여러 조건값을 비교하여 일치하는 값들을 가진 행을 출력해준다.
-조건값들은 괄호( ) 기호로 묶어서 작성하며, 조건값의 수는 제한없음
mysql> SELECT employee_id, last_name, salary, manager_id
-> FROM employees
-> WHERE manager_id IN(100, 101, 201);
+-------------+-----------+----------+------------+
| employee_id | last_name | salary | manager_id |
+-------------+-----------+----------+------------+
| 101 | Kochhar | 17000.00 | 100 |
| 102 | De Haan | 17000.00 | 100 |
| 114 | Raphaely | 11000.00 | 100 |
...
20 rows in set (0.01 sec)
mysql> SELECT last_name
-> FROM employees
-> WHERE last_name IN ('Fay', 'Higgins', 'Zlotkey', 'Baer');
+-----------+
| last_name |
+-----------+
| Zlotkey |
| Fay |
| Baer |
| Higgins |
+-----------+
4 rows in set (0.00 sec)
mysql> SELECT employee_id, hire_date
-> FROM employees
-> WHERE hire_date IN ('1993-01-13', '1991-05-21', '1987-06-17');
+-------------+------------+
| employee_id | hire_date |
+-------------+------------+
| 100 | 1987-06-17 |
| 102 | 1993-01-13 |
| 104 | 1991-05-21 |
+-------------+------------+
3 rows in set (0.00 sec)
7. LIKE 패턴 비교 연산자
패턴 문자의 패턴과 일치한 값을 가진 행을 출력
패턴 문자
- _ : 임의의 한자리의 문자
- % : 임의의 0~n 자리의 문자
-last_name의 값이 두 번째 자리가 ‘o’인 문자열을 출력
mysql> SELECT last_name
-> FROM employees
-> WHERE last_name LIKE '_o%';
+------------+
| last_name |
+------------+
| Kochhar |
| Lorentz |
| Popp |
...
12 rows in set (0.01 sec)
연습문제
- 'A'로 시작하는 last_name을 가진 행의 last_name 컬럼을 출력
mysql> SELECT last_name
-> FROM employees
-> WHERE last_name like 'A%';
+-----------+
| last_name |
+-----------+
| Austin |
| Atkinson |
| Ande |
| Abel |
+-----------+
4 rows in set (0.00 sec)
- 'n'으로 끝나는 last_name의 값을 가진 행의 last_name 출력
mysql> SELECT last_name
-> FROM employees
-> WHERE last_name LIKE '%n';
+------------+
| last_name |
+------------+
| De Haan |
| Austin |
| Chen |
...
19 rows in set (0.00 sec)
- first_name에 'er'을 포함하고 있는 행의 first_name 컬럼을 출력
mysql> SELECT first_name
-> FROM employees
-> WHERE first_name LIKE '%er%';
+-------------+
| first_name |
+-------------+
| Alexander |
| Alexander |
| Peter |
...
14 rows in set (0.00 sec)
*숫자는 between을 주로 씀. like도 쓸 수 있음
- 1993년도에 입사한 사원의 employee_id, last_name, hire_date를 출력
mysql> SELECT employee_id, last_name, hire_date
-> FROM employees
-> WHERE hire_date LIKE '1993%';
+-------------+-----------+------------+
| employee_id | last_name | hire_date |
+-------------+-----------+------------+
| 102 | De Haan | 1993-01-13 |
+-------------+-----------+------------+
1 row in set (0.00 sec)
mysql> SELECT employee_id, last_name, hire_date
-> FROM employees
-> WHERE hire_date BETWEEN '1993-01-01' AND '1993-12-31';
+-------------+-----------+------------+
| employee_id | last_name | hire_date |
+-------------+-----------+------------+
| 102 | De Haan | 1993-01-13 |
+-------------+-----------+------------+
1 row in set (0.00 sec)
- employee_id의 값이 110번대인 사원의 employee_id를 출력
mysql> SELECT employee_id
-> FROM employees
-> WHERE employee_id LIKE '11_';
+-------------+
| employee_id |
+-------------+
| 114 |
| 115 |
| 116 |
| 117 |
| 118 |
| 119 |
| 110 |
| 111 |
| 112 |
| 113 |
+-------------+
10 rows in set (0.00 sec)
-비교연산자는 데이터타입에 맞춰서 써야함
8. IS NULL 비교 연산자
-Null이면 출력, 아니면 출력x
mysql> SELECT last_name, manager_id
-> FROM employees
-> WHERE manager_id IS NULL;
+-----------+------------+
| last_name | manager_id |
+-----------+------------+
| King | NULL |
+-----------+------------+
1 row in set (0.00 sec)
*WHERE manager_id = NULL; 은 오류!
'DB > MySQL' 카테고리의 다른 글
[Mysql] ORDER BY절(정렬) (0) | 2023.09.16 |
---|---|
[Mysql] where절과 연산자(2) (0) | 2023.09.14 |
[Mysql] DISTINCT (0) | 2023.09.14 |
[Mysql] SELECT구문의 모든 것 (0) | 2023.09.14 |
[Mysql] DBMS란? (0) | 2023.09.14 |