Truy vấn lồng và biểu thức bảng chung (CTE)

Cải thiện hiệu năng truy vấn trong PostgreSQL

Amy McCarty

Instructor

Về truy vấn lồng (subquery)

Là gì?

  • Thay thế cho join
  • Truy vấn đơn giản

Vì sao?

  • Có thể trả về một kết quả
  • Dễ đọc
  • Cú pháp SQL tương tự join

Cách dùng?

  • Trong mệnh đề SELECT, FROM hoặc WHERE
Cải thiện hiệu năng truy vấn trong PostgreSQL

Truy vấn lồng trong SELECT

row script_word word_length
1 goat 4
2 goat 4
3 dog 3
15,782 ... ...
row english_word word_length
1 goat 4
2 turkey 6
3 ant 3
171,476 ... ...
Cải thiện hiệu năng truy vấn trong PostgreSQL

Truy vấn lồng trong 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
Cải thiện hiệu năng truy vấn trong PostgreSQL

Truy vấn lồng trong WHERE

row script_word word_length
1 goat 4
2 goat 4
3 dog 3
15,782 ... ...
row english_word word_length
1 goat 4
2 turkey 6
3 ant 3
171,476 ... ...
Cải thiện hiệu năng truy vấn trong PostgreSQL

Truy vấn lồng trong WHERE

SELECT AVG(word_length) AS avg_movie
FROM english_language
WHERE word IN 
  (SELECT DISTINCT word FROM movie) 
avg_movie
3
Cải thiện hiệu năng truy vấn trong PostgreSQL

Truy vấn lồng trong FROM

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

 

  • Giảm tính dễ đọc
  • Hạn chế linh hoạt của kế hoạch truy vấn
Cải thiện hiệu năng truy vấn trong PostgreSQL

Về biểu thức bảng chung (CTE)

Là gì?

  • Thay thế cho join
  • Truy vấn độc lập với bộ kết quả tạm

Vì sao?

  • Có thể trả về một kết quả
  • Dễ đọc
  • Tạo bảng tạm

Cách làm?

  • Mệnh đề WITH
Cải thiện hiệu năng truy vấn trong PostgreSQL

Cấu trúc 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
Cải thiện hiệu năng truy vấn trong PostgreSQL

Ayo berlatih!

Cải thiện hiệu năng truy vấn trong PostgreSQL

Preparing Video For Download...