SQL 코딩테스트 준비를 위해 해커랭크 문제풀이를 해보려고 합니다. 서버는 MySQL을 기준으로 설정하였으며, 문제의 핵심은 [sql 문자열 함수를 인지하고, 문자와 연결하는 함수 CONCAT]을 활용하는 것입니다. 문제 분석을 통해 정답 SQL 쿼리와 오답을 포함한 자세한 풀이 과정을 작성했습니다. SQL 코딩 능력을 키우고자 하는 분들에게 도움이 될 수 있도록 문제 해결에 필요한 사고 과정과 코드 설명을 상세히 다루었습니다. 🔥
📌 SQL 문자열 함수: CONCAT 및 SUBSTRING 정리
1. CONCAT 함수
CONCAT 함수는 여러 개의 문자열을 하나로 결합하는 데 사용됩니다. 이 함수는 데이터베이스에서 다양한 문자열을 조합하여 새로운 문자열을 생성할 수 있게 해줍니다.
예시:
name , actor -> name (A)
SELECT CONCAT(Name, '(', SUBSTRING(occupation, 1, 1), ')')
FROM occupations
ORDER BY name;
2. SUBSTRING 함수
SUBSTRING 함수는 문자열의 특정 부분을 추출하는 데 사용됩니다. 이 함수는 시작 위치와 길이를 인자로 받아 해당 부분 문자열을 반환합니다.
예시 :
occupation의 첫글자만 추출
doctor -> d
SELECT SUBSTRING(occupation, 1, 1)
FROM occupations;
다른 문자열 함수 예시
3. LENGTH 함수
LENGTH 함수는 문자열의 길이를 반환합니다. 예를 들어, 특정 직업의 길이를 확인할 수 있습니다.
예시:
SELECT occupation, LENGTH(occupation) AS occupation_length
FROM occupations;
4. LOWER 함수
LOWER 함수는 문자열을 소문자로 변환합니다. 이를 통해 데이터의 일관성을 유지할 수 있습니다.
예시:
SELECT LOWER(occupation)
FROM occupations;
5. UPPER 함수
UPPER 함수는 문자열을 대문자로 변환합니다.
예시:
SELECT UPPER(Name)
FROM occupations;
6. TRIM 함수
TRIM 함수는 문자열의 앞뒤 공백을 제거합니다.
예시:
SELECT TRIM(Name)
FROM occupations;
📌 SQL 문자열 함수 활용 문제! CONCAT 및 SUBSTRING 활용
문제 : The PADS (Hackerrank SQL MySQL)
난이도 : Medium
서버 : MySQL
테이블 이름 : OCCUPATIONS
문제 의도 :
문제 요약 :
Input sample과 output sample 테이블을 보면 이해하기 쉽다.
추출해야 할 열: name, occupation(첫 글자만), 문장
여기서 문장은: There are a total of [occupation_count] [occupation]s.
input sample
output sample
정답 sql 코드 :
SELECT CONCAT(Name, '(', SUBSTRING(occupation,1,1), ')')
FROM occupations
order by name;
SELECT CONCAT('There are a total of ', COUNT(occupation),' ', lower(occupation), 's.')
FROM OCCUPATIONS
GROUP BY occupation
ORDER BY COUNT(occupation)
sql 풀이과정 :
(나의 풀이 사고과정 정리)
일단,
사고 과정 1 :
output sample 보는순간..음 다른 형태의 행을 어떻게 추출하지?
UNION이나 UNION ALL 로 결합할 수 없는데..?
-> 연달아 작성하면 끝.
사고 과정 2: 문자열 함수 substring이랑 concat 함수 이용해야겠다.
따라서, 다음과 같은 코드를 실행하면 정답!
SELECT CONCAT(Name, '(', SUBSTRING(occupation,1,1), ')')
FROM occupations
order by name;
SELECT CONCAT('There are a total of ', COUNT(occupation),' ', lower(occupation), 's.')
FROM OCCUPATIONS
GROUP BY occupation
ORDER BY COUNT(occupation)