서브쿼리 - 쿼리문 안에 쿼리문
()안에 쿼리문을 작성하는 것을 서브쿼리라고 한다.
SELECT 컬럼명
FROM 테이블명
WHERE 조건식 (서브쿼리);
예제1) Ipoh coffee 이름의 상품보다 큰 상품들을 조회하고 싶다.
1. Ipoh coffee 의 가격을 먼저조회
SELECT Price FROM products WHERE ProductName = 'Ipoh coffee'; -- 46.00
2. 서브 쿼리 없이 기존 조회 방법 (WHERE 절에 Ipoh coffee 가격을 비교연산자 통해 조회)
SELECT ProductName, Price FROM products WHERE Price > 46.00 ORDER BY Price DESC;
3. 서브 쿼리 활용 - 1번의 조회 쿼리를 서브쿼리로 활용
SELECT ProductName, Price
FROM products
WHERE Price > (SELECT Price FROM products WHERE ProductName = 'Ipoh coffee')
ORDER BY Price DESC;
이렇게 WHERE 절 조건식에 () 괄호 안에 쿼리문을 작성할 수 있다.
값이 단일 값이 아닌 여러 값이 라면?
IN을 활용해서 사용
한 개의 열 / 여러개의 행
예제2) 멕시코 고객이 주문한 일자들을 조회
1. customers 테이블에서 멕시코 고객들을 우선 조회
SELECT CustomerID FROM customers WHERE Country = 'mexico'; -- 5명이 조회됨
2. 서브 쿼리와 IN 을 활용해 조회
SELECT OrderDate
FROM orders
WHERE CustomerID IN (SELECT CustomerID FROM customers WHERE Country = 'mexico');
여러개 행, 열
-- 행 여러개 열 여러개
INSERT INTO customers (CustomerName, Address, Country)
(SELECT SupplierName, Address, Country FROM suppliers);
INSERT, CREATE 등등 여러가지 방법으로 사용 가능
-- INSERT 예제
-- 열의 개수와 타입만 맞으면 서브쿼리로 INSERT 도 가능
INSERT INTO customers (CustomerName, Address, Country)
(SELECT ContactName, City, Phone, FROM suppliers);
-- CREATE TABLE 예제
CREATE TABLE table_c
SELECT CustomerName, City, Country
FROM customers;
1. 비상관 쿼리
2. 상관쿼리
비상관 쿼리 - 외부쿼리의 컬럼이 내부쿼리에 사용되지 않을 때
※외부쿼리: () 밖에 기재된 쿼리문 / ※내부쿼리: ()안에 서브쿼리를 내부쿼리라고 한다.
일반적으로 사용하는 서브쿼리 방식이랑 동일
SELECT 컬럼명
FROM 테이블명
WHERE 조건식 (서브쿼리(내부쿼리));
예제)
-- Supplier 테이블의 SupplierID의 값이 1인 Country가
-- customers의 Country랑 몇 개(COUNT())나 같은지~
SELECT COUNT(*)
FROM customers
WHERE Country = (SELECT Country FROM suppliers WHERE SupplierID = 1);
-- 결과 값: 7
상관 쿼리 - 외부쿼리의 컬럼이 내부쿼리에서 사용될 때
동작방식은 외부쿼리의 한 행이 내부쿼리에 모든 행을 탐색한다
그래서 속도가 느릴 수 있는 문제가 생길 수 있다.
예제)
-- Customers, Supplier 각 테이블의 Country가
-- Supplier 테이블의 supplierID 기준으로 몇 개나 겹치는지
SELECT s.supplierID, (SELECT COUNT(*) FROM customers c WHERE c.Country = s.Country) AS 'Num'
FROM suppliers s;
동작 방식 그림 설명)
결과 값)
반응형
'DataBase' 카테고리의 다른 글
집계함수, 집합함수, 그룹함수 - aggregate function (Maria DB) (0) | 2023.10.16 |
---|---|
UNION(CROSS JOIN, FULL OUTER JOIN) (Maria DB) (0) | 2023.10.13 |
JOIN - 테이블 끼리 결합 (Maria DB) (1) | 2023.10.12 |
데이터베이스 정규화(Normalization) (0) | 2023.10.12 |
DATABASE, SCHMA / Table 생성하기 (Maria DB) (0) | 2023.10.12 |