본문 바로가기

[공부] SQL

[SQL 코딩테스트] 리트코드 Advanced String Functions / Regex / Clause 정답

무슨 문제가 나오는 건지 예상이 안되는 챕터..? EASY가 많으니 훈련한다 생각하고 해보자!

 

[EASY] 1667. Fix Names in a Table
CONCAT / UPPER / LOWER / SUBSTR
⏰ 4:23
SELECT USER_ID, CONCAT(UPPER(SUBSTR(NAME,1,1)),LOWER(SUBSTR(NAME,2))) AS NAME
FROM USERS
ORDER BY 1

 

[EASY]  1527. Patients With a Condition
LIKE
⏰ 4:03 
SELECT *
FROM PATIENTS
WHERE CONDITIONS LIKE 'DIAB1%' OR CONDITIONS LIKE '% DIAB1%'

 

[EASY]  196. Delete Duplicate Emails
DELETE
⏰ 8:00

 

DELETE 함수 처음 써봤다...! 테이블에 손대는 함수는 실전에서 쓰기 넘 무서울 것 같은데~!

DELETE FROM PERSON
WHERE ID NOT IN (
    SELECT * FROM (
    SELECT MIN(ID)
    FROM PERSON
    GROUP BY EMAIL) AS A
)

 

이번에도 챗GPT한테 DELETE의 활용법에 대해 자세히 물어봤는데, 당최 왜 서브쿼리를 2번 걸어야 하는건지 이해가 안돼서 집요하게 물었다. 결론은 구냥 DELETE의 법칙이 그렇다는 얘기... 일단 데이터를 뽑아서 새로운 테이블인척 하고 일을 시켜야 애가 충격을 안 받고 자기꺼 아니고 남의꺼인줄 알고 삭제해주나보다...(?)

 

[MEDIUM] 176. Second Highest Salary
LIMIT / DISTINCT
⏰ 21:48

 

으아아악. 큰 맥락에서 보면 위에서 본 것과 비슷한 사례고 지난 번에 MAX구문 활용할 때도 끝까지 궁금해했던 부분인데.

 

[배움 1] 빈 값을 NULL로 출력하려면 서브쿼리로 한 번 감싸준다.

한 번 SELECT로 출력했을 때 값이 없다면 NULL도 출력되지 않지만, 그 아무것도 없는 테이블에서 다시 값을 출력하려고 시도하면 그때는 NULL을 출력해주는 것. 구냥 그런걸로 기억해두고 외워야겠다...

 

[배움 2] 이런 경우 본쿼리에 FROM 안 써도 결과값이 나옴 (!!!)

 

[배움 3] LIMIT에 변수를 2개 쓰면 LIMIT OFFSET(어디부터 시작), COUNT(몇개까지 카운트)와 같이 쓸 수 있다.

SELECT 
(SELECT DISTINCT SALARY 
FROM EMPLOYEE
ORDER BY SALARY DESC
LIMIT 1,1)
AS SecondHighestSalary

 

[EASY] 1484. Group Sold Products By The Date
GROUP_CONCAT / DISTINCT
⏰ 6:59

 

GROUP_CONCAT 처음 써봤다! 잘 배워갑니다~

SELECT  SELL_DATE, COUNT(DISTINCT PRODUCT) AS NUM_SOLD, 
        GROUP_CONCAT(DISTINCT PRODUCT ORDER BY PRODUCT) AS PRODUCTS
  FROM  ACTIVITIES
GROUP BY SELL_DATE

 

[EASY] 1327. List the Products Ordered in a Period
GROUP BY / HAVING
⏰ 4:58
SELECT P.PRODUCT_NAME, SUM(O.UNIT) AS UNIT
FROM PRODUCTS P
     JOIN ORDERS O
     USING (PRODUCT_ID)
WHERE DATE_FORMAT(O.ORDER_DATE,'%Y-%m') = '2020-02'
GROUP BY P.PRODUCT_NAME
HAVING SUM(O.UNIT) >= 100

 

[EASY] 1517. Find Users With Valid E-Mails
RLIKE / REGEXP
⏰ 21:26

 

* REGEXP = REGular EXPression

와. 정규표현식 처음 봤는데 익히느라 끙끙. 백슬래시 \ 한 번만 쓰면 왜 ?까지 같이 뽑히는지 모루겠다...

SELECT *
FROM USERS 
WHERE MAIL RLIKE '^[A-Za-z][A-Za-z0-9_.-]*@leetcode\\.com$'
SELECT *
FROM USERS 
WHERE MAIL RLIKE '^[A-Za-z][A-Za-z0-9_.-]*@leetcode[.]com$'