[Programmers] SQL level4

동민·2021년 3월 11일
#우유와 요거트가 담긴 장바구니
SELECT DISTINCT CART_ID FROM (SELECT * FROM CART_PRODUCTS WHERE NAME = '우유') A JOIN (SELECT * FROM CART_PRODUCTS WHERE NAME = '요거트') B USING(CART_ID) ORDER BY CART_ID;

#입양 시각 구하기(2)
SET @h = -1;
SELECT
(@h := @h + 1) AS HOUR,
(SELECT COUNT(*) FROM ANIMAL_OUTS WHERE HOUR(DATETIME) = @h) AS COUNT
FROM ANIMAL_OUTS
WHERE @h < 23;

#보호소에서 중성화한 동물
SELECT I.ANIMAL_ID, I.ANIMAL_TYPE, I.NAME FROM ANIMAL_INS I JOIN ANIMAL_OUTS O USING(ANIMAL_ID) WHERE I.SEX_UPON_INTAKE <> O.SEX_UPON_OUTCOME ORDER BY ANIMAL_ID;
# 우유와 요거트가 담긴 장바구니 (SELF JOIN 활용)
SELECT DISTINCT CART_ID FROM (SELECT * FROM CART_PRODUCTS WHERE NAME = '우유') A JOIN (SELECT * FROM CART_PRODUCTS WHERE NAME = '요거트') B USING(CART_ID) ORDER BY CART_ID;
만약)
SELECT DISTINCT CART_ID FROM CART_PRODUCTS L JOIN CART_PRODUCTS R USING(CART_ID) WHERE L.NAME = '우유' AND R.NAME = '요거트' ... 이렇게 구현하면 정답은 맞지만 전체를 통째로 조인한 후 WHERE 절로 걸러내기 때문에 비효율적인 SQL 코드이다. 따라서 WHERE 절로 먼저 걸러낸 테이블을 조인하는 것이 효율적이다.

# 입양 시각 구하기(2) (SET 변수 지정 활용)
SET @h = -1;
SELECT
(@h := @h +1) as HOUR,
(SELECT COUNT(*) FROM ANIMAL_OUTS WHERE HOUR(DATETIME) = @h) as COUNT
FROM ANIMAL_OUTS
WHERE @h < 23;

MySQL 변수할당 : SET @변수명 =;
할당한 변수명에 1씩 더하기 : (@변수명 := @변수명 + 1)
profile
BE Developer

0개의 댓글