導入
構造化照会言語(SQL)は、テーブルへのデータ挿入方法において非常に柔軟性の高い言語です。例えば、VALUESキーワードを使って個々のデータ行を指定したり、SELECTクエリを使って既存のテーブルからデータセット全体をコピーしたり、SQLが自動的にデータを挿入するように列を定義したりすることができます。.
このガイドでは、それぞれの方法で INSERT INTO SQL 構文を使用してテーブルにデータを追加する方法について説明します。.
前提条件
このガイドに従うには、SQLを使用するリレーショナルデータベース管理システム(RDBMS)を搭載したコンピューターが必要です。このガイドの手順と例は、以下の環境で検証されています。
- Ubuntu 20.04 を実行しているサーバー。管理者権限を持つ非 root ユーザーと、UFW で構成されたファイアウォールを備えています。.
- MySQL はサーバー上にインストールされ、保護されています。.
また、データの挿入を練習するためのデータベースとテーブルも必要です。これらをお持ちでない場合は、「MySQLへの接続とサンプルデータベースの設定」セクションを参照して、このガイドの例で使用するデータベースとテーブルの作成方法の詳細を確認してください。.
MySQLへの接続とサンプルデータベースの設定
SQL データベース システムがリモート サーバー上で実行されている場合は、ローカル マシンからサーバーに SSH で接続します。
ssh sammy@your_server_ip
次に、MySQL サーバー プロンプトを開き、Sami を MySQL ユーザー名に置き換えます。
mysql -u sammy -p
insertDB というデータベースを作成します。
CREATE DATABASE insertDB;データベースが正常に作成された場合、次の出力が表示されます。
Query OK, 1 row affected (0.01 sec)insertDB データベースを選択するには、次の USE ステートメントを実行します。
USE insertDB;
Output
Database changedinsertDBデータベースを選択したら、その中にテーブルを作成します。例えば、工場を所有していて、従業員に関する情報を保存するテーブルを作成するとします。このテーブルには、以下の5つの列が含まれます。
名前: 各従業員の名前は、最大30文字のvarcharデータ型で表されます。位置この列には各従業員の役職が格納されます。これも、最大 30 文字の varchar データ型を使用して表現されます。.部門: 各従業員が勤務する部門。varchar データ型を使用して表現されますが、最大 20 文字までです。.時給各従業員の時給を記録する列は、小数点以下の2桁を含む最大4桁の小数データ型を使用しています。したがって、この列で許容される値の範囲は-99.99~99.99です。開始日: 各従業員の入社日。日付データ型で表されます。この型の値はYYYY-MM-DDの形式に従う必要があります。
次の 5 つの列を持つ factoryEmployees というテーブルを作成します。
CREATE TABLE factoryEmployees (
name varchar(30),
position varchar(30),
department varchar(20),
hourlyWage decimal(4,2),
startDate date
);これで、ガイドの残りの部分に進み、SQL を使用してデータを挿入する方法を学習する準備が整いました。.
データを手動で入力する
SQL でデータを挿入するための一般的な構文は次のとおりです。
INSERT INTO table_name
(column1, column2, . . . columnN)
VALUES
(value1, value2, . . . valueN);デモンストレーションとして、次の INSERT INTO ステートメントを実行して、factoryEmployees テーブルに 1 行のデータをロードします。
INSERT INTO factoryEmployees
(name, position, department, hourlyWage, startDate)
VALUES
('Agnes', 'thingamajig foreman', 'management', 26.50, '2017-05-01');Output
Query OK, 1 row affected (0.00 sec)ステートメントはキーワードINSERT INTOで始まり、その後にデータを挿入するテーブル名が続きます。テーブル名の後には、ステートメントがデータを挿入する列のリストが括弧で囲まれて続きます。列リストの後にキーワードVALUESが続き、その後に括弧で囲まれカンマで区切られた値のセットが続きます。.
列をリストする順序は重要ではありません。ただし、指定する値の順序は列の順序と一致する必要があることに注意してください。SQLは常に、指定された最初の値をリストの最初の列に挿入し、2番目の値を次の列に挿入する、というように処理を進めます。例えば、次のINSERT文は別のデータ行を追加しますが、列の順序は異なります。
INSERT INTO factoryEmployees
(department, hourlyWage, startDate, name, position)
VALUES
('production', 15.59, '2018-04-28', 'Jim', 'widget tightener');Output
Query OK, 1 row affected (0.00 sec)値を正しく整列させないと、SQLはデータを間違った列に挿入する可能性があります。さらに、値のいずれかが列のデータ型と競合すると、次の例のようにエラーが発生します。
INSERT INTO factoryEmployees
(name, hourlyWage, position, startDate, department)
VALUES
('Louise', 'doodad tester', 16.50, '2017-05-01', 'quality assurance');Output
ERROR 1366 (HY000): Incorrect decimal value: 'doodad tester' for column 'hourlyWage' at row 1
指定する各列には必ず値を指定する必要がありますが、新しいデータ行を追加する際には、必ずしもテーブル内のすべての列を指定する必要はありません。削除する列に、この場合にエラーを引き起こす制約(NOT NULLなど)がない限り、MySQLは指定されていない列にNULLを追加します。
INSERT INTO factoryEmployees
(name, position, hourlyWage)
VALUES
('Harry', 'whatzit engineer', 26.50);Output
Query OK, 1 row affected (0.01 sec)テーブルの各列に値を含む行を挿入する場合、列名を入力する必要はありません。入力する値は、テーブル定義で定義されている列の順序と一致している必要があることに注意してください。.
この例では、リストされている値は、factoryEmployee テーブルの CREATE TABLE ステートメントで列が定義されている順序に揃えられています。
INSERT INTO factoryEmployees
VALUES
('Marie', 'doodad welder', 'production', 27.88, '2018-03-29');
Output
Query OK, 1 row affected (0.00 sec)
次のように、各行をコンマで区切って、複数のレコードを一度に追加することもできます。
INSERT INTO factoryEmployees
VALUES
('Giles', 'gizmo inspector', 'quality assurance', 26.50, '2019-08-06'),
('Daphne', 'gizmo presser', 'production', 32.45, '2017-11-12'),
('Joan', 'whatzit analyst', 'quality assurance', 29.00, '2017-04-29');Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0SELECT文によるデータのコピー
データを行ごとに指定する代わりに、SELECT クエリを使用して 1 つのテーブルから複数のデータ行をコピーし、別のテーブルに挿入することができます。.
このタイプの操作の構文は次のとおりです。
INSERT INTO table_A (col_A1, col_A2, col_A3)
SELECT col_B1, col_B2, col_B3
FROM table_B;この例の構文では、列リストの後にVALUESキーワードを記述する代わりに、SELECT文を記述しています。この例の構文のSELECT文にはFROM句のみが含まれていますが、有効なクエリであればどれでも動作します。.
デモとして、次のCREATE TABLE操作を実行して、「showroomEmployees」という新しいテーブルを作成します。このテーブルの列名とデータ型は、前のセクションで使用したfactoryEmployeesテーブルの3つの列と同じであることに注意してください。
CREATE TABLE showroomEmployees (
name varchar(30),
hourlyWage decimal(4,2),
startDate date
);Output
Query OK, 0 rows affected (0.02 sec)これで、INSERT INTO ステートメントに SELECT クエリを含めることで、以前に作成された factoryEmployees テーブルからいくつかのデータをこの新しいテーブルにロードできるようになりました。.
SELECT クエリがターゲット テーブルの列と同じ数の列を同じ順序で返し、それらの列のデータ型も一致する場合は、INSERT INTO ステートメントから列リストを省略できます。
INSERT INTO showroomEmployees
SELECT
factoryEmployees.name,
factoryEmployees.hourlyWage,
factoryEmployees.startDate
FROM factoryEmployees
WHERE name = 'Agnes';Output
Query OK, 1 row affected (0.01 sec)
Records: 1 Duplicates: 0 Warnings: 0この操作のSELECT文にはWHERE句が含まれており、このクエリはfactoryEmployeesテーブルからname列にAgnesという値が含まれる行のみを返します。ソーステーブルには行が1つしかないため、その行のみがshowroomEmployeesテーブルにコピーされます。.
これを確認するには、次のクエリを実行して、ショールーム従業員テーブル内のすべてのレコードを返します。
SELECT * FROM showroomEmployees;
Output
+-------+------------+------------+
| name | hourlyWage | startDate |
+-------+------------+------------+
| Agnes | 26.50 | 2017-05-01 |
+-------+------------+------------+
1 row in set (0.00 sec)ソーステーブルから複数行を返すクエリを使用して、複数行のデータを挿入できます。例えば、次の文のクエリは、factoryEmployeesデータベース内のname列の値がJで始まらないレコードをすべて返します。
INSERT INTO showroomEmployees
SELECT
factoryEmployees.name,
factoryEmployees.hourlyWage,
factoryEmployees.startDate
FROM factoryEmployees
WHERE name NOT LIKE 'J%';Output
Query OK, 5 rows affected (0.01 sec)
Records: 5 Duplicates: 0 Warnings: 0ショールーム従業員テーブル内のすべてのレコードを返すには、次のクエリを再度実行します。
SELECT * FROM showroomEmployees;
+--------+------------+------------+
| name | hourlyWage | startDate |
+--------+------------+------------+
| Agnes | 26.50 | 2017-05-01 |
| Agnes | 26.50 | 2017-05-01 |
| Harry | 26.50 | NULL |
| Marie | 27.88 | 2018-03-29 |
| Giles | 26.50 | 2019-08-06 |
| Daphne | 32.45 | 2017-11-12 |
+--------+------------+------------+
6 rows in set (0.00 sec)
Name列にAgnesという同一の行が2つあることに注目してください。SELECT文を含むINSERT INTO文を実行するたびに、SQLはクエリの結果を新しいデータセットとして扱います。テーブルに特定の制約を課したり、より正確なクエリを作成したりしない限り、このようなデータを追加すると、データベースに重複レコードが読み込まれるのを防ぐことはできません。.
情報を自動的に挿入する
テーブルを作成するときに、列に特定の属性を適用して、RDBMS が自動的にデータを入力するようにすることができます。.
例えば、次の文を実行して「interns」というテーブルを定義してみましょう。3つの列を持つ「interns」というテーブルが作成されます。この例の最初の列「internID」には、int型のデータが格納されます。ただし、この列にはAUTO_INCREMENT属性も含まれていることに注意してください。この属性により、SQLは新しい行ごとに一意の数値を自動的に生成します。この数値はデフォルトで1から始まり、後続のレコードごとに1ずつ増加します。.
同様に、2番目の列「section」にはキーワード「DEFAULT」が含まれています。INSERT INTO文の列リストから「section」を削除すると、RDBMSは自動的にデフォルト値(この例では「production」)を挿入します。
CREATE TABLE interns (
internID int AUTO_INCREMENT PRIMARY KEY,
department varchar(20) DEFAULT 'production',
name varchar(30)
);これらの機能を確認するには、次のINSERT INTO文を実行してInternsテーブルにデータをロードします。この操作では、Name列の値のみを指定します。
INSERT INTO interns (name) VALUES ('Pierre'), ('Sheila'), ('Francois');
Output
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0次に、次のクエリを実行して、テーブルのすべてのレコードを返します。
SELECT * FROM interns;
Output
+----------+------------+----------+
| internID | department | name |
+----------+------------+----------+
| 1 | production | Pierre |
| 2 | production | Sheila |
| 3 | production | Francois |
+----------+------------+----------+
3 rows in set (0.00 sec)この出力は、列定義により、指定されていないにもかかわらず、前の INSERT INTO ステートメントによって内部セクションと外部セクションの両方に値が追加されていることを示しています。.
セクション列にデフォルト値以外の値を追加するには、次のように INSERT INTO ステートメントでその列を指定する必要があります。
INSERT INTO interns (name, department)
VALUES
('Jacques', 'management'),
('Max', 'quality assurance'),
('Edith', 'management'),
('Daniel', DEFAULT);Output
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0この例で提供された値の最後の行には、文字列値ではなくキーワード DEFAULT が含まれていることに注意してください。これにより、データベースはデフォルト値(「production」)を挿入します。
SELECT * FROM interns;
Output
+----------+-------------------+----------+
| internID | department | name |
+----------+-------------------+----------+
| 1 | production | Pierre |
| 2 | production | Sheila |
| 3 | production | Francois |
| 4 | management | Jacques |
| 5 | quality assurance | Max |
| 6 | management | Edith |
| 7 | production | Daniel |
+----------+-------------------+----------+
7 rows in set (0.00 sec)結果
このガイドを読むことで、VALUES キーワードを使用して個々のデータ行を指定する方法、SELECT クエリを使用してデータ セット全体をコピーする方法、SQL が自動的にデータを挿入する列を定義する方法など、テーブルにデータを挿入するさまざまな方法を学習しました。.
ここに挙げたコマンドは、SQLを使用するあらゆるデータベース管理システムで動作するはずです。ただし、SQLデータベースはそれぞれ独自の言語実装を使用しているため、INSERT INTO文の処理方法や利用可能なオプションの詳細については、DBMSのドキュメントを参照してください。.









