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

MySQL挿入コマンドと例を含むT-SQLクエリ構文

    開発者は生涯の学生です。できるだけ早く新しい知識を得ることが常に私たちのギグです。 T-SQLキャンプから来ている場合、MySQLを学ぶためのより速い方法は何ですか?多くの場合、構文を比較する必要があります。前回、MySQLでテーブルを作成する方法を学びました。今日の投稿では、さらに一歩進んでいきます。 MySQLINSERTを使用してレコードを挿入します。

    どれだけ簡単にできますか?どちらのデータベースプラットフォームもSQLを使用していますが、これらのデータベース製品には、標準のSQL構文にいくつかの追加機能があることがわかっています。 MySQLINSERTも例外ではありません。

    したがって、MySQLとSQL Serverの参照を比較することにうんざりしている場合は、今日が幸運な日です。構文をキュレートし、比較を行いました。また、チェックアウトする例もあります。最後に、別の無料のチートシートを用意します。

    さて、飛び込む前に、以下のオプトインフォームに記入することで、この記事に関する無料のPDFチートシートを入手することもできます。

    [sendpulse-form id =” 12097”]

    準備?すばらしい!

    MySQL INSERT INTOクエリ構文(テーブル値コンストラクター)

    ただし、詳細を説明する前に、いくつかのことを明確にしましょう。

    • ここで使用しているMySQLのバージョンは8.0.23で、InnoDBストレージエンジンを搭載しています。
    • SQLServerのバージョンは2019年です。

    まず、1つのレコードをテーブルに挿入してみましょう。基本的な構文は、SQLServerの構文と似ています。ただし、データベースとスキーマ名を含めず、列名をバッククォートで囲まない場合です。

    CREATE TABLE testdatabase.people
    (`ID` int NOT NULL PRIMARY KEY,
     `Lastname` varchar(50) NOT NULL,
     `FirstName` varchar(50) NOT NULL,
     `MiddleName` varchar(50) NULL DEFAULT '',
     `Rank` varchar(20) NOT NULL,
     `Ship` varchar(50) NOT NULL,
     `ShipRegistry` varchar(20) NOT NULL,
     `ModifiedDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP());
      
    INSERT INTO people
    (`ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, `Ship`, `ShipRegistry`)
    VALUES (3,'Archer','Jonathan','','Captain','Enterprise','NX-01');
    

    テーブルの実際の場所の指定は少し異なります。この投稿で示したように、データベースはMySQLのスキーマと同義です。以下の変更されたサンプルを確認してください:

    INSERT INTO testdatabase.people
    (`ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, `Ship`, `ShipRegistry`)
    VALUES (3,'Archer','Jonathan','','Captain','Enterprise','NX-01');
    

    上記のスキーマ名がないことに気づきましたか?

    一方、上記のVALUES句は、テーブル値コンストラクターを形成します。同様に、SQLServerにもその機能があります。

    MySQLのテーブルに複数の行を挿入する

    複数の行を挿入してみましょう。

    INSERT INTO testdatabase.people
    (ID, LastName, FirstName, MiddleName, Rank, Ship, ShipRegistry)
    VALUES (4,'Janeway','Kathryn','', Captain','USS Voyager', 'NCC-74656'), 
           (5, 'Sisko','Benjamin','','Captain','USS Defiant','NX-74205');
    

    上記のコードは、2つのテーブル値コンストラクターを使用して2つのレコードを挿入します。リテラル値の代わりに式を使用することもできます。以下の例では、列ごとにサブクエリを使用しています。

    CREATE TABLE testdatabase.people2 LIKE people;
    
    INSERT INTO testdatabase.people2
    (`ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, `Ship`, `ShipRegistry`)
    VALUES (4,'Janeway','Kathryn','','Captain','USS Voyager', 'NCC-74656'), 
           (5, (SELECT Lastname FROM people WHERE ID=5), 
               (SELECT Firstname FROM people WHERE ID=5), 
               (SELECT MiddleName FROM people WHERE ID=5),
               (SELECT `Rank` FROM people WHERE ID=5),
               (SELECT Ship FROM people WHERE ID=5),
               (SELECT ShipRegistry FROM people WHERE ID=5));
    

    上記のクエリでは、サブクエリは冗長に見えます。ただし、これによりエラーが発生します:

    INSERT INTO testdatabase.people2
    (`ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, `Ship`, `ShipRegistry`)
    VALUES (4,'Janeway','Kathryn','','Captain','USS Voyager', 'NCC-74656'), 
           (SELECT `ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, 
            `Ship`, `ShipRegistry` FROM people);    -- ERROR!
    

    テーブル値コンストラクターは、列リストの各フィールドにリテラルまたは式を想定しています。さらに、前の例のサブクエリは、1つの値を持つ単一の行を返します。これは有効です。ただし、上記のSELECTステートメントは複数の行と列を返すため、エラーが発生します。

    もう1つのオプションは、次の例のようにROWキーワードを指定することです。

    INSERT INTO testdatabase.people
    (ID, LastName, FirstName, MiddleName, Rank, Ship, ShipRegistry)
    VALUES ROW(4,'Janeway','Kathryn','', Captain','USS Voyager', 'NCC-74656'), 
           ROW(5, 'Sisko','Benjamin','','Captain','USS Defiant','NX-74205');
    

    ただし、INSERTステートメントのROWキーワードはSQLServerではサポートされていません。

    別のテーブルからのSELECTを使用したMySQLINSERTINTO

    SELECTステートメントを使用してテーブルにレコードを追加できます:

    INSERT INTO people2
    (ID, Lastname, FirstName, MiddleName, `Rank`, Ship, ShipRegistry)
    SELECT ID, Lastname, FirstName, MiddleName, `Rank`, Ship, ShipRegistry FROM people;
    

    ご覧のとおり、データベース名、スキーマ名、バックティック文字を除いたT-SQLでも同じです。ちなみに、ランクは予約語です。

    したがって、ランクという単語を囲むバッククォート文字は必須です。

    列リストなしで表現できます。ターゲットテーブルの列配置と同じ順序で列名を指定するだけです。

    TRUNCATE TABLE testdatabase.people2;
    
    INSERT INTO testdatabase.people2
    SELECT ID, Lastname, FirstName, MiddleName, `Rank`, Ship, ShipRegistry, ModifiedDate 
    FROM people;
    
    SELECT * FROM testdatabase.people2
    

    以下のdbForgeStudioforMySQLからの出力を参照してください。

    いいですね?列値の処理のトピックについてさらに詳しく見ていきましょう。

    INSERTおよびテーブルの列の値

    このセクションでは、MySQLINSERTを使用する際の列の値について詳しく説明します。それらは4つあります:

    • Unicode値。
    • デフォルト値。
    • 自動インクリメントを使用します。
    • ユーザー定義変数からの値。

    Unicode文字列を挿入

    T-SQLでは、文字列値の前に Nを付けることに慣れています。 。これを使用する場合、SQLServerは値がUnicode値であると想定します。 MySQLでは、それは必要ありません。

    以下の例を確認してください:

    CREATE TABLE IF NOT EXISTS UnicodeNames
    (ID int NOT NULL PRIMARY KEY AUTO_INCREMENT,
     FullName varchar(50) NOT NULL);
    
    INSERT INTO UnicodeNames
    (FullName)
    VALUES ('김지수'),('김제니'),('박채영'),('ลลิษา มโนบาล');
    
    SELECT * FROM UnicodeNames
    

    注意すべき点がいくつかあります:

    1. MySQL 8でテーブルを作成する際にNVARCHARを使用すると、自動的にVARCHARに変更されます。
    2. Unicode値の前にNを付ける必要はありません。 、N’김zippy수’のように。
    3. SQL Serverで正常に実行するには、上記のコードを少し編集する必要があります。

    以下の結果を確認してください:

    T-SQLの同等のコードは次のとおりです。

    CREATE TABLE UnicodeNames
    (ID int NOT NULL IDENTITY PRIMARY KEY,
     FullName nvarchar(50) NOT NULL);
    
    INSERT INTO UnicodeNames
    (FullName)
    VALUES (N'김지수'),(N'김제니'),(N'박채영'),(N'ลลิษา มโนบาล');
    
    SELECT * FROM UnicodeNames
    

    上記のUnicode値の1つから「N」を削除してみてください。コードは正常に実行されますが、SQL ServerManagementStudioで以下の出力を確認してください。

    MySQLにデフォルト値を挿入する方法

    列のデフォルト値は、値を指定せずにレコードを挿入したときに機能します。上記の最初の例でそれを使用しました。もう一度列の定義を示します:

    
    `ModifiedDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP()
    
    

    ModifiedDate デフォルトはサーバー上の現在の日付と時刻です。そのため、これを行ったとき:

    INSERT INTO testdatabase.people
    (`ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, `Ship`, `ShipRegistry`)
    VALUES (3,'Archer','Jonathan','','Captain','Enterprise','NX-01');
    

    結果は次のとおりです:

    非常にきちんとしていて、キーストロークを節約できます。これと同じ動作はSQLServerでも発生します。

    一方、明示的にしたい場合は、デフォルトの値で列名を指定するだけです:

    INSERT INTO testdatabase.people
    (`ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, `Ship`, `ShipRegistry`, `ModifiedDate`)
    VALUES (6, 'Pyke','Christopher','','Captain','USS Enterprise','NCC 1701', DEFAULT);
    

    SQLServerでもわずかな変更を加えて動作します。

    別の時間とキーストロークの節約があります。自動インクリメントの列値があります。

    挿入 AUTO_INCREMENT列

    テーブルの最後の整数値を取得して1を加算する代わりに、自動インクリメント列を定義することをお勧めします。主キーに適しています。 Unicodeテーブルの例でそれを行いました。

    もう一度その一部を示します:

    CREATE TABLE IF NOT EXISTS UnicodeNames
    (ID int NOT NULL PRIMARY KEY AUTO_INCREMENT,
     FullName varchar(50) NOT NULL);
    

    一方、SQL Serverでは、AUTO_INCREMENTの代わりにキーワードIDENTITYを使用します。

    図2は、自動インクリメント列を定義した結果を示しています。整数値は、INSERTステートメントで指定せずに生成されました。

    ユーザー定義変数を使用した列値の設定

    T-SQLにレコードを挿入するもう1つの一般的なケースは、ユーザー定義変数を適用して列の値を設定することです。アドホックスクリプトやストアドプロシージャを作成するのに役立ちます。

    ただし、最初に、MySQLでの変数の定義はSETを使用して行うことができます。 SQL Serverとは異なり、DECLAREを使用します。例を見てください:

    SET @stringValue = 'string value';
    SET @numericValue = 1287;
    SET @booleanValue = TRUE;
    SET @dateValue = CURRENT_DATE();
    
    CREATE TABLE IF NOT EXISTS TableDataTypeValues
    (ID int NOT NULL PRIMARY KEY AUTO_INCREMENT,
     stringValue varchar(50) NOT NULL,
     numericValue int NOT NULL,
     BooleanValue bit not NULL DEFAULT FALSE,
     dateValue date NULL);
    
    INSERT INTO TableDataTypeValues
    (stringValue, numericValue, BooleanValue, dateValue)
    VALUES (@stringValue, @numericValue, @booleanValue, @dateValue);
    

    上記のように、変数はVALUES句の列の値を埋めるための式として機能します。

    MySQLの一時テーブルに挿入

    ここでは、一時テーブルでMySQLINSERTを使用する方法を確認します。 T-SQL開発者は、「」に精通しています。 一時テーブル名の前にある‘記号。 MySQLでは、一時テーブルはCREATE TEMPORARY TABLE table_nameを使用して作成されます 。 「」はありません ‘記号。したがって、スクリプトの行の中で、一時的なテーブル名は通常のテーブル名と同じように見える場合があります。

    CREATE TEMPORARY TABLE tmpkpopgroup
    (ID int NOT NULL PRIMARY KEY AUTO_INCREMENT,
     GroupName varchar(50) NOT NULL,
     ModifiedDate datetime DEFAULT CURRENT_TIMESTAMP());
    
    INSERT INTO tmpkpopgroup
    (GroupName)
    VALUES ('BTS'),('SEVENTEEN'),('TWICE'),('MOMOLAND'),('GIRLS GENERATION'),('BLACKPINK'),('OH MY GIRL'),('RED VELVET');
    
    SELECT * FROM tmpkpopgroup
    ORDER BY GroupName;
    

    つまり、一時テーブルへのレコードの挿入は、通常のテーブルと同じように見えます。

    結果は次のとおりです。

    MySQLINSERT…ONDUPLICATEKEYUPDATE –T-SQLでサポートされていない構文

    最後に、MySQL INSERTには、T-SQLでサポートされていない構文ケースがあります。それらの1つは、INSERT…ON DUPLICATEKEYUPDATEです。何ができますか?

    テーブルに一意のキーがあり、重複の原因となる値を挿入した場合、INSERTは失敗します。ただし、INSERT…ON DUPLICATE KEY UPDATEを使用すると、代わりに既存の行が更新されます。エラーは発生しません。

    人々にこれらの記録があるとしましょう テーブル:

    赤で囲まれた船籍の値と、その行全体に注目してください。問題は、ON DUPLICATEKEYUPDATEで同じレコードを挿入することです。

    それでは、以下のステートメントを実行してみましょう:

    INSERT INTO testdatabase.people
    (`ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, `Ship`, `ShipRegistry`, `ModifiedDate`)
    VALUES (5, 'Sisko','Benjamin','','Captain','USS Defiant','NCC-75633', DEFAULT)
    ON DUPLICATE KEY UPDATE ShipRegistry = 'NCC-75633';
    
    SELECT * FROM testdatabase.people;
    

    エラーはありますか?確認しましょう!

    かっこいいですね。

    これを行うと同じ効果が発生します:

    UPDATE people 
    SET ShipRegistry = 'NCC-75633'
    WHERE ID = 5
    

    一方、T-SQLでは次のように意図を表現できます。

    IF EXISTS(SELECT id FROM people WHERE id = 5)
    	UPDATE people 
    	SET ShipRegistry = 'NCC-75633'
    	WHERE ID = 5
    ELSE
    	INSERT INTO people
    	(ID, LastName, FirstName, MiddleName, [Rank], Ship, ShipRegistry, ModifiedDate)
    	VALUES (5, 'Sisko','Benjamin','','Captain','USS Defiant','NCC-75633', DEFAULT);
    

    同じ結果が発生します。

    結論

    ベンジャミン・フランクリンはかつて、「知識への投資は常に最善の利益をもたらす」と述べました。この記事が時間内に報われることを願っています。

    要約しましょう:

    1. 基本的なMySQLINSERT構文は、スキーマ名がなく、バッククォートが使用されていることを除いて、T-SQLでもほぼ同じです。
    2. 別のテーブルからMySQLにレコードを挿入することは、T-SQLの場合とほとんど同じです。
    3. MySQL INSERTでは、列の値の処理が異なります。 Unicode値が最も注目に値します。また、AUTO_INCREMENTの使用では構文が異なります。
    4. MySQLの一時テーブルにレコードを挿入すると、T-SQLで「」とわずかな違いがあります。 ‘シンボル。
    5. INSERT…ONDUPLICATEKEYUPDATEは、重複エラーを回避するために構文を短縮するのに適しています。

    MySQLを学習しているときに、この記事がお役に立てば幸いです。この投稿が気に入ったら、お気に入りのソーシャルメディアプラットフォームで共有してください!


    1. Android-SQLite-Date1とDate2の間で選択

    2. PDO AdvancedCRUDGeneratorツールを使用してPHPCRUDインターフェイスをすばやく構築する

    3. SQL Serverでデータファイルを移動する方法–パート1

    4. Oracle SQL Developerでパッケージを作成する方法は?