sql >> データベース >  >> RDS >> SQLite

SQLiteサブクエリ

    概要 :このチュートリアルでは、より読みやすく複雑なクエリを構築するためのSQLiteサブクエリについて学習します。

    SQLiteサブクエリの概要

    サブクエリはSELECTです 別のステートメントにネストされたステートメント。次のステートメントを参照してください。

    SELECT column_1
    FROM table_1
    WHERE column_1 = (
       SELECT column_1 
       FROM table_2
    );Code language: SQL (Structured Query Language) (sql)

    次のクエリは外部クエリです :

    SELECT column_1
      FROM table_1
     WHERE colum_1 =Code language: SQL (Structured Query Language) (sql)

    そして、次のクエリはサブクエリです 。

    (SELECT column_1
      FROM table_2)Code language: SQL (Structured Query Language) (sql)

    サブクエリを囲むには、括弧のペアを使用する必要があります。サブクエリを特定の深さの別のサブクエリ内にネストできることに注意してください。

    通常、サブクエリは単一の行をアトミック値として返しますが、値をINと比較するために複数の行を返す場合があります。 オペレーター。

    SELECTでサブクエリを使用できます 、FROMWHERE 、およびJOIN 条項。

    SQLiteサブクエリの例

    tracksを使用します およびalbums デモンストレーション用のサンプルデータベースのテーブル。

    1)WHEREのSQLiteサブクエリ 条項の例

    単純なサブクエリを検索条件として使用できます。たとえば、次のステートメントは、タイトルがLet There Be Rockのアルバム内のすべてのトラックを返します。

    SELECT trackid,
           name,
           albumid
    FROM tracks
    WHERE albumid = (
       SELECT albumid
       FROM albums
       WHERE title = 'Let There Be Rock'
    );Code language: SQL (Structured Query Language) (sql)

    サブクエリは、タイトルが'Let There Be Rock'のアルバムのIDを返します。 。クエリはequal演算子(=)を使用してalbumidを比較します albumidを使用してサブクエリによって返される tracksで テーブル。

    サブクエリが複数の値を返す場合は、INを使用できます 一連の値に対して単一の値が存在するかどうかを確認する演算子。

    次のemployeesを参照してください およびcustomers サンプルデータベースのテーブル:

    たとえば、次のクエリは、営業担当者がカナダにいる顧客を返します。

    SELECT customerid,
           firstname,
           lastname
      FROM customers
     WHERE supportrepid IN (
               SELECT employeeid
                 FROM employees
                WHERE country = 'Canada'
           );
    Code language: SQL (Structured Query Language) (sql)

    サブクエリは、カナダにいる従業員のIDのリストを返します。外部クエリはINを使用します オペレーターは、リストに営業担当者IDを持つ顧客を検索します。

    2)FROMのSQLiteサブクエリ 条項の例

    集計関数を列に複数回適用したい場合があります。たとえば、最初にアルバムのサイズを合計してから、すべてのアルバムの平均サイズを計算します。次のクエリを思い付くかもしれません。

    SELECT AVG(SUM(bytes) 
    FROM tracks
    GROUP BY albumid;Code language: SQL (Structured Query Language) (sql)

    このクエリは無効です。

    これを修正するには、FROMでサブクエリを使用できます 次のような条項:

    SELECT
    	AVG(album.size)
    FROM
    	(
    		SELECT
    			SUM(bytes) SIZE
    		FROM
    			tracks
    		GROUP BY
    			albumid
    	) AS album;Code language: SQL (Structured Query Language) (sql)
    AVG(album.size)
    ---------------
      338288920.317

    この場合、SQLiteは最初にFROMでサブクエリを実行します 句を使用して、結果セットを返します。次に、SQLiteはこの結果セットを外部クエリの派生テーブルとして使用します。

    SQLite相関サブクエリ

    これまでに見たすべてのサブクエリは、独立して実行できます。つまり、外部クエリに依存しません。

    相関サブクエリは、外部クエリの値を使用するサブクエリです。通常のサブクエリとは異なり、相関サブクエリを個別に実行することはできません。

    相関サブクエリは、外部クエリによって処理される行ごとに評価されるため、効率的ではありません。

    次のクエリは、相関サブクエリを使用して、サイズが10MB未満のアルバムを返します。

    SELECT albumid,
           title
      FROM albums
     WHERE 10000000 > (
                          SELECT sum(bytes) 
                            FROM tracks
                           WHERE tracks.AlbumId = albums.AlbumId
                      )
     ORDER BY title;Code language: SQL (Structured Query Language) (sql)

    クエリの仕組み。

    • 外部クエリで処理された行ごとに、相関サブクエリは、SUMを使用して、現在のアルバムに属するトラックからアルバムのサイズを計算します。 機能。
    • WHEREの述語 句は、サイズが10MB(10000000バイト)以上のアルバムをフィルタリングします。

    SELECTのSQLite相関サブクエリ 条項の例

    次のクエリは、SELECTで相関サブクエリを使用します アルバム内のトラック数を返す句。

    SELECT albumid,
           title,
           (
               SELECT count(trackid) 
                 FROM tracks
                WHERE tracks.AlbumId = albums.AlbumId
           )
           tracks_count
      FROM albums
     ORDER BY tracks_count DESC;Code language: SQL (Structured Query Language) (sql)

    このチュートリアルでは、サブクエリを紹介し、クエリでサブクエリを使用してテーブルからデータを選択するさまざまな方法を示しました。


    1. ストアドプロシージャのSqlParameterでDateTimeを使用すると、フォーマットエラーが発生します

    2. MySQL、MariaDB、MongoDB、PostgreSQLシステムを監視するためのカスタムグラフ-ClusterControlのヒントとコツ

    3. ORA-01618

    4. Oracleで負の値を正に変更する方法は?