SQLのview作成についてまとめています。
SQLのview作成は、create view
create view文で、指定したselect文の結果を仮想的なテーブル(view)として設定できます。作成済みのviewはテーブルと同等に扱いが可能です。ただし、読み取り専用となります。
mysql> create view emp_view1 as select emp_no, first_name, last_name from employees; Query OK, 0 rows affected (0.01 sec) mysql> select * from emp_view1 limit 10; +--------+------------+-----------+ | emp_no | first_name | last_name | +--------+------------+-----------+ | 10001 | Georgi | Facello | | 10002 | Bezalel | Simmel | | 10003 | Parto | Bamford | | 10004 | Chirstian | Koblick | | 10005 | Kyoichi | Maliniak | | 10006 | Anneke | Preusig | | 10007 | Tzvetan | Zielinski | | 10008 | Saniya | Kalloufi | | 10009 | Sumant | Peac | | 10010 | Duangkaew | Piveteau | +--------+------------+-----------+ 10 rows in set (0.00 sec)
元となるテーブルが存在しない場合でも、viewの作成は可能です。以下の例は、カラム名hello、値Hello Worldが格納されたviewを作成しています。
drop viewで、格納されたデータごとviewを削除することが可能です。
mysql> CREATE VIEW vista AS SELECT 'Hello World' as hello; Query OK, 0 rows affected (0.00 sec) mysql> select * from vista; +-------------+ | hello | +-------------+ | Hello World | +-------------+ 1 row in set (0.00 sec) mysql> drop view vista; Query OK, 0 rows affected (0.02 sec) mysql> select * from vista; ERROR 1146 (42S02): Table 'employees.vista' doesn't exist mysql>
viewには複数条件を指定したjoinを使ったselect文など、複雑なSQLを指定可能です。
create view jointest as SELECT employees.emp_no, first_name, last_name, dept_name FROM employees left join dept_emp on employees.emp_no = dept_emp.emp_no and first_name like 'G%' left join departments on dept_emp.dept_no = departments.dept_no Query OK, 0 rows affected (0.04 sec) mysql> select * from jointest limit 10; +--------+------------+-----------+-------------+ | emp_no | first_name | last_name | dept_name | +--------+------------+-----------+-------------+ | 10001 | Georgi | Facello | Development | | 10002 | Bezalel | Simmel | NULL | | 10003 | Parto | Bamford | NULL | | 10004 | Chirstian | Koblick | NULL | | 10005 | Kyoichi | Maliniak | NULL | | 10006 | Anneke | Preusig | NULL | | 10007 | Tzvetan | Zielinski | NULL | | 10008 | Saniya | Kalloufi | NULL | | 10009 | Sumant | Peac | NULL | | 10010 | Duangkaew | Piveteau | NULL | +--------+------------+-----------+-------------+ 10 rows in set (0.00 sec)
【関連記事】
▶SQLのONは、JOINの条件を記述 複数条件はANDやORで接続する
以下のように、サブクエリとunionを使って結果を連結したselect文も、viewとして作成可能です。
create view subquerytest as select * from (select emp_no, first_name, last_name, hire_date from employees where birth_date > 1970-01-01 and gender = 'F' union all select emp_no, first_name, last_name, hire_date from employees where birth_date < 1960-01-01 and gender = 'M' ) t1 order by last_name, emp_no mysql> select * from subquerytest limit 10; +--------+------------+-----------+------------+ | emp_no | first_name | last_name | hire_date | +--------+------------+-----------+------------+ | 12516 | Sreenivas | Aamodt | 1990-03-06 | | 12982 | Sachem | Aamodt | 1992-01-11 | | 17400 | Basim | Aamodt | 1991-09-15 | | 18182 | Dekang | Aamodt | 1988-05-25 | | 27188 | Vasilii | Aamodt | 1996-10-12 | | 27413 | Phuoc | Aamodt | 1987-08-28 | | 28387 | Nahla | Aamodt | 1997-02-15 | | 29182 | Arumugam | Aamodt | 1986-01-09 | | 31701 | Carrsten | Aamodt | 1985-10-07 | | 35101 | Christ | Aamodt | 1990-02-05 | +--------+------------+-----------+------------+
【関連記事】
▶SQLのorder byで複数条件を指定する union allとサブクエリで複雑な条件にも対応
PostgreSQLでは、再帰的(Recursive)ビューが設定可能
PostgreSQLでは、リカーシブ指定で再帰的な構造のビューを設定可能です。
postgres=# CREATE RECURSIVE VIEW nums_1_100 (n) AS VALUES (1) UNION ALL SELECT n+1 FROM nums_1_100 WHERE n < 100; CREATE VIEW postgres=# select * from nums_1_100; n ----- 1 2 3 4 5 6 7 8 9 10 11 12 : : 100 (100 rows)
PostgreSQLのviewは、recursive指定やtemporary指定など、他のデータベース管理ソフトに比べると、比べると拡張された部分があるようです。
まとめ
- viewはselect文の結果を仮想的なテーブルとして作成できる
- joinやサブクエリを使った複雑なSQL、テーブル実体のないviewも設定可能
- PostgreSQLでは、recursive(再帰)やtemporary(一時的)viewの設定が可能