[solvesql]MySQL_2(Lv2)

2025. 10. 12. 17:09·코딩 테스트/02. SQL

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 절만으로 실행 가능한 쿼리”가 만들어지는 것입니다!

 

  • 쿼리 구조 읽기
  1. 내부적으로
    • SELECT COUNT(*) FROM artworks WHERE ... → 값을 하나 계산
    • SELECT COUNT(*) FROM artworks → 또 다른 값을 하나 계산
  2. 그리고 바깥쪽 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
'코딩 테스트/02. SQL' 카테고리의 다른 글
  • [solvesql_Lv3]멘토링 짝꿍 리스트(JOIN에서 ON의 특징)
  • [solvesql_Lv3] 작품이 없는 작가 찾기
  • [solvesql_Lv2] 제목이 모음으로 끝나지 않는 영화
  • [solvesql_Lv2] 다음날 서울숲의 미세먼지 농도 나쁨
Growth DA Log
Growth DA Log
Growth DA Log 님의 블로그 입니다.
  • Growth DA Log
    Growth DA Log님의 블로그
    Growth DA Log
  • 전체
    오늘
    어제
    • 분류 전체보기 (125)
      • TIS_COMPANY (6)
      • 코딩 테스트 (61)
        • 01. Python (3)
        • 02. SQL (58)
      • 데이터 분석 (53)
        • 01. BigQuery (9)
        • 02. GA4 (1)
        • 02-1. GA4를 더 잘 다루기 위한 마케팅 개.. (5)
        • 03. streamlit (5)
        • 04. Git (12)
        • 05. 데이터 엔지니어링 (3)
        • 06. 데이터 모델링 (11)
        • 07. Excel (0)
        • 08. Tableau (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    tableaubootcamp
    rank
    쿼리테스트
    이행성
    git
    AARRR
    tableau
    코드잇스프린트후기
    Reset
    윈도우함수
    streamlit
    DENSE_RANK
    SQL
    solvesql
    revert
    ROW_NUMBER
    코딩테스트
    프로그래머스
    코테
    cross_join
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
Growth DA Log
[solvesql]MySQL_2(Lv2)
상단으로

티스토리툴바