서브쿼리
쿼리문 안쪽의 또다른 쿼리문 으로 바깥쪽의 쿼리와 안쪽의 서브쿼리문은 독자적으로 실행되며 서로 상관하지 않는다.
ex1)
SELECT
CategoryID, CategoryName, Description,
(SELECT ProductName FROM Products WHERE ProductID = 1)
FROM Categories;
쿼리문 안에 또 다른 쿼리문을 넣어서 다른 테이블에서 데이터를 불러옴
ex2)
SELECT * FROM Products
WHERE Price < (
SELECT AVG(Price) FROM Products
);
서브쿼리를 이용해서 Price의 평균을 구하고 평균 보다 낮은 값을 추출한다.
ex3)
SELECT CategoryID, CategoryName, Description
FROM Categories;
Categories테이블의 CategoryID, CategoryName, Description 컬럼
ex3-1)
SELECT CategoryID FROM Products
WHERE Price > 50;
Poducts 테이블의 Price가 50보다 큰 값을 가진 CategoryID들
ex3-2)합쳐 보기
Poducts 테이블의 Price가 50보다 큰 값을 가진 CategoryID를 추출해서 Categories테이블의 CategoryName, Description 컬럼을 데이터를 불러옴
연산자 | 의미 |
---|---|
~ALL | 서브쿼리의 모든 결과에 대해 ~하다 |
~ANY | 서브쿼리의 하나 이상의 결과에 대해 ~하다 |
ex1) ALL
SELECT Price FROM Products
WHERE CategoryID =2;
CategoryID가 2인 것 들을 추출해서 Price를 보여줌
ex1-1) ALL 적용
SELECT * FROM Products
WHERE Price > ALL(
SELECT Price FROM Products
WHERE CategoryID =2
);
CategoryID가 2인 것 들의 Price보다 큰 Price 값을 보여준다. 즉 CategoryID가 2인 것 들 중 Max값 보다 큰 값을 보여줌
ex2) ANY
SELECT CategoryID FROM Products
WHERE Price > 50;
Price가 50보다 큰 값의 CategoryID
ex2-1) ANY 적용
SELECT CategoryID, CategoryName, Description
FROM Categories
WHERE CategoryID = ANY (
SELECT CategoryID FROM Products
WHERE Price > 50);
Price가 50보다 큰 값의 CategoryID 중 같은 값이 있으면 해당 값을 보여준다.
"CategoryID = ANY" == "CategoryID IN"
바깥쪽의 쿼리와 안쪽의 서브쿼리가 맡물려 돌아간다.
ex1)
Products 테이블
Categories 테이블
Products 테이블은 CategoryID를 가지고 있고,
Categories는 각 각의 CategoryID가 가지는 데이터들이 있다.
SELECT ProductID, ProductName,
(
SELECT CategoryName FROM Categories C
WHERE C.CategoryID = P.CategoryID
) AS CategoryName
FROM Products P;
ex2)
Suppliers 테이블
Customers 테이블
각 각의 테이블이 가지고있는 County와 City 정보를 이용해 하나의 테이블로 정리한다.
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;
연산자 | 의미 |
---|---|
EXISTS | 존재 하는가 |
NOT EXISTS | 존재하지 않는가 |
ex1) EXISTS
SELECT CategoryID, CategoryName
FROM Categories C
WHERE EXISTS(
SELECT * FROM Products P
WHERE P.CategoryID = C.CategoryID AND P.Price > 80
);
P.Category Id 와 C.CategoryID가 같은고 price가 80이 넘어가는 데이터가 존재한다면 해당 데이터를 보여준다.
ex2) NOT EXISTS
SELECT CategoryID, CategoryName
FROM Categories C
WHERE NOT EXISTS(
SELECT * FROM Products P
WHERE P.CategoryID = C.CategoryID AND P.Price > 80
);
P.Category Id 와 C.CategoryID가 같은고 price가 80이 넘어가는 데이터가 존재하는것을 제외하고 보여준다.