사용 DB : MySQL (5.7 / 8.0인 것은 따로 명시)
12.8 String Functions and Operators
# 가장 긴 문자열 1개만 찾기 (길이가 같다면 사전 순으로 앞서는 것)
SELECT CITY,LENGTH(CITY)
FROM STATION
WHERE LENGTH(CITY) = (
SELECT MAX(LENGTH(CITY))
FROM STATION
)
ORDER BY CITY
LIMIT 1;
13.6.5 Flow Control Statements
# binary search tree의 노드 종류 구분하기 문제
SELECT DISTINCT BST1.N AS node,
CASE
WHEN BST1.P IS NULL
THEN 'Root'
WHEN BST2.P IS NOT NULL
THEN 'Inner'
ELSE 'Leaf'
END
AS type
FROM BST BST1
LEFT JOIN BST BST2 ON BST1.N = BST2.P
ORDER BY node;
# iterative한 중앙값(median) 찾기
SET @idx = -1;
SELECT ROUND(LAT_N,4) AS medianLatitude
FROM (
SELECT @idx := @idx+1 AS rowIdx,
LAT_N
FROM STATION
ORDER BY LAT_N
) AS subQuery
WHERE subQuery.rowIdx = floor(@idx/2);
# between 조건으로 조인
SELECT IF(grd.Grade < 8 , NULL , stu.name),
grd.Grade,
stu.Marks
FROM Students stu
JOIN Grades grd ON stu.Marks BETWEEN grd.Min_Mark AND grd.Max_Mark
ORDER BY grd.Grade DESC,
stu.name,
stu.Marks;
12.20.3 MySQL Handling of GROUP BY
SELECT hack.hacker_id AS id,
hack.name AS name
FROM Hackers hack
JOIN Submissions sub ON hack.hacker_id = sub.hacker_id
JOIN Challenges chal ON sub.challenge_id = chal.challenge_id
JOIN Difficulty diff ON diff.difficulty_level = chal.difficulty_level
WHERE chal.difficulty_level = diff.difficulty_level
AND sub.score = diff.score
GROUP BY id,
name
HAVING COUNT(sub.hacker_id) > 1
ORDER BY COUNT(sub.hacker_id) DESC,
id;
13.2.15 WITH (Common Table Expressions)
# 테이블 없이 N 이하 모든 소수 구하기
SET @num := 2;
WITH RECURSIVE cte AS
(
SELECT @num AS num
UNION
SELECT @num := @num + 1
FROM cte
WHERE @num < 100
)
SELECT cte1.num
FROM cte cte1
JOIN cte cte2 ON cte1.num > cte2.num
GROUP BY cte1.num
HAVING SUM(
IF((cte1.num % cte2.num) = 0, 1,0)
) = 0
ORDER BY cte1.num;