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를 반환한다.
: 외래키와 기본키는 데이터베이스 설계에서 중요한 개념으로, 테이블 간의 관계를 정의하고 데이터의 무결성을 유지하는 데 사용된다.
기본키는 테이블 내의 각 행을 고유하게 식별하는 데 사용되는 하나 이상의 열입니다. 기본키의 주요 특징은 다음과 같습니다:
예시:
CREATE TABLE Employees (
EmployeeID INT PRIMARY KEY,
FirstName VARCHAR(50),
LastName VARCHAR(50)
);
위 예시에서 EmployeeID 열은 Employees 테이블의 기본키로 사용됩니다.
외래키는 한 테이블에서 다른 테이블의 기본키를 참조하여 두 테이블 간의 관계를 정의합니다. 외래키의 주요 특징은 다음과 같습니다:
예시:
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 KEY | FOREIGN KEY (CustomerID) REFERENCES Employees(EmployeeID) |
기본키: 테이블 내에서 각 행을 고유하게 식별하는 열(또는 열의 집합)로, 고유하고 NULL 값을 가질 수 없다.
외래키: 한 테이블이 다른 테이블의 기본키를 참조하여 두 테이블 간의 관계를 정의하는 열(또는 열의 집합)로, 외래키 값은 참조하는 테이블에 존재해야 함.
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
테이블을 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 절 필터링이 가능하다!
SELECT * 을 돌려 JOIN의 완성도를 점검한다.