テーブルの結合とビュー

テーブルの結合

社員の情報を部署名を含めて表示する。そのためには社員テーブル(emp)の他、部署テーブル(dep)も必要となる。

  1. SELECT文で複数テーブルを指定。

    oddtbs=> select * from dep, emp;
     code |  name  |  code  | depcode |   name   | gender
    ------+--------+--------+---------+----------+--------
     1001 | 総務部 | 564001 |    1002 | 鈴木義男 |      1
     1001 | 総務部 | 564002 |    1003 | 斎藤洋子 |      2
     1001 | 総務部 | 564003 |    1001 | 山田美樹 |      2
     1001 | 総務部 | 564004 |    1002 | 田中秀明 |      1
     1002 | 営業部 | 564001 |    1002 | 鈴木義男 |      1
     1002 | 営業部 | 564002 |    1003 | 斎藤洋子 |      2
     1002 | 営業部 | 564003 |    1001 | 山田美樹 |      2
     1002 | 営業部 | 564004 |    1002 | 田中秀明 |      1
     1003 | 開発部 | 564001 |    1002 | 鈴木義男 |      1
     1003 | 開発部 | 564002 |    1003 | 斎藤洋子 |      2
     1003 | 開発部 | 564003 |    1001 | 山田美樹 |      2
     1003 | 開発部 | 564004 |    1002 | 田中秀明 |      1
    (12 rows)
    

    depとempの全ての行が組み合わされるため、12行も出力されている。

  2. 条件を指定。

    oddtbs=> select * from dep, emp where dep.code = emp.depcode;
     code |  name  |  code  | depcode |   name   | gender
    ------+--------+--------+---------+----------+--------
     1002 | 営業部 | 564001 |    1002 | 鈴木義男 |      1
     1003 | 開発部 | 564002 |    1003 | 斎藤洋子 |      2
     1001 | 総務部 | 564003 |    1001 | 山田美樹 |      2
     1002 | 営業部 | 564004 |    1002 | 田中秀明 |      1
    (4 rows)
    

    depテーブルのcode列とempテーブルのdepcode列の値が同じである組み合わせのみが選択されている。

  3. テーブルの別名(相関名)を使用。

    SELECT ... FROM テーブル名 別名, ...;
    または
    SELECT ... FROM テーブル名 AS 別名, ...;
    
    oddtbs=> select * from dep d, emp e where d.code = e.depcode;
    ...
    oddtbs=> select * from dep as d, emp as e where d.code = e.depcode;
    ...
    

    結果は前回と同様。

  4. 列の選択

    次のSQLをファイルとして作成。(join051.sql)
    
    
    oddtbs=> \i join051.sql
      code  |   name   | depcode |  name  | gender
    --------+----------+---------+--------+--------
     564001 | 鈴木義男 |    1002 | 営業部 |      1
     564002 | 斎藤洋子 |    1003 | 開発部 |      2
     564003 | 山田美樹 |    1001 | 総務部 |      2
     564004 | 田中秀明 |    1002 | 営業部 |      1
    (4 rows)
    

    empテーブルのcode列は出力されていない。が、出力列名でnameが重複してしまっている。

  5. 列の別名

    次のSQLをファイルとして作成。(join052.sql)
    
    
    oddtbs=> \i join052.sql
     empcode | empname  | depcode | depname | gender
    ---------+----------+---------+---------+--------
      564001 | 鈴木義男 |    1002 | 営業部  |      1
      564002 | 斎藤洋子 |    1003 | 開発部  |      2
      564003 | 山田美樹 |    1001 | 総務部  |      2
      564004 | 田中秀明 |    1002 | 営業部  |      1
    (4 rows)
    

    出力結果の列名の重複が解消された。

VIEW

SELECT文自体に名前をつけて定義することができ、これをビュー(VIEW)という。先ほどのSELECT文をVIEWとして定義する。

CREATE VIEW ビュー名 AS SELECT文;
  1. 次のSQLをファイルとして作成。(emp_view051.sql)

    
    
  2. ログイン画面から実行。

    oddtbs=> \i emp_view051.sql
    ...
    oddtbs=> select * from emp_v;
     empcode | empname  | depcode | depname | gender
    ---------+----------+---------+---------+--------
      564001 | 鈴木義男 |    1002 | 営業部  |      1
      564002 | 斎藤洋子 |    1003 | 開発部  |      2
      564003 | 山田美樹 |    1001 | 総務部  |      2
      564004 | 田中秀明 |    1002 | 営業部  |      1
    (4 rows)