[SQL] SQL 50문제 - (44) ~ (50)
🔍 SQL : LeetCode 기본 예제 50문제 중 44번 ~ 50번. Advanced String Functions / Regex / Clause
(44) 이름 앞글자만 대문자로 만들어서 선택하기
SELECT user_id, CONCAT(UPPER(LEFT(name,1)),LOWER(SUBSTRING(name,2))) AS name
FROM Users
ORDER BY user_id;
(45) 원하는 단어가 포함되어있으면 선택하기(값이 아예 붙어있는 경우를 배제하기 위해 조건을 두개로 달아줬습니다.)
SELECT *
FROM Patients
WHERE conditions LIKE '% DIAB1%'
OR conditions LIKE 'DIAB1%';
(46) 아이디가 중복되는 경우 가장 작은 아이디 값만을 남겨두고 나머지 행을 삭제하기
DELETE FROM Person
WHERE id NOT IN( -- 그 아이디가 아닌 경우의 아이디
SELECT id FROM( -- 같은 이메일로 묶었을 때 가장 작은 값을 가지는 아이디를 고름
SELECT MIN(id) AS id
FROM Person
GROUP BY email
) m
);
(47) 두 번째로 급여가 높은 사람의 급여를 선택하기
SELECT
(SELECT DISTINCT salary
FROM Employee
ORDER BY salary DESC LIMIT 1 OFFSET 1)
AS SecondHighestSalary;
- 반환해야 행이나 생략할(OFFSET)의 행이 없는 경우에는, LIMIT와 OFFSET은 NULL값을 반홥합니다.
(48) 같은 그룹의 경우 같은 컬럼 값으로 넣어 선택하기
SELECT sell_date, COUNT(DISTINCT product) AS num_sold,
GROUP_CONCAT(DISTINCT product ORDER BY sell_date, product) AS products
FROM Activities
GROUP BY sell_date
ORDER BY sell_date;
(49) 조건에 부합하는 값을 선택하기
SELECT p.product_name, o.unit
FROM (
SELECT product_id, CASE WHEN SUM(unit) >= 100 THEN SUM(unit) END AS unit
FROM Orders
WHERE 1=1
AND MONTH(order_date) = 2
AND YEAR(order_date) = 2020
GROUP BY product_id
) o
JOIN Products p
ON p.product_id = o.product_id
WHERE o.unit IS NOT NULL;
(50) 이메일 조건 확인하기
SELECT *
FROM Users
WHERE 1=1
AND mail REGEXP '^[A-Za-z]+[A-Za-z0-9._-]*@leetcode\\.com$';
정리
- CONCAT()란 여러 문자열을 결합(CONCATencate)할 때 사용하는 함수입니다. UPPER()와 LOWER() 함수는 대문자와 소문자를 만드는 함수입니다. LEFT와 SUBSTRING은 문자열의 일부를 쪼개올 수 있는 함수입니다.
SELECT CONCAT('Hello', ' ', 'World') AS greeting;
- LIKE란 문자열 패텅 매칭을 사용할 때 쓰는 연산자로, %는 0개 이상의 문자를, _는 1개 이상의 문자를 찾을 때 사용됩니다.
SELECT * FROM employees WHERE name LIKE 'A%';
-IN란 특정 값이 지정된 리스트에 포함되어 있는지 확인할 때 사용합니다.
SELECT * FROM products WHERE category_id IN (1, 2, 3);
- OFFSET란 쿼리에서 LIMIT과 함께 사용되어, 결과를 건너뛸 행의 수를 지정하는데 사용됩니다.
SELECT * FROM employees LIMIT 5 OFFSET 10;
- GROUP_CONCAT()란 GROUB BY된 절로 그룹화된 결과를 하나의 문자열로 결합할 때 사용됩니다.
SELECT department, GROUP_CONCAT(employee_name) AS employees FROM employees GROUP BY department;
- REGEXP란 정규식을 사용해서 문자열이 특정패턴과 일치하는지 검사할 때 사용되는 연산자입니다. REGEXP에서 사용할 수 있는 정규식 패턴은 아래처럼 정말 다양하고 정규식에서는 .이 아무문자를 의미하므로 실제 점을 사용하고 싶은 경우에는 \\ 백슬래시를 두개 써주면 됩니다.
패턴 | 의미 | 예제 |
. | 아무문자(한글자) | 'a.c'→'abc','aac' |
^ | 문자열시작 | '^A'→'Apple'(O),'Banana'(X) |
$ | 문자열끝 | 'e$'→'apple'(O),'orange'(X) |
* | 0개이상반복 | 'bo*k'→'bk','bok','book' |
+ | 1개이상반복 | 'bo+k'→'bok','book'(O),'bk'(X) |
? | 0개또는1개 | 'bo?k'→'bk','bok'(O),'book'(X) |
{n} | 정확히n개반복 | 'a{3}'→'aaa'(O),'aa'(X) |
{n,} | 최소n개반복 | 'a{2,}'→'aa','aaa','aaaa' |
{n,m} | 최소n개최대m개반복 | 'a{2,4}'→'aa','aaa','aaaa'(O),'a'(X) |
| | OR연산자 | 'a|b'→'a','b' |
[] | 특정문자집합 | '[aeiou]'→'a','e','i'(O) |
[0-9] | 숫자한자리 | '[0-9]'→'1','5','9' |
[A-Za-z] | 알파벳한글자 | '[A-Za-z]'→'A','z','m' |
[^] | 특정문자제외 | [^0-9]→'A','z','!'(O),'3'(X) |