[MySQL] 서브쿼리

김재현·2022년 10월 13일
0

sql

목록 보기
11/12
post-thumbnail

깃허브 : TIL 저장소

MySQL 공부 내용을 깃허브 TIL 저장소에 정리를 해두었습니다. 이를 수행하고자 하는 작업을 기준으로 문법들을 다시 정리를 해보고자합니다. 이번 게시글에서는 서브쿼리에 대해 정리해보았습니다.


SUBQUERY

서브쿼리는 쿼리 안에 쿼리를 넣는 것으로 Inner Query 라고 부릅니다. 그리고 서브쿼리를 포함하는 쿼리는 Outer Query라고 부릅니다.

1. WHERE절 서브쿼리

1.1 단일 행 서브쿼리

  • Single Row : 서브쿼리의 결과값이 컬럼, 로우 모두 한 개일 때
# 결과 값이 하나이기 때문에, 비교연산자와 함게 사용되는 경우가 많다.
SELECT column_names
FROM table_name
WHERE column_name = (SELECT column_name From table_name WHERE condtion)
ORDER BY column_name;

1.2 다중 행 서브쿼리

  • Multiple Row : 서브쿼리의 결과값이 컬럼은 한 개, 로우는 N개일 때
# IN : 서브쿼리 결과 중에 포함될 때
SELECT column_names
FROM table_name
WHERE column_name IN (SELECT column_name FROM table_name WHERE condtion)
ORDER BY column_name;

# EXISTS : 서브쿼리 결과에 값이 있을 때
SELECT column_names
FROM table_name
WHERE column_name EXISTS (SELECT column_name FROM table_name WHERE condtion)
ORDER BY column_name;

# ANY : 서브쿼리 결과 중에 최소한 하나라도 만족하면 (비교연산자 사용)
SELECT column_names
FROM table_name
WHERE column_name = ANY (SELECT column_name FROM table_name WHERE condtion)
ORDER BY column_name;

# ALL : 서브쿼리 결과를 모두 만족하면 (비교연산자 사용)
SELECT column_names
FROM table_name
WHERE column_name = ALL (SELECT column_name FROM table_name WHERE condtion);

1.3 다중 컬럼 서브쿼리

  • Multiple Column : 서브쿼리의 결과값이 컬럼, 로우 모두 N개일 때
SELECT column_names
FROM tablename
WHERE (column1, column2, ...) IN (SELECT column1_condition, column2_condition,...
                                  FROM tablename)
ORDER BY column_names;

2. FROM절 서브쿼리

  • Inline View : From절에 사용
# 가상의 테이블을 하나 더 만든다고 생각하고 사용
# 서브쿼리에 별칭(alias) 필수
SELECT col_1, Aggregate_Functions(sample)
FROM (
      SELECT col_1
           , col_2
           , Aggregate_Functions(col_3) AS sample
      FROM tablename
      GROUP BY columname
      ) new_name
WHERE condition
GROUP BY columnname;

-- AVG 함수에서는 Null값을 무시한다. 그래서 총합을 null을 제외한 값의 수로 나눈다.
-- Null을 무시하지 않고, 0으로 취급해서 계산을 해주기 위해서는 하기의 방법을 사용한다. 
SELECT SUM(columnname)/COUNT(*)
FROM tablename

# 두 테이블을 동시에 활용할 경우
SELECT a.column, b.column
FROM table1 a, (SELECT  column1, column2 FROM table2) b
WHERE condition;

  • WITH 구문
WITH new_name AS (
SELECT column1
           , column2
           , Aggregate_Functions(column3)
      FROM tablename
      GROUP BY columname
) new_name2 AS (
...
)

SELECT columnname
FROM new_name
WHERE condition;

3. SELECT절 서브쿼리

  • Scalar subquery : Select절에 사용
SELECT column1, (SELECT column2 FROM table2 WHERE condition)
FROM table1
WHERE condtion;

0개의 댓글