호기심 많은 분석가

[MySQL] 프로그래머스 Coding_Test / JOIN (2) 본문

Coding/Coding Test & Algorithm

[MySQL] 프로그래머스 Coding_Test / JOIN (2)

DA Hun 2021. 5. 7. 12:33

포스팅 개요

 SQL 문법과 익숙해지고자 프로그래머스의 SQL Coding Test 문제들을 풀어봄. 그중 JOIN 파트의 문제들을 기록해두었습니다. JOIN 파트에서 가장 어려운 문제들을 조금 자세히 다뤄보기 위해 이번 포스팅을 작성하였습니다. 그 전 문제들은 2021.05.07 - [Coding Test & Algorithm] - [MySQL] 프로그래머스 Coding_Test / JOIN (1)에서 확인하실 수 있습니다.


포스팅 본문

 아래의 문제들은 모두 동일한 TABLE을 기준으로 문제가 주어졌습니다.

TABLE 설명

TABLE SUMMARY


4. 보호소에서 중성화한 동물

 보호소에서 중성화 수술을 거친 동물 정보를 알아보려 합니다. 보호소에 들어올 당시에는 중성화되지 않았지만, 보호소를 나갈 당시에는 중성화된 동물의 아이디와 생물 종, 이름을 조회하는 아이디 순으로 조회하는 SQL 문을 작성해주세요.

- 중성화를 거치지 않은 동물은 성별 및 중성화 여부에 Intact, 중성화를 거친 동물은 Spayed 또는 Neutered라고 표시되어 있습니다.

보호소에서 중성화한 동물

SELECT AI.ANIMAL_ID, AI.ANIMAL_TYPE, AI.NAME
FROM ANIMAL_INS AS AI
LEFT OUTER JOIN
ANIMAL_OUTS AS AO
USING (ANIMAL_ID)
WHERE AI.SEX_UPON_INTAKE LIKE '%Intact%'
AND AO.SEX_UPON_OUTCOME REGEXP  '^(Spayed|Neutered)$'
ORDER BY AI.ANIMAL_ID

 이 문제 덕분에 잊고 있던 LIKE 문법을 다시 사용해보았다. LIKE 문법에 대해 먼저 알아보겠다.

LIKE 연산자는 특정 문자가 포함되어 있는 데이터를 검색할 때 사용한다.

1. 특정 문자로 시작하는 데이터 검색
SELECT [필드명] FROM [테이블명] WHERE [필드명] LIKE '특정 문자열%'
- 뒤에 %를 사용, %를 blah blah 느낌으로 이해하면 된다.

2. 특정 문자로 끝나는 데이터 검색
SELECT [필드명] FROM [테이블명] WHERE [필드명] LIKE '%특정 문자열'

3. 특정 문자를 포함하는 데이터 검색
SELECT [필드명] FROM [테이블명] WHERE [필드명] LIKE '%특정 문자열%'

이때, 복수개의 특정 문자열을 포함하는 데이터를 검색하기 위해서는 OR 연산자를 사용해야한다.
SELECT [필드명] FROM [테이블명] WHERE [필드명] LIKE '%특정 문자열1%' OR '%특정 문자열2%'

 사실 여기까지만 이해해도 4번을 해결하는 데는 큰 무리가 없다. 하지만 OR이 여러번 반복되어야 할 경우 테이블이 굉장히 아름답지 않기에 우리는 REGEXP(정규표현식)에 대해서도 알아보자.

정규표현식(Regular Expression)이란?

정규표현식은 특정한 규칙을 가진 문자열의 집합을 표현하는데 사용하는 형식 언어다.
문자열을 처리하는 방법 중의 하나로, 특정한 조건의 문자를 '검색'하거나 '치환'하는 과정을 매우 간편하게 처리할 수 있도록 해주는 수단이다.

정규표현식은 패턴을 사용해서 문자열을 처리한다.

 이 정규표현식은 텍스트 전처리에도 유용히 쓰이니 알아두면 더 좋다. 방금까지 배웠던 그 2가지를 통해 조건을 설정해두면 4번은 쉽게 해결할 수 있다. 정규표현식에는 %가 쓰이지 않는 것을 주의하자.!

  • 추가 정보 : REGEXP 경우 '^(EXP1|EXP2))$' 중 ^와 $를 쓰지 않으면 오답일 확률이 높다고 합니다.
    • XXEXP1XXX와 같은 경우도 포함되기 때문입니다.

 이렇게 JOIN 문제들도 다 해결해보았습니다. 이제 슬슬 SQL 사용법에 익숙해지고 있습니다.

마지막 String, Date 파트에서 뵙겠습니다. 질문 사항 있으시면 언제든 댓글 남겨주세요. :)