반응형

데이터베이스 13

178. Rank Scores

MYSQL의 다양한 순위 함수 중 RANK()에 대해 연습해 볼수 있는 괜찮은 문제이다. 학부과정에서 다양한 고급 함수를 배우기 보다는 기본 SQL을 배우다보니 문제를 보는 순간 풀이가 바로 떠오르지 않았다. 프로그래밍이라면 IF - ELSE 를 사용하여 rank를 구할수 있겠지만 SQL문에서 IF - ELSE 사용은 많이 사용해본적이 없어 자신이 없었다. 문득 혹시 내장 함수중에 rank를 구해주는 함수가 있지 않을까 찾아보니 역시나.... 모르는게 너무 많은것 같다. 우선 기본적으로 MYSQL에서 다양한 순위함수(분석함수)를 제공해준다. 더보기 PARTITION BY : 동일 그룹으로 묶어줄 칼럼 명 지정 ORDER BY : Partition 정의에 지정된 컬럼에 대한 정렬 수행 SELECT (arg..

181. Employees Earning More Than Their Managers

Employee 테이블에 employees와 managers가 섞여 있는 상황에서 employee의 salary가 manager의 salary 보다 더 많은 사람의 name을 반환하도록 SQL을 작성하는 문제이다. Employee 테이블에 직원과 매니저 정보가 모두 들어있기 때문에 cartesian product를 이용하여 managerId = id 인 레코드를 뽑아낸 후 조건에 맞게 where문을 작성해준다. SELECT e1.name AS Employee FROM Employee AS e1, Employee AS e2 WHERE e1.managerId = e2.id AND e1.salary >e2.salary

1527. Patients With a Condition

Patients 테이블에서 conditions 가 'DIAB1'로 시작하는 모든 레코드를 반환하도록 SQL을 작성하는 문제이다. 문제를 보는 순간 LIKE 연산자를 사용하면 쉽게 해결할 수 있을것 같다고 생각했다. #wrong answer -> 틀린이유는 SDIAB100도 레코드로 반환이 된다. select * from Patients where conditions like '%DIAB1%' #correct answer -> DIAB1로 시작하거나 (space)DIAB1 인 결과만 반환하도록 수정한다. select * from Patients where conditions like 'DIAB1%' or conditions like '% DIAB1%' #other solution SELECT * FROM ..

1484. Group Sold Products By The Date

Activities 테이블에서 sell_date를 기준으로 GROUP BY를 한 후 그룹핑된 product를 기준으로 count를 구하고, 최종적으로 해당 그룹에 제품들을 콤마 로 구분하여 하나로 합쳐 결과를 반환하는 SQL을 작성하는 문제이다. 처음엔 이전 문제를 풀면서 CONCAT(문자열 합쳐주는 함수) 를 알게 되었고 이를 사용하여 문제를 해결하려고 시도 하였다. 풀이가 도저히 생각나지 않아 솔루션을 확인한 결과 GROUP_CONCAT 이라는 것을 새롭게 알게 되었다. GROUP_CONCAT사용법은 다음과 같다. select type, group_concat(name) from test group by type ; type name fruit 수박,사과,바나나,사과 group_concat을 기본적인..

1667. Fix Names in a Table

Users 테이블에 name 필드에서 name의 첫번째 문자는 대문자, 이후 문자는 소문자로 변환하여 반환하는 SQL을 작성하는 문제이다. (핵심은 SQL의 문자열 함수를 사용해 적절히 변환 하는것이다.) Mysql의 문자열 함수는 다음과 같은 것이 존재한다. 함수 사용법 반환 값 ASCII() ASCII(t) t의 아스키 코드값 리턴 CONCAT() CONCAT(t1,t2,.....) t1t2 형식의 문자열 CONCAT_WS() CONCAT_WS(S,t1,t2,....) t1St2S.. 형식의 문자열 LENGTH() LENGTH(t) 문자열 t의 길이 CHAR_LENGTH() CHAR_LENGTH(t) 문자열 t의 길이 single-byte, multi-byte 미구별 CHARACTER_LENGTH()..

196. Delete Duplicate Emails

Person 테이블에 중복된 이메일을 삭제하여 결과를 반환하도록 SQL을 작성하는 문제이다. ※단, SELECT를 사용하지 않고 결과를 반환해야한다. 문제를 처음 보는 순간 select를 사용하여 이메일 기준으로 group by 한다음 해당 그룹에 이메일 갯수가 1개 이상이면 중복된 이메일이 있다는 것을 알 수 있다. (이 답도 제출이 되네...) delete from Person where id not in ( select min(p.Id) from (select * from Person) p group by p.email ); 이를 해결하기 위해 Person을 Join 하거나 Cartesian Product를 통해 조건을 설정해주면 된다. delete p1 from Person p1, Person p..

627. Swap Salary

이번 문제는 단순 조회하는 select 쿼리 문제가 아니라 update 쿼리문제이다. spring JPA를 쓰다보니 Hibernate에서 SQL를 자동으로 생성해주어 개발자가 직겁 select,update,delete쿼리를 날리는 경우가 거의 없다. 하지만 현업에는 다양한 도메인이 있으며 이를 위해서는 직접 SQL을 작성해보는 훈련이 필요하다. #my solution update Salary set sex = if(sex='m','f',if(sex='f','m',sex)) #other solution UPDATE salary SET sex = CASE sex WHEN 'm' THEN 'f' ELSE 'm' END;

1873. Calculate Special Bonus

Employees 테이블에서 employee_id 가 짝수이거나 name이 M으로 시작하는 직원은 0의 bonus를 받고 그 외 직원은 salary의 100%를 보너스를 받도록 SQL을 작성하는 문제이다. (단 employee_id를 기준으로 정렬해야한다) 이 문제의 핵심은 IF 와 MOD(%)연산을 적절히 사용하는 것이다. 기존에 SELECT에서 단일 애트리뷰트만 조건없이 조회하였지만 SQL에 다양한 기능이 있는것을 알게 되었다. select employee_id, if(employee_id % 2 = 0 or name like 'M%' ,0, salary) as bonus from Employees order by employee_id asc

584. Find Customer Referee

Customer 테이블에서 referee_id가 2가 아닌 사람의 name을 반환하는 SQL을 작성하는 문제이다. 테이블 스키마를 확인해보면 referee_id가 int 인것을 확인 할 수 있다. (엇.. 빈칸이 있네.. NULL인가??) null을 다뤄보지 않아 referee_id = null 이렇게 처리하면 동작할줄 알았다... (null은 =연산이 안되는지 몰랐음...) 해결 방법은 referee_id is null 또는 isnull(referee_id)를 사용하면 된다. # my solution select name from Customer where referee_id != 2 or referee_id is null # other solution SELECT name FROM customer W..

반응형