문제 : https://programmers.co.kr/learn/courses/30/lessons/62284

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

▶ FROM 절에서 사용되는 서브쿼리

FROM 절에서 사용되는 서브쿼리를 인라인 뷰(inline view)라고 한다.

FROM 절에는 테이블 명이 오도록 되어 있다.

그런데 서브쿼리가 FROM절에 사용되면 뷰(View)처럼 결과가 동적으로 생성된 테이블로 사용할 수 있다.

임시적인 뷰이기 때문에 데이터베이스에 저장되지는 않는다.

또한, 인라인 뷰로 동적으로 생성된 테이블이어서 인라인 뷰의 컬럼은 자유롭게 참조가 가능하다.

(출처: https://snowple.tistory.com/360)

 

▶ SQL 코드

풀이 1: FROM절 서브쿼리 이용

SELECT A.cart_id 
FROM 
(SELECT cart_id FROM CART_PRODUCTS WHERE NAME='우유') as A, 
(SELECT cart_id FROM CART_PRODUCTS WHERE NAME='요거트') as B 
WHERE A.cart_id = B.cart_id

 

풀이 2: WHERE절에 그냥 NAME을 단순2개 비교하는 조건은 없기때문에, 서브쿼리로 id하나 구해준뒤 AND사용 
SELECT cart_id 
FROM CART_PRODUCTS 
WHERE cart_id in (SELECT cart_id FROM CART_PRODUCTS WHERE name='우유') 
        AND NAME='요거트' 
ORDER BY cart_id asc;

풀이 3: SELF JOIN
SELECT C.cart_id
FROM CART_PRODUCTS C, CART_PRODUCTS T
WHERE C.cart_id = T.cart_id
    AND (C.name='우유' AND T.name='요거트')
ORDER BY C.cart_id

CREATE DATABASE file;
USE file;

CREATE TABLE customer (
	user_id varchar(50),
    user_name varchar(50),
    membership int);
    
CREATE TABLE library (
	book_id int,
    book_name varchar(50),
    price int);
    
CREATE TABLE orderinfo (
	order_no int,
    buyer_id varchar(50),
    book_id int);
    
insert into customer values ('랄로123', '랄로', 2);
insert into customer values ('도파123', '도파', 1);
insert into customer values ('파카123', '파카', 3);
insert into customer values ('미야123', '미야', 4);
insert into customer values ('말구123', '말구', 1);

insert into library values (10, '메이플 1권', 30000);
insert into library values (11, '메이플 2권', 31000);
insert into library values (12, '메이플 3권', 32000);
insert into library values (13, '메이플 4권', 33000);

insert into orderinfo values (1, '랄로123', '12');
insert into orderinfo values (2, '도파123', '10');
insert into orderinfo values (3, '도파123', '11');
insert into orderinfo values (4, '파카123', '13');
insert into orderinfo values (5, '미야123', '12');
insert into orderinfo values (6, '말구123', '10');
insert into orderinfo values (7, '말구123', '13');

select*from customer;
delete from customer;
select*from library;
delete from library;
select*from orderinfo;
delete from orderinfo;

#문제: 멤버십등급이 1등급인 고객을 찾아 해당 고객의 아이디와 전체 기간에 대한 누적 구매액을 구하시오.
#ex) 
#고객 아이디   누적 구매액
# 도파123      100000

SELECT sum(price)
FROM library
WHERE book_id = '10';

SELECT user_id as '고객 아이디'
FROM customer
WHERE membership = 1;

#join으로 풀면 될듯...
#정답 쿼리문
SELECT c.user_name, sum(lb.price)
FROM customer c, orderinfo oi, library lb
WHERE c.user_id = oi.buyer_id 
	AND lb.book_id = oi.book_id
    AND c.membership = 1
GROUP BY c.user_id;