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

SQLINSERTINTO…SELECTの例

    SQL INSERT ステートメントは、個々の行をテーブルに挿入するために最も一般的に使用されます。

    ただし、クエリの結果をテーブルに挿入することもできます。これは、一度に複数の行を挿入できることを意味します(クエリによって返される限り)。

    基本的な例

    これがデモンストレーションの基本的な例です。

    INSERT INTO Pets2
    SELECT * FROM Pets;

    これにより、Petsからすべての行が挿入されます テーブルをPets2に テーブル。

    Pets2がすでに作成されていることを前提としています テーブルとそれが正しい定義を持っていること。

    存在しない場合、または正しい定義がない場合は、エラーが発生します。

    複数のテーブルからデータを挿入

    このメソッドを使用して、複数のテーブルからデータを挿入できます。

    INSERT INTO PetsTypesOwners
    SELECT 
        p.PetId,
        p.PetName,
        p.DOB,
        pt.PetTypeId,
        pt.PetType,    
        o.OwnerId,
        o.FirstName,
        o.LastName,
        o.Phone,
        o.Email
    FROM Pets p 
    INNER JOIN PetTypes pt 
    ON p.PetTypeId = pt.PetTypeId 
    INNER JOIN Owners o 
    ON p.OwnerId = o.OwnerId;

    この例では、3つのテーブルのデータをPetsTypesOwnersという1つのテーブルに挿入しました。 。

    各列を明示的にリストしたことに注意してください。これを行ったのは、宛先列の列が3つのテーブルの合計よりも少ないためです。この場合、すべての列を選択した場合、主キーと同じ名前と値を持つ外部キーが原因で、クエリが重複する列を返すためです。

    これらの重複する列を含める場合は、宛先の列にこれらの重複する列を含める必要がありますが、重複するペアごとに名前が異なります。

    すべての列を選択する例を次に示します(名前が表示されるように、ここで明示的に選択します):

    INSERT INTO PetsTypesOwners2
    SELECT 
        p.PetId, 
        p.OwnerId, 
        p.PetTypeId,
        p.PetName,
        p.DOB,
        pt.PetTypeId,
        pt.PetType,    
        o.OwnerId,
        o.FirstName,
        o.LastName,
        o.Phone,
        o.Email
    FROM Pets p 
    INNER JOIN PetTypes pt 
    ON p.PetTypeId = pt.PetTypeId 
    INNER JOIN Owners o 
    ON p.OwnerId = o.OwnerId;

    OwnerIdという2つの列があることがわかります。 2つはPetTypeIdと呼ばれます 、それぞれ異なるテーブルから。これらは、それぞれのテーブルの主キーと外部キーです。

    これらの列が重複しているため、前の例ではそれぞれ1つだけを含めました。ただし、このデモの目的で、これらをこの例に含めました。

    したがって、この新しいINSERT INTO... SELECTに対応するため ステートメントでは、宛先テーブルに正しい列数があり、互換性のある定義が必要です。

    したがって、宛先テーブルの定義は次のようになります。

    CREATE TABLE PetsTypesOwners2 (
        PetId       int NOT NULL PRIMARY KEY,
        PetPetType  varchar(60) NOT NULL,
        PetOwnerId  int NOT NULL,
        PetName     varchar(60) NOT NULL,
        DOB         date NULL,
        PetTypeId   int NOT NULL,
        PetType     varchar(60) NOT NULL,
        OwnerId     int NOT NULL,
        FirstName   varchar(60) NOT NULL,
        LastName    varchar(60) NOT NULL,
        Phone       varchar(20) NOT NULL,
        Email       varchar(254)
    );

    この場合、重複する各列の1つにPetのプレフィックスを付けました。 。具体的には、PetPetTypeIdを作成しました (これはp.OwnerIdにマップされます クエリの列)およびPetOwnerId 列(p.PetTypeIdにマップされます クエリの列)。

    ただし、宛先テーブルの列を何と呼ぶか​​は問題ではないことに注意してください。 INSERT INTO... SELECT ステートメントはそれを気にしません。 INSERT INTO... SELECT ステートメントは列の順序にのみ関心があります。

    ビューからデータを挿入

    同じINSERT INTO... SELECTを使用できます ビューからテーブルにデータを挿入するための構文。

    簡単な例を次に示します。

    INSERT INTO PetTypeCount
    SELECT * FROM vPetTypeCount;

    この場合、vPetTypeCount はビューであり、その内容をPetTypeCountというテーブルに挿入しています。 。

    ストアドプロシージャからデータを挿入

    一部のDBMS(SQL Serverなど)も同じINSERT INTO... SELECTを使用できます ストアドプロシージャからテーブルにデータを挿入するための構文。

    簡単な例を次に示します。

    INSERT INTO PetById
    EXEC uspGetPetById 2;

    繰り返しますが、これは正しい定義の宛先テーブルがあることを前提としています。

    SELECT INTO ステートメント

    DBMSによっては、SELECT INTOもあります 結果セットに基づいて新しいテーブルを自動的に作成し、その結果セットをそのテーブルに挿入するために使用できるステートメント。


    1. SQLの切り捨て

    2. Javaを使用してSSH経由でリモートMySQLデータベースに接続します

    3. Rails + OSX上のMySQL:ライブラリがロードされていません:libmysqlclient.18.dylib

    4. カーソルを使用したAndroidのSQliteクエリ