SQL第一歩第23話.サブクエリ


サブクエリ


サブクエリは、SELECTコマンドで括弧で囲まれて指定された下位レベルのクエリです.通常、SQLコマンドに割り当てられるWHERE文.

1.DELETEのWHERE文でサブクエリを使用する


sample 54テーブルは、a値が最も小さいローを削除しようとします.
通常は以下の手順で行います.
SELECT MIN(a)を使用して最小値を検索→DELETE文を使用して行を削除
  • カッコでサブクエリを指定すると、このSELECTコマンドをDELETEコマンドと組み合わせることができます.
  • DELETE FROM sample54 WHERE a=(SELECT MIN(a) FROM sample54);
    ➊MySQLは、同じテーブルがサブクエリで使用できないため、データの追加/更新中にエラーが発生します.
    次の図に示すように、テンポラリ・テーブルを「行内ビュー」で処理して結果を表示します.
    DELETE FROM sample54 WHERE a=(SELECT a FROM(SELECT MIN(a) AS a FROM sample54) AS x);

    2.スカラー値


    サブクエリを使用する場合は、SELECTコマンドが返す値に注意してください.
  • 行、1列モード(1値)
  • > SELECT MIN(a) FROM sample54;
    // a열에서 가장 적은 수 출력
  • N行、1列モード
  • SELECT no FROM sample54;
    // no값만 출력
  • 第1行、N列モード
  • SELECT MIN(a),MAX(no) FROM sample54;
    // a열에서 가장 적은수, no열에서 가장 높은 수 출력
  • N行、N列モード
  • SELECT no,a FROM sample54;
    열 지정하여 출력
    1番モードのみが他のモードとは異なり、1つの値を返します.
  • このようにSELECT文は「戻りスカラー値」と呼ばれる1つの値しか返さない.
  • 標準量子クエリには、次のような特徴があります.
  • スカラー値を返すサブクエリは=演算子であり、比較が容易です.
  • 集約関数はWHERE文では使用できませんが、スカラー量子クエリを実行できます.
  • 3.SELECT文でサブクエリを使用

    SELECT (SELECT COUNT(*) FROM sample51) AS sql1,(SELECT COUNT(*) FROM sample54) AS sql2;

    SELECT文では、標準量子クエリを使用できます.
  • サブクエリ以外の上位レベルSELECTコマンドにはFROM文がありません.これはMySQLではFROM文を省略できるためです.
  • 4.SET文でのサブクエリの使用


    SET領域ではサブクエリも使用できます.
    mysql > UPDATE sample54 SET a = (SELECT a FROM (SELECT MAX(a) AS a FROM sample54) AS x);
    
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 2  Changed: 1  Warnings: 0
    
    mysql > SELECT * FROM sample54;
    
    +------+------+
    | no   | a    |
    +------+------+
    |    1 |  900 |
    |    2 |  900 |
    +------+------+
    2 rows in set (0.00 sec)
    
  • 列のすべての値がa列の最値に更新されます.
  • 5.FROMフレーズでサブクエリを使用する

  • FROMボールはテーブル以外のものも指定できます.ただし、デフォルトでは、テーブルを指定する場合、サブクエリはスカラー値を返す必要はありません.
  • mysql > SELECT * FROM (SELECT * FROM sample54) AS sq;
    
    +------+------+
    | no   | a    |
    +------+------+
    |    1 |  900 |
    |    2 |  900 |
    +------+------+
    2 rows in set (0.00 sec)
    上記の形態を「nasted構造」、「重ね合わせ構造」などと呼ぶ.

    5-1. 実際のビジネスでFROM文にサブクエリを指定すると、

  • Oracleの場合、LIMIT文は存在しないため、ロー数はROWNUM文に制限されます.
  • しかし、WHERE文には番号が割り当てられているため、ROWNUMでは行数が限られている.
  • したがって、
  • は、これを並べ替えた後に、例えば上位ビットを抽出する条件を付加することはできない.
  • サブクエリがFROM文に使用される.方法は次のとおりです.
  • SELECT * FROM (
        SELECT * FROM sample54 ORDER BY a DESC
    ) AS sq WHERE ROWNUM <= 2;
    OracleにはLIMIT文がありません.このコマンドは、ソート後に抽出するローを制限するときに発行されます.

    6.INSERTコマンドとサブクエリ


    サブクエリはINSERTコマンドにも使用できます.方法は2つあります.
  • VALESボールの一部としてサブクエリを使用する方法
  • VALES文の代わりにSELECTコマンドを使用する方法
  • ①の場合、サブクエリはスカラー量子クエリとして指定し、資料の種類も一致するようにする.
    mysql > INSERT 
              INTO sample541 
            VALUES((SELECT COUNT(*) 
                      FROM sample51), 
                   (SELECT COUNT(*) 
                      FROM sample54));
    
    Query OK, 1 row affected (0.00 sec)
    
    mysql > SELECT * FROM sample541;
    
    +------+------+
    | a    | b    |
    +------+------+
    |    5 |    2 |
    +------+------+
    1 row in set (0.00 sec)```
    上記の値は、整数型a、b列からなる空のテーブルsample 541に追加することができる.
    ②の場合はINSERT SELECTと呼ばれるコマンドです.
  • SELECTの結果はすべてINSERT INTOとして指定されたテーブルに追加されるため、データのコピーや移動によく使用されます.
  • $ mysql > INSERT INTO sample541 SELECT 1, 2;
    
    Query OK, 1 row affected (0.00 sec)
    Records: 1  Duplicates: 0  Warnings: 0
    
    $ mysql > SELECT * FROM sample541;
    
    +------+------+
    | a    | b    |
    +------+------+
    |    5 |    2 |
    |    1 |    2 |
    +------+------+
    2 rows in set (0.00 sec)
    
  • の場合、SELECT 1,2がMySQLで実行された場合の結果は以下の通りです.
  • mysql > SELECT 1, 2;
    
    +---+---+
    | 1 | 2 |
    +---+---+
    | 1 | 2 |
    +---+---+
    1 row in set (0.00 sec)