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테이블의 구조는 다음과 같으며ID,NAME,HOST_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라고 쿼리문안에 쿼리문을 사용하는 방식을 말한다.
다른문제들은 시도라도 해봤으나 해당 문제는 아예 손도 못댔다.
네번째 문제는 프로그래머스에서 가져온걸로 앞으로 프로그래머스에서 쿼리문 연습도 해봐야겠다.