본문 바로가기

DataBase

서브쿼리 (SubQuery) (Maria DB)

서브쿼리 - 쿼리문 안에 쿼리문

()안에 쿼리문을 작성하는 것을 서브쿼리라고 한다.

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;

동작 방식 그림 설명)

동작 방식 그림 설명

결과 값)

결과 값 그림설명

 

반응형