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');
✅ 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
'DataBase > MySQL' 카테고리의 다른 글
[MySQL] 사용자 및 권한 설정하기! (0) | 2023.03.21 |
---|---|
[MySQL] MySQL함수 - 2️⃣문자열 함수 (0) | 2023.03.20 |
[MySQL] JOIN 과 UNION_INNER JOIN , LEFT/RIGHT OUTER JOIN, UNION, UNION ALL (0) | 2023.03.20 |
[MySQL] MySQL 함수 - 1️⃣ 집계 함수 (0) | 2023.03.16 |
[MySQL] 필드 기준으로 그룹 하기, 그룹에 조건 달기 - GROUP BY, HAVING (0) | 2023.03.16 |