Underfrågor och gemensamma tabelluttryck (CTE)

Förbättra frågeprestanda i PostgreSQL

Amy McCarty

Instructor

Om underfrågor

Vad?

  • Alternativ till join
  • Enkel fråga

Varför?

  • Kan returnera ett resultat
  • Läsbar
  • SQL-instruktioner liknar joins

Hur?

  • I SELECT-, FROM- eller WHERE-satser
Förbättra frågeprestanda i PostgreSQL

SELECT-underfråga

rad script_word word_length
1 goat 4
2 goat 4
3 dog 3
15 782 ... ...
rad english_word word_length
1 goat 4
2 turkey 6
3 ant 3
171 476 ... ...
Förbättra frågeprestanda i PostgreSQL

SELECT-underfråga

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
Förbättra frågeprestanda i PostgreSQL

WHERE-underfråga

rad script_word word_length
1 goat 4
2 goat 4
3 dog 3
15 782 ... ...
rad english_word word_length
1 goat 4
2 turkey 6
3 ant 3
171 476 ... ...
Förbättra frågeprestanda i PostgreSQL

WHERE-underfråga

SELECT AVG(word_length) AS avg_movie
FROM english_language
WHERE word IN 
  (SELECT DISTINCT word FROM movie) 
avg_movie
3
Förbättra frågeprestanda i PostgreSQL

FROM-underfråga

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

 

  • Försämrar läsbarheten
  • Begränsar frågeplansflexibiliteten
Förbättra frågeprestanda i PostgreSQL

Om gemensamma tabelluttryck (CTE)

Vad?

  • Alternativ till join
  • Fristående fråga med temporär resultatmängd

Varför?

  • Kan returnera ett resultat
  • Läsbar
  • Skapar en temporär tabell

Hur?

  • WITH-satser
Förbättra frågeprestanda i PostgreSQL

CTE-struktur

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
Förbättra frågeprestanda i PostgreSQL

Nu kör vi en övning!

Förbättra frågeprestanda i PostgreSQL

Preparing Video For Download...