서브쿼리

최대환·2022년 8월 2일
0

참고블로그

서브쿼리(subquery)

하나의 SQL문에 또 하나의 SQL문이 있는 형태.
서브쿼리를 가로로 감싸서 사용한다.
서브쿼리에서는 ORDER BY를 사용하지 못한다.

비상관 서브쿼리(un-correlated subquery)

서브 쿼리가 외부 쿼리의 어떤 것도 참조하지 않고 단독적으로 사용된다.
내부 쿼리와 외부쿼리의 값은 아무 상관없고 단독으로도 쿼리가 실행된다.

SELECT
  CategoryID, CategoryName, Description,
  (SELECT ProductName FROM Products WHERE ProductID = 1)
FROM Categories;


카테코리 테이블에서 CategoryID, CategoryName, Description 칼럼을 조회하고, Products 테이블에서 ProductID가 1인 ProductName칼럼을 조회한다.

SELECT * FROM Products
WHERE Price < (
  SELECT AVG(Price) FROM Products
);


Products테이블을 조회하는데 가격이 평균(28)보다 작은거만 조회한다.

SELECT
  CategoryID, CategoryName, Description
FROM Categories
WHERE
  CategoryID =
  (SELECT CategoryID FROM Products
  WHERE ProductName = 'Chais');

Categories 테이블에서 CategoryID, CategoryName, Description 칼럼을 조회하는데 Products 테이블에서 ProductName이 'Chais'인 CategoryID만 조회한다.
하나만 나온다.

SELECT
  CategoryID, CategoryName, Description
FROM Categories
WHERE
  CategoryID IN
  (SELECT CategoryID FROM Products
  WHERE Price > 50);

Categories 테이블에서 CategoryID, CategoryName, Description 를 조회하는데 Products 테이블에서 Price가 50 보다 큰거만 조회한다.

상관 서브쿼리(correlated subquery)

내부 서브쿼리값이 결정되는데 외부 쿼리값에 의존한다.

SELECT
  ProductID, ProductName,
  (
    SELECT CategoryName FROM Categories C
    WHERE C.CategoryID = P.CategoryID
  ) AS CategoryName
FROM Products P;


Products 테이블에서 ProductID, ProductName을, C.CategoryID 와 P.CategoryID 가 같은 (Categories 테이블에 있는)CategoryName을 조회한다.

SELECT
  SupplierName, Country, City,
  (
    SELECT COUNT(*) FROM Customers C
    WHERE C.Country = S.Country
  ) AS CustomersInTheCountry,
  (
    SELECT COUNT(*) FROM Customers C
    WHERE C.Country = S.Country 
      AND C.City = S.City
  ) AS CustomersInTheCity
FROM Suppliers S;


Suppliers테이블에서 SupplierName, Country, City 칼럼을 조회하고, Customers 테이블에서 Suppliers테이블의 Country가 같은 로우의 수를 CustomersInTheCountry로, Country와 City가 같은 로우의 수를 CustomersInTheCity로 출력한다.

SELECT
  CategoryID, CategoryName,
  (
    SELECT MAX(Price) FROM Products P
    WHERE P.CategoryID = C.CategoryID
  ) AS MaximumPrice,
  (
    SELECT AVG(Price) FROM Products P
    WHERE P.CategoryID = C.CategoryID
  ) AS AveragePrice
FROM Categories C;


Categories테이블에서 CategoryID, CategoryName를 출력하고, Products 테이블에서 Categories테이블의 CategoryID와 같은 로우들중에 가장 비싼가격인것만 출력하고,
평균가격을 출력한다.

SELECT
  ProductID, ProductName, CategoryID, Price
FROM Products P1
WHERE Price < (
  SELECT AVG(Price) FROM Products P2
  WHERE P2.CategoryID = P1.CategoryID
);


Products테이블에서 ProductID, ProductName, CategoryID, Price를 조회한다.
그 중 CategoryID을 가진 로우의 평균보다 작은값만 조회한다.

profile
나의 개발지식 output 공간

0개의 댓글