SteadyDrills

[TIL] SQL 연습문제6 & SQL 코딩테스트 연습 문제 본문

SQL

[TIL] SQL 연습문제6 & SQL 코딩테스트 연습 문제

Drills 2024. 6. 14. 17:36

20240614

id name region rating join_date
1 르탄이 한국 1300 2019-06-15
2 배캠이 미국 1500 2020-09-01
3 구구이 한국 1400 2021-01-07
4 이션이 미국 1350 2019-11-15
  • lol_users 테이블에서 각 유저의 레이팅(rating) 순위를 계산하는 쿼리를 작성해 주세요! 전체 지역(region) 기준이고 순위는 레이팅이 높을수록 높아야 해요. (e.g. rating 1400 유저의 순위 > rating 1350 유저의 순위)
SELECT name
FROM lol_users
ORDER BY rating DESC ;
  • lol_users 테이블에서 가장 늦게 게임을 시작한(join_date) 유저의 이름을 선택하는 쿼리를 작성해주세요
SELECT name
FROM lol_users
ORDER BY join_date DESC 
LIMIT 1;
  • lol_users 테이블에서 지역별로 레이팅이 높은 순으로 유저들을 정렬해서 나열하는 쿼리를 작성해 주세요!
SELECT name
FROM lol_users
GROUP BY region
ORDER BY rating DESC ;

 

  • lol_users 테이블에서 지역별로 평균 레이팅을 계산하는 쿼리를 작성해 주세요!
SELECT avg(rating)
FROM lol_users
GROUP BY region ;

 


문제 출처: https://school.programmers.co.kr/learn/courses/30/lessons/151137

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

나의 오답:

SELECT CAR_TYPE, COUNT(CAR_ID) AS CARS
FROM CAR_RENTAL_COMPANY_CAR
WHERE OPTIONS IN ('통풍시트', '열선시트', '가죽시트')
GROUP BY CAR_TYPE
ORDER BY CAR_TYPE;

 

 위 답을 쓴 이유는  options 안의 컬럼들을 or 없이 선택해 쿼리를 가독성있게  작성한 거였는데, 위의 쿼리로 실행하면 하나의 데이터도 추출 되지않았다. in  뒤에 통풍시트만 둬보기도 하고 ,열선시트 까지만 써보기도 했다.

 하지만 결과에 나오는 데이터는 없었고, 예시 시트를 자세히 보다 깨달았다. 지금까지 예제는 하나의 컬럼 데이터에 한 가지 단어로 된 정보만 이 있었는데, options에는 여러 옵션을 넣은 단어들이 나열된 하나의 문자열 데이터였다.

그 말은 컴퓨터는 저 옵션들을 하나의 문자열 데이터로 보고 있기 때문에 in을 사용해서는 안 나온다는 것이었다.

 

나의 답:

SELECT CAR_TYPE, COUNT(CAR_ID) AS CARS
FROM CAR_RENTAL_COMPANY_CAR
WHERE OPTIONS like '%통풍시트%' or like'%열선시트%' or like '%가죽시트%'
GROUP BY CAR_TYPE
ORDER BY CAR_TYPE;

 그래서 나는 'LIKE'를 이용해 답을 맞힐 수 있었다.

그리고 문제에서 의도한 답은 REGEXP 함수를 사용하는 것이었다.

REGEXP 함수는 정규 표현식을 사용하여 패턴 매칭을 수행할 때 사용 된다고 한다. like를 사용하면 위의 답처럼 조금 문장이 길게 코드를 만들게 되는데 반해 REGEXP 함수를 사용하면

SELECT CAR_TYPE, COUNT(CAR_ID) AS CARS
FROM CAR_RENTAL_COMPANY_CAR
WHERE OPTIONS REGEXP '통풍시트|열선시트|가죽시트' 
GROUP BY CAR_TYPE
ORDER BY CAR_TYPE ;

이런 식으로 표현된다.