高度な SQL

Mar 03 2023
少し前に SQL 初心者向けのチュートリアルを作成しました。ここで読むことができます。今回は、GROUP BY 演算子と HAVING 演算子、MERGE ステートメント、ストアド プロシージャなど、より高度なトピックについて説明します。

少し前に SQL 初心者向けのチュートリアルを作成しました。ここで読むことができます。今回は、GROUP BY 演算子と HAVING 演算子、MERGE ステートメント、ストアド プロシージャなど、より高度なトピックについて説明します。

グループ化

SQL の GROUP BY 句は、1 つ以上の列に基づいて結果セット内の行をグループ化するために使用されます。通常、COUNT、SUM、AVG、MIN、MAX などの集計関数と組み合わせて使用​​され、各グループの値を計算します。

SELECT category, SUM(sales)
FROM orders
GROUP BY category;

もう一つの例:

SELECT department, COUNT(employee_id)
FROM employees
GROUP BY department;

エラーの発生を避けるために、GROUP BY 句でカバーされていない列を選択する場合は、集計関数を使用する必要があることに注意してください。さらに、GROUP BY 句の列がグループを定義する列であることを覚えておくことが重要です。SELECT ステートメント内の列の順序は結果セットには影響しません。

持っている

集計関数の条件に基づいて、SQL の HAVING 句を使用して結果セット内の行のグループをフィルタリングできます。通常は、GROUP BY 句と組み合わせて、特定の要件に適合しないグループを削除します。

たとえば、サンプルorderテーブル内の各製品カテゴリの総売上高を選択し、総売上高が 1000 を超えるカテゴリのみを返す次の SQL クエリについて考えてみましょう。

SELECT category, SUM(sales)
FROM orders
GROUP BY category
HAVING SUM(sales) > 1000;

もう一つの例:

SELECT department, AVG(salary)
FROM employees
GROUP BY department
HAVING COUNT(employee_id) > 5;

WHERE 句と同様に、HAVING 句は、GROUP BY 句によってグループが生成され、集計関数が適用された後にグループをフィルタリングするために使用されます。

マージ

SQL MERGE ステートメントは、ソース テーブルのデータに基づいてターゲット テーブルにデータを更新または挿入したり、2 つ以上のテーブルのデータを 1 つのテーブルに結合したりするために使用されます。これは、INSERT、UPDATE、DELETE を組み合わせたステートメントの代替としてよく使用されます。

構文:

MERGE INTO target_table
USING source_table
ON (join_condition)
WHEN MATCHED THEN
    UPDATE SET target_table.column1 = source_table.column1, ...
WHEN NOT MATCHED THEN
    INSERT (column1, column2, ...)
    VALUES (source_table.column1, source_table.column2, ...)

MERGE INTO products
USING prices
ON (products.product_id = prices.product_id)
WHEN MATCHED THEN
    UPDATE SET products.price = prices.price;

MERGE INTO employees
USING temp_employees
ON (employees.employee_id = temp_employees.employee_id)
WHEN MATCHED THEN
    UPDATE SET employees.salary = temp_employees.salary
WHEN NOT MATCHED THEN
    INSERT (employee_id, first_name, last_name, department, salary)
    VALUES (temp_employees.employee_id, temp_employees.first_name, temp_employees.last_name, temp_employees.department, temp_employees.salary);

MySQL や SQLite などの一部のデータベース管理システムは MERGE ステートメントをサポートしていないため、代わりに INSERT、UPDATE、および DELETE ステートメントを組み合わせて使用​​する必要があります。

MERGE コマンドは、大規模なテーブルではパフォーマンスに大きな影響を与える可能性があるため、テーブル全体で使用する前に、データの小さなサブセットでテストする必要があります。

ストアド プロシージャ

ストアド プロシージャとしてデータベースに保存される、プリコンパイルされた SQL ステートメントのグループ。これらは、データベースから情報を取得したり、複雑な計算を実行したりするなど、特定のタスクや一連の活動を実行するために使用されることがよくあります。多数の個別の SQL ステートメントを実行する場合と比較して、ストアド プロシージャは入力パラメーターを受け取り、出力値を返すことができるため、より汎用性があり、効率的です。

以下は、テーブルからすべての行を取得する単純なストアド プロシージャの例ですemployees。

CREATE PROCEDURE GetAllEmployees
AS
BEGIN
    SELECT * FROM employees;
END

EXEC GetAllEmployees;

フォローして私たちの出版物をサポートしてください

以下の記事も参考にしてください。

Java 8 Stream API インタビューの質問と回答