1873. Calculate Special Bonus
보너스 계산해서 퍼올리는 문제이다. 대신 조건은 아이디가 홀수인 경우 , 그리고 이름이 'M'으로 시작하지 않는 경우에만 보너스가 주어지고, 아니라면 0 쿼리 결과로 띄워주어야 한다.
select 문 그리고 bonus라는 결괏값에 if 문을 넣어 적을 생각을 하였다.
# Write your MySQL query statement below
select employee_id,
if(name not like 'm%' and employee_id % 2 = 1,salary,0) as bonus
from employees
order by employee_id;
if( 조건, 참, 거짓) 3항 연산자가 생각나는 표현법이지 않은가 직관적이고 좋다.
문자의 시작을 검사할 때 like '문자%' 이런 기법이 있다는 것을 검색하면서 알게 되었다.
- like '문자 %' 문자로 시작하는 걸 검색할 때
- like '% 문자' 문자로 끝나는 걸 검색할 때
- like '% 문자%' 문자가 들어 있는 걸 검색할 때
627. Swap Salary
성별을 업데이트해주는 쿼리를 날려야 한다.
set을 이용하고, 조건이 단 2가지 이기 때문에 If를 사용할 생각을 했다, 이보다 많다면 아마 case를 쓰지 않을까 싶다.
# Write your MySQL query statement below
update
salary
set
sex = if(sex='f','m','f');
심플하다 특이사항 없이 위에 작성한 그대로다.
디스커스를 둘러보던 중 케이스를 작성한 사람이 있어 코드를 보자.
UPDATE
Salary
SET
sex =
(CASE
WHEN (sex='f') THEN 'm'
WHEN (sex='m') THEN 'f'
END);
솔직히 이렇게 case로 작성하는 것이 보다 직관적 이여서 추후 복잡한 로직이라면 이런 케이스의 경우가 더선호되지 않을까 싶다.
196. Delete Duplicate Emails
딜리트 쿼리를 이용해서 중복된 이메일을 지워주어야 한다, 대신 아이디가 높은 아이들이 지워져야 한다.
음 막막해서 구글링 해서 이것저것 붙여 넣어서 완성했다.. ㅋㅋ
# Please write a DELETE statement and DO NOT write a SELECT statement.
# Write your MySQL query statement below
delete p1 from person as p1
inner join person as p2
where p1.id>p2.id and p1.email = p2.email;
지난번 작성한 join을 여기서 또 작성한다. 동일한 테이블을 조인시킨다면 모든 값이 올라가고, 그중에 조건을 걸어서 지워주는 것이다.
동일한 이메일에 아이디가 크다면. 조인을 이렇게도 사용한다는 것이 신기했다.
DELETE FROM Person
WHERE ID NOT IN
(SELECT * FROM
(
SELECT MIN(ID) FROM Person
GROUP BY email
) as Person1
);
그룹바이를 이용해 이메일 별로 가장 작은 아이디 값을 가져오고 그것이 person에 없다면 지워주는 방식이 새로웠다.
이렇게 sql 은 알고리즘처럼 참 다양한 풀이들이 많은 것 같다.
'SQL' 카테고리의 다른 글
계층형 구조 만들기2 (Hierarchical Structure, 클로저테이블,Closure Table) (0) | 2023.01.06 |
---|---|
계층형 구조 만들기 (Hierarchical Structure, 인접노드,열거형 방식) (0) | 2023.01.04 |
SQL Study Plan Day4 (0) | 2022.08.10 |
SQL Study Plan Day3 (0) | 2022.08.08 |
SQL Study Plan Day1 (0) | 2022.08.04 |