수색…
비고
하위 쿼리는 외부 쿼리의 다른 절 또는 집합 연산에 나타날 수 있습니다.
괄호 ()
로 묶어야합니다. 하위 쿼리의 결과가 다른 것과 비교되는 경우 열의 수가 일치해야합니다. 테이블 별칭은 임시 테이블의 이름을 지정하기 위해 FROM 절의 하위 쿼리에 필요합니다.
WHERE 절의 하위 쿼리
하위 쿼리를 사용하여 결과 집합을 필터링합니다. 예를 들어 가장 높은 유급 직원과 동일한 급여를 가진 모든 직원을 반환합니다.
SELECT *
FROM Employees
WHERE Salary = (SELECT MAX(Salary) FROM Employees)
FROM 절의 하위 쿼리
FROM
절의 하위 쿼리는 쿼리 실행 중에 생성되어 나중에 손실되는 임시 테이블과 유사하게 작동합니다.
SELECT Managers.Id, Employees.Salary
FROM (
SELECT Id
FROM Employees
WHERE ManagerId IS NULL
) AS Managers
JOIN Employees ON Managers.Id = Employees.Id
SELECT 절의 하위 쿼리
SELECT
Id,
FName,
LName,
(SELECT COUNT(*) FROM Cars WHERE Cars.CustomerId = Customers.Id) AS NumberOfCars
FROM Customers
FROM 절의 하위 쿼리
하위 쿼리를 사용하여 임시 테이블을 정의하고이를 "외부"쿼리의 FROM 절에서 사용할 수 있습니다.
SELECT * FROM (SELECT city, temp_hi - temp_lo AS temp_var FROM weather) AS w
WHERE temp_var > 20;
위의 내용은 매일의 온도 변화가 20보다 큰 날씨 표 에서 도시를 찾습니다. 결과는 다음과 같습니다.
시티 | temp_var |
---|---|
세인트루이스 | 21 |
로스 앤젤레스 | 31 |
로스 앤젤레스 | 23 |
로스 앤젤레스 | 31 |
로스 앤젤레스 | 27 |
로스 앤젤레스 | 28 |
로스 앤젤레스 | 28 |
로스 앤젤레스 | 32 |
.
WHERE 절의 하위 쿼리
다음 예는 인구가 평균 기온 (하위 qquery를 통해 얻은 것)보다 낮은 도시 ( 도시의 예 )를 찾습니다.
SELECT name, pop2000 FROM cities
WHERE pop2000 < (SELECT avg(pop2000) FROM cities);
여기에서 : 하위 쿼리 (SELECT avg (pop2000) FROM cities)는 WHERE 절에서 조건을 지정하는 데 사용됩니다. 결과는 다음과 같습니다.
이름 | pop2000 |
---|---|
샌프란시스코 | 776733 |
세인트루이스 | 348189 |
캔자스시 | 146866 |
SELECT 절의 하위 쿼리
하위 쿼리는 외부 쿼리의 SELECT
부분에서도 사용할 수 있습니다. 다음 쿼리는 cities 테이블 의 해당 상태가있는 모든 기상 테이블 열을 표시 합니다 .
SELECT w.*, (SELECT c.state FROM cities AS c WHERE c.name = w.city ) AS state
FROM weather AS w;
다른 테이블에서 쿼리를 사용하여 쿼리 결과 필터링
이 쿼리는 수퍼바이저 테이블에없는 모든 직원을 선택합니다.
SELECT *
FROM Employees
WHERE EmployeeID not in (SELECT EmployeeID
FROM Supervisors)
LEFT JOIN을 사용하여 동일한 결과를 얻을 수 있습니다.
SELECT *
FROM Employees AS e
LEFT JOIN Supervisors AS s ON s.EmployeeID=e.EmployeeID
WHERE s.EmployeeID is NULL
상관 하위 쿼리
상관 관계 (Synchronized 또는 Coordinated라고도 함) 하위 쿼리는 외부 쿼리의 현재 행을 참조하는 중첩 쿼리입니다.
SELECT EmployeeId
FROM Employee AS eOuter
WHERE Salary > (
SELECT AVG(Salary)
FROM Employee eInner
WHERE eInner.DepartmentId = eOuter.DepartmentId
)
하위 쿼리 SELECT AVG(Salary) ...
는 외부 쿼리에서 Employee
행 eOuter
를 참조하므로 상관 관계 가 있습니다.