공부/TIL

[SQL 첫걸음] 2장 06강 검색 조건 지정하기

Ail_ 2023. 11. 13. 09:07

06. 검색 조건 지정하기

학습 내용
조건을 지정하여 데이터를 검색하는 방법
행을 WHERE 구, 열을 SELECT 구로 선택하여 검색하는 방법

 

1. SELECT 구에서 열 지정하기

열 여러개 지정 가능 : SELECT 열1, 열2... FROM 테이블명

열이 정의된 순서와 동일한 순서로 지정할 필요 없음

중복으로 열을 지정해도 상관 없음

mysql> SELECT * FROM sample21;
+------+--------+------------+-------------------+
| no   | name   | birthday   | address           |
+------+--------+------------+-------------------+
|    1 | 박준용 | 1976-10-18 | 대구광역시 수성구 |
|    2 | 김재진 | NULL       | 대구광역시 동구   |
|    3 | 홍길동 | NULL       | 서울특별시 마포구 |
+------+--------+------------+-------------------+
3 rows in set (0.01 sec)

mysql> SELECT no, name FROM sample21;
+------+--------+
| no   | name   |
+------+--------+
|    1 | 박준용 |
|    2 | 김재진 |
|    3 | 홍길동 |
+------+--------+
3 rows in set (0.00 sec)

mysql> SELECT address, name FROM sample21;
+-------------------+--------+
| address           | name   |
+-------------------+--------+
| 대구광역시 수성구 | 박준용 |
| 대구광역시 동구   | 김재진 |
| 서울특별시 마포구 | 홍길동 |
+-------------------+--------+
3 rows in set (0.00 sec)

mysql> SELECT address, name, no, no FROM sample21;
+-------------------+--------+------+------+
| address           | name   | no   | no   |
+-------------------+--------+------+------+
| 대구광역시 수성구 | 박준용 |    1 |    1 |
| 대구광역시 동구   | 김재진 |    2 |    2 |
| 서울특별시 마포구 | 홍길동 |    3 |    3 |
+-------------------+--------+------+------+
3 rows in set (0.00 sec)

 

2. WHERE 구에서 행 지정하기

보통 행은 열에 비해 훨씬 많음

WHERE 구는 FROM 구의 뒤에 표기 : SELECT 열 FROM 테이블명 WHERE 조건식

 

구의 순서와 생략

- SQL에는 구의 순서가 정해져 있어 바꿔적을 수 없음

- WHERE 구처럼 생략 가능한 구 존재(생략 시 테이블 내의 모든 행이 검색 대상)

 

WHERE 구

- 조건식 : 열, 연산자, 상수로 구성되는 식

- WHERE 구로 행만 추출할 수도 있고, 동시에 열 지정도 가능

mysql> SELECT * FROM sample21 WHERE no = 2;
+------+--------+----------+-----------------+
| no   | name   | birthday | address         |
+------+--------+----------+-----------------+
|    2 | 김재진 | NULL     | 대구광역시 동구 |
+------+--------+----------+-----------------+
1 row in set (0.00 sec)

mysql> SELECT no, name FROM sample21 WHERE no = 2;
+------+--------+
| no   | name   |
+------+--------+
|    2 | 김재진 |
+------+--------+
1 row in set (0.00 sec)

 

조건식

- 조건식 'no = 2'는 no 열 값이 2일 경우에 참이 되는 조건

- 'no = 2' = 'no' + '=' + '2'

- 'no' : 열 이름

- '=' : 어떤 계산을 할지 지정하는 연산자, =의 경우, 좌우로 2개 항목이 필요한 이항 연산자에 해당, 동시에 결괏값이 참/거짓인지 반환하므로 비교 연산자에 해당

- '2' : 상수

 

값이 서로 다른 경우 '<>'

- 서로 다른 값인지를 비교하는 연산자 (<=> '=' : 서로 같은 값인지를 비교하는 연산자)

mysql> SELECT * FROM sample21;
+------+--------+------------+-------------------+
| no   | name   | birthday   | address           |
+------+--------+------------+-------------------+
|    1 | 박준용 | 1976-10-18 | 대구광역시 수성구 |
|    2 | 김재진 | NULL       | 대구광역시 동구   |
|    3 | 홍길동 | NULL       | 서울특별시 마포구 |
+------+--------+------------+-------------------+
3 rows in set (0.00 sec)

mysql> SELECT * FROM sample21 WHERE no <> 2;
+------+--------+------------+-------------------+
| no   | name   | birthday   | address           |
+------+--------+------------+-------------------+
|    1 | 박준용 | 1976-10-18 | 대구광역시 수성구 |
|    3 | 홍길동 | NULL       | 서울특별시 마포구 |
+------+--------+------------+-------------------+
2 rows in set (0.00 sec)

 

3. 문자열형의 상수

- 문자열의 경우 싱글쿼트('')로 둘러싸 비교값 표기

- 날짜시간형의 경우에도 싱글쿼트로 둘러싸 표기, 연월일은 하이픈(-), 시분초는 콜론(:)으로 구분하여 표기 ex. '2023-03-03 10:22:33'

- 문자열형의 열과 비교하기 위해선 조건으로 지정할 값도 그 자료형에 맞춰 지정해야 함

- 리터럴 Literal : 자료형에 맞게 표기한 상수값

mysql> SELECT * FROM sample21;
+------+--------+------------+-------------------+
| no   | name   | birthday   | address           |
+------+--------+------------+-------------------+
|    1 | 박준용 | 1976-10-18 | 대구광역시 수성구 |
|    2 | 김재진 | NULL       | 대구광역시 동구   |
|    3 | 홍길동 | NULL       | 서울특별시 마포구 |
+------+--------+------------+-------------------+
3 rows in set (0.00 sec)

mysql> SELECT * FROM sample21 WHERE name = '박준용';
+------+--------+------------+-------------------+
| no   | name   | birthday   | address           |
+------+--------+------------+-------------------+
|    1 | 박준용 | 1976-10-18 | 대구광역시 수성구 |
+------+--------+------------+-------------------+
1 row in set (0.00 sec)

 

4. NULL값 검색

IS NULL

- '=' 연산자로는 NULL 값 검색 불가능

- IS NULL : 술어

mysql> SELECT * FROM sample21;
+------+--------+------------+-------------------+
| no   | name   | birthday   | address           |
+------+--------+------------+-------------------+
|    1 | 박준용 | 1976-10-18 | 대구광역시 수성구 |
|    2 | 김재진 | NULL       | 대구광역시 동구   |
|    3 | 홍길동 | NULL       | 서울특별시 마포구 |
+------+--------+------------+-------------------+
3 rows in set (0.00 sec)

mysql> SELECT * FROM sample21 WHERE birthday IS NULL;
+------+--------+----------+-------------------+
| no   | name   | birthday | address           |
+------+--------+----------+-------------------+
|    2 | 김재진 | NULL     | 대구광역시 동구   |
|    3 | 홍길동 | NULL     | 서울특별시 마포구 |
+------+--------+----------+-------------------+
2 rows in set (0.00 sec)

 

<-> IS NOT NULL : NULL 값이 아닌 행 검색

mysql> SELECT * FROM sample21 WHERE birthday IS NOT NULL;
+------+--------+------------+-------------------+
| no   | name   | birthday   | address           |
+------+--------+------------+-------------------+
|    1 | 박준용 | 1976-10-18 | 대구광역시 수성구 |
+------+--------+------------+-------------------+
1 row in set (0.00 sec)

 

5. 비교 연산자

= 연산자

좌변과 우변의 값이 같을 경우 참

 

<> 연산자

좌변과 우변의 값이 같지 않을 경우 참

 

> 연산자

좌변의 값이 우변의 값보다 클 경우 참

 

>= 연산자

좌변의 값이 우변의 값보다 크거나 같을 경우 참

 

< 연산자

좌변의 값이 우변의 값보다 작을 경우 참

 

<= 연산자

좌변의 값이 우변의 값보다 작거나 같을 경우 참