Menu
Coddy logo textTech

Упрощение запросов, ключевое слово WITH

Часть раздела Основы путешествия по SQL на Coddy — урок 49 из 72.

Запросы могут стать слишком запутанными при добавлении множества вложенных запросов. Например, вот запрос, который имеет множество подзапросов:

SELECT * FROM table1
WHERE col2 IN (
	SELECT col1 FROM table2
	WHERE col3 + col2 > 3 AND col5 LIKE '%test%' AND col6 IN (
		SELECT col5 FROM table3
		WHERE col1 AND col3 OR col2
	)
)

Чтобы упростить это, мы можем использовать ключевое слово WITH query_name AS (...). Оно позволяет сохранить запрос с именем и использовать его где угодно:

WITH query1 AS (
	SELECT col5 FROM table3
	WHERE col1 AND col3 OR col2
), query2 AS (
	SELECT col1 FROM table2
	WHERE col3 + col2 > 3 AND col5 LIKE '%test%' AND col6 IN query1
)
SELECT * FROM table1
WHERE col2 IN query2 AND col4 IN query1

Здесь мы повторно использовали query1 в query2 и в основном запросе.

challenge icon

Задание

Легко

Доступные таблицы и столбцы:

  • <strong>devices_specs</strong>: <strong>device_id</strong>, <strong>width</strong>, <strong>height</strong>, <strong>num_features</strong>, <strong>opinion</strong>
  • <strong>devices_score</strong>: <strong>device_id</strong>, <strong>score</strong>

напишите запрос, который:

  1. Сначала определяет «крупные устройства» (устройства с width больше 200)
  2. Затем вычисляет среднюю оценку для этих крупных устройств. Назовите этот столбец как average_score

Используйте клаузу WITH для решения этой задачи.

Шпаргалка

Используйте WITH query_name AS (...) для создания именованных подзапросов, которые можно повторно использовать:

WITH query1 AS (
    SELECT col5 FROM table3
    WHERE col1 AND col3 OR col2
), query2 AS (
    SELECT col1 FROM table2
    WHERE col3 + col2 > 3 AND col5 LIKE '%test%' AND col6 IN query1
)
SELECT * FROM table1
WHERE col2 IN query2 AND col4 IN query1

Этот подход делает сложные запросы с несколькими подзапросами более читаемыми и позволяет повторно использовать один и тот же подзапрос несколько раз.

Попробуйте сами

quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Основы