[강의명]
패스트캠퍼스 SQL 100제 + 자격증 완성 온라인 완주반
[수강목록]
11. 데이터 조회와 필터링 - 07. IN 연산자
12. 데이터 조회와 필터링 - 08. BETWEEN 연산자
13. 데이터 조회와 필터링 - 09. LIKE 연산자
14. 데이터 조회와 필터링 - 10. IS NULL 연산자
15. 데이터 조회와 필터링 - 11. 실습 문제 - 1
[강의내용]
11. 데이터 조회와 필터링 - 07. IN 연산자
특정 집합(컬럼 혹은 리스트)에서 특정 집합 혹은 리스트가 존재하는지 판단하는 연산자이다.
문법
SELECT *
FROM TABLE_NAME
WHERE COLUMN_NAME IN (VALUE1, VALUE2, ... );
COLUMN_NAME이 가지고 있는 집합에서 VALUE1, VALUE2 등의 값이 존재하는지 확인
SELECT *
FROM TABLE_NAME
WHERE COLUMN_NAME IN
(SELECT COLUMN_NAME2 FROM TABLE_NAME2)
COLUMN_NAME이 가지고 있는 집합에서 TABLE_NAME2 테이블의 COLUMN_NAME2의 집합이 존재하는지 확인
실습
SELECT customer_id, rental_id, return_date
FROM rental
WHERE customer_id IN (1, 2)
ORDER BY return_date DESC;
customer_id가 1 또는 2인 행을 출력한다.
그 결과를 return_date 컬럼 기준 내림차순으로 출력한다.
SELECT customer_id, rental_id, return_date
FROM rental
WHERE customer_id NOT IN (1, 2) -- 1또는 2의 의미 (OR, && '='와 같음)
ORDER BY return_date DESC;
SELECT customer_id, rental_id, return_date
FROM rental
WHERE customer_id NOT IN (1, 2)
ORDER BY return_date DESC;
customer_id가 1도 아니고 2도 아닌 행을 출력한다. 그 결과를 return_date 컬럼 내림차순으로 출력한다.
내림차순이기 때문에 null 값이 등장할 수 있다.
SELECT customer_id
FROM rental
WHERE CAST (return_date AS DATE) = '2005-05-27';
return_date가 2005년 5월 27일인 customer_id를 출력한다.
CAST는 return_date를 DATE타입으로 바꿔준다.
이번에는 서브쿼리를 사용해본다
SELECT first_name, last_name
FROM customer
WHERE customer_id IN (
SELECT customer_id
FROM rental
WHERE CAST (return_date AS DATE) = '2005-05-27'
);
return_date가 2005년 5월 27일인 customer_id의 first_name, last_name을 출력한다.
메인쿼리 : customer_id의 first_name, last_name을 출력한다
서브쿼리 : return_date가 2005년 5월 27일인 customer_id를 출력한다
그리고 WHERE ~ IN으로 연결한다.
효율적으로 쿼리를 처리하기 위해 서브쿼리 사용.
12. 데이터 조회와 필터링 - 08. BETWEEN 연산자
특정 집합에서 어떠한 컬럼의 값이 특정 범위 안에 들어가는 집합을 출력하는 연산자이다.
SELECT *
FROM TABLE_NAME
WHERE COLUMN_NAME
BETWEEN VALUE_A AND VALUE_B;
COLUMN_NAME 컬럼의 값이 VALUE_A와 VALUE_B 사이에 있는 집합을 출력한다.
즉 COLUMN_NAME은 VALUE_A보다 크거나 같고 VALUE_B보다는 작거나 같다.
SELECT *
FROM TABLE_NAME
WHERE COLUMN_NAME
NOT BETWEEN VALUE_A AND VALUE_B;
COLUMN_NAME 컬럼의 값이 VALUE_A와 VALUE_B 사이에 있지 않은 집합을 출력한다.
즉 COLUMN_NAME은 VALUE_A보다 작거나 VALUE_B 보다 크다.
실습
SELECT customer_id, payment_id, amount
FROM payment
WHERE amount BETWEEN 8 AND 9;
SELECT customer_id, payment_id, amount
FROM payment
WHERE amount NOT BETWEEN 8 AND 9;
13. 데이터 조회와 필터링 - 09. LIKE 연산자
특정 집합에서 어떠한 컬럼의 값이 특정 값과 유사한 패턴을 갖는 집합을 출력하는 연산자이다.
문법
SELECT *
FROM TABLE_NAME
WHERE COLUMN_NAME
LIKE 특정패턴
COLUMN_NAME 컬럼의 값이 특정 패턴과 유사한 집합을 출력한다.
SELECT *
FROM TABLE_NAME
WHERE COLUMN_NAME
NOT LIKE 특정패턴
COLUMN_NAME 컬럼의 값이 특정 패턴과 유사하지 않은 집합을 출력한다.
* 특정 패턴에서 '%'는 어떤 문자 혹은 문자열이든지 매칭되었다고 판단한다.
* 특정 패턴에서 '_'는 한 개의 문자가 어떤 문자이든지 매칭되었다고 판단한다.
실습
SELECT first_name, last_name
FROM customer
WHERE first_name LIKE 'Jen%';
first_name이 'Jen'으로 시작하는 모든 값을 출력한다.
SELECT 'FOO' LIKE 'FOO', -- TRUE
'FOO' LIKE 'F%', -- TRUE
'FOO' LIKE '_O_', -- TRUE
'BAR' LIKE 'B_' -- FALSE (3자리라서 안됨)
'BAR' LIKE ~ 가 참이 되게 하려면 'B__' 또는 'B%'가 와야 한다.
SELECT first_name, last_name
FROM customer
WHERE first_name LIKE '_her%';
SELECT first_name, last_name
FROM customer
WHERE first_name NOT LIKE 'Jen%';
14. 데이터 조회와 필터링 - 10. IS NULL 연산자
특정 컬럼 혹은 값이 널 값인지 아닌지를 판단하는 연산자이다. IS NULL 혹은 IS NOT NULL로 널 유무를 판단한다.
문법
SELECT *
FROM TABLE_NAME
WHERE COLUMN_NAME IS NULL;
COLUMN_NAME 컬럼의 값이 널인 집합을 출력한다. ( = NULL 사용 불가)
SELECT *
FROM TABLE_NAME
WHERE COLUMN_NAME IS NOT NULL
COLUMN_NAME 컬럼의 값이 널이 아닌 집합을 출력한다. ( != NULL 사용 불가)
15. 데이터 조회와 필터링 - 11. 실습 문제 - 1
payment 테이블에서 단일 거래의 amount의 액수가 가장 많은 고객들의 customer_id를 추출하라. 단, customer_id의 값은 유일해야 한다.
가장 큰 amount값을 찾고, 해당 값을 가진 customer_id를 찾아야 함.
먼저 메인쿼리에 customer_id를 찾는 쿼리를 작성한다. DISTINCT를 부여해야 한다.
SELECT DISTINCT customer_id
FROM payment
WHERE
서브쿼리를 작성한다. 가장 큰 amount값을 찾는데, 내림차순과 LIMIT를 이용한다.
SELECT amount
FROM payment
ORDER BY amount DESC
LIMIT 1
이제 연결한다.
SELECT DISTINCT customer_id
FROM payment
WHERE amount = (
SELECT amount
FROM payment
ORDER BY amount DESC
LIMIT 1
);