Menu
CoddyTech

Đơn giản hóa truy vấn bằng từ khóa WITH

Thuộc phần Kiến thức cơ bản trong hành trình SQL của Coddy. Bài học 49 trên 72.

Các truy vấn có thể trở nên quá rối khi bạn thêm nhiều truy vấn con. Ví dụ, đây là một truy vấn có nhiều truy vấn con:

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
	)
)

Để mọi việc dễ dàng hơn, bạn có thể dùng từ khóa WITH query_name AS (...). Từ khóa này cho phép bạn lưu một truy vấn với tên gọi và dùng ở bất cứ đâu bạn muốn:

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 (SELECT col1 FROM query2) AND col4 IN (SELECT col5 FROM query1)

Ở đây, chúng ta dùng lại query1 trong query2 và trong truy vấn chính.

challenge icon

Thử thách

Dễ

Các bảng và cột hiện có:

  • devices_specs: device_id, width, height, num_features, opinion
  • devices_score: device_id, score

viết một truy vấn để:

  1. Trước tiên, xác định “các thiết bị lớn” (thiết bị có width lớn hơn 200)
  2. Sau đó, tính điểm trung bình của các thiết bị lớn này. Đặt tên cột này là average_score

Dùng mệnh đề WITH để giải bài toán này.

Tự làm thử

-- Bước 1: đặt tên cho tập kết quả tạm thời chỉ chứa các thiết bị bạn quan tâm
WITH large_devices AS (
    SELECT ____
    FROM devices_specs
    WHERE ____
)
-- Bước 2: dùng lại tập kết quả tạm thời đó trong truy vấn (query) chính
SELECT ____ AS average_score
FROM devices_score
WHERE device_id IN (____);
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Kiến thức cơ bản

Tự luyện tập: Playground SQL