Поиск…


замечания

Подзапросы могут отображаться в разных предложениях внешнего запроса или в заданной операции.

Они должны быть заключены в круглые скобки () . Если результат подзапроса сравнивается с чем-то другим, количество столбцов должно совпадать. Табличные псевдонимы необходимы для подзапросов в предложении 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 из внешнего запроса.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow