SQL 정리 : Subquery, Distinct

Notura·2024년 9월 22일
post-thumbnail

Subquery


Subquery in SELECT

✔조건 : 서브쿼리의 결과 테이블이 1개의 열, 1개의 행만 가져야한다.(단일 값)

SELECT name, price, (
	SELECT MAX(price) FROM products // products 테이블의 max price값 출력하는 열
)
FROM products
WHERE price > 867;
SELECT name, price, (
	SELECT price FROM products WHERE id = 3
) AS id_3_price // id가 3인 price를 쭉 출력하는 행
FROM products
WHERE price > 867;

이렇게만 하면 의미없이 한 가지 값이 모든 열에 쭉 출력된다.


Subquery in FROM

from 절에 서브쿼리를 사용하는 이유를 예제를 통해서 알아보자
orders 테이블에서 모든 사용자의 주문 횟수의 평균을 알아보는 쿼리를 보자

  • 그동안 공부했던 내용들로 시도해본 쿼리
SELECT AVG(COUNT(*)) // 오류!!
FROM orders
GROUP BY user_id;

aggregate 함수는 저렇게 내부에 서로 파라미터로 사용할 수 없다

  • from에 서브쿼리 사용해서 해결하기
SELECT AVG(order_count) 
FROM (
  SELECT user_id, COUNT(*) AS order_count
  FROM orders
  GROUP BY user_id
) AS p // 서브쿼리로 from을 할때 AS로 이름을 붙여주는건 필수다

Subquery in WHERE

  • in 연산자 + 서브쿼리
SELECT id 
FROM orders
WHERE product_id IN (
	SELECT id FROM products WHERE price / weight > 50
);
  • < 연산자 + 서브쿼리
SELECT name, price
FROM phones
WHERE price > (
	SELECT price FROM phones WHERE name = 'S5620 Monte'
);

새로운 where 연산자

  • '> ALL' : 컬럼 모두와 비교해서 크면 참
SELECT name, price
FROM products
WHERE price > ALL (
	SELECT price FROM products WHERE department = 'Industrial'
);
  • '> SOME' : 컬럼과 비교해서 하나의 값보다 크다면 참
SELECT name, price
FROM products
WHERE price > SOME (
	SELECT price FROM products WHERE department = 'Industrial'
);
  • 다양한 조건 연산자에 ALL과 SOME을 붙일 수 있다.
    EX) > ALL, <= SOME, = ALL, = SOME 등등

Distinct

  • 컬럼의 모든 값을 출력하는데, 만약 한 값이 3개의 중복이 된다면 나머지 2개는 제외하고 유일한 값만 대표해서 출력한다.
SELECT DISTINCT department
FROM products;
  • 유일한 department - name의 쌍을 출력한다.
SELECT DISTINCT department, name 
FROM products;
  • distinct 활용
SELECT COUNT(DISTINCT manufacture)
FROM phones;
profile
고통을 즐기자

0개의 댓글