processor_families.fdb → processor_families → Подзапрос в WHERE

SQL · Подзапрос в WHERE · Процессоры Intel

Подзапросы SELECT в базе данных процессоров Intel

Таблица «processor_families» — 20 строк детерминированно сгенерированных данных. Показанный ниже Подзапрос в WHERE реально выполнен движком FileDB: 9 строк в результате, 1.3 мс на выполнение, полным сканом таблицы.

Структура таблицы processor_families

Поля и типы данных

ПолеТипNullableИндекс
idintнетда (PK)
family_namevarchar(80)нет
segmentvarchar(80)нет
introduced_yearint (2000–2024)нет

Пример строк (8 из 20)

idfamily_namesegmentintroduced_year
1Core 2 DuoDesktop2010
2CeleronMobile2018
3Core Ultra 5Server2015
4Xeon WHEDT2014
5Core 2 DuoEmbedded2020
6Core Ultra 5Desktop2011
7Core 2 DuoDesktop2018
8Core i9Server2002

SQL-запрос: Подзапрос в WHERE

Задача: найти строки, где introduced_year выше среднего по таблице — среднее считает подзапрос.

SELECT * FROM processor_families WHERE introduced_year > (SELECT AVG(introduced_year) FROM processor_families) LIMIT 20;
SQL Playground · processor_families.fdbFileDB Engine
результат появится ниже

Результат выполнения

20строк в таблице
9строк в результате
1.3 мсвремя выполнения

В результате 9 строк из 20 (около 45%). Если бы условие возвращало почти всю таблицу, фильтр был бы бесполезен; ноль строк — повод проверить значения в данных, а не синтаксис.

Первые строки результата

idfamily_namesegmentintroduced_year
12Core i5Mobile2023
15Core Ultra 5Desktop2022
18CeleronHEDT2020
2CeleronMobile2018
3Core Ultra 5Server2015

Показаны 5 из 9 строк результата.

Как читать этот запрос

Подзапрос в WHERE вычисляется первым, его результат подставляется в условие внешнего запроса. Здесь это скалярный подзапрос (возвращает одно число — среднее), поэтому с ним можно сравнивать оператором >.
Фактическое время: 1.29 мс. Для сравнения: тот же запрос через сетевой протокол добавил бы миллисекунды на сериализацию и round-trip — встраиваемый движок исполняет его in-process.

Подзапрос в WHERE в разных СУБД

СУБДСинтаксисОтличие
PostgreSQLWHERE x > (SELECT AVG(x) …)планировщик может материализовать подзапрос
MySQLWHERE x > (SELECT AVG(x) …)исторически слабее оптимизирует коррелированные подзапросы
SQLiteWHERE x > (SELECT AVG(x) …)скалярный подзапрос вычисляется один раз, если не коррелирован
FileDBWHERE x > (SELECT AVG(x) …)скалярные подзапросы в WHERE поддержаны

Скачать структуру и данные

Файлы собираются из текущего датасета (seed v1): структура таблицы, 20 строк данных и этот запрос.

Вопросы и ответы

Сколько раз выполняется подзапрос?

Некоррелированный скалярный подзапрос (как здесь, AVG по всей таблице) — один раз. Коррелированный, ссылающийся на текущую строку, — потенциально на каждую строку.

Чем подзапрос отличается от JOIN?

Подзапрос отвечает на «вычисли значение/множество для условия», JOIN — «пристыкуй колонки другой таблицы к результату». Часто выразимо и так и так; выбирайте читаемое.

Что вернёт сравнение, если подзапрос дал NULL?

Неизвестность: строка не пройдёт условие. На пустой таблице AVG вернёт NULL — и внешний запрос не вернёт ничего.