Загальні табличні вирази

Маніпулювання даними в SQL

Mona Khalil

Data Scientist, Greenhouse Software

Коли додаєте підзапити…

  • Складність запитів швидко зростає!
    • Інформацію важко відстежувати

Рішення: загальні табличні вирази (CTE)!

Маніпулювання даними в SQL

Загальні табличні вирази

Загальні табличні вирази (CTE)

  • Таблиця, оголошена перед основним запитом
  • Іменована та використана далі в операторі FROM

Налаштування CTE

WITH cte AS (
    SELECT col1, col2
    FROM table)

SELECT AVG(col1) AS avg_col FROM cte;
Маніпулювання даними в SQL

Візьміть підзапит у FROM

SELECT
  c.name AS country,
  COUNT(s.id) AS matches
FROM country AS c
INNER JOIN (
  SELECT country_id, id 
  FROM match
  WHERE (home_goal + away_goal) >= 10) AS s
ON c.id = s.country_id
GROUP BY country;
| country     | matches |
|-------------|---------|
| England     | 3       |
| Germany     | 1       |
| Netherlands | 1       |
| Spain       | 4       |
Маніпулювання даними в SQL

Розмістіть на початку

(
  SELECT country_id, id 
  FROM match
  WHERE (home_goal + away_goal) >= 10
)
Маніпулювання даними в SQL

Розмістіть на початку

WITH s AS (
  SELECT country_id, id 
  FROM match
  WHERE (home_goal + away_goal) >= 10
)
Маніпулювання даними в SQL

Покажіть CTE

WITH s AS (
  SELECT country_id, id 
  FROM match
  WHERE (home_goal + away_goal) >= 10
)
SELECT
  c.name AS country,
  COUNT(s.id) AS matches
FROM country AS c
INNER JOIN s
ON c.id = s.country_id
GROUP BY country;
| country     | matches |
|-------------|---------|
| England     | 3       |
| Germany     | 1       |
| Netherlands | 1       |
| Spain       | 4       |
Маніпулювання даними в SQL

Покажіть усі CTE

WITH s1 AS (
  SELECT country_id, id 
  FROM match
  WHERE (home_goal + away_goal) >= 10),
s2 AS (                              -- Новий підзапит
  SELECT country_id, id 
  FROM match
  WHERE (home_goal + away_goal) <= 1
)
SELECT
  c.name AS country,
  COUNT(s1.id) AS high_scores,
  COUNT(s2.id) AS low_scores         -- Новий стовпець
FROM country AS c
INNER JOIN s1
ON c.id = s1.country_id
INNER JOIN s2                        -- Нове зʼєднання
ON c.id = s2.country_id
GROUP BY country;
Маніпулювання даними в SQL

Навіщо використовувати CTE?

  • Виконується один раз

    • Потім CTE зберігається в памʼяті
    • Підвищує швидкодію запиту
  • Краще структурує запити

  • Може посилатися на інші CTE

  • Може посилатися на себе (SELF JOIN)
Маніпулювання даними в SQL

Давайте потренуємось!

Маніпулювання даними в SQL

Preparing Video For Download...