[프로그래머스 / SQL] 코딩테스트 대비 정리

SQL

목록 보기
1/8
post-thumbnail

순서

1) 문법 순서
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY

2) 실행 순서
FROM : 조회 테이블 확인
ON : 조인 조건 확인
JOIN : 테이블 조인(병합)
WHERE : 데이터 추출 조건 확인
GROUP BY : 특정 컬럼 그룹화
HAVING : 그룹화 시킨 후 각 그룹에 적용될 조건
SELECT : 데이터 추출
DISTINCT : 중복 제거
ORDER BY : 데이터 순서 정렬
LIMIT

*** Alias(as) 는 FROM, SELECT, ORDER BY 절에서만 사용 가능
그래서 FROM 절에서 정한 ALIAS를 이후에도 사용할 수 있음.
SELECT 절에서 사용한 ALIAS를 ORDER BY 절에서 사용할 수 있는 것과도 같음

*** tip : SQL 작성시 실행 순서대로 작성하기.
SELECT -> FROM -> WHERE 이 아니라
FROM -> WHERE -> SELECT 순으로 적으면 좋음. 이후에 성능적으로 튜닝할 수 있는 요소를 발견하기 용이하기 때문. 덜 헷갈린다고 함.

출처 : https://jaehoney.tistory.com/191

여러 기준으로 정렬하기

SELECT ANIMAL_ID,NAME,DATETIME FROM ANIMAL_INS 
ORDER BY NAME ASC, DATETIME DESC

상위 n개

SELECT NAME FROM ANIMAL_INS 
ORDER BY DATETIME LIMIT 1

조건에 맞는 회원수 구하기

SELECT COUNT(*) AS USERS FROM USER_INFO 
WHERE AGE >= 20 AND AGE <= 29 AND YEAR(JOINED) = 2021

SELECT COUNT(*) AS USERS FROM USER_INFO 
WHERE JOINED LIKE '2021%' AND AGE>=20 AND AGE<=29

가격이 제일 비싼 식품 하나 출력

SELECT * FROM FOOD_PRODUCT 
ORDER BY PRICE DESC 
LIMIT 1

OR 

SELECT * FROM FOOD_PRODUCT
WHERE PRICE = (SELECT MAX(PRICE) FROM FOOD_PRODUCT)

포맷 바꾸기

SELECT BOOK_ID, 
DATE_FORMAT(PUBLISHED_DATE, '%Y-%m-%d') AS PUBLIC_DATE 
FROM BOOK 
WHERE CATEGORY = '인문' 
	AND YEAR(PUBLISHED_DATE)='2021%' 
ORDER BY  PUBLIC_DATE

*** Data_format(적용할 날짜, '적용시킬 포맷')
'%Y-%m-%d' => 2021-10-24
Y = 2021 / y = 21
M = October / m = 10
D = 24th / d = 24

*** 몇년도 조건으로 데이터 구하기
where YEAR(public_date) = '2021'

* SQL 날짜 시간 관련 함수

최댓값 구하기

https://school.programmers.co.kr/learn/courses/30/lessons/59415

SELECT DATETIME 
FROM ANIMAL_INS 
ORDER BY DATETIME DESC LIMIT 1

의도 )

SELECT MAX(DATETIME) 
  FROM ANIMAL_INS

성능은 이게 더 좋다.

최솟값 구하기

SELECT MIN(DATETIME) FROM ANIMAL_INS

동물 수 세기

아.. 낚시 잘하네 프로그래머스

SELECT COUNT(*) FROM ANIMAL_INS

처음에 COUNT(NAME)으로 했는데 NAME이 NULLABLE TRUE라서 한 케이스 빗겨나가 틀렸다.
전체 행으로 바꾸니 맞았네.. 그 전에 입력했던 ANIMAL_ID는 왜 안되나 했더니 오타였다.ㅎ

오타 조심하고 조건 잘보기

중복 제거하기

SELECT COUNT(DISTINCT NAME) FROM ANIMAL_INS

*** COUNT 는 NULL 안셈
COUNT 할 때 중복 제거하고 싶으면 COUNT(DISTINCT, 컬럼명) 이게 제일 깔금함.
참고 : https://chanhuiseok.github.io/posts/db-4/

GROUP BY

조건 잘 확인하고 순서 기억하면서 풀기

SELECT B.INGREDIENT_TYPE, SUM(A.TOTAL_ORDER) AS TOTAL_ORDER
FROM FIRST_HALF AS A, ICECREAM_INFO AS B 
WHERE A.FLAVOR = B.FLAVOR
GROUP BY B.INGREDIENT_TYPE
ORDER BY TOTAL_ORDER;

GROUP BY & HAVING

https://school.programmers.co.kr/learn/courses/30/lessons/59041
GROUP BY절의 조건을 줄 땐 HAVING 에서 조건을 주고
그룹함수는 NULL 값을 고려하지 않는다.

SELECT NAME, COUNT(NAME) AS 'count'
FROM ANIMAL_INS
GROUP BY NAME
HAVING COUNT(NAME) >= 2
ORDER BY NAME;

입양시간 구하기

시간대별로 동물 수 구하기인데 생각보다 어려웠음.
시간 함수를 몰라서 어려웠던 것.
https://school.programmers.co.kr/learn/courses/30/lessons/59412

날짜 시간함수 참고

SELECT HOUR(DATETIME) AS 'HOUR', COUNT(HOUR(DATETIME)) AS 'COUNT'
FROM ANIMAL_OUTS
GROUP BY HOUR(DATETIME)
HAVING HOUR BETWEEN '9' AND '19'
ORDER BY HOUR(DATETIME);

이것도있지만 이 경우엔 WHERE 절로 조건을 적어주는 것이 더 좋다.

SELECT HOUR(DATETIME) AS 'HOUR', COUNT(HOUR(DATETIME)) AS 'COUNT'
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) BETWEEN '9' AND '19'
GROUP BY HOUR(DATETIME)
ORDER BY HOUR(DATETIME);

날짜, 시간, DATEFORMAT 잘 활용해보자.

TRUNCATE, ROUND

https://school.programmers.co.kr/learn/courses/30/lessons/131530
TRUNCATE(숫자,자리수) 일의자리 이상 -1,-2... / 소수점 1,2....

    SELECT TRUNCATE(PRICE, -4) AS PRICE_GROUP, COUNT(PRODUCT_ID) AS PRODUCTS 
    FROM PRODUCT 
    GROUP BY PRICE_GROUP
    ORDER BY PRICE_GROUP;

즐겨찾기가 가장 많은 식당 검색

하 진짜 한끝차이로 틀렸다.
다중조건.. 잊지말자

SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM REST_INFO
WHERE FAVORITES 
    IN (SELECT MAX(FAVORITES)
    FROM REST_INFO GROUP BY FOOD_TYPE)
ORDER BY FOOD_TYPE DESC;

처음엔 이렇게 풀었는데 MAX FAVORITES 값이 중복된 값이 있어서 어떻게 해야되나 온갖 고민했는데
결국 답은 엄청 쉽게 풀었다.

SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM REST_INFO
WHERE (FOOD_TYPE, FAVORITES) // 이 부분을 묶어주면 됨. 
    IN (SELECT MAX(FAVORITES)
    FROM REST_INFO GROUP BY FOOD_TYPE)
ORDER BY FOOD_TYPE DESC;

비교해줄 값도 묶어주면 된다는 것. 하하

profile
두둥탁 뉴비등장

0개의 댓글