수강 날짜 20.07.22
11강의명 : 07 IN 연산자
12강의명 : 08 BETWEEN 연산자
13강의명 : 09 LIKE 연산자
14강의명 : 10 IS NULL 연산자
15강의명 : 실습 문제-1
특정 집합에서 특정 집합 혹은 리스트가 존재하는지 판단하는 연산자
where절에서 사용한다.
쿼리
select customer_id, rental_id, return_date from rental where customer_id in (1,2);
결과
(1,2) 집합에 속해 있는 경우를 출력한다.
customer_id = 1 OR customer_id = 2 랑 유사하나
이러한 조건이 여러개 일 경우 집합으로 만들어 처리를 하기 때문에 IN연산자가 더 좋다.
IN 연산자는 OR 이랑 같다.
위에 명시한 것 처럼 여러 결과에 대하여 찾아서 합치는 것은 OR이다. 아까 IN연산자를 사용한 것을 다시 표현해보면 다음과 같다.
쿼리
select customer_id, rental_id, return_date from rental where customer_id = 1 or customer_id = 2;
결과
IN과 OR을 비교할 시 IN이 가독성이 더 좋다. 그러므로 IN 사용을 더 권장한다.
하지만 이러한 특정 값에 대해서가 아닌 경우에는 OR을 사용한다.
그 집합에 속하지 않을 시를 조건으로 하는 연산자
쿼리
select customer_id, rental_id, return_date from rental where customer_id not in (1, 2);
결과
1,2,에 속하지 않는 결과들이 출력되었다.
쿼리
select customer_id, rental_id, return_date from rental where customer_id != 1 and customer_id != 2;
결과
조건에 서브 우리가 서브 쿼리를 하여 나온 결과들을 집합으로 취급하여 조건을 간단하게 한다.
쿼리
select customer_id from rental where cast(return_date as DATE) ='2005-05-27';
결과
이렇게 나온 결과값을 다시 조건으로 선택해서 찾는다.
쿼리select customer_id, rental_id, return_date from rental where customer_id in ( select customer_id from rental where cast(return_date as DATE) ='2005-05-27');
결과
아까 결과를 집합으로 하여 다시 찾아본것이다.
IN으로는 집합을 표현할 수 있다. 그러나 만약 (1,2,3,4,5)라는 집합을 일일이 다 정해줘야 하는가?
그래서 나온 것이 BETWEEN 연산자이다.
BETWEEN연산자는 특정 집합에서 어떠한 컬럼의 값이 특정 범위 안에 들어가는 집합을 출력하는 연산자이다.
쿼리
select customer_id, payment_id, amount from payment where amount between 8 and 9;
결과
amount 값이 8과 9 사이인 집합을 출력한다.
이것은 >= AND <= 로 표현이 가능하다
쿼리
select customer_id, payment_id, amount from payment where amount >= 8 and amount <= 9;
결과
이것 또한 NOT으로 아닌 값들을 고를 수 있다.
쿼리
select customer_id, payment_id, amount from payment where amount NOT between 8 and 9;
결과
범위는 DATE도 가능하다.
select customer_id, payment_id, amount from payment where cast(payment_date as DATE) between '2007-02-07' and '2007-02-15';
cast를 이용하면 형태를 바꿔줄 수 있다.
특정 패턴과 유사한 집합을 출력한다.
이떄 정규표현식이 사용된다.
쿼리
FIRST_NAME이 'Jen'으로 시작하는 집합을 출력한다.
즉 'Jen'이후의 문자 혹은 문자열을 모두 매칭된다.select first_name ,last_name from customer where first_name like 'Jen%';
결과
LIKE는 boolean 값으로 결과를 출력한다.
쿼리
select 'FOO' like 'FOO' , 'FOO' like 'F%' , 'FOO' like '_O_' , 'FOO' like 'B_'
결과
어떠한 문자열을 포함하고 있는지도 검색이 가능하다.
쿼리
select first_name ,last_name from customer where first_name like '%er%';
결과
두번째 글자부터 her이 오는 모든 이름을 찾아라!
쿼리select first_name ,last_name from customer where first_name like '_her%';
결과
특정 컬럼 혹은 값이 널 값인지 아닌지르 판단하는 연산자이다. IS NULL 혹은 IS NOT NULL로 널 유무 확인
WHERE 절에서 조건으로 사용된다.
실습준비
create table contacts ( ID INT generated by default as identity , FIRST_NAME VARCHAR(50) not null , LAST_NAME VARCHAR(50) not null , EMAIL VARCHAR(255) not null , PHONE VARCHAR(15) , primary key (ID) ); insert into contacts(first_name, Last_name, EMAIL, PHONE) values ('John', 'Doe', 'john.doe@example.com', NULL), ('Lily', 'Bush', 'lily.bush@example.com','408-234-2764'); commit; select * from contacts;
결과
쿼리
select ID, first_name, last_name, email, phone from contacts where phone = null;
결과
where 속성 = null은 안된다
쿼리select ID, first_name, last_name, email, phone from contacts where phone is null;
결과
다음과 같이 = NULL이 아닌 IS NULL을 사용해야한다.
문제를 먼저 풀어보고 영상을 시청하도록 한다.
실습 문제 1
일단 이것을 해결하기 위하여 PAYMENT 테이블의 값들을 조회하였다.
select *
from payment;
다음에 결과중에 AMOUNT를 기준으로 하여 내림차순으로 정렬하였다. 필요한 정보인 C_ID와 AMOUNT(확인용)만 SELECT하였다
select customer_id, amount
from payment
order by amount DESC;
가장 큰 값을 가지고 있는 애들만 남기고 싶다. 아직 배우지는 않았지만 MAX함수와 서브쿼리를 이용하면 문제를 쉽게 구할 수 있었다.
select customer_id, amount
from payment
where amount =
(select MAX(amount)
from payment);
하지만 아직 MAX에 관하여 배우지 않았기에 다른 방식으로 문제를 해결해보았다.
LIMIT을 이용하고 DESC를 이용하여 가장 큰 값 한개만을 가지고 오도록 하였다.
select customer_id, amount
from payment
where amount =
(select amount
from payment
order by amount desc
limit 1);
영상과 비교하니 DISTINCT를 넣지 않았다.
문제에서는 '단, CUSTOMER_ID의 값은 유일해야 한다.'라는 말이 있는데 이것이 C_ID가 유일한 값들로 이루어져있다라고 인식하였다.