1. 비상관 서브쿼리
원래 쿼리와 안의 쿼리와는 완전 상관없이 돌아가는 것
SELECT
CategoryID, CategoryName, Description,
(SELECT ProductName
FROM Products
WHERE ProductID = 1)
FROM Categories;
| ategoryID | CategoryName | Description | (SELECT ProductName FROM Products WHERE ProductID = 1) |
|---|
| 1 | Beverages | Soft drinks, coffees, teas, beers, and ales | Chais |
| 2 | Condiments | Sweet and savory sauces, relishes, spreads, and seasonings | Chais |
→ 사실 이거는 의미는 없음
SELECT *
FROM Products
WHERE Price < (
SELECT AVG(Price)
FROM Products
);
| ProductID | ProductName | SupplierID | CategoryID | Unit | Price |
|---|
| 1 | Chais | 1 | 1 | 10 boxes x 20 bags | 18.00 |
| 2 | Chang | 1 | 1 | 24 - 12 oz bottles | 19.00 |
SELECT
CategoryID, CategoryName, Description
FROM Categories
WHERE
CategoryID =
(SELECT CategoryID
FROM Products
WHERE ProductName = 'Chais');
| CategoryID | CategoryName | Description |
|---|
| 1 | Beverages | Soft drinks, coffees, teas, beers, and ales |
SELECT
CategoryID, CategoryName, Description
FROM Categories
WHERE
CategoryID IN
(SELECT CategoryID
FROM Products
WHERE Price > 50);
| CategoryID | CategoryName | Description |
|---|
| 1 | Beverages | Soft drinks, coffees, teas, beers, and ales |
| 3 | Confections | Desserts, candies, and sweet breads |
| 4 | Dairy Products | Cheeses |
| 연산자 | 의미 |
|---|
| ~ ALL | 서브쿼리의 모든 결과에 대해 ~하다 |
| ~ ANY | 서브쿼리의 하나 이상의 결과에 대해 ~하다 |
SELECT *
FROM Products
WHERE Price > ALL (
SELECT Price
FROM Products
WHERE CategoryID = 2
);
| ProductID | ProductName | SupplierID | CategoryID | Unit | Price |
|---|
| 9 | Mishi Kobe Niku | 4 | 6 | 18 - 500 g pkgs. | 97.00 |
| 18 | Carnarvon Tigers | 7 | 8 | 16 kg pkg. | 62.50 |
| 20 | Sir Rodney's Marmalade | 8 | 3 | 30 gift boxes | 81.00 |
SELECT
CategoryID, CategoryName, Description
FROM Categories
WHERE
CategoryID = ANY
(SELECT CategoryID
FROM Products
WHERE Price > 50);
SELECT
CategoryID, CategoryName, Description
FROM Categories
WHERE
CategoryID IN
(SELECT CategoryID
FROM Products
WHERE Price > 50);
→ = ANY를 IN 으로 바꿔도 똑같은 결과가 나옴
| CategoryID | CategoryName | Description |
|---|
| 1 | Beverages | Soft drinks, coffees, teas, beers, and ales |
| 3 | Confections | Desserts, candies, and sweet breads |
| 4 | Dairy Products | Cheeses |
2. 상관 서브쿼리
바깥 쿼리와 안쪽 쿼리가 같이 맞물려져서 돌아감
그래서 상관된 테이블들의 닉네임을 만들어줘야함!
SELECT
ProductID, ProductName,
(
SELECT CategoryName
FROM Categories C
WHERE C.CategoryID = P.CategoryID
) AS CategoryName
FROM Products P;
| ProductID | ProductName | CategoryName |
|---|
| 1 | Chais | Beverages |
| 2 | Chang | Beverages |
| 3 | Aniseed Syrup | Condiments |
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;
| SupplierName | Country | City | CustomersInTheCountry | CustomersInTheCity |
|---|
| Exotic Liquid | UK | Londona | 7 | 0 |
| New Orleans Cajun Delights | USA | New Orleans | 13 | 0 |
| Grandma Kelly's Homestead | USA | Ann Arbor | 13 | |
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;
| CategoryID | CategoryName | MaximumPrice | AveragePrice |
|---|
| 1 | Beverages | 263.50 | 37.979167 |
| 2 | Condiments | 43.90 | 23.062500 |
| 3 | Confections | 81.00 | 25.160000 |
SELECT
ProductID, ProductName, CategoryID, Price
FROM Products P1
WHERE Price < (
SELECT AVG(Price)
FROM Products P2
WHERE P2.CategoryID = P1.CategoryID
);
| ProductID | ProductName | CategoryID | Price |
|---|
| 1 | Chais | 1 | 18.00 |
| 2 | Chang | 1 | 19.00 |
| 3 | Aniseed Syrup | 2 | 10.00 |
EXISTS / NOT EXISTS 연산자
SELECT
CategoryID, CategoryName
FROM Categories C
WHERE EXISTS (
SELECT *
FROM Products P
WHERE P.CategoryID = C.CategoryID
AND P.Price > 80
);
| CategoryID | CategoryName |
|---|
| 1 | Beverages |
| 3 | Confections |
| 6 | Meat/Poultry |