240711

Gi Woon Lee·2024년 7월 11일
1

TIL

목록 보기
15/78

SQL

🟦 스칼라 서브쿼리(Scalar Subquery)

WHERE 칼럼 = (서브쿼리 SELECT..FROM..)

서브쿼리가 하나의 값을 반환하는 경우, 이를 WHERE 절의 필터링 값으로 사용할 수 있다. 이를 스칼라 서브쿼리라고 부른다.

이는 주 쿼리의 WHERE, SELECT, HAVING 절에서 모두 사용 가능하다.

특징
1. 단일 값 반환: 반드시 하나의 값만 반환해야 합니다. 여러 행이나 여러 열을 반환하면 오류가 발생합니다.
2. 독립적 실행: 서브쿼리는 주 쿼리와 독립적으로 실행됩니다.
3. 다양한 사용: WHERE 절, SELECT 절, HAVING 절 등 다양한 SQL 문맥에서 사용할 수 있습니다.

예시 문제: SQL66번 -조회수가 가장 많은 중고거래

SELECT 
    B.BOARD_ID, 
    F.FILE_ID, 
    F.FILE_NAME, 
    F.FILE_EXT, 
    B.VIEWS,
    CONCAT('/home/grep/src/', B.BOARD_ID, '/', F.FILE_ID, '/', F.FILE_NAME, '.', F.FILE_EXT) AS FILE_PATH
FROM 
    USED_GOODS_BOARD B
INNER JOIN 
    USED_GOODS_FILE F ON B.BOARD_ID = F.BOARD_ID
WHERE 
    B.VIEWS = (
        SELECT MAX(VIEWS)
        FROM USED_GOODS_BOARD
    )
ORDER BY 
    F.FILE_ID DESC;

위 쿼리의 WHERE 절에 있는 서브쿼리가 바로 스칼라 서브쿼리이다.
해당 스칼라 서브쿼리는 BOARD 테이블에서 가장 뷰가 많은 값(301)을 주 쿼리에서 필터링하는 역할을 수행한다.

SELECT MAX(VIEWS)
FROM USED_GOODS_BOARD

스칼라 서브쿼리 값: 301

주 쿼리에서는 해당 뷰(301)를 가지는 게시물의 경로 FILE_PATH를 반환한다.

🟦 기본키(Primary Key)와 외래키(Foreign Key)

: 외래키와 기본키는 데이터베이스 설계에서 중요한 개념으로, 테이블 간의 관계를 정의하고 데이터의 무결성을 유지하는 데 사용된다.

기본키 (Primary Key)

기본키는 테이블 내의 각 행을 고유하게 식별하는 데 사용되는 하나 이상의 열입니다. 기본키의 주요 특징은 다음과 같습니다:

  1. 고유성 (Uniqueness): 기본키는 테이블 내의 각 행을 고유하게 식별합니다. 즉, 기본키 값은 중복될 수 없습니다.
  2. NULL 불가 (Not Null): 기본키는 NULL 값을 가질 수 없습니다. 모든 행은 기본키 값을 가져야 합니다.
  3. 단일 열 또는 복합 열: 기본키는 단일 열로 구성될 수도 있고, 여러 열의 조합으로 구성될 수도 있습니다. 후자의 경우 복합키(Composite Key)라고 합니다.

예시:

CREATE TABLE Employees (
    EmployeeID INT PRIMARY KEY,
    FirstName VARCHAR(50),
    LastName VARCHAR(50)
);

위 예시에서 EmployeeID 열은 Employees 테이블의 기본키로 사용됩니다.

외래키 (Foreign Key)

외래키는 한 테이블에서 다른 테이블의 기본키를 참조하여 두 테이블 간의 관계를 정의합니다. 외래키의 주요 특징은 다음과 같습니다:

  1. 참조 무결성 (Referential Integrity): 외래키는 참조되는 테이블의 기본키 값을 참조해야 합니다. ⭐외래키 값은 참조하는 테이블에 존재해야 합니다.
  2. NULL 가능: 외래키는 NULL 값을 가질 수 있습니다. 이는 관계가 없는 행을 허용합니다.
  3. 제약 조건: 외래키 제약 조건을 통해 데이터베이스는 참조 무결성을 자동으로 유지합니다. 예를 들어, 참조하는 행이 삭제되거나 업데이트될 때 동작을 정의할 수 있습니다.

예시:

CREATE TABLE Orders (
    OrderID INT PRIMARY KEY,
    OrderDate DATE,
    CustomerID INT,
    FOREIGN KEY (CustomerID) REFERENCES Employees(EmployeeID)
);

위 예시에서 CustomerID 열은 Orders 테이블에서 Employees 테이블의 EmployeeID 기본키를 참조하는 외래키로 사용됩니다.

요약

특성기본키 (Primary Key)외래키 (Foreign Key)
정의테이블 내에서 각 행을 고유하게 식별하는 열다른 테이블의 기본키를 참조하여 관계를 정의하는 열
고유성중복될 수 없음중복될 수 있음
NULL 값허용되지 않음허용됨
목적각 행을 고유하게 식별테이블 간의 관계 정의 및 참조 무결성 유지
제약 조건기본키 제약 조건 (UNIQUE, NOT NULL) 적용외래키 제약 조건 적용
단일/복합단일 열 또는 여러 열의 조합 (복합키) 가능단일 열 또는 여러 열의 조합 가능
예시EmployeeID INT PRIMARY KEYFOREIGN KEY (CustomerID) REFERENCES Employees(EmployeeID)
  • 기본키: 테이블 내에서 각 행을 고유하게 식별하는 열(또는 열의 집합)로, 고유하고 NULL 값을 가질 수 없다.

  • 외래키: 한 테이블이 다른 테이블의 기본키를 참조하여 두 테이블 간의 관계를 정의하는 열(또는 열의 집합)로, 외래키 값은 참조하는 테이블에 존재해야 함.

🟦 GROUP BY

SELECT를 통해 복수의 칼럼과 해당 칼럼들의 그룹화 집계 결과(집계함수 결과)를 알고 싶다면,
SELECT에 출력을 요청하는 모든 칼럼들을 GROUP BY 절에서 GROUPING해야 한다.

예를 들어 BOOK 테이블의 BOOK_ID, AUTHOR_ID, SALES_AMOUNT, PRICE 칼럼이 있다고 하자.
BOOK_ID, AUTHOR_ID 별로 SUM(SALES_AMOUNT * PRICE)를 반환하고 싶다면

SELECT BOOK_ID, AUTHOR_ID, SUM(SALES_AMOUNT * PRICE)

GROUP BY 절에서 집계함수 SUM(SALES_AMOUNT * PRICE)에 들어가는 SALES_AMOUNT, PRICE를 제외한 칼럼들 BOOK_ID, AUTHOR_ID 을 전부 넣어줘야 한다.

SELECT BOOK_ID, AUTHOR_ID, SUM(SALES_AMOUNT * PRICE)
FROM BOOK
GROUP BY BOOK_ID, AUTHOR_ID

예시 문제(SQL-68번-저자,카테고리별 매출액)

🟦 JOIN 절 필터링

테이블을 JOIN을 관장하는 FROM 절에서 AND 연산자를 통해 필터링이 가능하다.

FROM SALES S
LEFT JOIN BOOK B
ON S.BOOK_ID = B.BOOK_ID AND SUBSTR(s.sales_date,1,7) = '2022-01'
#SALES 테이블의 SALES_DATE 칼럼의 1~7 인자가 '2022-01'와 동일한 값들만 반환하라.

위 코드는 SALES 테이블과 BOOK 테이블을 각자의 BOOK_ID 칼럼으로 JOIN하는 FROM 절이다.

JOIN의 대상 칼럼을 명시하는 ON 뒤에 AND 연산자를 통해 FROM 절 필터링이 가능하다!

  • 필터링 조건
    "JOIN 을 수행하며 SALES 테이블의 SALES_DATE 칼럼의 1~7 인자가 '2022-01'와 동일한 값들만 반환하라."

🟦 다수의 테이블 JOIN 절차

  1. 가장 메인이 되는(모든 값이 필요한 테이블) 테이블 결정. LEFT JOIN의 왼쪽에 위치시킨다.
  2. 필요 시 AND를 통해 필터링
  3. INNER, LEFT를 판단해서 나머지 테이블을 JOIN한다.
  4. 모든 조인을 마치면 SELECT * 을 돌려 JOIN의 완성도를 점검한다.
  5. 필요한 칼럼을 아낸다. - GROUPING, ORDERING, SELECTING 을 진행한다.
    예시 문제(SQL-68번-저자,카테고리별 매출액)

0개의 댓글