본문 바로가기
DataBase/MySQL

[MySQL] 서브쿼리(Sub Query)에 대해 알아보자! 🧐

by coding-choonsik 2023. 3. 20.
728x90
반응형
SMALL

1. 서브쿼리(Sub Query)란 ❓

  • 다른 쿼리 내부에 포함되어 있는 select문을 의미
  • 서브쿼리를 포함하고 있는 쿼리를 외부쿼리라고 부르고, 서브쿼리는 내부쿼리라고도 부름
  • 서브쿼리는 괄호()로 감싸져서 표현
  • 서브쿼리는 메인쿼리 컬럼 사용이 가능하며, 메인쿼리는 서브쿼리 컬럼을 사용하지 못함
  • select, where, from, having절 등에서 사용할 수 있음

2. SELECT절 서브쿼리

  • 하나의 열처럼 사용함

✅product 테이블에서 코드, 이름, 가격 전체 데이터의 가격 중 가장 큰값을 출력하는 쿼리

 

# 가격 중 최대값 출력
select max(price) from product;

 

위 출력 결과를 하나의 컬럼으로 생각하면 된다.

 

select code, name, price, (select max(price) from product) as max_price from product;


3. WHERE절 서브쿼리

  • 가장 대표적인 형태

✅ code가 100001인 제품의 가격보다 크거나 같은 제품 정보 조회하기

 

# 코드가 100001인 제품의 가격 조회
select price from product where code = '100001';

 

select * from product 
where price >= (select price from product where code = '100001');

 

1300000원보다 비싼 제품들의 모든 정보를 조회


✅ orders 테이블을 만들고 데이터를 입력해보자.

create table orders(
	no int not null,
	userid varchar(20) not null,
    product varchar(100) not null,
    cnt int default 1,
    regdate datetime default now(),
    foreign key(userid) references member(userid)   
);

insert into orders (no, userid, product, cnt) values (1, 'apple', '사과', 3);
insert into orders (no, userid, product, cnt) values (2, 'apple', '꿀사과', 2);
insert into orders (no, userid, product, cnt) values (3, 'banana', '바나나', 5);
insert into orders (no, userid, product, cnt) values (4, 'banana', '딸바', 1);
insert into orders (no, userid, product, cnt) values (5, 'orange', '오렌지', 2);
insert into orders (no, userid, product, cnt) values (6, 'berry', '블루베리', 3);

select * from orders;

✅ member 테이블 확인

select * from member;

 

✅상품을 최소 2번 이상 구입한 회원의 아이디와 이름, 성별을 출력해보자.

 

1) 상품을 최소 2번 이상 구입한 회원

select userid from orders group by userid having count(no) >=2;

2) in을 이용하여 member테이블에서 해당 서브쿼리를 만족하는 회원의 아이디, 이름, 성별을 출력한다.

select userid, username, gender 
from member 
where userid in (select userid  from orders group by userid having count(no) >=2 );

4. FROM절 서브쿼리

  • 하나의 테이블처럼 사용
  • 테이블처럼 사용되므로 열 이름과 테이블명을 명시해주어야 함(AS 명시)

✅ 상품을 2번 이상 구입한 사용자의 아이디, 상품 구입 횟수, 시도이름을 출력해보자.

상품 구입횟수 ➡ orders 테이블

아이디, 시도이름 ➡ member 테이블

 

4-1. join 이용하기

select userid, substring(address1, 1, 3)as 시도이름 from member;

select userid, count(no) as cnt from orders group by userid having cnt>=2;

orders 테이블의 모든 데이터가 나오도록  right outer join하자.

select m.userid, count(o.no) as cnt, substring(m.address1, 1, 3)as 시도이름 
from member as m       # 별명 사용
right outer join 
orders as o on m.userid = o.userid 
group by userid having cnt >= 2;


4-2. from절 서브쿼리

별명 AS 명시 필수!

select m.userid, t.ocnt, substring(m.address1, 1, 3) as address 
from member as m
right outer join
(select userid, count(no) as ocnt from orders group by userid having count(no) >= 2) as t
on m.userid = t.userid;

 

 

728x90
반응형
LIST