241012_TIL

J Lee·2024년 10월 12일

아무리 사소하더라도 배움이 없는 날은 없다.

SQL 문제풀이 복습

문제 링크
group by에 딸린 having 절에도
if나 집계함수를 써서 조건을 부여할 수 있다.
굳이 CTE를 여러 개 만들거나
서브쿼리를 여러 번 쓸 필요가 없는 셈.

SELECT o.customer_id,
       c.name
FROM   Orders o
       JOIN Product p
         ON o.product_id = p.product_id
       JOIN Customers c
         ON o.customer_id = c.customer_id
GROUP  BY 1
HAVING Sum(IF(order_date LIKE '2020-06%', quantity * price, 0)) >= 100
       AND Sum(IF(order_date LIKE '2020-07%', quantity * price, 0)) >= 100;

문제 링크
정규표현식 문제.
난이도는 Easy라고 되어있지만 사실상 정규표현식을 모르면
Hard보다도 더 어려운, 그냥 아예 푸는 게 불가능할 것 같은 문제다ㅎㅎ

이 문제에 들어간 정규표현식 해설.

  1. ^ → ^ 이하로 시작해야 한다
  2. [a-zA-z] → 알파벳 대문자나 소문자로 시작해야 한다
  3. [a-zA-z0-9_.-] → 그 뒤에 올 수 있는 건 알파벳 대소문자, 숫자, 언더바(_), 닷, 그리고 하이픈(-)이다.
  4. 애스터리스크* → 앞에 나온 문자들은 0회 이상 나와야 한다.
  5. @leetcode → 도메인 이름 넣어주고
  6. [.] → @leetcode 다음에는 .이 "반드시" 나와야 하고
  7. com$ → com으로 끝나야 한다 (comv, comA, com_ 등등 안됨)
SELECT *
FROM   users
WHERE  mail REGEXP '^[a-zA-Z][a-zA-Z0-9_.-]*@leetcode[.]com$';

문제 링크
where 조건을 잘 설정하면 쉬운 문제.
문제에서 요구한 조건은

  1. 아예 전체 conditions가 DIAB1로 시작하거나
  2. 앞에 다른 수식어가 붙더라도 DIAB1로 시작하거나

이렇게 두 가지다.
따라서 where을 쓸 때

  1. DIAB1%라고 쓰면 (%가 뒤에 무슨 말이 오든 상관없다는 와일드카드이므로) 위의 1번 조건을 만족하게 되고
  2. '% DIBA1%'라고 쓰면 '앞에 무슨 말이든지 나오고 + 띄어쓰기가 있고 + DIAB1이 있고 + 그 뒤엔 무슨 말이 나와도 상관없음' 이라는 뜻이므로 2번 조건을 만족하게 되는 것.

지금까지의 where절이 비교적 간단했어서
이렇게 정규식스러운(?) 문제가 나오면 잠깐 멈칫하게 되기 쉬운 듯.

SELECT patient_id,
       patient_name,
       conditions
FROM   Patients
WHERE  conditions LIKE 'DIAB1%'
        OR conditions LIKE '% DIAB1%';
profile
기본기를 소홀히 하지 말자

0개의 댓글