문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/164673
문제
USED_GOODS_BOARD와 USED_GOODS_REPLY 테이블에서 2022년 10월에 작성된 게시글 제목, 게시글 ID, 댓글 ID, 댓글 작성자 ID, 댓글 내용, 댓글 작성일을 조회하는 SQL문을 작성해주세요. 결과는 댓글 작성일을 기준으로 오름차순 정렬해주시고, 댓글 작성일이 같다면 게시글 제목을 기준으로 오름차순 정렬해주세요.
풀이
SELECT A.TITLE, A.BOARD_ID, B.REPLY_ID, B.WRITER_ID, B.CONTENTS, DATE_FORMAT(B.CREATED_DATE, '%Y-%m-%d') AS CREATED_DATE FROM USED_GOODS_BOARD AS A JOIN USED_GOODS_REPLY AS B ON A.BOARD_ID=B.BOARD_ID WHERE DATE_FORMAT(A.CREATED_DATE, '%Y-%m') LIKE "2022-10" ORDER BY CREATED_DATE , A.TITLE
date_format 함수를 사용해 문제에서 요구하는 2022년 10월 형태로 변형 후 like로 조건을 확인한다.
substr(B.CREATED_DATE, 1, 7) 로 잘라서 문제를 풀 수 있다.
또는 '2022-10%' 으로도 풀수있다.
like 보다는 = 을 사용하는 것이 좋다. 패턴 매칭이기 때문에 이와 같은 문제에서는 =을 사용 하는것이 좋을 것이다.
이 문제에 created_date의 타입이 date인데 실제 데이터는 2022-10-15 00:00:00 로 되어있는것이 많이 거슬렸다.. 고쳤으면 한다.

문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/133025
문제
상반기 아이스크림 총주문량이 3,000보다 높으면서 아이스크림의 주 성분이 과일인 아이스크림의 맛을 총주문량이 큰 순서대로 조회하는 SQL 문을 작성해주세요.
풀이
SELECT A.FLAVOR FROM FIRST_HALF A JOIN ICECREAM_INFO B ON A.FLAVOR = B.FLAVOR WHERE A.TOTAL_ORDER > 3000 AND B.INGREDIENT_TYPE = 'fruit_based' ORDER BY A.TOTAL_ORDER DESC
간단하게 아이스크림 정보 테이블에서 성분이 과일 베이스인 것을 찾고 상반기 아이스크림 테이블과 조인하여 찾으면 된다.
문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/132203
문제
DOCTOR 테이블에서 진료과가 흉부외과(CS)이거나 일반외과(GS)인 의사의 이름, 의사ID, 진료과, 고용일자를 조회하는 SQL문을 작성해주세요. 이때 결과는 고용일자를 기준으로 내림차순 정렬하고, 고용일자가 같다면 이름을 기준으로 오름차순 정렬해주세요.
풀이
SELECT DR_NAME, DR_ID, MCDP_CD, SUBSTR(HIRE_YMD,1,10) FROM DOCTOR WHERE MCDP_CD = 'CS' OR MCDP_CD = 'GS' ORDER BY HIRE_YMD DESC, DR_NAME
OR 과 IN 차이
이 문제는 OR 또는 IN으로 WHERE 절을 만족할 수 있다.
OR (같은 컬럼): 인덱스 사용 O, 실행 계획은 IN과 거의 동일.
IN: 가독성이 좋고, MySQL 내부 최적화가 안정적으로 적용됨.
실제 성능은 거의 차이가 없음 → IN이 조금 더 최적화된 경우가 많음.
문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/301646
문제
2번 형질이 보유하지 않으면서 1번이나 3번 형질을 보유하고 있는 대장균 개체의 수(COUNT)를 출력하는 SQL 문을 작성해주세요. 1번과 3번 형질을 모두 보유하고 있는 경우도 1번이나 3번 형질을 보유하고 있는 경우에 포함합니다.
풀이
SELECT COUNT(*) COUNT FROM ECOLI_DATA WHERE GENOTYPE & 2 = 0 AND (GENOTYPE & 1 = 1 OR GENOTYPE & 4 = 4);
형질을 2진수로 나타내어 1,2,3,4 형질로 판별하는 문제이다.
GENOTYPE 15 면 1111(2) 로 1,2,3,4 형질이 다 있는것이다. 0 인부분이 형질을 갖고 있지 않다. 1101(2) 이면 2형질이 없고 1,3,4 형질은 있는것이다.
비트 풀이로 풀면되는 문제이다.
비트를 어떻게 사용하는지 알면 쉽게 풀리는 문제이다.
- IFNULL(TLNO,"NONE") -> TLNO 가 NULL 일때 문자열 NONE으로 대체
- ROUND(AVG(DAILY_FEE)) -> ROUND(숫자, 자릿수) 자릿수를 생략하면 0이다.
- YEAR(), MONTH(), DAY() -> 각 년 월 일 추출하기
- WHERE 'Python' IN (SKILL_1, SKILL_2, SKILL_3);
WHERE 절에서 NVL, SUBSTR, LIKE %_ , NULL, IN, OR 은 시작점과 끝점을 알 수 없어서 인덱스를 탈 수 없다.
하지만 OR, IN은 내부적으로 옵티마이저가 UNION을 사용해 RANGE SCAN을 하면 가능하다.