>

TIL

SQL - SubQuery

ekdud 2024. 12. 9. 15:19

📑

     

    SubQuery

    1. SELECT 절에서의 사용

    select
    	username, (select top 1 username from testTable)
    from
    	testTable

    *하나의 값만 반환 가능. 둘 이상은 오류 발생.

     

     

    2. FROM 절에서의 사용

    select
    	a.*
    from
    	(
    		select username from testTable where username like '%e%'
    	) as a

     

     

    3. WHERE 절에서의 사용

    select
    	a.*
    from
    	(
    		select username from testTable where username like '%e%'
    	) as a

    *하나의 값만 반환 가능. 둘 이상은 오류 발생.

     

    다중 값이 필요한 경우 IN을 이용

     


     

    SQL CODE KATA 

    Ⅰ. 구매횟수가 가장 적은 사람의 아이디와 이름 조회(중복값 무시하고 한 명만 조회).

    SELECT T_USER.USER_ID, T_USER.USER_NM, CNT 
    FROM T_USER 
    LEFT JOIN (SELECT USER_ID, COUNT(USER_ID) AS CNT FROM T_ORD GROUP BY USER_ID) AS T_ORD
    ON T_USER.USER_ID = T_ORD.USER_ID
    ORDER BY CNT
    LIMIT 1;

    * LEFT OUTER JOIN이 아닌 INNER JOIN을 하면 NULL인 값은 조회되지 않음.

     

     

     

    Ⅱ. 박미진 사용자의 주문 내역 조회. "아이디", "사용자이름", "연락처", "주소", '[카테고리명]상품명' AS "상품명", "수량", "가격", "결제금액" 으로 표현해주세요. (임직원으로 등록된 사용자임. 결제금액은 합산 후 할인율이 적용된 금액.)

     

     

    Ⅲ. 매출액이 가장 많은 카테고리를 찾아 해당 카테고리의 카테고리, 상품명, 매출액을 조회하고, 매출액을 내림차순으로 정렬하여 표현.

    SELECT 
    	CTGRY_NM '카테고리',
    	GOODS_NM '상품명',
    	ORD_QY*SUPLY_PC TOTAL_ORD_AMT
    FROM T_ORD O 
    JOIN T_ORD_DETAIL D ON O.ORD_NO = D.ORD_NO 
    JOIN T_GOODS G ON D.GOODS_ID = G.GOODS_ID 
    JOIN T_GOODS_CTGRY C ON G.CTGRY_CD = C.CTGRY_CD 
    WHERE C.CTGRY_CD = (
                SELECT C.CTGRY_CD
                FROM T_ORD O 
                JOIN T_ORD_DETAIL D ON O.ORD_NO = D.ORD_NO 
                JOIN T_GOODS G ON D.GOODS_ID = G.GOODS_ID 
                JOIN T_GOODS_CTGRY C ON G.CTGRY_CD = C.CTGRY_CD 
                GROUP BY C.CTGRY_CD 
                ORDER BY SUM(ORD_QY*SUPLY_PC) DESC LIMIT 1
                )
    GROUP BY G.GOODS_ID   # PK 
    ORDER BY TOTAL_ORD_AMT DESC;