1. 언더 스코어(_)가 포함되지 않는 데이터 찾기
SELECT DISTINCT page_location
FROM ga
WHERE page_location NOT LIKE '%\_%'
ORDER BY page_location
POINT : 언더스코어(_) 앞에 역슬래시를 해야하는 이유
- LIKE 문법에서 언더스코어(_)가 가진 특수 의미
- 언더스코어는 임의의 한 글자를 뜻하는 와일드 카드로 쓰입니다.
- 그래서 언더스코어를 문자로 사용할 경우 와일드카드가 아닌 진짜 언더스코어라고 알려주는 것이 역슬래시(\)입니다.
예시로 확인하기
| 패턴 | 의미 | 일치하는 예시 |
| 'a_c' | a + (임의의 한 글자) + c | abc, a9c, a-c ✅ |
| 'a\_c' | a + ‘_’ 문자 그대로 + c | a_c ✅ |
2. 게임을 10개 이상 발매한 게임 배급사 찾기
조건: 게임 배급사로 참여한 게임이 10개 이상인 회사
SELECT c.name
FROM companies AS c
JOIN games AS g
ON g.publisher_id = c.company_id
GROUP BY c.company_id, c.name
HAVING COUNT(DISTINCT g.game_id) >= 10
ORDER BY c.name;
- GROUP BY 키: g.publisher_id 대신 c.company_id, c.name으로 그룹핑하면 DB 표준에 더 안전하고, 이름과 ID가 일치하는 하나의 그룹으로 확정됩니다.
- COUNT(DISTINCT g.game_id): 혹시 조인·중복으로 같은 게임이 여러 번 잡일 수 있는 스키마에 대비.
- SQL의 규칙상 GROUP BY는 집계 함수(COUNT, SUM, AVG 등) 이 아닌 컬럼은
반드시 그룹 기준 컬럼 안에 있어야 한다는 원칙이 있습니다.
그래서 되도록이면 그룹 기준으로 쓴 컬럼들은 SELECT 절에도 나오는 게 가장 명확하고 안전한 설계입니다
3. 기증품 비율 계산하기 : 스칼라 서브쿼리 활용
조건: 소장품 중 부분 기증품을 포함한 기증품의 비율이 얼마나 되는지 계산하는 쿼리
SELECT
ROUND(
(SELECT COUNT(*) FROM artworks
WHERE UPPER(credit) LIKE '%GIFT%')
/
(SELECT COUNT(*) FROM artworks) * 100, 3
) AS 'ratio';
이번 문제에서는 SELECT 절만으로 쿼리를 작성했습니다.
이처럼 SELECT 안에서 값(1개의 결과)을 반환하는 작은 SELECT 문을
스칼라 서브쿼리(Scalar Subquery) 라고 합니다.
SELECT 문이 “계산기”처럼 동작할 수 있는 이유는,
내부의 각 SELECT가 이미 데이터를 조회해 단일 값을 반환하기 때문입니다.
따라서 외부 쿼리는 별도의 FROM 절 없이도 이 값을 이용해 연산을 수행할 수 있습니다.
즉, 내부 쿼리가 데이터를 불러오고, 외부 쿼리가 그 값을 계산하는 구조이기 때문에
“SELECT 절만으로 실행 가능한 쿼리”가 만들어지는 것입니다!
- 쿼리 구조 읽기
- 내부적으로
- SELECT COUNT(*) FROM artworks WHERE ... → 값을 하나 계산
- SELECT COUNT(*) FROM artworks → 또 다른 값을 하나 계산
- 그리고 바깥쪽 SELECT는 그 두 값을 이용해서 비율을 계산
즉, 바깥 SELECT는 단순 계산기 역할을 하는 거예요. 그래서 FROM 없이도 잘 동작하죠
4. 최대값을 가진 행 찾기
SELECT id
FROM points
WHERE x = (SELECT MAX(x) FROM points)
OR y = (SELECT MAX(y) FROM points)
ORDER BY id;
POINT!
WHERE절에서는 행단위 조건만 사용할 수 있습니다
그래서 MAX(X) 같은 집계함수는 그룹 단위 계산이라서 사용할 수 없어요.
여기서 행단위 조건이란
각 행이 개별적으로 조건을 만족하는지를 판단할 수 있어야합니다
예시로 아래와 같이 각 행이 독립적으로 조건을 평가할 수 있어야하는 거죠
SELECT *
FROM employees
WHERE salary > 5000; -- 각 행의 salary가 5000보다 큰가?
WHERE department_id = 10; -- 각 행의 부서번호가 10인가?
WHERE hire_date >= '2021-01-01';
WHERE name LIKE '김%'
그래서 집계함수와 같이 전체 테이블에서 계산된 하나의 결과값은
WHERE절이 아닌 HAVING절이나 SELECT절에서만 가능합니다!!
'코딩 테스트 > 02. SQL' 카테고리의 다른 글
| [solvesql_Lv3]멘토링 짝꿍 리스트(JOIN에서 ON의 특징) (2) | 2025.10.14 |
|---|---|
| [solvesql_Lv3] 작품이 없는 작가 찾기 (0) | 2025.10.13 |
| [solvesql_Lv2] 제목이 모음으로 끝나지 않는 영화 (0) | 2025.10.12 |
| [solvesql_Lv2] 다음날 서울숲의 미세먼지 농도 나쁨 (0) | 2025.10.11 |
| [solvesql]MySQL_1 (Lv_2) (0) | 2025.10.11 |