Sql-using-views
SQL-ビューの使用
ビューは、関連する名前でデータベースに保存されるSQLステートメントにすぎません。 ビューは、実際には、事前定義されたSQLクエリの形式のテーブルの構成です。
ビューには、テーブルのすべての行を含めることも、テーブルから行を選択することもできます。 ビューは、記述されたSQLクエリに依存して1つまたは複数のテーブルから作成でき、ビューを作成します。
仮想テーブルの一種であるビューは、ユーザーが次のことを行えるようにします-
- ユーザーまたはユーザーのクラスが自然または直感的に見えるようにデータを構造化します。
- データへのアクセスを制限し、ユーザーが必要なものだけを表示し、(場合によっては)修正できるようにします。
- レポートの生成に使用できるさまざまなテーブルのデータを要約します。
ビューを作成する
データベースビューは、 CREATE VIEW ステートメントを使用して作成されます。 ビューは、単一のテーブル、複数のテーブル、または別のビューから作成できます。
ビューを作成するには、ユーザーは特定の実装に応じて適切なシステム権限を持っている必要があります。
基本的な CREATE VIEW 構文は次のとおりです-
CREATE VIEW view_name AS
SELECT column1, column2.....
FROM table_name
WHERE [condition];
通常のSQL SELECTクエリで使用するのと同様の方法で、SELECTステートメントに複数のテーブルを含めることができます。
例
次のレコードを持つCUSTOMERS表を考慮してください-
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+----------+-----+-----------+----------+
以下は、CUSTOMERSテーブルからビューを作成する例です。 このビューは、CUSTOMERSテーブルの顧客名と年齢を取得するために使用されます。
SQL > CREATE VIEW CUSTOMERS_VIEW AS
SELECT name, age
FROM CUSTOMERS;
これで、実際のテーブルをクエリするのと同様の方法でCUSTOMERS_VIEWをクエリできます。 以下は同じ例です。
SQL > SELECT * FROM CUSTOMERS_VIEW;
これにより、次の結果が生成されます。
+----------+-----+
| name | age |
+----------+-----+
| Ramesh | 32 |
| Khilan | 25 |
| kaushik | 23 |
| Chaitali | 25 |
| Hardik | 27 |
| Komal | 22 |
| Muffy | 24 |
+----------+-----+
WITH CHECKオプション
WITH CHECK OPTIONは、CREATE VIEWステートメントオプションです。 WITH CHECK OPTIONの目的は、すべてのUPDATEおよびINSERTがビュー定義の条件を満たしていることを確認することです。
それらが条件を満たさない場合、UPDATEまたはINSERTはエラーを返します。
次のコードブロックには、WITH CHECK OPTIONを使用して同じビューCUSTOMERS_VIEWを作成する例があります。
CREATE VIEW CUSTOMERS_VIEW AS
SELECT name, age
FROM CUSTOMERS
WHERE age IS NOT NULL
WITH CHECK OPTION;
この場合のWITH CHECK OPTIONは、ビューのAGE列のNULL値のエントリを拒否します。これは、ビューがAGE列にNULL値を持たないデータによって定義されているためです。
ビューを更新する
ビューは、以下に示す特定の条件下で更新することができます-
- SELECT句にキーワードDISTINCTを含めることはできません。
- SELECT句に集計関数を含めることはできません。
- SELECT句に集合関数を含めることはできません。
- SELECT句にセット演算子を含めることはできません。
- SELECT句にORDER BY句を含めることはできません。
- FROM句に複数のテーブルを含めることはできません。
- WHERE句にサブクエリを含めることはできません。
- クエリにGROUP BYまたはHAVINGを含めることはできません。
- 計算列は更新されない場合があります。
- INSERTクエリを機能させるには、ベーステーブルのすべてのNOT NULL列をビューに含める必要があります。
したがって、ビューが上記のすべてのルールを満たしている場合、そのビューを更新できます。 次のコードブロックには、Rameshの年齢を更新する例があります。
SQL > UPDATE CUSTOMERS_VIEW
SET AGE = 35
WHERE name = 'Ramesh';
これにより最終的にベーステーブルCUSTOMERSが更新され、同じことがビュー自体に反映されます。 ここで、ベーステーブルを照会すると、SELECTステートメントは次の結果を生成します。
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 35 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+----------+-----+-----------+----------+
ビューへの行の挿入
データの行をビューに挿入できます。 UPDATEコマンドに適用されるのと同じルールがINSERTコマンドにも適用されます。
ここでは、このビューにすべてのNOT NULL列が含まれていないため、CUSTOMERS_VIEWに行を挿入できません。そうでない場合は、テーブルに挿入するのと同様の方法でビューに行を挿入できます。
ビューへの行の削除
データの行はビューから削除できます。 UPDATEおよびINSERTコマンドに適用される同じルールがDELETEコマンドに適用されます。
以下は、AGE = 22のレコードを削除する例です。
SQL > DELETE FROM CUSTOMERS_VIEW
WHERE age = 22;
これにより、最終的にベーステーブルCUSTOMERSから行が削除され、同じことがビュー自体に反映されます。 ここで、ベーステーブルを照会すると、SELECTステートメントは次の結果を生成します。
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 35 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+----------+-----+-----------+----------+
ビューの削除
明らかに、ビューがある場合、ビューが不要になったらドロップする方法が必要です。 構文は非常に単純であり、以下に示されています-
DROP VIEW view_name;
以下は、CUSTOMERSテーブルからCUSTOMERS_VIEWを削除する例です。
DROP VIEW CUSTOMERS_VIEW;