코테 대비 프로그래머스 SQL 고득점 Kit를 벼락치기로 풀어보고자 한다.
문제를 풀이하며 잊고있던 MySQL 문법을 정리하여 풀이와 함께 올리겠다!
[출제 빈도 : 낮음, 평균 점수 : 높음, 문제세트 : 20]
[Level 2]
조건
1. 3월 생일
2. 여성
3. 전화번호 null 제외
+회원id 기준 오름차순 정렬
주의사항
DATE_OF_BIRTH의 데이트 포맷이 예시와 동일해야 정답처리
SELECT MEMBER_ID, MEMBER_NAME, GENDER, DATE_FORMAT(DATE_OF_BIRTH, '%Y-%m-%d') AS DATE_OF_BIRTH
FROM MEMBER_PROFILE
WHERE GENDER = 'W'
AND MONTH(DATE_OF_BIRTH) = 3
AND TLNO IS NOT NULL
ORDER BY MEMBER_ID
SELECT * FROM 테이블 WHERE YEAR(컬럼명) = "2021"
문자열이 아닌 그냥 = 2021 을 해도 되는 것 같다. 위의 문제에서도 = 3이 아니라 = '03', = '3'으로 해도 맞다.
DATE_FORMAT(컬럼명, 형식)
%Y : 연도, 숫자, 네자리, %y : 연도, 숫자, 두자리
%M : 월, 이름(January..December), %m : 월, 숫자(00..12)
%D : 영어, 날(0th, 1st, 2nd, ..), %d : 월, 일(00..31)
SELECT DATE_FORAT(컬럼명, '%Y-%m-%d') FROM 테이블
is null
특정 컬럼에 null 값이 있으면 가지고 있는 데이터 반환
is not null
특정 컬럼에 null값을 가지고 있지 않은 데이터 반환
SELECT *
FROM 테이블
WHERE TLNO IS NOT NULL
ORDER BY
정렬은 기본적으로 오름차순(ASC)이다.
오름차순 정렬
ORDER BY 컬럼명 또는 ORDER BY 컬럼명 ASC
내림차순 정렬
ORDER BY 컬럼명 DESC
SELECT *
FROM 테이블
WHERE TLNO IS NOT NULL
ORDER BY MEMBER_ID
첫 문제여서 정리할 부분이 많은 거겠지요 .. ? ^.^
중복되는 부분은 문법으로 다루지 않을 것입니다!
두번째 문제 풀이도 이어가겠습니다.
[Level 1]
조건
1. 총주문량 3000 초과
2. 주성분이 과일
+아이스크림 맛을 총주문량 큰 순서대로(내림차순) 정렬
SELECT F.FLAVOR
FROM FIRST_HALF AS F, ICECREAM_INFO AS I
WHERE F.FLAVOR = I.FLAVOR
AND F.TOTAL_ORDER > 3000
AND I.INGREDIENT_TYPE = 'fruit_based'
ORDER BY F.TOTAL_ORDER DESC
SELECT F.FLAVOR
FROM FIRST_HALF AS F
INNER JOIN ICECREAM_INFO AS I
ON F.FLAVOR = I.FLAVOR
WHERE F.TOTAL_ORDER > 3000
AND I.INGREDIENT_TYPE = 'fruit_based'
ORDER BY F.TOTAL_ORDER DESC
위의 두 코드는 결국 같은 실행 결과를 보인다. (mysql에서만 가능)
대신 where에 조건으로 F.FLAOR = I.FLAVOR을 꼭 추가해줘야 한다.
SELECT F.FLAVOR
FROM FIRST_HALF AS F
LEFT JOIN ICECREAM_INFO AS I
ON F.FLAVOR = I.FLAVOR
WHERE F.TOTAL_ORDER > 3000
AND I.INGREDIENT_TYPE = 'fruit_based'
ORDER BY F.TOTAL_ORDER DESC
SELECT *
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
설명 생략
(그냥 * 이용하면 끝.)
[Level 1]
조건
1. 나이 12세 이하
2. 성별 여자
3. 조회할 것 : 환자이름, 환자번호, 성별코드, 나이, 전화번호 순
4. 전화번호 NULL이면 'NONE'으로 출력
+나이 기준 내림차순 정렬, 나이 같으면 환자이름 기준 오름차순 정렬
SELECT PT_NAME, PT_NO, GEND_CD, AGE, IFNULL(TLNO, 'NONE') AS TLNO
FROM PATIENT
WHERE AGE <= 12
AND GEND_CD = 'W'
ORDER BY AGE DESC, PT_NAME ASC
주의할 점 : 테이블 조회 순서 주의, PT_NO보다 PT_NAME가 먼저 출력되어야 함. 아니면 틀림킄킄
IFNULL
(MySQL에서 컬럼 값이 NULL인 경우를 처리해주는 함수에는 IFNULL
, CASE
등이 있다.
SELECT IFNULL(컬럼명, "Null일 경우 대체 값") FROM 테이블
CASE에 대해서는 추후 다룰 예정..
위와 같이 AGE를 기준으로 내림차순 정렬, AGE 값이 같다면 ID 기준 오름차순 정렬을 하고 싶을 때 다중 정렬 이용.
원하는 우선순위대로 ORDER BY 뒤에 써주면 된다.
SELECT * FROM TABLE ORDER BY AGE, ID, ...
내림차순, 오름차순을 반영하려면
SELECT * FROM TABLE ORDER BY AGE DESC, ID ASC, ...
[Level 2]
조건
1. 동일한 회원이 동일한 상품 재구매 했는지
SELECT USER_ID, PRODUCT_ID
FROM ONLINE_SALE
GROUP BY USER_ID, PRODUCT_ID
HAVING COUNT(*) >= 2
ORDER BY USER_ID ASC, PRODUCT_ID DESC
셀프조인.. ? 뭐 이런 거 써야 되나 했는데 해결 못함.
사실 개쉬웠음. group by랑 having, count 쓰면 끝
GROUP BY 를 통해 집계하고, HAVING문을 통해 집계 결과에 조건을 넣는 방식
이 문제에서는 USER_ID, PRODUCT_ID 두개의 속성을 GROUP BY 시킨다.
이때, 이 두개의 속성은 모두 SELECT절에 나타나야 한다.
WHERE문 VS HAVING문
WHERE문 : 데이터 행에서 조건을 만족하는 데이터만을 필터링하는 구문
HAVING문 : GROUP BY문을 통해 집계한 이후, 만족하는 데이터만을 필터링하는 구문
(설명 생략)
불친절해도 이해해주세효 .. 이것은 단순 정리용
[Level 1]
SELECT NAME, DATETIME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID DESC
설명 생략
[Level 1]
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION = 'Sick'
ORDER BY ANIMAL_ID
설명 생략
[Level 1]
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE NOT INTAKE_CONDITION = 'Aged'
ORDER BY ANIMAL_ID
설명 생략
[Level 1]
SELECT ANIMAL_ID, NAME, DATETIME
FROM ANIMAL_INS
ORDER BY NAME, DATETIME DESC
설명 생략
[LEVEL 1]
SELECT NAME
FROM ANIMAL_INS
WHERE DATETIME = (SELECT MIN(DATETIME) FROM ANIMAL_INS)
WHERE구문에 서브 쿼리를 이용하면 된다.
찾는 조건의 ROW를 가져오고, 그 중 NAME을 SELECT.
SELECT NAME
FROM ANIMAL_INS
ORDER BY DATETIME
LIMIT 1;
정렬하고, LIMIT 구를 이용해도 된다.
SELECT * FROM EMPLOYEE WHERE SALARY = (SELECT MAX(SALARY) FROM EMPLOYEE)
LIMIT 1 : 맨 위에서부터 1개까지의 정보 조회
따라서, ORDER BY와 짝지어 사용하면 된다.
SELECT *
FROM EMPLOYEE
ORDER BY DATETIME
LIMIT 1
[Level 1]
SELECT COUNT(*)
FROM USER_INFO
WHERE YEAR(JOINED) = '2021'
AND AGE BETWEEN 20 AND 29
a와 b 사이의 모든 값에 해당하는지 확인
SELECT * FROM 테이블명 WHERE DATETIME BETWEEN '2022-09-01' and '2022-09-26'
[Level 1]
SELECT DR_NAME, DR_ID, MCDP_CD, DATE_FORMAT(HIRE_YMD, '%Y-%m-%d') AS HIRE_YMD
FROM DOCTOR
WHERE MCDP_CD = 'CS'
OR MCDP_CD = 'GS'
ORDER BY HIRE_YMD DESC, DR_NAME ASC
❗ 주의사항 잘보기..! 날짜 포맷 출력 예시와 똑같이 출력하기
[Level 1]
SELECT ROUND(AVG(DAILY_FEE)) AS AVERAGE_FEE
FROM CAR_RENTAL_COMPANY_CAR
WHERE CAR_TYPE = 'SUV'
추가로,
[Level 1]
조건
1. address칼럼에서 '강원도'를 포함하는지
SELECT FACTORY_ID, FACTORY_NAME, ADDRESS
FROM FOOD_FACTORY
WHERE ADDRESS LIKE '강원도%'
: 특정 문자가 포함되어 있는 데이터를 검색할 때 사용
1) 특정 문자로 시작하는 데이터 검색
SELECT * FROM 테이블명 WHERE 컬럼명 LIKE '특정 문자열%'
2) 특정 문자로 끝나는 데이터 검색
SELECT * FROM 테이블명 WHERE 컬럼명 LIKE '%특정 문자열'
3) 특정 문자를 포함하는 데이터 검색
SELECT * FROM 테이블명 WHERE 컬럼명 LIKE '%특정 문자열'%
14개 문제에 대해 풀이를 적었는데 .. 나머지는 너무 겹치는 내용이거나, Level 4 문제여서 일단 스킵하였다.
다음 편을 먼저 풀어보고 시간이 되면 Level 4 문제를 풀이하도록 하겠다 ^-6
SQL 100% 정답률을 위하여 .. 💭