[내일배움캠프] TIL_230111

JungHoon Han·2023년 1월 11일
0

내일배움캠프

목록 보기
51/78

SQL Query문 지식부족

오늘은 내배캠 선발대 첫번째 수업이 있는 날이였다.
첫날인 오늘은 학생들의 수준을 파악하겠다고 5문제를 준비하셨으나 시간 관계상 4문제만 진행했다. 그동안 Sequelize만 약 한달동안 썼다고 전에 배웠던 쿼리문이 기억이 안났다.
구글링도 하지말고 순전히 머리속에 있는것만 가지고 작성하라고 하시니 내 지식이 얼마나 부족한지 느낄 수 있었다.
내 머리속에는 SELECT FROM 정도가 다였다.
사실 쿼리문 공부를 크게 안한것도 있긴하니 당연한 수준이다..

첫번째 문제

  • 다음과 같은 스키마의 employees라는 테이블이 있습니다.
    - department_id(부서 ID. INT), salary(연봉. INT), comm(커미션. INT)
    Q. 연봉이 최대 5,000만원을 넘지 않는 부서 ID가 17인 사원들 및 부서 ID가 5번인 모든 사원들 및 커미션을 받는 사원들의 목록을 찾고 싶습니다. 어떻게 쿼리문을 작성하면 될까요?

SELECT * FROM employees WHERE (salery <= 50000000 AND department_id = 17) OR department_id = 5 OR comm > 0
이런식으로 WHERE뒤에 특정 조건을 사용할 수 있었다.

두번째 문제

  • 다음과 같은 스키마의 students라는 테이블이 있습니다.
    - student_name(학생 이름. VARCHAR), track(트랙. VARCHAR)
    Q. track이 “Node.js”이거나 “React”인 학생들 중 성이 “김”씨거나 끝의 이름이 “호”로 끝나는 학생들의 명단(student_name)을 알고 싶습니다. 어떻게 쿼리문을 작성하면 될까요?

SELECT student_name FROM students WHERE (track IN('Node.js','React') AND (student_name LIKE '김%' OR student_name LIKE '%호'))
여기에서 %를 사용하였는데 김% 는 '김'으로 시작하는 모든것이고, %호 는 '호'로 끝나는 모든것을 가리킨다. %정% 이라면 가운데 정이 들어가는 모든것을 가리킨다.

세번째 문제

  • 다음과 같은 스키마의 lol_players라는 테이블이 있습니다.
    - player_id(플레이어 ID, INT), name(플레이어 이름, VARCHAR), rank_score(랭크게임 점수, INT)
    Q. rank_score가 1000 이하면 “IRON”, 1001 ~ 2000 사이면 “BRONZE”, 2001 ~ 3000 사이면 “SILVER” 3001 이상이면 “GOD”을 출력하는 rank_result라는 이름의 컬럼을 포함하여 name과 같이 결과를 알고 싶습니다. 어떻게 쿼리문을 작성하면 될까요?
    Bonus Q. 위의 문제에서 rank라는 컬럼으로 결과를 알 수 있을 것 같은데 왜 굳이 제가 rank_result라는 이름의 컬럼으로 썼을까요?

SELECT name, CASE WHEN rank_score <= 1000 THEN 'IRON' WHEN rank_score <= 1000 THEN 'BRONZE' WHEN rank_score <= 1000 THEN 'SILVER' ELSE 'GOD' END AS rank_result FROM lol_players

CASE를 사용하여 IF문처럼 사용하였고, 마지막에는 ELSE를 사용하고 END로 끝을냈다. AS는 별칭을 붙이는것처럼 사용한다.

네번째 문제
PLACES 테이블은 공간 임대 서비스에 등록된 공간의 정보를 담은 테이블입니다. PLACES 테이블의 구조는 다음과 같으며 IDNAMEHOST_ID는 각각 공간의 아이디, 이름, 공간을 소유한 유저의 아이디를 나타냅니다. ID는 기본키입니다.

문제

이 서비스에서는 공간을 둘 이상 등록한 사람을 "헤비 유저"라고 부릅니다. 헤비 유저가 등록한 공간의 정보를 아이디 순으로 조회하는 SQL문을 작성해주세요.

예시

예를 들어, PLACES 테이블이 다음과 같다면

  • 760849번 유저는 공간을 3개 등록했으므로 이 유저는 헤비유저입니다.
  • 30900122번 유저는 공간을 2개 등록했으므로 이 유저는 헤비유저입니다.
  • 21058208번 유저는 공간을 1개 등록했으므로 이 유저는 헤비유저가 아닙니다.
    따라서 SQL 문을 실행하면 다음과 같이 나와야 합니다.

SELECT ID, NAME, HOST_ID FROM PLACES WHERE HOST_ID IN (SELECT HOST_ID FROM PLACES GROUP BY HOST_ID HAVING COUNT(HOST_ID) > 1) ORDER BY ID
이건 subQuery라고 쿼리문안에 쿼리문을 사용하는 방식을 말한다.
다른문제들은 시도라도 해봤으나 해당 문제는 아예 손도 못댔다.
네번째 문제는 프로그래머스에서 가져온걸로 앞으로 프로그래머스에서 쿼리문 연습도 해봐야겠다.

profile
Node.js 주니어 개발자

0개의 댓글