SQL 4일차 11-15

박철민·2021년 7월 22일
0

제로베이스SQL100제

목록 보기
6/19
post-thumbnail

수강 날짜 20.07.22

11강의명 : 07 IN 연산자
12강의명 : 08 BETWEEN 연산자
13강의명 : 09 LIKE 연산자
14강의명 : 10 IS NULL 연산자
15강의명 : 실습 문제-1

IN연산자

특정 집합에서 특정 집합 혹은 리스트가 존재하는지 판단하는 연산자
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연산자가 더 좋다.

OR연산자

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을 사용한다.

NOT IN 연산자

그 집합에 속하지 않을 시를 조건으로 하는 연산자

쿼리

select customer_id, rental_id, return_date 
  from rental
 where customer_id not in (1, 2);

결과

1,2,에 속하지 않는 결과들이 출력되었다.

IN = OR

NOT IN = NOT AND

쿼리

select customer_id, rental_id, return_date 
  from rental
 where customer_id != 1
   and customer_id != 2;

결과

IN을 이용한 서브 쿼리

조건에 서브 우리가 서브 쿼리를 하여 나온 결과들을 집합으로 취급하여 조건을 간단하게 한다.

쿼리

 	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');

결과

아까 결과를 집합으로 하여 다시 찾아본것이다.


BETWEEN 연산자

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를 이용하면 형태를 바꿔줄 수 있다.

LIKE연산자

특정 패턴과 유사한 집합을 출력한다.
이떄 정규표현식이 사용된다.

  • 특정 패턴에서 '%'는 어떤 문자 혹은 문자열이든지 매칭되었다고 판단한다.
  • 특정 패턴에서 '_'는 한 개의 문자가 어떤 문자이든지 매칭 되었다고 판단한다.

쿼리
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 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 테이블에서 단일 거래의 AMOUNT의 액수가 가장 많은 고객들의 CUSTOMER_ID를 추출하라. 단, CUSTOMER_ID의 값은 유일해야 한다.

일단 이것을 해결하기 위하여 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가 유일한 값들로 이루어져있다라고 인식하였다.

profile
취준좀비 컴공

0개의 댓글