サブクエリ、CTE、結合の比較
最適なクエリを構築するため、サブクエリ、共通テーブル式(CTE)、結合の違いと使い分けを比較します。
「サブクエリ、CTE、結合の比較」はCoddyKit上の無料PostgreSQL Performance & Query Optimizationレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPostgreSQL Performance & Query Optimization学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 PostgreSQL Performance & Query Optimizationコースには全4レッスンが含まれています。
このレッスンの一部はまだ翻訳されておらず、英語で表示されています。
Welcome to Query Construction
In this lesson, we'll explore three fundamental ways to combine and structure data in PostgreSQL: Subqueries, Common Table Expressions (CTEs), and Joins.
Understanding their differences and optimal use cases is key to writing efficient and readable SQL.
Joins: The Foundation
You're already familiar with JOINs! They are the primary way to combine rows from two or more tables based on a related column between them.
- Purpose: Link related data across tables.
- Readability: Often straightforward for direct relationships.
- Performance: Highly optimized by PostgreSQL for combining large datasets.
What are Subqueries?
A subquery (or inner query) is a query nested inside another SQL query. It can return a single value (scalar), a single row, a single column, or a table.
- Placement: In
SELECT,FROM,WHERE, orHAVINGclauses. - Use Cases: Filtering with
IN/EXISTS, calculating aggregate values for comparison, or providing derived tables.
Subquery in Action
Here's a simple example where a subquery helps find products with prices above the average. Notice how the inner query runs first.
CREATE TABLE products (
product_id SERIAL PRIMARY KEY,
product_name VARCHAR(50),
price DECIMAL(10, 2)
);
INSERT INTO products (product_name, price) VALUES
('Laptop', 1200.00),
('Mouse', 25.00),
('Keyboard', 75.00),
('Monitor', 300.00),
('Webcam', 50.00);
SELECT product_name, price
FROM products
WHERE price > (SELECT AVG(price) FROM products);
DROP TABLE products;What are CTEs?
A Common Table Expression (CTE), defined with the WITH clause, creates a temporary, named result set that you can reference within a single SQL statement.
- Purpose: Improve readability, organize complex queries, and enable recursion.
- Scope: Only available for the query immediately following the
WITHclause. - Readability: Breaks down complex logic into logical, readable steps.
CTE in Action
Let's rewrite the previous example using a CTE. Notice how it defines "average_price" first, making the main query clearer.
CREATE TABLE products (
product_id SERIAL PRIMARY KEY,
product_name VARCHAR(50),
price DECIMAL(10, 2)
);
INSERT INTO products (product_name, price) VALUES
('Laptop', 1200.00),
('Mouse', 25.00),
('Keyboard', 75.00),
('Monitor', 300.00),
('Webcam', 50.00);
WITH AverageProductPrice AS (
SELECT AVG(price) AS avg_price
FROM products
)
SELECT p.product_name, p.price
FROM products p, AverageProductPrice app
WHERE p.price > app.avg_price;
DROP TABLE products;Choosing Joins
JOINs are your go-to when you need to combine data from different tables that have a direct, logical relationship.
- Direct Relationships: When tables are linked by foreign keys.
- Performance: Highly optimized by the planner for combining large datasets efficiently.
- Result Set: Creates a single, wider result set from matching rows.
They are often the most performant for combining large tables.
Choosing Subqueries
Subqueries are useful for specific filtering or calculating values that depend on the main query's data, often acting as a single value or a list.
- Scalar Values: When you need a single value (e.g.,
WHERE price > (SELECT AVG(price))). - Filtering: With
IN,NOT IN,EXISTS,NOT EXISTSclauses. - Derived Tables: In the
FROMclause for temporary, unnamed result sets.
They can sometimes be less readable for complex logic.
Choosing CTEs
CTEs excel when you need to break down complex queries into logical, readable steps or handle recursive data structures.
- Readability: Improves understanding of multi-step logic.
- Recursion: Essential for querying hierarchical or graph-like data.
- Reusability: A CTE can be referenced multiple times within the same main query.
They are often preferred over complex subqueries for clarity.
Performance: It's Complicated!
Often, a query written with a subquery can be rewritten as a JOIN or a CTE, and vice-versa. PostgreSQL's optimizer is smart!
- Optimizer Role: It often transforms these constructs internally into the most efficient execution plan.
- Readability First: Prioritize clear, maintainable code.
EXPLAIN ANALYZE: Always use it to truly understand the performance impact of your chosen approach, rather than guessing.
Compare & Contrast
Consider the following scenarios. Which SQL construct is generally the most suitable choice for each?
Recap: Constructing Optimal Queries
You've learned to differentiate between JOINs, Subqueries, and CTEs:
- JOINs: Best for direct table relationships and combining large datasets.
- Subqueries: Ideal for scalar values,
IN/EXISTSfiltering, and derived tables. - CTEs: Shine for readability, multi-step logic, and recursive queries.
Remember to prioritize readability and use EXPLAIN ANALYZE to confirm performance!
よくある質問
「サブクエリ、CTE、結合の比較」レッスンは無料ですか?
はい。「サブクエリ、CTE、結合の比較」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、PostgreSQL Performance & Query Optimizationコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 PostgreSQL Performance & Query Optimizationコースには全4レッスンが含まれています。
「サブクエリ、CTE、結合の比較」で何を学びますか?
最適なクエリを構築するため、サブクエリ、共通テーブル式(CTE)、結合の違いと使い分けを比較します。 ブラウザで直接実行するハンズオンコードでPostgreSQL Performance & Query Optimizationを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
PostgreSQL Performance & Query Optimizationを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのPostgreSQL Performance & Query Optimizationは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「サブクエリ、CTE、結合の比較」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このPostgreSQL Performance & Query Optimizationレッスンでコードを書いて実行できますか?
はい。すべてのPostgreSQL Performance & Query Optimizationレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 結合アルゴリズムを理解する
- 複雑な結合の書き換え
- サブクエリ、CTE、結合の比較
- LATERAL結合と相関参照の最適化