상세 컨텐츠

본문 제목

서브쿼리

SQL/MySQL 이론

by 관재탑 2022. 8. 1. 16:56

본문

WHERE절 서브쿼리

 

단일행 서브쿼리

평균보다 높은 tip을 받은 데이터만 출력하는 쿼리

WHERE절에 비교연산자(>)을 넣어줘서 서브쿼리의 결과값은 하나만 나와야 한다, 비교연산자와 자주 쓰임

SELECT *
FROM tips
WHERE tip > (SELECT AVG(tip) FROM tips)

 

 

다중행 서브쿼리

요일 별 판매 금액이 1500불 이상인 날의 결제 내역을 출력하는 쿼리

서브쿼리의 결과값이 컬럼은 1개,  행은 여러개 가능, IN or NOT IN과 자주 쓰임

SELECT *
FROM tips
WHERE day IN(SELECT day
             FROM tips
             GROUP BY day
             HAVING SUM(total_bill) >= 1500)

 

 

다중컬럼 서브쿼리

요일 별로 가장 높은 금액을 지출한 데이터를 출력

서브쿼리의 결과값이 컬음은 여러개, 행도 여러개 가능

MySQL에서 outer query의 WHERE절에서 칼럼들을 ()로 묶어줘야 됨

SELECT *
FROM tips
WHERE (day, total_bill) IN(
SELECT day,
MAX(total_bill)
FROM tips
GROUP BY day)

서브쿼리의 결과값

 

outer query의 WHERE절에서 (day, total_bill)의 두 칼럼이 서브쿼리의 결과값에 해당하는 row만 출력

 

 

 

HAVING절 서브쿼리

SELECT months*salary AS earnings, COUNT(*)
FROM Employee
GROUP BY earnings
HAVING earnings = (SELECT MAX(months*salary) FROM employee)

 

 

 

FROM절 서브쿼리

인라인 뷰(inline view)라고도 합니다.

FROM절에 서브쿼리 작성시 별칭을 줘야합니다.

서브쿼리의 결과값을 daily라는 테이블로 사용할 수 있습니다.

서브쿼리에서 일별 매출액의 평균을 모두 평균내서 outer query에서는 하루 평균 매출액을 구함

SELECT AVG(sales)
FROM(SELECT day, ROUND(AVG(total_bill)) AS sales
     FROM tips
     GROUP BY day) AS daily

왼쪽은 서브쿼리의 결과값, 오른쪽은 outer query의 결과값

 

 

JOIN도 가능하다

SELECT *
FROM(SELECT day, 
     ROUND(AVG(total_bill)) AS sales
     FROM tips
     GROUP BY day
     ) AS daily INNER JOIN tips ON daily.day = tips.day

 

 

 

WITH문

위의 FROM절 서브쿼리에서 사용한 서브쿼리를 "WITH 테이블명 AS(서브쿼리)"로도 사용가능

결과값은 위의 FROM절 서브쿼리문과 똑같음

WITH문은 테이블을 생성하는 문법은 아님, 쿼리를 실행할 때만 유효한 임시 결과문을 만들어줌

WITH daily AS(SELECT day, 
     SUM(total_bill) AS sales
     FROM tips
     GROUP BY day)

SELECT *
FROM daily

 

WITH문은 여러개 작성 가능

WITH 별칭 AS(
...
), 별칭 AS(
```
)

 

 

 

SELECT절 서브쿼리

단일행 서브쿼리만 사용가능하다

행에 들어가는 데이터를 만들어준다.

()로 감싸주는게 좋다.

 

서브쿼리의 결과값은 t2테이블에서 day가 Sat인 날의 total_bill의 합계를 구한다.

세개의 칼럼이 생기는데 SELECT 서브쿼리로 만든 sales 칼럼의 모든 row에는 토요일의 total_bill 합계가 들어간다.

SELECT t1.day,
       t1.total_bill,
       (SELECT SUM(total_bill) FROM tips t2 WHERE t2.day = 'Sat') AS sales
FROM tips t1

 

 

 

t2의 day가 t1의 day와 같은 요일의 매출액 합계를 구한다. 

t1.day가 토요일이면 sales칼럼에는 토요일의 매출액 합계가, t1.day가 일요일이면 일요일의 매출액 합계가 행마다 나온다.

sales칼럼에는 t1.day 칼럼과 같은 요일의 매출액 합계가 나오게 된다.

SELECT t1.day,
       t1.total_bill,
       (SELECT SUM(total_bill) FROM tips t2 WHERE t2.day = t1.day) AS sales
FROM tips t1

 

 

 

INNER JOIN절 서브쿼리

SELECT d.name AS department,
       e.name AS employee,
       e.salary 
FROM employee AS e
     INNER JOIN (
                 SELECT departmentid, MAX(salary) AS max_salary
                 FROM employee
                 GROUP BY departmentid
                 ) AS dh ON e.departmentid = dh.departmentid
                         AND e.salary = dh.max_salary
     INNER JOIN department AS d ON d.id = e.departmentid

 

 

'SQL > MySQL 이론' 카테고리의 다른 글

My SQL 날짜 함수  (0) 2022.09.11
정규표현식  (0) 2022.08.12
집계함수, GROUP BY, HAVING  (0) 2022.07.26
WHERE, ORDER BY  (1) 2022.07.26
MySQL 이론2  (0) 2022.07.18

관련글 더보기

댓글 영역