データベース設計(Access)

【SQL学習入門】3回目:SQLでAccessテーブルのデータを編集する

スポンサーリンク

こんにちは。システム担当の父親KATSUです。
Excel歴20年、Access歴10年ですが、ブログ歴はもうすぐで2年になります。
新記事の投稿は週1程度で行っています。

今回はSQL学習入門の3回目です。
前回まではテーブルのデータを参照する方法について解説しましたが、今回はテーブルのデータを編集するために必要なSQL文を紹介します。

この記事を読んでいる方は、日々の業務でExcelにデータを入力することが多いのではないでしょうか?
数件から数十件程度のデータだけなら簡単に作業を終わらせられますが、数千件や数万件の入力やコピペなどは当然時間もかかりますし、作業ミスなども起こりやすくなります。

「SQL文でデータを編集する」ことは、手作業ではなくコンピューターにテーブルを編集させるということです。
本記事で紹介しているSQL文を習得し、プログラムコードに織り交ぜることができれば、数千件や数万件の一括編集をワンクリックで行えるようになります。

Accessテーブルのデータを編集する時に使う3つのSQL文

SQL文は「SELECT」「INSERT」「UPDATE」「DELETE」の4種類に分けられます。

過去2回の記事で解説しましたが、SELECT文はテーブルのデータを参照するための命令文です。
SELECT文の中でもグループ化して集計したり、クロス集計したりなど、いろいろ複雑な加工を行うこともできます。

SELECT文以外の3つのSQL文は、いずれもテーブルのデータを編集するための命令文です。

  • INSERT文でデータを挿入する
  • UPDATE文でデータを更新する
  • DELETE文でデータを削除する

では、実際にSQL文を書いて実行してみましょう。
サンプルデータベースはこちらからダウンロードできます。

購買管理DB_Table_Edit.accdb

開いてみると、2つのテーブルがオブジェクトブラウザにあります

  • T11部品マスタ編集用
  • T12発注伝票明細編集用
今回編集するテーブル

2つともレコードが0件の空テーブルになっていますので、SQL文を使って編集していきます。

データが空のテーブル

INSERT文でデータを挿入する

INSERT文でレコードを挿入できますが、

  • 1件ずつレコードを挿入する方法
  • 他のテーブルやクエリからレコードを転記する方法

の2種類に分けることができます。

1件ずつデータを挿入する

単体のデータを追加する場合はこのような書き方です。

INSERT INTO T11部品マスタ_編集用 ( 品名, 型式, 規格, 小分類ID, 伝票表示 ) VALUES ("埋込コンセント", "WF1420BK", "10個", "2", "型式");

実際にSQLビューにINSERT文を書き、更新ボタンをクリックします。

INSERT文を書いてSQLを実行

警告が表示されますが、「OK」をクリックします。

警告表示

テーブルを開くと、INSERT文で書いたデータが挿入されました。

データが1件追加された

次の作業のために、DELETEキーで入力したデータを削除しておきましょう。

デザインビューの挿入クエリから作成すると、以下のSQL文が自動作成されます。

INSERT INTO T11部品マスタ_編集用 ( 品名, 型式, 規格, 小分類ID, 伝票表示 ) SELECT "埋込コンセント" AS 式1, "WF1420BK" AS 式2, "10個" AS 式3, "2" AS 式4, "型式" AS 式5;

他のデータベースシステムでも共通して使えるのは、初めに記載した「INSERT INTO ~ VALUES」の方です。
SELECTを使ったINSERT文より、シンプルなINSERT文に慣れておいた方がよいでしょう。

業務システムで使われている新規入力画面は、一件分のデータを挿入するINSERT文がよく使われています。

特定のテーブルやクエリからのデータを転記する

複数のデータを追加する場合にはSELECT文を使います。
「T01部品マスタ」内の小分類IDが1のレコードのみを、「T11部品マスタ_編集用」に追加してみます。

INSERT INTO T11部品マスタ_編集用 ( 部品登録ID, 品名, 型式, 規格, サイズ, 小分類ID, 備考, 伝票表示 )
 SELECT 部品登録ID, 品名, 型式, 規格, [サイズ], 小分類ID, 備考, 伝票表示 FROM T01部品マスタ
 WHERE T01部品マスタ.小分類ID=1;

結果を確認してみると、2件のレコードが追加されました。

2件のデータが追加された

元データのT01部品マスタを確認してみます。
小分類IDが1のレコードは2件のみですので、指定した条件に合致したデータが追加されていることが確認できました。

小分類IDが1のレコード

例文ではWHERE句を入れて条件抽出してみましたが、JOIN句を使ったSELECT文から挿入することもできます。

逆に、シンプルに*(アスタリスク)を使ってINSERT文を作ることも出来ます

INSERT INTO T12発注伝票明細_編集用 SELECT * FROM T02発注伝票明細;

SQLを実行してみると、T02発注伝票明細の全レコードが挿入されていることが確認できました。

全てのレコードが追加された

まとめてデータを挿入する方法は、集計するバッチ処理を行う時に使われます。

UPDATE 文でデータを更新する

定数を更新する

UPDATEの基本は、定数を更新する書き方ですので、しっかりとマスターしておきましょう。

UPDATE T12発注伝票明細_編集用 SET T12発注伝票明細_編集用.数量 = 1;

実行すると、全てのレコードの数量が1になりました。

全件の数量が1に更新された

最もよく使われる方法は、WHERE句で特定のレコードを指定し、更新することです。

業務システムで、データを修正する画面がありますが、1件分のデータを修正するUPDATE文が使われています。

JOIN句を使った更新

別のテーブルからデータを参照して更新する方法です。
更新前のテーブル「T12発注伝票明細_編集用」は、発注日が空欄になっています。

発注日が空欄になっている
UPDATE T12発注伝票明細_編集用 INNER JOIN T02発注伝票 ON T12発注伝票明細_編集用.発注登録No = T02発注伝票.発注登録No SET T12発注伝票明細_編集用.発注日 = [T02発注伝票].[発注日];

実行すると、T12発注伝票明細_編集用の発注日が更新されていることが分かります。

全ての発注日が更新された

もう一度発注日をNULLにしてみます。

UPDATE T12発注伝票明細_編集用 SET T12発注伝票明細_編集用.発注日 = NULL;

UPDATE文を実行すると、発注日が空欄になっていることを確認できました。

発注日が空欄になった

今度は部品登録IDが1桁(10未満)の商品のみの発注日のみを反映させます。

UPDATE T12発注伝票明細_編集用 INNER JOIN T02発注伝票 ON T12発注伝票明細_編集用.発注登録No = T02発注伝票.発注登録No SET T12発注伝票明細_編集用.発注日 = [T02発注伝票].[発注日] WHERE T12発注伝票明細_編集用.部品登録ID<10;

SQL文を実行すると、対象の商品のみが反映されていることが分かりました。

条件の合致したレコードのみ更新された

DELETE文でデータを削除する

DELETE文はデータを削除するだけです。

DELETE * FROM T11部品マスタ編集用; 
DELETE * FROM T12発注伝票明細編集用;

両方のテーブルのデータが削除されていることが確認できました。

全レコードが削除された

気軽にDELETE文を乱発させないようにだけ気をつけましょう。

「仮削除」というフィールドを作っておいて、チェックが入ったものは表示させないという処置もあります。
データを完全に消去したくない方は検討してもいい方法でしょう。

まとめ

今回は、AccessテーブルのデータをSQL文で編集する方法について解説しました。
ここで紹介した方法はAccessでシステムを構築するときにそのまま使えます。

システムのデータ編集画面では、1件ずつデータを変更するSQL文が使われています。
一方、集計やデータ分析を行うためのバッチ処理では、まとめてデータを編集するSQL文が使われています。
両方の使い方をマスターすることで、Accessを使った自動化に近づけることができます。

これまで手作業でデータを編集していた方は、本記事で紹介しているSQL文を学べば、既にシステムの自作が可能な状態になっています。
自分で作ったSQL文をVBA上で実行させるだけで、そのまま一瞬で処理されます。
覚えることが多いですが、ひたすら手を動かしていけばきっと慣れていきます。
学習を継続してSQL文を自分のものにできれば、きっと今まで見えていなかったものが見えてくるはずです。

次回は、複数のクエリを一つにまとめたり、SQL文の文字を少なくするためのテクニックについて解説します。

スポンサーリンク

-データベース設計(Access)