Meiren

[5일 벼락치기] 1day, SQL Level 1~ 3.zip 본문

SQL

[5일 벼락치기] 1day, SQL Level 1~ 3.zip

meiren 2023. 1. 3. 21:31

잘 안풀린거 위주

 

2. 재구매가 일어난 상품과 회원 리스트 구하기

  • group by -> having count...
SELECT USER_ID, PRODUCT_ID
FROM ONLINE_SALE
GROUP BY USER_ID, PRODUCT_ID
HAVING COUNT(SALES_AMOUNT) > 1
ORDER BY USER_ID, PRODUCT_ID DESC

 

3. Union

  • join으로 풀면 틀림 ㅎ
    UNION ALL : 모든 컬럼값이 같은 ROW도 결과로 보여준다. 중복제거 하지 않는다.
    UNION (DISTINCT) : 쿼리의 결과를 합친다. 중복된 ROW는 제거
  • 내 쿼리
    SELECT O.SALES_DATE AS SALES_DATE, O.PRODUCT_ID, IFNULL(O.USER_ID, NULL) AS USER_ID, O.SALES_AMOUNT
    FROM ONLINE_SALE O
    	JOIN OFFLINE_SALE S
    	ON O.PRODUCT_ID = S.PRODUCT_ID
    WHERE O.SALES_DATE LIKE '%-03-%'
    	AND S.SALES_DATE LIKE '%-03-%'
    ORDER BY SALES_DATE, PRODUCT_ID, USER_ID
    ;
  • 통과 쿼리
SELECT DATE_FORMAT(Z.SALES_DATE, '%Y-%m-%d') SALES_DATE, Z.PRODUCT_ID, Z.USER_ID, Z.SALES_AMOUNT
FROM (
SELECT SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT FROM ONLINE_SALE
UNION ALL
SELECT SALES_DATE, PRODUCT_ID, NULL, SALES_AMOUNT FROM OFFLINE_SALE
) Z
WHERE SALES_DATE LIKE '2022-03%'
ORDER BY SALES_DATE, PRODUCT_ID, USER_ID

 

 

4. between 100 and 200

- 100이상 200이하로 둘다 포함됨

- where 100 <= A <= 200 은 안됨...

SELECT COUNT(*) AS USERS
FROM USER_INFO
where YEAR(JOINED) = 2021
AND AGE between 20 and 29

 

 

5. MIN, MAX

- 가장 고가의 상품

SELECT MAX(PRICE) AS MAX_PRICE
FROM PRODUCT
LIMIT 1

- 가장 최근(마지막)에 들어온 동물

ver1) SELECT DATETIME 시간 FROM ANIMAL_INS ORDER BY DATETIME DESC LIMIT 1

ver2) SELECT MAX(DATETIME) AS 시간 FROM ANIMAL_INS

 

 

6. Count vs sum

- count  vs  sum

    - 아니 사람들이... 이게 다르다 나도 몰랐다 이런 글은 많은데 그래서 어떻게 해서 다른건지를...... 왜... ... 왜... 그래서 나도 몰라 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

    - count : 조회되는 row다 += 1,

        - COUNT(*) : NULL 포함

        - COUNT({colname}) : null 미포함!!

        - 단 null값은 제외, 그러면 row의 5개 값 중 1개가 Null이면 제외시키는건지?

        - 어쨌든, count(특정 컬럼명)에서 null이어도 카운트하려면 함수 써야함

    - sum : 주어진 조건을 모두 만족할 때 카운트

 

- count(distinct {colname})

    - 중복값 제거한 유일한 값만 카운트

    - null값은 디폴트로 제외되기 때문에 조건절이 필요 없다

SELECT count(DISTINCT NAME) as count
from ANIMAL_INS
# where NAME is not null

 

 

7. @변수명 := 대입할 값

- @ : 변수 선언

- :=, = : 대입연산자, 비교연산자

SET @hour_count := -1;
# 시간이 0부터여서 := -1대입한다

SELECT @hour_count:=@hour_count+1 as hour,
    (
        select count(DATETIME) 
        from ANIMAL_OUTS 
        where @hour_count = HOUR(DATETIME) 
    ) as count
FROM ANIMAL_OUTS
where @hour_count < 23

 

 

 

8. CASE WHEN

- WRONG SQL

SET @STANDARD:= -10000;

SELECT @STANDARD:=@STANDARD+10000 AS PRICE_GROUP
    , (SELECT COUNT(PRODUCT_ID)
       FROM PRODUCT
       WHERE PRICE >= @STANDARD AND PRICE < @STANDARD+10000
       ) AS PRODUCTS
FROM PRODUCT
GROUP BY PRICE_GROUP

 

- 반올림/내림

    - floor : 무조건 내림

    - round (9.89, 1) = 9.9

        - round(11.72, -1) = 10     <-- 음수면, 소수점 앞자리에서 반올림

    - ceiling(11.3) = 12   <-- 올림

 

- /  -> 몫만 가져가려면 -> floor({colname}/숫자) : 몫!!

- % : 나머지

SELECT floor(PRICE/10000) *10000 AS PRICE_GROUP, COUNT(PRICE) AS PRODUCTS
FROM PRODUCT
GROUP BY PRICE_GROUP
ORDER BY PRICE_GROUP

 

 

 

9. null값 처리

- ifnull

- if ({colname} is null, {null인 경우 값}, {null이 아닌 경우 값}) as {colname}

SELECT WAREHOUSE_ID, WAREHOUSE_NAME, ADDRESS, IFNULL(FREEZER_YN, 'N')
FROM FOOD_WAREHOUSE
WHERE WAREHOUSE_NAME LIKE '%_경기%'
ORDER BY WAREHOUSE_ID

 

 

10. SUM, 조건절 대신

- sum(age is null)

- age = null 인 것이 True == 1이 됨, 따라서 null인 경우가 1로 카운트됨

SELECT SUM(AGE IS NULL) AS USERS
FROM USER_INFO;

- count(*)하면 null도 포함해서 문제가 됨, 

- count(user_id)라고 특정 컬럼명을 선택하면 자동으로 null은 제외하고 카운트 됨

SELECT COUNT(USER_ID) AS USERS
FROM USER_INFO
WHERE AGE IS NULL;