SJ_Koding

SQLD 대비 (10) - 서브쿼리(Sub Query), 비등가 조인, 집합연산자 본문

SQL/SQLD

SQLD 대비 (10) - 서브쿼리(Sub Query), 비등가 조인, 집합연산자

성지코딩 2023. 11. 16. 23:18
 

SQLD 대비 (9) - JOIN

SELECT * FROM Employees CROSS JOIN Departments; SELECT * FROM Employees, Departments;​ SQLD 대비 (8) - SQL 문법 및 라이브러리_3 SQLD 대비 (7) - SQL 문법 및 라이브러리_2 SQLD 대비 (6) - SQL 문법 및 라이브러리_1 SQLD 대비 (5

sjkoding.tistory.com

이전 글과 이어지는 글입니다. 해당 정리글은 아래의 유튜브 영상을 참고하여 만들었습니다. 문제 시 삭제하겠습니다.
빨간색 형광펜은 강의에서 강조한 부분, 노란색 형광펜은 추가 서치로 내용을 '직접' 보강한 부분입니다.

서브쿼리(Sub Query)

  • 하나의 SQL에 포함되어 있는 또 다른 SQL을 지칭
  • 서브쿼리는 대부분의 SQL절에서 사용 가능
    • SELECT, FROM, WHERE, HAVING, ORDER BY, SET 절 등
  • 서브쿼리는 시작과 끝을 소괄호로 감싸서 표현
  • 서브쿼리는 사용되는 위치에 따라 단일행으로 출력되거나 복수형으로 출력될 수 있음
단일행 서브쿼리 =, <, >, <>사용가능
다중행 서브쿼리 IN, ALL, ANY, EXISTS 사용가능
CROSS JOIN JOIN 하는 테이블간 조인 조건이 없을 때 실행되는 JOIN
OUTER JOIN INNER JOIN과 같은 상태에서 기준이 되는 테이블은 다른 쪽에 같은 값이 없어도 실행되어 출력하는 JOIN
서브쿼리 위치 명칭
SELECT 절 스칼라 서브쿼리
FROM 절 인라인뷰
WHERE 절 중첩 서브쿼리, 서브쿼리

 

스칼라 서브쿼리(SELECT 절)

  • SELECT 절에 사용이 된다.
  • 성능에 매우 불리하다.
SELECT name AS 학생이름,
    (SELECT major_title
    FROM major b
    WHERE b.major_id = a.major_id) AS 학과명
FROM student a;

 

인라인뷰 (FROM 절)

  • SQL의 핵심
  • FROM절에 사용되는 서브쿼리
  • 동적 뷰 라고도 함
SELECT a.name as 학생이름, b.major_title as 학과명
FROM student a (
    SELECT major_title, major_id
    FROM major) b
WHERE a.major_id = b.major_id
SELECT *
FROM (SELECT major_id, count(*) cnt
	FROM student
    GROUP BY major_id)

 

EXISTS, NOT EXISTS

  • 서브쿼리의 결과가 존재한다면 메인쿼리의 결과가 출력되는 문법
  • EXISTS는 다른 방법으로 구현이 간으함
  • EXISTS에서는 ON절 사용 불가
SELECT *
FROM student s
WHERE EXISTS (SELECT 1
		FROM major_outer m
                WHERE m.major_id = s.major_id);
                
                
SELECT *
FROM student s
WHERE NOT EXISTS (SELECT 1
		FROM major_outer m
                WHERE m.major_id = s.major_id);

 

비등가조인

  • 조인을 할 때 꼭 등가 조인을 해야 하는 건 아니다.
  • 특정 범위나 같지 다는 조건으로도 조인을 할 수 있다.
SELECT c.name, c.point, g.name
FROM customer c JOIN gift g
ON c.point between g.point_s and g.point_e

 

집합연산자

  • 조인은 두개의 테이블을 하나로 반드는데, 좌우로 붙이는 개념이다.
  • 집합 연산자는 ROW단위로, 데이터를 위아래로 붙이는 개념이다.
  • 두 개 이상의 SELECT 결과를 하나로 만들어 준다.
  • SELECT절의 컬럼수가 같아야 하고, 데이터타입의 호환이 되어야 한다.

1. UNION

UNION 연산자는 두 개 이상의 쿼리 결과를 결합하여 중복을 제거한 결과를 반환합니다. 모든 쿼리는 동일한 수의 열과 유사한 데이터 타입을 가져야 합니다.

SELECT column_name FROM table1
UNION
SELECT column_name FROM table2;

2. UNION ALL

 

UNION ALL은 UNION과 유사하지만, 중복된 행을 제거하지 않고 모든 결과를 반환합니다.

SELECT column_name FROM table1
UNION ALL
SELECT column_name FROM table2;

3. INTERSECT

INTERSECT 연산자는 두 쿼리에서 공통적으로 존재하는 행만을 반환합니다.

예시 코드:

SELECT column_name FROM table1
INTERSECT
SELECT column_name FROM table2;

4. EXCEPT 또는 MINUS

EXCEPT (또는 일부 데이터베이스 시스템에서는 MINUS)는 첫 번째 쿼리의 결과 중 두 번째 쿼리의 결과에 포함되지 않는 행만을 반환합니다.

예시 코드:

SELECT column_name FROM table1
EXCEPT
SELECT column_name FROM table2;