Поиск…
замечания
Подзапросы могут отображаться в разных предложениях внешнего запроса или в заданной операции.
Они должны быть заключены в круглые скобки ()
. Если результат подзапроса сравнивается с чем-то другим, количество столбцов должно совпадать. Табличные псевдонимы необходимы для подзапросов в предложении 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
В следующем примере найдены города (из примера городов ), население которых находится ниже средней температуры (полученной через sub-qquery):
SELECT name, pop2000 FROM cities
WHERE pop2000 < (SELECT avg(pop2000) FROM cities);
Здесь: подзапрос (SELECT avg (pop2000) FROM города) используется для указания условий в предложении WHERE. Результат:
название | pop2000 |
---|---|
Сан-Франциско | 776733 |
СВЯТОЙ ЛУИ | 348189 |
Канзас-Сити | 146866 |
Подзапросы в предложении SELECT
Подзапросы могут также использоваться в части SELECT
внешнего запроса. Следующий запрос показывает все столбцы таблицы погоды с соответствующими состояниями из таблицы городов .
SELECT w.*, (SELECT c.state FROM cities AS c WHERE c.name = w.city ) AS state
FROM weather AS w;
Фильтрация результатов запроса с использованием запроса в другой таблице
Этот запрос выбирает всех сотрудников не в таблице Supervisors.
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
Коррелированные подзапросы
Коррелированные (также называемые синхронизированными или скоординированными) подзапросами - это вложенные запросы, которые ссылаются на текущую строку их внешнего запроса:
SELECT EmployeeId
FROM Employee AS eOuter
WHERE Salary > (
SELECT AVG(Salary)
FROM Employee eInner
WHERE eInner.DepartmentId = eOuter.DepartmentId
)
Подзапрос SELECT AVG(Salary) ...
коррелирован, потому что он ссылается на строку Employee
row eOuter
из внешнего запроса.