코딩 개발/ORACLE

ORACLE - IN, NOT IN 연산자 (feat. SEQUENCE)

호소세 2023. 5. 8. 22:56
728x90
반응형

https://pabeba.tistory.com/141

 

ORACLE - GROUP BY HAVING

GROUP BY 란? 특정 칼럼을 기준으로 데이터를 그룹화하여 조회할 때 사용합니다. 집계함수와 함께 사용합니다. ( count, max, min, avg, sum,.......) Having 이란? GROUP BY와 함께 사용하는 조건절입니다. 그룹

pabeba.tistory.com

GROUP BY ~ HAVING에 대한 글을 먼저 보고 오시면 좋아요.

IN 연산자란?

특정값이 포함되는 데이터를 조회하고자 할 때 사용하는 연산자입니다.

 

NOT IN 연산자란?

당연히 특정값이 포함되지 않는 데이터를 조회하고자 할 때 사용하는 연산자입니다.

 

이 연산자를 사용하면 subquery문을 사용할 수 있습니다.

 

ORACLE SEQUENCE

순차적으로 증가하고, 유일한 값을 생성하기 위한 객체입니다.

예제를 보면서 이해해 보겠습니다.

예제

food 테이블 생성 및 데이터 추가

CREATE TABLE FOOD(
ID NUMBER PRIMARY KEY,
NAME VARCHAR2(100) NOT NULL,
MAKER VARCHAR2(100) NOT NULL,
PRICE NUMBER NOT NULL
)

create sequence food_seq;​

insert into food(id,name,maker,price) values(food_seq.nextval,'후라이드','또래오래',15000);
insert into food(id,name,maker,price) values(food_seq.nextval,'소곱창','대한곱창',20000);
insert into food(id,name,maker,price) values(food_seq.nextval,'양념치킨','또래오래',16000);
insert into food(id,name,maker,price) values(food_seq.nextval,'참치회','이춘복참치',35000);
insert into food(id,name,maker,price) values(food_seq.nextval,'파닭','또래오래',17000);
insert into food(id,name,maker,price) values(food_seq.nextval,'미니전골','대한곱창',18000);

​commit

보시면 food_seq라는 이름의 시퀀스를 생성하고, id 값을 순차적으로 증가시키기 위해 food_seq.nextval을 사용하고 있습니다. 저렇게만 시퀀스를 생성하면 디폴트로 1부터 1씩 증가해서 id 값을 표현할 것입니다.

이런 식으로 말이죠.

 

예제 1. MAKER가 또래오래, 대한곱창인 FOOD를 조회

SELECT id,name,maker,price FROM food WHERE maker IN('대한곱창','또래오래');
SELECT id,name,maker,price FROM food WHERE maker='대한곱창' OR maker='또래오래';

예제 2. MAKER가 또래오래, 대한곱창이 아닌 음식을 조회

SELECT id,name,maker,price FROM food WHERE maker NOT IN('대한곱창','또래오래');
SELECT id,name,maker,price FROM food WHERE maker <> '대한곱창' AND maker<> '또래오래';

이렇게 두 가지의 방법이 있지만 subquery문을 사용해야 하기 때문에 IN이나 NOT IN을 사용하여 음식을 조회해야 합니다.

바로 다음 예제를 보시죠.

 

예제 3. 전체 FOOD 평균가보다 maker 별 평균가가 낮은 maker의 food 정보를 찾기

SELECT id,name,maker,price FROM food 
WHERE maker IN(
	SELECT MAKER FROM FOOD 
	GROUP BY maker 
	HAVING AVG(price)<(SELECT AVG(price) FROM FOOD)
)

먼저 이 문장을 완성하기 전에 생각해야 할 것은 food 평균가 보다 낮은 maker 별 평균가의 maker를 찾는 것입니다. 그다음에 찾은 maker의 이름으로 food들의 정보를 찾으면 됩니다.

1. food 평균가 보다 낮은 maker 별 평균가의 maker를 찾기

SELECT MAKER FROM FOOD 
GROUP BY maker 
HAVING AVG(price)<(SELECT AVG(price) FROM FOOD)

2. 1번을 이용하여 maker 가 대한곱창, 또래오래인 food들을 나타내면 됩니다.

위의 정답을 사용하여 값을 확인하면 

이렇게 나오게 됩니다.

반응형