https://school.programmers.co.kr/learn/courses/30/lessons/133024
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
* 인기있는 아이스크림
문제
상반기에 판매된 아이스크림의 맛을 총주문량을 기준으로 내림차순 정렬하고 총주문량이 같다면 출하 번호를 기준으로 오름차순 정렬하여 조회하는 SQL 문을 작성해주세요.
- 총주문량을 먼저 내림차순 정렬하고, 같다면 출하 번호를 기준으로 오름차순 정렬.
- 처음에 같다면 이라는 조건을 따로 작성해야하는 줄 알았다.
- 그냥 Order by 절에 연달아서 조건을 작성해주면 끝.
SELECT FLAVOR
FROM FIRST_HALF
ORDER BY TOTAL_ORDER DESC, SHIPMENT_ID ASC
https://school.programmers.co.kr/learn/courses/30/lessons/132201
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
* 12세 이하인 여자 환자 목록 출력하기
문제
PATIENT 테이블에서 12세 이하인 여자환자의 환자이름, 환자번호, 성별코드, 나이, 전화번호를 조회하는 SQL문을 작성해주세요. 이때 전화번호가 없는 경우, 'NONE'으로 출력시켜 주시고 결과는 나이를 기준으로 내림차순 정렬하고, 나이 같다면 환자이름을 기준으로 오름차순 정렬해주세요.
- Null일 경우에 NONE 값을 채우는게 문제.
- IFNULL() 과 COALESCE() 함수를 사용해서 NONE 값을 채울 수 있다.
SELECT PT_NAME, PT_NO, GEND_CD, AGE, COALESCE(TLNO, "NONE") AS TLNO
FROM PATIENT
WHERE GEND_CD = "W" AND AGE <= 12
ORDER BY AGE DESC, PT_NAME ASC
- COALESCE() 여러가지 사용법이 있겠지만, 첫번째에 컬럼값을 두번째에 NULL 값 대신 들어갈 값을 적어주면 된다.
https://school.programmers.co.kr/learn/courses/30/lessons/144853
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
- 조건에 맞는 도서 리스트 출력하기
문제
BOOK 테이블에서 2021년에 출판된 '인문' 카테고리에 속하는 도서 리스트를 찾아서 도서 ID(BOOK_ID), 출판일 (PUBLISHED_DATE)을 출력하는 SQL문을 작성해주세요.
결과는 출판일을 기준으로 오름차순 정렬해주세요.
- 색다른건 없지만 DATE_FORMAT() 함수 사용을 익힐 필요가 있다.
- DATE_FORMAT() 함수의 첫 번째는 날짜 컬럼을 전달.
- 두번째는 출력할 Year, Month, Day를 차례대로 입력하면 된다.
- "%Y-%M-%D" : 긴숫자와 영어를 출력한다 2020-November-1th 출력한다
- "%y-%m-%d" : 짧은 숫자로 20-1-1 출력한다
- 출력 형식에 맞게 출력하면 된다.
- 아래에 WHERE 절에서 년, 달, 날 단위로 출력하고 싶으면 YEAR(), MONTH(), DAY() 함수를 사용하면 된다.
SELECT BOOK_ID, DATE_FORMAT(PUBLISHED_DATE, '%Y-%M-%D') AS PUBLISHED_DATE
FROM BOOK
WHERE TRIM(CATEGORY) = '인문'
AND YEAR(PUBLISHED_DATE) = 2021
ORDER BY PUBLISHED_DATE ASC;
https://school.programmers.co.kr/learn/courses/30/lessons/273711
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
* 업그레이드 된 아이템 ( 정리 예정 )
https://school.programmers.co.kr/learn/courses/30/lessons/131114
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
* LIKE 명령어를 사용하여 앞뒤로 '경기' 포함 되어 있는지 확인하는 문제.
* COALESCE() 함수는 위에서 사용했으니 설명 생략.
SELECT 컬럼명
FROM 테이블명
WHERE 컬럼명 LIKE '패턴';
* LIKE 뒤에 2가지 패턴이 올 수 있는데,
1. _ 패턴 : 정확히 한개가 올 수 있다
2. % 패턴 : 여러가지가 올 수 있다
EX) _A -> AA 와 BA 가 올 수 있다. %A ABABA 가 오는등 앞에 글자수에 제한이 없다.
SELECT WAREHOUSE_ID, WAREHOUSE_NAME, ADDRESS, COALESCE(FREEZER_YN, 'N') AS FREEZER_YN
FROM FOOD_WAREHOUSE
WHERE WAREHOUSE_NAME LIKE '%경기%'
ORDER BY WAREHOUSE_ID ASC
https://school.programmers.co.kr/learn/courses/30/lessons/59041
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
* GROUP 후에 ( 집계 후 ) 필터링 하는 HAVING 절을 사용하는 문제.
* 처음에는 WHERE COUNT(NAME) >= 2 로 계산했지만
* GROUP 후에는 HAVING 절을 사용해야한다.
* 즉 GROUP BY 키워들 사용하지 않으면 HAVING 절을 사용할 수 없다.
SELECT NAME, COUNT(*) AS COUNT
FROM ANIMAL_INS
GROUP BY NAME
HAVING COUNT(NAME) >= 2
ORDER BY NAME ASC
https://school.programmers.co.kr/learn/courses/30/lessons/131530
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
* 그룹별로 카운팅을 하는 SQL 문을 작성해야 함
* 0-9999, 10000-19999, 20000-29999, 30000-49999 이런식으로 구간을 구해야함
* (price/10000) * 10000 을 적용하면 범위에 맞는 값들을 일정하게 반환 받을 수 있다
* 하고 그룹핑을 똑같이 나누어주고 카운팅 하면 된다.
SELECT
FLOOR(PRICE / 10000) * 10000 AS PRICE_GROUP,
COUNT(*) AS PRODUCTS
FROM PRODUCT
GROUP BY FLOOR(PRICE / 10000) * 10000
ORDER BY PRICE ASC
* 일정 값으로 Scaling을 한 후 Grouping 진행
* 각 Grouping한 값들을 count 하는 것이다
https://school.programmers.co.kr/learn/courses/30/lessons/157340
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
* 해당 기간안에 포함되어있는 CAR_Id는 무조건 대여중, 아니면 대여 가능 이렇게 표시해야한다
* GROUP BY 명령어와 MAX() 명령어를 사용하여 해결했다
* 위 명령어를 사용한 이유는 SQL 명령어 실행 순서를 이해하면 된다
* 실행 순서
FROM -> ON -> JOIN -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY -> LIMIT
* 위 순서로 처리되기 때문에 GROUP BY 를 진행한 후에 같은 CAR_ID 로 MAX() 값을 처리하는 것이다
* 이러면은 한번이라도 처리한 부분은 1이기 때문이다
SELECT
CAR_ID,
CASE
WHEN MAX('2022-10-16' BETWEEN START_DATE AND END_DATE) = 1 THEN '대여중'
ELSE '대여 가능'
END AS AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID DESC;
* GROUP BY 실행 -> SELECT 의 MAX() 함수를 실행하기 때문에
한번이라도 범위안에 있으면 1. 따라서 대여중이 표시된다.
* 추가적으로 CASE WHEN THEN ELSE END. 문을 외우면 좋을 것 같다.
++ SQL CASE 문 사용법
SELECT
NAME,
SCORE,
CASE
WHEN SCORE >= 90 THEN 'A'
WHEN SCORE >= 80 THEN 'B'
WHEN SCORE >= 70 THEN 'C'
ELSE 'F'
END AS GRADE
FROM STUDENTS;
* CASE 안에서 값을 변경하거나 컬럼을 추가할때 많이 사용 됨.
++ BETWEEN 문 사용법
* 숫자 비교
SELECT * FROM PRODUCTS
WHERE PRICE BETWEEN 10000 AND 20000;
* 날짜 비교
SELECT * FROM ORDERS
WHERE ORDER_DATE BETWEEN '2023-01-01' AND '2023-01-31';
++ NOT BTWEEN
SELECT * FROM USERS
WHERE AGE NOT BETWEEN 20 AND 29;