내일배움캠프 4기/TIL

DAY 42. DataBase(SQL)

H-JJOO 2023. 1. 11. 21:03
  • 오늘 한거

선발대 상황파악 테스트

 

  • 문제발생

SQL 다 까먹음

 

  • 시도

해설 강의 수강

 

  • 해결방안

가능한 정답 쿼리문을 구하려고 노력 (구글링 X)

 

  • 알게 된 것 

Q1.

  • 다음과 같은 스키마의 employees라는 테이블이 있습니다.
    • department_id(부서 ID. INT), salary(연봉. INT), comm(커미션. INT)

Q.

연봉이 최대 5,000만원을 넘지 않는 부서 ID가 17인 사원들 및 부서 ID가 5번인 모든 사원들 및 커미션을 받는 사원들의 목록을 찾고 싶습니다. 어떻게 쿼리문을 작성하면 될까요?

 

A. 

SELECT * FROM employees WHERE (salary <= 50000000) 

AND department_id = 17 department_id = 5 OR comm > 0

 

KEY WORD :

 

- SELECT * FROM

 

- WHERE

 

- AND

 

- OR

 

Q2. 

  • 다음과 같은 스키마의 students라는 테이블이 있습니다.
    • student_name(학생 이름. VARCHAR), track(트랙. VARCHAR)

Q. track이 “Node.js”이거나 “React”인 학생들 중 성이 “김”씨거나 끝의 이름이 “호”로 끝나는 학생들의 명단(student_name)을 알고 싶습니다. 어떻게 쿼리문을 작성하면 될까요?

 

A.

SELECT student_name FROM students

WHERE (track IN ('Node.js', 'React') AND (student_name LIKE '김%' OR student_name LIKE '%호'))

 

KEY WORD :

 

- IN

 

- LIKE

 

- %

 

Q3.

  • 다음과 같은 스키마의 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라는 이름의 컬럼으로 썼을까요?

 

A.

SELECT name CASE

WHEN rank_score <= 1000 THEN 'IRON'

WHEN rank_socre <= 2000 THEN 'BRONZE'

WHEN rank_score <= 3000 THEN 'SLIVER'

ELSE 'GOD' END AS rank_result FROM lol_players

 

KEY WORD :

 

- CASE

 

- WHEN

 

- THEN

 

- ELSE

 

- END

 

- AS

 

- 왜 rank 를 쓰지않고 rank_result 를 썼을까? 이유는 SQL 예약어에 RANK 가 약속 되어있기 때문이다.

 

Q4. 

문제 설명

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

문제

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

예시

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

  • 760849번 유저는 공간을 3개 등록했으므로 이 유저는 헤비유저입니다.
  • 30900122번 유저는 공간을 2개 등록했으므로 이 유저는 헤비유저입니다.
  • 21058208번 유저는 공간을 1개 등록했으므로 이 유저는 헤비유저가 아닙니다.

따라서 SQL 문을 실행하면 다음과 같이 나와야 합니다.

 

A.

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

 

KEY WORD :

 

- 서브쿼리 : 쿼리 안의 쿼리, HOST_ID 를 가져오기 위한

 

- GROUP BY

 

- HAVING

 

- COUNT

 

- ORDER BY

 

 

 

[결론]

 

인간은 망각의 동물

 

반복하자