select p.firstName, p.lastName, a.city, a.state
from Person p
left join Address a on a.personId = p.personId;
salary
를 조회하라.salary
가 없다면 null
을 출력하라.select max(salary) as 'SecondHighestSalary'
from Employee
where salary < (select max(salary) from Employee);
where
절 서브쿼리로 salary
의 최대값을 가져오고 가져온 최대값보다 작은 salary
중 최대값을 출력한다.
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
set N = N-1;
RETURN (
select distinct salary
from Employee
order by salary desc
limit 1
offset N
);
END
스토어드 함수가 사용된 처음 보는 문제유형이다.
N번째 큰 값을 가져오는 것은 여러가지 방법이 있겠지만 limit-offset
방법을 선택했다.
offset N
을 사용할 때 offset N-1
과 같은 방식은 에러가 발생한다.
앞서 미리 offset
으로 사용하기 위해 N
을 감소시키고 사용했다.
SET N = N-1;
score
에 대한 내림차순 기준 랭킹을 구하라select score, dense_rank() over (order by score desc) as 'rank'
from Scores;
MySQL
에서 rank()
함수를 사용하는 기본적인 방법은 아래와 같다.
select rank() over (order by 기준칼럼 [asc|desc])
select dense_rank() over (order by 기준칼럼 [asc|desc])
일반적인 rank()
의 경우 같은 값에 대해 공동순위를 갖지 않는다.
만약 공동순위를 허용하고자 한다면 dense_rank()
를 사용한다.
manager
보다 높은 salary
를 받는 직원을 조회하라 managerId
는 다른 row의 pk를 참조하는 형태이다.select e1.name as 'Employee'
from Employee e1
join Employee e2 on e1.managerId = e2.id
where e1.salary > e2.salary;
한 개 테이블에서 join을 하는 self join
으로 문제를 해결했다.
e1
은 직원에 해당하고 e2
는 매니저에 해당한다.
email
이 2번 이상 중복된 email
을 조회하라.select email
from Person
group by email
having count(email) > 1;
email
로 그룹핑 후 having
절을 이용해서 그룹핑 된 결과 count
가 1보다 큰 것만 조회한다.
Customers
테이블에는 있지만 Order
테이블에는 없는 Customer
의 name을 조회하라not in
사용select name as 'Customers'
from Customers
where id not in (
select c.id
from Customers c
join Orders o on c.id = o.customerId
);
customerId
가 있는지 확인select name as 'Customers'
from Customers c
left join Orders o on c.id = o.customerId
where o.customerId is null;
select d.name as 'Department', e.name as 'Employee', e.salary as 'Salary'
from Employee e
join Department d on e.departmentId = d.id
where (e.departmentId, e.salary) in
(select departmentId, max(salary)
from Employee
group by departmentId
);
부서별 가장 높은 연봉을 받는다
라는 조건을 만들기 위해 where
절 서브쿼리에서 그룹화한다.