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)
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
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
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 |
댓글 영역