하루살이 개발자

[SQL] 리트코드 SQL 문제 모음 본문

코딩테스트

[SQL] 리트코드 SQL 문제 모음

하루살이 2023. 1. 6. 21:00

1. 테이블 에서 두 번째로 높은 급여를 보고하는 SQL 쿼리를 작성 

두 번째로 높은 급여가 없는 경우 쿼리는 null로 처리하기

Select max(salary) AS SecondHighestSalary
FROM Employee
Where salary < (Select max(salary) From Employee);

 

2. 가장 많은 주문을 한 고객 을 찾기  

Select customer_number
From Orders
Group By customer_number
Order By count(customer_number) DESC
Limit 1;

 

3. 큰 국가 구하기

다음과 같은 경우  국가입니다 .

  • 최소 300만 면적(즉, ) 또는3000000 km2
  • 그것은 적어도 2천5백만의 인구를 가지고 있습니다(즉, 25000000).
Select name, population, area
From World
Where area >= 3000000 or population >= 25000000;

 

4. 이름이 "RED" 인 회사와 관련된 주문이 없는 모든 영업 사원의 이름을 보고하는 SQL 쿼리를 작성하십시오 .

Select s.name
From SalesPerson s
Where sales_id Not In (select sales_id 
                       From orders 
                       Where com_id = (Select com_id
                                       From company
                                       Where name = "RED") 
                       );

 

5. 각 플레이어 의 첫 로그인 날짜 를 보고하는 SQL 쿼리를 작성합니다 .

 

Select player_id, min(event_date) as first_login
From Activity
Group By player_id;

 

6. 트리의 각 노드는 다음 세 가지 유형 중 하나일 수 있습니다.

  • "Leaf" : 노드가 리프 노드인 경우.
  • "루트" : 노드가 트리의 루트인 경우.
  • "내부" : 노드가 리프 노드도 루트 노드도 아닌 경우.

트리의 각 노드 유형을 보고하는 SQL 쿼리를 작성합니다.

Select id, 
       CASE
           WHEN p_id IS NULL THEN 'Root'
           WHEN id IN (Select p_id From Tree) THEN 'Inner'
           ELSE 'Leaf'
           END
           AS type
 FROM Tree;

 

7. (actor_id, director_id)배우가 감독과 3회 이상 협력한 쌍을 제공하는 보고서에 대한 SQL 쿼리를 작성하십시오 .

Select actor_id, director_id
From ActorDirector
Group By actor_id, director_id
having count(1) >= 3; # 행 수가 3이상인 경우

 

8. 1분기에만 판매된 제품  보고하는 SQL 쿼리를 작성합니다 . 즉, 사이  포함입니다.20192019-01-012019-03-31

select s.product_id, p.product_name
from  Sales s join Product p
on s.product_id = p.product_id
group by s.product_id 
having
	min(s.sale_date) >= "2019-01-01" 
	AND
	max(s.sale_date) <= "2019-03-31";

 

9. 2019-07-27부터 30동안 일일 활성 사용자 수를 찾는 SQL 쿼리를 작성 2019-07-27합니다.  

 

select activity_date as day, count(distinct user_id)as active_users
from Activity
group by activity_date 
having activity_date >= "2019-06-28"
and activity_date <= "2019-07-27";

 

10. 자신의 기사 중 하나 이상을 본 모든 작성자를 찾는 SQL 쿼리를 작성하십시오.

id오름차순으로 정렬된 결과 테이블을 반환합니다 .

select distinct author_id as id
from Views
where author_id = viewer_id
order by id;

 

11. 각 주식 의 자본 이득/손실 을 보고하는 SQL 쿼리를 작성하십시오 .

주식 의 자본 이득/손실 은 주식을 한 번 또는 여러 번 매매한 후의 총 이득 또는 손실입니다.

 

select stock_name, sum(if(operation = "Buy", -price, price)) as capital_gain_loss
from Stocks
group by stock_name
order by stock_name

 

12.각 사용자가 이동한 거리를 보고하는 SQL 쿼리를 작성합니다.

로 정렬된 결과 테이블 travelled_distance을 내림차순 으로 반환합니다. 두 명 이상의 사용자가 같은 거리를 이동한 경우 name오름차순 으로 정렬 합니다.

select u.name, IFNULL(sum(r.distance),0) as travelled_distance
from Users u left join Rides r
on u.id = r.user_id
group by u.id
order by travelled_distance desc, name

 

13. SQL 쿼리를 작성하여 각 날짜별로 판매된 다양한 제품의 수와 이름을 찾으십시오.

각 날짜의 판매된 제품 이름은 사전순으로 정렬해야 합니다.

select sell_date, 
       count(distinct(product)) as num_sold, 
       group_concat(distinct product order by product SEPARATOR ',') as products
from activities
group by sell_date
order by sell_date;

[참고]

MySQL에서 group by 로 문자열을 합칠땐 group_concat 을 이용한다.

1. 기본형 : group_concat(필드명)
2. 구분자 변경 : group_concat(필드명 separator '구분자')
3. 중복제거 : group_concat(distinct 필드명)
4. 문자열 정렬 : group_concat(필드명 order by 필드명)

 

[추가 문법]

IN - 포함되는 것 찾기
where name in('a','b')

LIKE - 포함 여부 찾기
where name like '%AB%'
where name like 'AB%'
where name like '%AB'
like '_a%' 두번째 자리에 a가 들어가는 모든 것
like 'a_%_%' a로 시작되고 최소 3이상의 길이를 가진 모든 것

IF - 조건을 넣어 칼럼의 값을 바꾸는 방법
if(name like '%AB%', 'O', 'X') 포함되는 인자가 있다면 O, 없다면 X

DATE - 문자를 날짜로 바꾸기
date(datetime)
date(yesterday) = date(datetime) 문자열이 아닌 날짜로 연산 가능

DATE_FROMAT - 원하는 날짜 출력 포맷을 지정해줌
date_fromat(datetime, "%Y-%m")

YEAR, MONTH, DAY, HOUR, MINUTE, SECOND
where hour between 0 and 19

IS NULL - null값 찾기
where name is null

IFNULL - null인 값을 찾아 치환함
ifnull(name, 'abc') null값은 abc로 치환

BETWEEN - where절에서 조건 범위를 지정할 때 많이 사용
where price between 10 and 20

select case ~~~ end as name


LIMIT
limit 0, 3 // 0번부터 3개

집계함수
count // null은 숫자로 세지 않음
min, max, count, avg, sum

UNION - 하나의 테이블로 합치기
select
from
union
select
from

JION
inner join 교집합
left join  왼쪽 다
right jion 오른쪽 다
full outer join -> left join union right join으로 구현해야 함

조인
select
from a join b
on a.id = b.id