문제

Two pairs (X1, Y1) and (X2, Y2) are said to be symmetric pairs if X1 = Y2 and X2 = Y1.
Write a query to output all such symmetric pairs in ascending order by the value of X. List the rows such that X1 ≤ Y1.

 

*

Join문을 활용해서 구할 수 있는 문제이다.

 

 

실행 코드

 

1) X!=Y, 즉 X<Y인 케이스 -> INNER JOIN으로 짝 구하기

2) X=Y 인 케이스 -> HAVING COUNT(*) >= 2 조건을 추가해서 짝 구하기

 

두 가지 케이스를 UNION으로 합쳐주면 간단하게 풀 수 있다.

문제

REST_INFO와 REST_REVIEW 테이블에서 서울에 위치한 식당들의 식당 ID, 식당 이름, 음식 종류, 즐겨찾기수, 주소, 리뷰 평균 점수를 조회하는 SQL문을 작성해주세요. 이때 리뷰 평균점수는 소수점 세 번째 자리에서 반올림 해주시고 결과는 평균점수를 기준으로 내림차순 정렬해주시고, 평균점수가 같다면 즐겨찾기수를 기준으로 내림차순 정렬해주세요.

 

 

실행 코드

GROUP BY 사용해서 REST_ID를 묶어줘야 정답 처리가 된다~

'Data > SQL' 카테고리의 다른 글

[HackerRank] Weather Observataion Station 5  (0) 2023.07.24
[HackerRank] Symmetric Pairs  (0) 2023.03.17
[HackerRank] New Companies  (0) 2023.03.14
[HackerRank] Placements  (0) 2023.03.13
[HackerRank] Top Competitors  (0) 2023.03.11

문제

Given the table schemas below, write a query to print the company_code, founder name, total number of lead managers, total number of senior managers, total number of managers, and total number of employees. Order your output by ascending company_code.

 

 

 

실행 코드

 

5개의 테이블을 LEFT JOIN으로 줄줄이 연결해주면 된다.

문제

Write a query to output the names of those students whose best friends got offered a higher salary than them. Names must be ordered by the salary amount offered to the best friends. It is guaranteed that no two students got same salary offer.

*

 

 

실행 코드

 

3개의 테이블이 제시되어 있는데, 먼저 본인을 기준으로 연봉 테이블을 구해준 뒤, 본인의 친구 기준으로 연봉 테이블을 연결해주어야 한다.

나는 from절에서 서브쿼리를 사용해서 조건을 추가했다.

 

1. 서브쿼리를 통해 본인의 연봉 제시

2. 본 쿼리에서 'INNER JOIN Packages P ON P.ID = A.Friend_ID' 구문을 추가하여 친구의 연봉 구분한 후 WHERE절로 비교

 

 

문제

Julia just finished conducting a coding contest, and she needs your help assembling the leaderboard! Write a query to print the respective hacker_id and name of hackers who achieved full scores for more than one challenge. Order your output in descending order by the total number of challenges in which the hacker earned a full score. If more than one hacker received full scores in same number of challenges, then sort them by ascending hacker_id.

 

1. 2개 이상의 챌린지 성공 및 만점 획득한 hacker를 찾아야 한다.

2. Difficulty테이블에서 difficulty_level에 따른 score와 hacker들이 획득한 score, difficulty_level이 일치하는지 확인해야 한다.

 

총 4개의 테이블이 있으며, 이들을 모두 inner_join 해준 후 차례대로 조건을 걸어주면 된다.

 

 

실행 코드

HAVING COUNT(H.HACKER_ID) > 1 조건을 추가해서 2개 이상의 챌린지를 한 hacker를 찾아주었다.

테이블이 4개라서 join절을 작성한 구문이 조금 복잡하다고 느껴지는데, 코드를 뜯어보면 전혀.. 그렇지 않다!

 

문제

FOOD_PRODUCT 테이블에서 식품분류별로 가격이 제일 비싼 식품의 분류, 가격, 이름을 조회하는 SQL문을 작성해주세요. 이때 식품분류가 '과자', '국', '김치', '식용유'인 경우만 출력시켜 주시고 결과는 식품 가격을 기준으로 내림차순 정렬해주세요.

 

실행 코드

이전에 풀었던 즐겨찾기 식당 문제와 유사한 문제이다.

where절에 이중쿼리를 조건문으로 넣어서 풀이했다.

 

 

이중쿼리 부분이 여전히 약한데, 여러 문제 풀어보면서 보완해야겠다 !

문제

REST_INFO 테이블에서 음식종류별로 즐겨찾기수가 가장 많은 식당의 음식 종류, ID, 식당 이름, 즐겨찾기수를 조회하는 SQL문을 작성해주세요. 이때 결과는 음식 종류를 기준으로 내림차순 정렬해주세요.

 

 

 

풀이 코드

처음 작성했던 코드는 where in 절 대신 주석 처리된 줄을 포함해서 실행했었다.

두 코드 모두 동일한 답을 출력하긴 하지만, where in 절을 포함시키지 않으면 오류 발생 가능성이 있기 때문에(중복 처리 가능성으로 생각된다..) 오답 처리가 되는 것 같다.

이런 부분까지 생각하고 쿼리를 잘 설계해야 하는데.. 아직 더 많은 공부와 노력이 필요하다는 걸 느꼈다. ~~

문제

CAR_RENTAL_COMPANY_CAR 테이블과 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블과

CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블에서 자동차 종류가 '세단' 또는 'SUV' 인 자동차 중 2022년 11월 1일부터 2022년 11월 30일까지 대여 가능하고 30일간대여 금액이 50만원 이상 200만원 미만인 자동차에 대해서 자동차 ID, 자동차 종류, 대여 금액(컬럼명: FEE) 리스트를 출력하는 SQL문을 작성해주세요. 결과는 대여 금액을 기준으로 내림차순 정렬하고, 대여 금액이 같은 경우 자동차 종류를 기준으로 오름차순 정렬, 자동차 종류까지 같은 경우 자동차 ID를 기준으로 내림차순 정렬해주세요.

 

 

조건1. CAR_RENTAL_COMPANY_RENTAL_HISTORY에서 start_date와 end_date를 활용하여 명시된 대여 가능 기간에 따른 car_id 뽑기

조건2. 30일 간의 기간 타입, 대여 금액 범위는 500,000 이상, 2,000,000 미만

 

 

 

 

실행 코드

car_rental_company_rental_history 테이블을 이중쿼리로 작성하여 대여 가능 기간을 설정해줬다. 대여 가능 기간 조건만 설정하면 나머지는 문제에 따라 차례대로 조건을 추가해주면 정답이 나온다. 코드 보면 뭔가 복잡한 것 같지만... 조건에 따라서 차근차근 작성하니까 구할 수 있었다!

 

근데 문제에 duration_type이 아니라.. dutaion_type으로 오타가 나있어서 처음에 오타난 컬럼명으로 쿼리 작성하다가 계속 오류가 나서 당황했다.. 그냥 스펠링 틀린 채로 컬럼명을 설정했다고 생각했는데...아니었다. ㅎㅎ

작년 인턴을 한 후로 SQL을 완전히 까먹었다.

데이터 분야에서 SQL 능력은 기본 중의 기본이기 때문에..

복습 및 실력 향상을 위해 오늘부터 SQL 코딩 테스트 문제 풀이를 시작했다.

기본적인 것부터 시작해서 난이도 있는 문제 풀이까지 해야겠다.

파이팅..

 

 

 

01. 조건에 맞는 도서와 저자 리스트 출력하기

- BOOK, AUTHOR 두 개의 테이블 존재

- 경제 카테고리에 속하는 도서들의 도서 ID, 저자명, 출판일 리스트를 출력하는 SQL문 작성

- 출판일 기준으로 오름차순 정렬

- 출판일의 데이트 포맷이 예시와 동일해야 정답처리(ex. 2023-01-28)

 

 

 

풀이 코드

JOIN문을 활용하면 풀 수 있는 쉬운 문제이다.

JOIN은 기본적으로 두 테이블 간의 공통 컬럼을 KEY로 연결하여 사용한다.

이 문제에서는 AUTHOR_ID가 공통적으로 두 테이블에 존재하기 때문에 이를 사용해서 문제를 풀었다.

 

 

 

 

02. 없어진 기록 찾기

- ANIMAL_INS, ANIMAL_OUTS 두 개의 테이블 존재

천재지변으로 인해 일부 데이터가 유실

- 입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 ID와 이름을 ID 순으로 조회하는 SQL문 작성

 

* ANIMAL_INS : 보호소에 들어온 동물 리스트 모아놓은 테이블

* ANIMAL_OUTS : 입양 보낸 동물 리스트 모아놓은 테이블

* ANIMAL_ID : 외래키

 

 

 

풀이 코드

문제 내용만 제대로 이해하면 쉬운 문제이다.

ANIMAL_OUTS에는 기록이 있는데, ANIMAL_INS에는 기록이 없는 동물을 찾는 문제로, 두 테이블을 JOIN 해준 후 WHERE절에서 ANIMAL_INS의 ANIMAL_ID(외래키) IS NULL 조건절을 추가해주면 된다.

 

 

* 참고 ! 실행결과

 

 

 

 

03. 그룹별 조건에 맞는 식당 목록 출력하기

- MEMBER_PROFILE, REST_REVIEW 두 테이블 존재

- MEMBER_PROFILE와 REST_REVIEW 테이블에서 리뷰를 가장 많이 작성한 회원의 리뷰들을 조회하는 SQL문 작성

- 회원 이름, 리뷰 텍스트, 리뷰 작성일이 출력되도록 작성

- 결과는 리뷰 작성일을 기준으로 오름차순, 리뷰 작성일이 같다면 리뷰 텍스트를 기준으로 오름차순 정렬

 

 

* 서브쿼리 필요

* GROUP BY, ORDER BY, LIMIT 구문 필요

 

이 문제는...약간 헤맸다

머리가 안 돌아가서.....

 

 

 

풀이 코드

 

JOIN을 통해 두 테이블을 연결해준 후, WHERE절 안에 서브쿼리를 작성해서 문제를 풀었다.

리뷰를 가장 많이 쓴 회원의 리뷰들을 보여줘야 하므로, MEMBER_ID를 GROUP BY로 묶은 후 ORDER BY 구문을 활용하여 COUNT함수를 써서 내림차 정렬을 했다.

LIMIT 1이라는 조건을 주어 내림차 정렬에 따른 가장 많은 리뷰들을 쓴 회원의 아이디가 선택되게 했다.

 

 

 

* 참고 ! 실행결과

+ Recent posts