[SQL 3-1강 (2)] 서브쿼리, OVER, EXISTS, SELECT 1

2021. 5. 26.·🤓 기술 학습 & 공부 기록/컴퓨터 일반

[강의명]
패스트캠퍼스 SQL 100제 + 자격증 완성 온라인 완주반

[수강목록]
44. 집합 연산자와 서브쿼리 - 09. 실습문제 - 1
45. 집합 연산자와 서브쿼리 - 10. 실습문제 - 2

[강의내용]

 

44. 집합 연산자와 서브쿼리 - 09. 실습문제 - 1

 

아래의 SQL문은 film 테이블을 2번이나 스캔하고 있다. film 테이블을 한번만 스캔하여

동일한 결과 집합을 구하는 SQL을 작성하라

 

SELECT FILM_ID, TITLE, RENTAL_RATE
FROM FILM
WHERE RENTAL_RATE > (
      SELECT AVG (RENTAL_RATE)
      FROM FILM 
 );

 

[풀이]

AVG값을 SELECT절에서 바로 출력되도록 해야한다. OVER()를 사용하면 된다.

 

OVER()를 사용하면 GROUP BY나 서브쿼리를 사용하지 않고도

분석함수나 집계함수 (SUM, MAX, MIN, COUNT, AVG, RANK 등..)를 사용할 수 있다.

 

디폴트는 OVER()이나, OVER(PARTITION BY 컬럼, ORDER BY, 세부 분할 기준)의 형태로 조건을 설정하는 것도 가능하다.

 

SELECT FILM_ID, TITLE, RENTAL_RATE 
FROM (
     SELECT FILM_ID, title, rental_rate,
            AVG(A.RENTAL_RATE) OVER() AS AVG_RENTAL_RATE
     FROM FILM A 
     ) A 
WHERE rental_rate > AVG_RENTAL_RATE;

 

결과는 동일하다.

 

45. 집합 연산자와 서브쿼리 - 10. 실습문제 - 2

 

아래 SQL문은 EXCEPT 연산을 사용하여 재고가 없는 영화를 구하고 있다.

EXCEPT 연산을 사용하지 말고 같은 결과를 도출하라

 

SELECT FILM_ID, TITLE
FROM FILM

EXCEPT 

SELECT DISTINCT INVENTORY.FILM_ID, TITLE
FROM INVENTORY
INNER JOIN FILM ON FILM.FILM_ID = INVENTORY.FILM_ID
ORDER BY TITLE;

 

쿼리 결과

[내 답안]

핵심은 전체 film_id에서 inventory 테이블에 존재하는 film_id를 제외하는 것이다.

LEFT JOIN을 통해 inventory.film_id를 추출하고, NULL값(재고가 없는 영화들)을 뽑는 방법을 사용했다.

 

SELECT f.film_id, f.title
FROM film f
LEFT JOIN (
          SELECT DISTINCT film_id
          FROM inventory
          ) AS t1 ON f.film_id = t1.film_id
WHERE t1.film_id IS NULL;

 

쿼리 결과

 

결과는 동일하다.

 

[모범답안]

NOT EXISTS를 사용하여 재고가 존재하는 집합을 전체 film 집합에서 제외한다.

 

SELECT a.film_id, a.title  
FROM film a
WHERE NOT EXISTS (
      SELECT 1 
      FROM inventory b
      WHERE b.film_id = a.film_id 
);

 

결과는 동일하다.

 

WHERE (NOT) EXISTS (SELECT 1 ...)에서 SELECT 1은 TRUE 값을 의미하며

WHERE (NOT) EXISTS (...) 에서 (...) 안의 내용이 TRUE인 조건이 WHERE 조건이 되는 것을 알아 두자

 

즉, SELECT 1 이하의 서브쿼리는 특정한 컬럼을 출력하는 것이 목표가 아니라,

WHERE (NOT) EXISTS 형식에 맞추기 위한 목표이다. 

 

'🤓 기술 학습 & 공부 기록/컴퓨터 일반' 카테고리의 다른 글
  • [SQL 3-2강 (2)] GROUP BY, GROUPING SET, ROLLUP, CUBE
  • [SQL 3-2강 (1)] 서브쿼리, EXISTS, ANY, SELECT 1, NOT IN
  • [SQL 3-1강 (1)] 서브쿼리, ANY, ALL, EXISTS, SELECT 1
  • [SQLD] 데이터 모델링의 이해 (2)
지식물원
지식물원
지식이 자라는 식물원!
  • 지식물원
    지식물원
    지식물원
  • 전체
    오늘
    어제
    • 분류 전체보기 (510)
      • 🎨 프론트엔드 공부 (247)
        • JS & TS (86)
        • HTML & CSS (22)
        • React & Next (49)
        • Vue & Nuxt (22)
        • 기타 (68)
      • 🤓 기술 학습 & 공부 기록 (116)
        • Node.js (0)
        • Python (37)
        • 백엔드 (0)
        • 딥러닝 (1)
        • 컴퓨터 일반 (72)
        • 개발 인프라 (6)
      • 👨‍💻 프로젝트 경험 (6)
        • Work (0)
        • Toy (6)
      • ⚙️ 개발 팁 & 노하우 (21)
        • 프론트엔드 (6)
        • 기타 (15)
      • ☕️ 커리어 & 인터뷰 준비 (88)
        • 코딩 테스트 (88)
      • 📰 기술 트렌드 & 생각 정리 (4)
      • 📚 기타 (25)
        • 마케팅 (15)
        • 비개발서적 (10)
  • 블로그 메뉴

    • 태그
  • 링크

  • 공지사항

    • 모바일 접속 시 코드 하이라이팅 깨질 때
  • 인기 글

  • hELLO· Designed By정상우.v4.10.3
지식물원
[SQL 3-1강 (2)] 서브쿼리, OVER, EXISTS, SELECT 1
상단으로

티스토리툴바