データベースをわかりやすく解説：ACID特性とSQL基礎について

**はじめに**

基本情報技術者試験のA試験では、「データベース」に関する知識が問われています。システムエンジニアとして業務現場で勤務した経験をお持ちの方にとっては馴染みのある分野かもしれませんが、IT未経験で基本情報技術者試験を受験する方々にとっては新しい知識と思われます。

この文章は、IT初心者で、基本情報技術者試験の受験勉強をしている方々にとって理解しやすいように、データベースについて紹介したうえ、データベースのACID特性およびSQLの基本文法について説明します。

SQL文の部分で使われているテーブルは、実業務で使われているデータベースのテーブルとは多少異なりますが、SQL文を用いてどのような処理を行えるかについて理解していただければと思います。

**データベースとは**

そもそも、データベースとは何でしょうか。
はじめてデータベース（Database）という単語を見たとき、私は「データ」を基礎にして、何かの処理ができるような、不思議なものというイメージを持ちました。実際、データベースというのは、電子的に保存され、権限を持つ人がアクセスできる組織化されたデータの集合であり、すなわち、「データの倉庫」のようなものです。

日常生活で使われている倉庫の中に置かれている品物が分類されて保管されていることと同様に、データベースの中のデータも、データの活用の仕方によって、様々なグループに分けられて保存されています。例えば、とあるショッピングサイトのサーバーが持つ「ユーザー情報」というデータベースには、そのサイトの利用者たちが登録した「ユーザー名」、「パスワード」、「支払い方法」、「住所」などの情報が保存されています。このようにデータベースを活用することで、多くの会社・組織が有効に情報収集・利用できるようになります。

ユーザーがアプリケーションまたはデータベース自体と会話し、データを取得して分析するためのソフトウェアは、データベース管理システム（DBMS）と呼ばれています。

各データベースを何かの関係（リレーション）があり、その関係性を用いてデータベースの中のデータを活用するのは、関係データベースです。

また、データベースに対して一連の処理・操作をまとめたものは、データベーストランザクションです。

**データベースのACID特性**

データベースには、原子性（Atomicity），一貫性（Consistency），独立性（Isolation），永続性（Durability）という4つの特性があります。データベースの特性は、その4つの特性の英語の頭文字を取り、合わせてデータベースのACID（アシッド）特性と呼びます。

上記の4つの特性は、見るだけで理解するのは難しいかもしれませんが、これからは身近な例を用いて、上記の特性をわかりやすく説明します。

*原子性（Atomicity）*

データベースの原子性というのは、データベースのトランザクションがすべて実行されるか、一つも実行されないかのどちらかになることを保証する特性です。例えば、ショッピングサイトで商品を注文して支払いする際、消費者側の銀行口座からお金が減り、ショッピングサイト側の口座にお金が増えるか、または両方の処理とも行われないのどちらかです。

*一貫性（Consistency）*

データベースの一貫性というのは、データベースのトランザクションが行われる前後、データベースの整合性が取れていることです。例えば、自分の銀行口座から他の口座へ5万円を送金する際、送金のデータが誤って「5千円」になることはありません。

*独立性（Isolation）*

データベースの独立性というのは、データベースのトランザクションはそれぞれ独立しており、お互いに干渉しないことです。例えば、銀行では、毎日多くの入金と出金が行われていますが、銀行のデータベースはそれらの処理を一括に処理するのではなく、処理を１つずつ行うのです。これは、「遅くて効率が悪い」と思われがちですが、処理を1件ずつ分かれることで、データベースの原子性を保つことにもなるため、データベースの重要な特性だと思われます。

*永続性（Durability）*

データベースの永続性というのは、トランザクションが一度完了しましたら、システム障害などの発生にもかかわらず、その結果は永久にデータベースに保存されます。永続性は、完了したトランザクションの結果を永久に保持されることを保証する特性です。

**データベースを参照する際の基礎SQLコマンド**

SQLとは、関係データベースにおいて、データの操作や定義を行うための問い合わせ言語です。JavaやPythonなどのプログラミング言語のように思い、苦手意識を持つ方はいるかもしれませんが、SQLは通常のプログラミング言語に比べれば理解しやすいので、頑張って学習しましょう。

この節では、基本情報技術者試験で出題される、SQLの基礎文法について紹介します。

多くの関係データベースでは、データは表形式（テーブル）で保管されています。関係データベースにおけるテーブルの基本操作には、「選択」、「射影」、「結合」があります。

*選択（Select）*

選択とは、テーブルの中の参照したい行を取り出す操作です。例えば、下記の表から、居住地が「中央区」の行を取り出す際、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3918798/2e8130b6-54f2-91fb-214c-6e0246342f32.png)

以下のようなSQLを作成して実行しますと：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3918798/5bb977c9-51a7-c465-8be2-92e7930ca44b.png)

条件を満たす行を抽出することが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3918798/a2051389-f016-5dda-d748-7138194a5cad.png)

ここで使ったSQL文について説明します。

冒頭の「SELECT」というのは、まさに「選択」という意味を持つコマンドであり、とある表からいくつかまたはすべての列を選択することを意味しています。※ここでは、「選択」（行の選択）について説明するため、選択する列名を「*」にしました。この「*」は、すべての列を意味します。※

FROMとは、「…から」の意味であり、そのあとに入力するのは、参照したいテーブルの名前です。

WHEREの行では、参照したい行の条件を記入します。今回は、「居住地」列の値が「中央区」の行を取り出すことですので、居住地＝ ‘中央区'で表します。WHERE 居住地＝ ‘中央区'というのは、すなわち、「居住地は「中央区」である行のことです。

*射影（Projection）*

射影とは、テーブルの中の参照したい列を取り出す操作です。例えば、下記の表から、「氏名」の列を取り出したい際、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3918798/b261c398-254d-01a0-a464-fadfbc633a0e.png)


以下のようなSQL文を作成して実行します。特定の列を選択する際は、列名をSELECTのあとに入力します。参照したい列は複数ある場合、列名と列名の間は「,」で区切ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3918798/328ad36b-8135-8e05-30ba-187a71e4aec8.png)

したがって、参照したい「氏名」列が抽出されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3918798/288309dd-3c86-c0c6-276a-f1049ce740f4.png)

*結合（Join）*

結合とは、複数のテーブルを１つのテーブルにする操作です。例えば、下記の2つの表を結合する際は、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3918798/2b0ba113-b67e-4d94-e5a5-abe6725d6431.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3918798/22182b06-e678-0ebd-3862-ee654ec9d46d.png)



以下のようなSQL文を作成すれば、2つの表が結合したビュー（View）が作成されて表示されます。上記のテーブル１とテーブル２を結合するには、この2つのテーブルに共通している情報（ここでは、「社員番号」列です）が必要です。そこで、SQLを見れば、「社員個人情報.社員番号」のような表記があります。これは、どのテーブルの社員番号なのかを区別するためのものです。さらに、「FROM 社員個人情報 INNER JOIN 社員座席管理 ON 社員個人情報.社員番号 = 社員座席管理.社員番号」というのは、「社員個人情報」と「社員座席管理」の二つの表を「社員番号」で結びつける（JOIN）ことです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3918798/3a8d5405-4374-9ffd-c59c-f31f7485b157.png)


ここで作成されたビューは、参照したい2つのテーブルから取り出された情報で構成された臨時的なテーブルであり、この操作によって参照元となる2つのテーブルの中身は変わりません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3918798/e595c63d-9add-ec2f-827c-6515f68e8059.png)

また、社員番号は、それぞれ別々のテーブルから取り出されているため、それぞれの先頭に取り出し元のテーブル名が加えられています。

**おわりに**

この文章を通じて、データベースについての理解を深めましたか。

IT初心者の方々にとって、初めて見る単語が多くて少し難しく感じたかもしれませんが、あきらめずに基礎知識を身につけていけば、徐々にデータベース関連の内容の全体像を把握できるはずです。

この文章以外、データベース分野で勉強すべき内容は、「データベースの復旧」および「データベースの正規化」があると思いますが、これからまた機会があれば、また記事を投稿する形で、皆さんと一緒に勉強したいと思います。

それでは、ここまで、お疲れ様でした。