目次
導入
基本的な知識のレビュー
コアコンセプトまたは関数分析
ウィンドウ関数
一般的なテーブル式(CTE)
ストアドプロシージャ
使用の例
基本的な使用法
高度な使用
一般的なエラーとデバッグのヒント
パフォーマンスの最適化とベストプラクティス
ホームページ データベース SQL SQLディープダイビング:マスタリングウィンドウ機能、一般的なテーブル式(CTE)、およびストアドプロシージャ

SQLディープダイビング:マスタリングウィンドウ機能、一般的なテーブル式(CTE)、およびストアドプロシージャ

Apr 04, 2025 am 12:20 AM
sql 窗口函数

SQLは、ウィンドウ関数、一般的なテーブル式(CTE)、およびストアドプロシージャの3つの強力な関数を提供します。 1。ウィンドウ関数により、データセットを変更せずにグループ化と並べ替え操作が可能になります。 2.CTESは、複雑なクエリを簡素化するために一時的な結果セットを提供します。 3.ストアドプロシージャは、効率と一貫性を改善するために繰り返し実行できるSQLコードブロックを事前拡張します。

導入

データ駆動型の世界では、SQLは単なるクエリ言語ではなく、アートでもあります。今日、SQLの3つの強力な機能、ウィンドウ関数、一般的なテーブル式(CTE)、およびストアドプロシージャに飛び込みます。この記事を通じて、これらのツールを使用して複雑なデータの問題に対処し、SQLスキルを向上させ、データ分析と管理を安心させる方法を学びます。

基本的な知識のレビュー

SQLの魅力は、そのシンプルさと強力な機能にあります。ウィンドウ関数を使用すると、データセットを変更せずにデータをグループ化およびソートできます。 CTEは、複雑なクエリをより読みやすく管理するための一時的な結果セットの方法を提供します。ストアドプロシージャは、効率と一貫性を向上させるために繰り返し実行できるSQLコードブロックを事前に拡張します。

コアコンセプトまたは関数分析

ウィンドウ関数

ウィンドウ関数は、SQLの魔法のツールであり、データセットを変更せずにデータをグループ化およびソートできるようにします。彼らは、移動平均、ランキング、累積金額などを計算するのに役立つため、データ分析で非常に役立ちます。

選択します 
    従業員_id、
    サラリー、
    AVG_DEPARTMENT_SALARYとしてのAVG(給与)オーバー(部門ごとのパーティション)
    rank()over(salary descによる注文)salary_rank
から 
    従業員;
ログイン後にコピー

この例では、各従業員の部門の平均給与を計算し、給与に基づいて従業員をランク付けします。ウィンドウ関数の力は、サブクエリやセルフボインを使用せずに同じクエリで複数の計算を実行できることです。

一般的なテーブル式(CTE)

CTEは、複雑なクエリの構造を簡素化し、コードをより読みやすく維持するためのSQLの一時的な結果セットです。 CTEは、自分自身を参照できるため、再帰的なクエリに特に役立ちます。

再帰的なemployee_hierarchyがas(
    employee_id、manager_id、0 as levelを選択します
    従業員から
    Manager_idはnullです
    ユニオンすべて
    E.EmployeE_ID、E.Manager_Id、eh.Level 1を選択します
    従業員からe
    emmanager_id = eh.employee_idにemployee_hierarchy ehに参加してください
))
select * from Employee_hierarchy;
ログイン後にコピー

この例では、CTEを使用して従業員の階層を構築します。 CTEの再帰的な性質により、複雑な自己接続クエリを書くことなく、従業員のツリー全体を簡単に通過できます。

ストアドプロシージャ

ストアドプロシージャは、繰り返し実行できるSQLコードのプリコンパイルブロックです。ネットワークトラフィックを短縮して時間を編集するため、複雑なロジックを実行したり、パフォーマンスを改善する必要がある場合に役立ちます。

手順を作成get_employee_details(in emp_id int)
始める
    選択します 
        E.Employee_id、
        e.first_name、
        e.last_name、
        D.DEPARTMENT_NAME
    から 
        従業員e
    参加する 
        department_id = d.department_idの部門
    どこ 
        e.Employee_id = emp_id;
終わり;
ログイン後にコピー

この例では、従業員の詳細を取得するためのストアドプロシージャを作成します。ストアドプロシージャの利点は、複雑なロジックをカプセル化し、複数回呼び出すことができ、コードの再利用性と一貫性を改善できることです。

使用の例

基本的な使用法

ウィンドウ関数の基本的な使用法は非常に簡単です。 OVER句を使用してウィンドウを定義し、さまざまな集計関数を使用して結果を計算できます。

選択します 
    Product_id、
    sale_date、
    sale_amount、
    running_totalとしてsum(sale_amount)over(product_id orderによるパーティション)
から 
    販売;
ログイン後にコピー

この例では、各製品の蓄積された販売を計算します。句PARTITION BYデータをグループ化し、句ORDER BY Windowsの順序を定義します。

CTEの基本的な使用も非常に簡単です。 WITHキーワードを使用してCTEを定義し、その後のクエリで参照できます。

 top_sellersを(
    Total_SalesとしてProduct_id、sum(sale_amount)を選択します
    販売から
    Group by Product_id
    Total_Sales DESCによる注文
    制限10
))
select * from top_sellers;
ログイン後にコピー

この例では、CTEを使用して、販売が最も高い10個の製品を見つけます。 CTEは、クエリ構造をより明確かつ簡単に管理します。

ストアドプロシージャの基本的な使用法も非常に簡単です。 CREATE PROCEDUREステートメントを使用してストアドプロシージャを定義し、 CALLステートメントを使用して呼び出すことができます。

 get_employee_details(1)に電話してください。
ログイン後にコピー

この例では、以前に定義されたストアドプロシージャを呼び出して、従業員ID 1で従業員の詳細を取得します。

高度な使用

ウィンドウ関数の高度な使用法には、 ROWSまたはRANGEを使用してウィンドウの範囲を定義し、 LAGLEAD関数を使用してフロントラウのデータにアクセスすることが含まれます。

選択します 
    Product_id、
    sale_date、
    sale_amount、
    lag(sale_amount)over over(sale_dateによるproduct_id Orderによるパーティション)
    next_saleとしてed(sale_amount)over(product_id orderによるパーティション)
から 
    販売;
ログイン後にコピー

この例では、 LAGおよびLEAD関数を使用して、各製品の以前と次の販売を取得します。このような高度な使用法は、より複雑なデータ分析を実行するのに役立ちます。

CTEの高度な使用には、再帰CTEを使用して階層データを処理すること、複数のCTEを使用して複雑なクエリを簡素化することが含まれます。

再帰category_hierarchyを使用して(
    category_id、parent_category_id、0 as levelを選択します
    カテゴリから
    ここで、parent_category_idはnullです
    ユニオンすべて
    c.category_id、c.parent_category_id、ch.level 1を選択します
    カテゴリからc
    c.parent_category_id = ch.category_idにcategory_hierarchy chに参加します
)、、
product_categories as(
    P.Product_id、Ch.Category_Id、Ch.Levelを選択します
    製品からp
    category_hierarchy ch on p.category_id = ch.category_idに参加します
))
select * from product_categories;
ログイン後にコピー

この例では、再帰CTEを使用して製品カテゴリの階層を構築し、別のCTEを使用して製品をカテゴリに関連付けます。このような高度な使用法は、複雑な階層データに対処するのに役立ちます。

ストアドプロシージャの高度な使用には、複雑なビジネスロジックを実装するためのカーソルの使用、例外処理、およびトランザクション管理が含まれます。

手順を作成update_EmployeE_SALARY(EMP_ID INT、NEW_SALARY DECIMAL(10、2))
始める
    sqlexceptionの出口ハンドラーを宣言します
    始める
        ロールバック;
        辞任;
    終わり;

    トランザクションを開始します。
    従業員を更新します
    SET SALARY = NEW_SALARY
    employee_id = emp_id;
    専念;
終わり;
ログイン後にコピー

この例では、従業員の給与を更新するためのストアドプロシージャを作成します。ストアドプロシージャは、データの一貫性と整合性を確保するために、トランザクション管理と例外処理を使用します。

一般的なエラーとデバッグのヒント

ウィンドウ関数を使用する場合のよくある間違いは、 OVER句の使用を忘れることです。これにより、SQLエンジンがウィンドウ機能を正しく解析できなくなります。

 - エラー例選択 
    従業員_id、
    サラリー、
    AVG(給与) - からの条項がありません 
    従業員;
ログイン後にコピー

このエラーを回避するには、ウィンドウ関数を使用するときは、 OVER句が常に含まれていることを確認してください。

CTEを使用する場合、よくある間違いは、CTE内のすべての必要な列を定義するのを忘れることです。これにより、後続のクエリがCTEのデータを正しく参照できなくなります。

 -TOP_SELLERSを使用したエラー例(
    Product_id -Total_Sales列が販売から欠落しているかどうかを選択します
    Group by Product_id
    Total_Sales DESCによる注文
    制限10
))
select * from top_sellers;
ログイン後にコピー

このエラーを回避するには、CTEを定義するときに必要なすべての列を含めるようにしてください。

ストアドプロシージャを使用する際のよくある間違いは、例外を処理するのを忘れることです。これにより、エラーが発生したときにトランザクションを正しくロールバックできない場合があります。

 - エラー例CREATE PROSTURE update_EmployeE_SALARY(emp_id int、in new_salary Decimal(10、2))
始める
    従業員を更新します
    SET SALARY = NEW_SALARY
    employee_id = emp_id;
終わり;
ログイン後にコピー

このエラーを回避するには、ストアドプロシージャに例外処理とトランザクション管理を含めるようにしてください。

パフォーマンスの最適化とベストプラクティス

ウィンドウ関数を使用する場合、パフォーマンスの最適化の重要なポイントは、適切なウィンドウフレームを選択することです。 ROWSまたはRANGE条項を使用すると、ウィンドウ関数の計算量を減らすことができるため、クエリパフォーマンスを大幅に改善できます。

 - 最適化の例選択 
    Product_id、
    sale_date、
    sale_amount、
    running_totalとして、sum(sale_amount)over(sale_id oder
から 
    販売;
ログイン後にコピー

この例では、 ROWS句を使用して、クエリのパフォーマンスを改善できるウィンドウフレームワークを定義します。

CTEを使用する場合、パフォーマンスの最適化の重要なポイントは、CTEで複雑な計算を使用しないことです。 CTEは、複雑な計算が含まれている場合、クエリパフォーマンスに影響を与える可能性のある一時的な結果セットです。

 -Sales_Summaryを使用した最適化の例(
    Total_SalesとしてProduct_id、sum(sale_amount)を選択します
    販売から
    Group by Product_id
))
SELES * FROM SALE_SUMMARY;
ログイン後にコピー

この例では、クエリパフォーマンスを改善するために、CTEの外側に複雑な計算を行います。

ストアドプロシージャを使用する場合、パフォーマンスの最適化の重要なポイントは、ストアドプロシージャでカーソルを使用しないようにすることです。カーソルは、ラインごとにデータを処理する必要があるため、パフォーマンスの劣化を引き起こす可能性があります。

 - 最適化の例CREATE PROSTURE update_Employee_Salaries()
始める
    従業員を更新します
    SET SALARY = SALARY * 1.1;
終わり;
ログイン後にコピー

この例では、カーソルの使用を避け、バッチアップデート操作を使用してパフォーマンスを向上させます。

SQLコードを作成する際には、ベストプラクティスには、意味のあるエイリアスの使用、コードの注釈、コードの読み取り可能かつ保守可能な状態を維持することが含まれます。

 - ベストプラクティスの例選択 
    employee_id as emp_id、 - 意味のあるエイリアスを使用e.first_name、 - コメントコードe.last_name、
    D.DEPARTMENT_NAME-コードの読みやすさと保守性を保持します 
    従業員e
参加する 
    e.department_id = d.department_idの部門d;
ログイン後にコピー

これらのベストプラクティスに従うことにより、より効率的で保守可能なSQLコードを作成できます。

SQLを探索する過程で、ウィンドウ関数、CTE、およびストアドプロシージャの基本的および高度な使用法を習得しただけでなく、一般的なエラーを回避し、パフォーマンスを最適化する方法を学びました。この記事が、これらの強力なSQL機能をよりよく理解し、適用し、データ分析と管理においてより大きな成功を収めるのに役立つことを願っています。

以上がSQLディープダイビング:マスタリングウィンドウ機能、一般的なテーブル式(CTE)、およびストアドプロシージャの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Hibernate フレームワークにおける HQL と SQL の違いは何ですか? Hibernate フレームワークにおける HQL と SQL の違いは何ですか? Apr 17, 2024 pm 02:57 PM

HQL と SQL は Hibernate フレームワークで比較されます。HQL (1. オブジェクト指向構文、2. データベースに依存しないクエリ、3. タイプ セーフティ)、SQL はデータベースを直接操作します (1. データベースに依存しない標準、2. 複雑な実行可能ファイル)。クエリとデータ操作)。

Oracle SQLでの除算演算の使用法 Oracle SQLでの除算演算の使用法 Mar 10, 2024 pm 03:06 PM

「OracleSQLでの除算演算の使用方法」 OracleSQLでは、除算演算は一般的な数学演算の1つです。データのクエリと処理中に、除算演算はフィールド間の比率を計算したり、特定の値間の論理関係を導出したりするのに役立ちます。この記事では、OracleSQL での除算演算の使用法を紹介し、具体的なコード例を示します。 1. OracleSQL における除算演算の 2 つの方法 OracleSQL では、除算演算を 2 つの異なる方法で実行できます。

Oracle と DB2 の SQL 構文の比較と相違点 Oracle と DB2 の SQL 構文の比較と相違点 Mar 11, 2024 pm 12:09 PM

Oracle と DB2 は一般的に使用される 2 つのリレーショナル データベース管理システムであり、それぞれに独自の SQL 構文と特性があります。この記事では、Oracle と DB2 の SQL 構文を比較し、相違点を示し、具体的なコード例を示します。データベース接続 Oracle では、次のステートメントを使用してデータベースに接続します: CONNECTusername/password@database DB2 では、データベースに接続するステートメントは次のとおりです: CONNECTTOdataba

MyBatis動的SQLタグのSetタグ機能の詳細説明 MyBatis動的SQLタグのSetタグ機能の詳細説明 Feb 26, 2024 pm 07:48 PM

MyBatis 動的 SQL タグの解釈: Set タグの使用法の詳細な説明 MyBatis は、豊富な動的 SQL タグを提供し、データベース操作ステートメントを柔軟に構築できる優れた永続層フレームワークです。このうち、Set タグは、UPDATE ステートメントで SET 句を生成するために使用され、更新操作でよく使用されます。この記事では、MyBatis での Set タグの使用法を詳細に説明し、特定のコード例を通じてその機能を示します。 SetタグとはMyBatiで使用するSetタグです。

SQL の ID 属性は何を意味しますか? SQL の ID 属性は何を意味しますか? Feb 19, 2024 am 11:24 AM

SQL における Identity とは何ですか? 具体的なコード例が必要です。SQL では、Identity は自動インクリメント数値の生成に使用される特別なデータ型です。多くの場合、テーブル内のデータの各行を一意に識別するために使用されます。 Identity 列は、各レコードが一意の識別子を持つようにするために、主キー列と組み合わせてよく使用されます。この記事では、Identity の使用方法といくつかの実用的なコード例について詳しく説明します。 Identity の基本的な使用方法は、テーブルを作成するときに Identity を使用することです。

SQL ステートメントを使用せずに Springboot+Mybatis-plus を実装して複数のテーブルを追加する方法 SQL ステートメントを使用せずに Springboot+Mybatis-plus を実装して複数のテーブルを追加する方法 Jun 02, 2023 am 11:07 AM

Springboot+Mybatis-plus が SQL ステートメントを使用して複数テーブルの追加操作を実行しない場合、私が遭遇した問題は、テスト環境で思考をシミュレートすることによって分解されます: パラメーターを含む BrandDTO オブジェクトを作成し、パラメーターをバックグラウンドに渡すことをシミュレートします。 Mybatis-plus で複数テーブルの操作を実行するのは非常に難しいことを理解してください。Mybatis-plus-join などのツールを使用しない場合は、対応する Mapper.xml ファイルを設定し、臭くて長い ResultMap を設定するだけです。対応する SQL ステートメントを記述します。この方法は面倒に見えますが、柔軟性が高く、次のことが可能です。

SQL の 5120 エラーを解決する方法 SQL の 5120 エラーを解決する方法 Mar 06, 2024 pm 04:33 PM

解決策: 1. ログインしているユーザーがデータベースにアクセスまたは操作するための十分な権限を持っているかどうかを確認し、ユーザーが正しい権限を持っているかどうかを確認します; 2. SQL Server サービスのアカウントに指定されたファイルまたはデータベースにアクセスする権限があるかどうかを確認します。 3. 指定されたデータベース ファイルが他のプロセスによって開かれているかロックされているかどうかを確認し、ファイルを閉じるか解放して、クエリを再実行します。管理者として試してください。Management Studio をなどとして実行します。

MySQL でデータの集計と統計に SQL ステートメントを使用するにはどうすればよいですか? MySQL でデータの集計と統計に SQL ステートメントを使用するにはどうすればよいですか? Dec 17, 2023 am 08:41 AM

MySQL でデータの集計と統計に SQL ステートメントを使用するにはどうすればよいですか?データの集計と統計は、データ分析と統計を実行する際の非常に重要な手順です。 MySQL は強力なリレーショナル データベース管理システムとして、データの集約と統計操作を簡単に実行できる豊富な集約機能と統計機能を提供します。この記事では、SQL ステートメントを使用して MySQL でデータの集計と統計を実行する方法を紹介し、具体的なコード例を示します。 1. カウントには COUNT 関数を使用します。COUNT 関数は最も一般的に使用されます。

See all articles