SQLでビューを定義する際に利用する CREATE VIEW文 について解説します。
CREATE VIEW ビュー名称 AS (SELECT文);

そもそもビューとは何か?という方でも理解できるよう前提となる知識も含め、図解付き・サンプルコード付きでわかりやすく解説します。
データベースエンジニアを目指す方であれば知らないと恥ずかしい超・基本知識です。是非最後までご覧ください。

SQL文の基本ルール(大文字/小文字の区別、コメントの付与など)を始めに学んでおきたい方は以下の記事を先にご覧ください。
前提:ビューとは?
ビュー(View)は1つ以上のテーブルから必要な要素のみを取得して作成される仮想的なテーブルのようなもの。


上記のように1つのテーブルから必要な列だけ(ID列~Math列)を抜き取って仮想的なテーブルのように作成したのがビューの例です。
毎回同じようなSELECT文を書いてレコードを取得するよりも、あらかじめビューとして定義することで開発の効率化が期待できるなどのメリットがあります。
ビューの定義を行う際に利用するのが今回の主題CREATE VIEW文です。

もう少し詳しくビューとは何か?を理解しておきたい!という方は以下の記事をご覧ください。
CREATE VIEW:構文ルール
CREATE VIEW文 の構文ルールは以下の通り。
CREATE VIEW ビュー名称 AS (SELECT文);
CREATE VIEW に続いてビュー名称を指定し、AS句に続いてSELECT文を記述します。

ポイントはビューはあくまでも1つのSELECT文を保存しているというのがポイントです。
どういうことが理解できるようにテーブル「PointList」をもとに実際にビュー「MathPointList」を作成するSQL文を見ていきましょう。

MathPointListというビューを作成したいので、CREATE VIEWに続けて「MathPointList」を記述。AS句にはSELECT文を記述します。
-- ビューの定義 CREATE VIEW MathPointList AS SELECT ID, Name, Class, Math FROM PointList; -- ビューに対するSELECT SELECT * FROM MathPointList; /* SELECT文の結果 +----+------+-------+------+ | ID | Name | Class | Math | +----+------+-------+------+ | 1 | 佐藤 | A | 100 | | 2 | 鈴木 | A | 70 | | 3 | 高橋 | A | 70 | | 4 | 中村 | A | 65 | | 5 | 小林 | B | 90 | | 6 | 山口 | B | 85 | | 7 | 田中 | B | 90 | | 8 | 伊藤 | B | 90 | +----+------+-------+------+ */
ご覧のように、PointListからID列,Name列,Class列,Math列のみを抽出するビューを作成することができました。
CREATE VIEW文の構文自体は非常に簡単です。初心者の方がCREATE VIEWに対して苦手意識を持ってしまうのは、結局はAS句に記述するSELECT文がしっかり理解できていない場合が多いのです。

SELECT文の基本ルールを復習しておきたい方は以下の記事からご覧ください。
CREATE VIEW:ビューのカラム名を指定する
ビューのカラム名称は作成元のテーブルのカラム名称がそのままの形で引き継がれます。ですが、あえて分かりやすくするために、ビュー独自にカラム名を指定することも可能です。


構文ルール自体は簡単で、ビュー名称の後に( )でカラム名を指定するだけ。
CREATE VIEW ビュー名称 (カラム名1,カラム名2,カラム名3,・・・・) AS (SELECT文);
実際にビューのカラム名を指定してビュー定義を行うサンプルコードがこちら。
-- ビュー定義 CREATE VIEW MathPointList (ID,Name,Class,数学) AS SELECT ID, Name, Class, Math FROM PointList; -- ビューの確認 SELECT * FROM MathPointList; +----+------+-------+------+ | ID | Name | Class | 数学 |←ビュー定義上Math列は「数学」列として定義されている +----+------+-------+------+ | 1 | 佐藤 | A | 100 | | 2 | 鈴木 | A | 70 | | 3 | 高橋 | A | 70 | | 4 | 中村 | A | 65 | | 5 | 小林 | B | 90 | | 6 | 山口 | B | 85 | | 7 | 田中 | B | 90 | | 8 | 伊藤 | B | 90 | +----+------+-------+------+

作成するビューの構造が複雑になればなるほどカラム名をあえて変更する場面も増えていきます。
2つ以上のテーブルからビューを作成する場合
CREATE VIEW文の基本をより深く理解できるように2つ以上のテーブルをもとにビューを作成する例を見ていきましょう。

まずは、以下のような2つのテーブルを用意します。PointListテーブルには主要3教科の点数が、SubPointListテーブルには他2教科の点数が格納されています。

※それぞれのテーブル定義(CREATE TABLE文)は以下の通りです。参考までに記載しておきます。
CREATE TABLE PointList ( ID INT(3), Name VARCHAR(50), Class VARCHAR(1), Japanese INT(3), Math INT(3), English INT(3) ); /* 出来上がったテーブルがこちら +----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+-------+ | ID | int(3) | YES | | NULL | | | Name | varchar(50) | YES | | NULL | | | Class | varchar(1) | YES | | NULL | | | Japanese | int(3) | YES | | NULL | | | Math | int(3) | YES | | NULL | | | English | int(3) | YES | | NULL | | +----------+-------------+------+-----+---------+-------+ */ CREATE TABLE SubPointList ( ID INT(3), Name VARCHAR(50), Class VARCHAR(1), Science INT(3), SocialStudies INT(3) ); /* +---------------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------------+-------------+------+-----+---------+-------+ | ID | int(3) | YES | | NULL | | | Name | varchar(50) | YES | | NULL | | | Class | varchar(1) | YES | | NULL | | | Science | int(3) | YES | | NULL | | | SocialStudies | int(3) | YES | | NULL | | +---------------+-------------+------+-----+---------+-------+ */
今回は2つのテーブルをもとに「ALLPointList」というビューを定義してみます。

2つ以上のテーブルをもとにビューを作成するといっても、基本はAS句にそれを実現するSELECT文を記述するというだけ。今回はLEFT OUTER JOINを利用して2つのテーブルを結合していきます。

出来上がるCREATE VIEW文は以下の通りです。
-- ビューの定義 CREATE VIEW ALLPointList AS SELECT PointList.*,SubPointList.Science,SubPointList.SocialStudies FROM PointList LEFT OUTER JOIN SubPointList ON PointList.ID = SubPointList.ID; /* 定義されたビューの構成 +---------------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------------+-------------+------+-----+---------+-------+ | ID | int(3) | NO | | NULL | | | Name | varchar(50) | NO | | NULL | | | Class | varchar(1) | YES | | NULL | | | Japanese | int(3) | YES | | 0 | | | Math | int(3) | YES | | 0 | | | English | int(3) | YES | | 0 | | | Science | int(3) | YES | | NULL | | | SocialStudies | int(3) | YES | | NULL | | +---------------+-------------+------+-----+---------+-------+ */ -- ビューに対するSELECT文 SELECT * FROM ALLPointList; /* 結果 +----+------+-------+----------+------+---------+---------+---------------+ | ID | Name | Class | Japanese | Math | English | Science | SocialStudies | +----+------+-------+----------+------+---------+---------+---------------+ | 1 | 佐藤 | A | 100 | 100 | 85 | 90 | 75 | | 2 | 鈴木 | A | 90 | 70 | 70 | 90 | 70 | | 3 | 高橋 | A | 85 | 70 | 65 | 85 | 70 | | 4 | 中村 | A | 90 | 65 | 85 | 40 | 0 | | 5 | 小林 | B | 70 | 90 | 65 | NULL | 90 | | 6 | 山口 | B | 90 | 85 | 85 | NULL | 85 | | 7 | 田中 | B | 70 | 90 | 65 | NULL | 90 | | 8 | 伊藤 | B | 70 | 90 | NULL | 70 | 90 | +----+------+-------+----------+------+---------+---------+---------------+ */

ご覧のように、CREATE VIEW文自体は非常に簡単な構文ルールです。
ですが、通常ビュー定義をする際はAS句に記述するSELECT文が複雑になってくるため、初心者のうちは苦手意識を持ってしまいがち。
再度、CREATE VIEW文の構文ルールを掲載しておきます。
CREATE VIEW ビュー名称 AS (SELECT文);
システムエンジニアを目指したい方は
システムエンジニアを目指す方や、IT知識を1から身につけたい方は以下のページをご覧ください。
正直どこから学び始めればよいかわからない。どのように勉強していけば、エンジニアとしてのスキルが磨けるか?が分からない・・・という方は必見です。

システムエンジニア向けに「できるエンジニア」になる方法を1から解説しておりますので、是非ご覧ください。