Sous-requêtes et expressions de table communes (CTE)

Améliorer la performance des requêtes dans PostgreSQL

Amy McCarty

Instructor

À propos des sous-requêtes

Quoi ?

  • Variante au jointure
  • Requête simple

Pourquoi ?

  • Peut renvoyer un seul résultat
  • Lisible
  • Instructions SQL semblables aux jointures

Comment ?

  • Dans les clauses SELECT, FROM ou WHERE
Améliorer la performance des requêtes dans PostgreSQL

Sous-requête en SELECT

rang script_word word_length
1 goat 4
2 goat 4
3 dog 3
15 782 ... ...
rang english_word word_length
1 goat 4
2 turkey 6
3 ant 3
171 476 ... ...
Améliorer la performance des requêtes dans PostgreSQL

Sous-requête en SELECT

SELECT AVG(word_length) AS avg_movie
  , (SELECT AVG(word_length) 
      FROM english_language) 
      AS avg_english
FROM MOVIE
avg_movie avg_english
3 4,5
Améliorer la performance des requêtes dans PostgreSQL

Sous-requête en WHERE

rang script_word word_length
1 goat 4
2 goat 4
3 dog 3
15 782 ... ...
rang english_word word_length
1 goat 4
2 turkey 6
3 ant 3
171 476 ... ...
Améliorer la performance des requêtes dans PostgreSQL

Sous-requête en WHERE

SELECT AVG(word_length) AS avg_movie
FROM english_language
WHERE word IN 
  (SELECT DISTINCT word FROM movie) 
avg_movie
3
Améliorer la performance des requêtes dans PostgreSQL

Sous-requête en FROM

SELECT AVG(word_length) AS avg_movie 
FROM (SELECT * FROM movie)

 

  • Réduit la lisibilité
  • Limite la souplesse du plan de requête
Améliorer la performance des requêtes dans PostgreSQL

À propos des expressions de table communes (CTE)

Quoi ?

  • Variante au jointure
  • Requête autonome avec ensemble de résultats temporaire

Pourquoi ?

  • Peut renvoyer un seul résultat
  • Lisible
  • Crée une table temporaire

Comment ?

  • Instructions WITH
Améliorer la performance des requêtes dans PostgreSQL

Structure d'une CTE

WITH english_cte AS
(    
  SELECT word_length
      , COUNT(word) AS english_word_count
    FROM english_language 
    GROUP BY word_length
)

SELECT movie.word_length , COUNT(movie.word) AS movie_word_count , cte.english_word_count FROM movie INNER JOIN english_cte cte ON movie.word_length = cte.word_length GROUP BY movie.word_length, cte.english_word_count
Améliorer la performance des requêtes dans PostgreSQL

Passons à la pratique !

Améliorer la performance des requêtes dans PostgreSQL

Preparing Video For Download...