新人研修用（DB編）

#目的
新人さん向け。
実際にDBに触れつつ、データを扱う上での注意点を体感してもらうためのテキストです。

#前提知識
リレーショナルデータベースの初歩的な研修を受けたことがあること。
簡単なSQLは知っていること。select, insert, update, deleteくらいは使ったことあるよね？

# DBの種類
DBは皆さんが研修で触ったであろうリレーショナルデータベースだけではありません。
世の中にはいろんなサービスや業務があり、適切なデータ管理の方法は様々です。
まずは世の中広い、ということを知りましょう。
 
[NoSQLとは？リレーショナルデータベース（RDB）との違いを徹底比較]
(https://blog.codecamp.jp/what-is-nosql)
 - RDBとNoSQLの違いや要請の背景が簡潔にまとめられています。

[リレーショナルデータベースはオワコン？ Postgres作者 が語るデータベースの未来]
(http://blog.nnasaki.com/entry/2015/05/01/141914)
 - RDB業界の発展に大きな影響を与えたMichael Stonebraker氏が語るデータベース市場の変革。
 [ソース記事はこちら](http://www.zdnet.com/article/the-elephants-dilemma-what-does-the-future-of-databases-really-look-like/)

[NoSQLの特性を調べよう！]
(http://grandbig.github.io/blog/2016/10/09/nosql/)
 - 結局NoSQL DBは何に使えるのさ？に答えてくれる。

[DBエンジンランキング]
(https://db-engines.com/en/ranking/document+store)
DB人気度ランキング。今主流のDBが一目瞭然。Encyclopediaに簡単な各DBの説明あり。

補足読みもの
[データベース入門]
(https://www.slideshare.net/takukobayashi560/ss-76804739?qid=bd00ccc6-4d61-4333-8dd4-0c0c26dd3206&v=&b=&from_search=5) <初心者向け>
[NoSQLについて勉強する。]
(http://qiita.com/t_nakayama0714/items/0ff7644666f0122cfba1)
[ビッグデータ処理データベースの全体像と使い分け]
(https://www.slideshare.net/recruitcojp/ss-64189311)
[RDB技術者のためのNoSQLガイド　NoSQLの必要性と位置づけ]
(https://www.slideshare.net/recruitcojp/rdbnosqlnosql)

#DBに触ってみよう。

##初期導入

まずはDBを作りましょう。今回はOSSのPostgreSQLを使います。
下記リンクからダウンロードしてインストールしましょう。

環境情報
OS:Windows 7 / 8 / Server 2012
DB: PostgreSQL 9.6.5


[Download PostgreSQL]
(https://www.enterprisedb.com/downloads/postgres-postgresql-downloads#windows)
[インストール手順参考](https://lets.postgresql.jp/documents/tutorial/windows/1)

初期設定のconfファイルは以下2箇所を修正しましょう。 
 C:\Program Files\PostgreSQL\9.6\data\postgresql.conf

```postgresql.conf
listen_addresses = 'localhost'
client_encoding = sjis
```

コメントにchange requires restartと記載されているパラメータはサービスの再起動が必要です。
コマンドプロンプトを立ち上げて、サービスの停止、と開始コマンドを実行します。
もし、コマンド実行できなかった場合はコントロールパネル＞管理ツール＞サービスから再起動しましょう。

```
>net stop postgresql-x64-9.6

The postgresql-x64-9.6 service is stopping.
The postgresql-x64-9.6 service was stopped successfully.


>net start postgresql-x64-9.6

The postgresql-x64-9.6 service is starting.
The postgresql-x64-9.6 service was started successfully.
```

システム環境変数のパス設定追加します。[参考](http://www.projectgroup.info/documents/PostgreSQL/POS_000004.html)
PATHを通すことで、コマンドプロンプトでpsqlと打つだけでコマンドが使えるようになります。

##基本的なコマンド
[PostgreSQLコマンドチートシート](http://qiita.com/Shitimi_613/items/bcd6a7f4134e6a8f0621)
[PostgreSQL 9.6.3 付属ドキュメント](https://www.postgresql.jp/document/9.6/html/)
[psqlリファレンス](https://www.postgresql.jp/document/9.6/html/app-psql.html)

##データベース接続確認

早速DBに接続してみましょう。
postgrgesはデフォルトで作成されるDBユーザです。パスワードはインストール時に設定したパスワードです。

```
>psql -U postgres

Password for user postgres:
psql (9.6.5)
Type "help" for help.

postgres=#
postgres=#
```

↓は英語環境で試したら文字コードが違うと怒られました。
そんなときは、chcpコマンドでプロンプトで使用するコードを変更します。

```
>psql -U postgres

Password for user postgres:
psql (9.6.5)
WARNING: Console code page (437) differs from Windows code page (1252)
         8-bit characters might not work correctly. See psql reference
         page "Notes for Windows users" for details.
Type "help" for help.

postgres=# \q

>cmd.exe /c chcp 1252
Active code page: 1252

>psql -U postgres
Password for user postgres:
psql (9.6.5)
Type "help" for help.
```


データベースの一覧を確認します。tempとデフォルトデータベースが確認できるはずです。

```
postgres=# \l

                             List of databases

   Name    |  Owner   | Encoding | Collate | Ctype |   Access privileges
-----------+----------+----------+---------+-------+-----------------------
 postgres  | postgres | UTF8     | C       | C     |
 template0 | postgres | UTF8     | C       | C     | =c/postgres          +
           |          |          |         |       | postgres=CTc/postgres
 template1 | postgres | UTF8     | C       | C     | =c/postgres          +
           |          |          |         |       | postgres=CTc/postgres

```

試しにテーブルを作成してみます。

```
postgres=# create table test( id char(1));
CREATE TABLE

postgres=# \d
        List of relations
 Schema | Name | Type  |  Owner
--------+------+-------+----------
 public | test | table | postgres
(1 row)

postgres=# \d test
        Table "public.test"
 Column |     Type     | Modifiers
--------+--------------+-----------
 id     | character(1) |
```

public はデフォルトスキーマです。
\dでテーブル一覧が取得できます。テーブル名をつけるとそのテーブルのレイアウトが確認できます。

補足1：
スキーマ、データベース、インスタンスの概念やそれらとユーザやデータベースファイルとの関係はDB製品によって微妙に異なるので初めて触る製品の場合はよく確認しましょう。
[PostgreSQLとOracle Databaseそれぞれの特徴](https://thinkit.co.jp/article/1063/1?page=0%2C1)
[PostgreSQLのアーキテクチャ](https://thinkit.co.jp/article/1038/1?page=0%2C1)

補足2：
物理的なデータベースファイルの保管場所は C:\Program Files\PostgreSQL\9.6\data\base です。[参考](https://www.postgresql.jp/document/8.0/html/storage.html)
対応するフォルダやファイルは以下のようにして確認できます。[参考](https://gist.github.com/Epictetus/3386858)
データを1件Insertすると、テーブルファイルのサイズが増え、dropするとサイズが0に戻ることを確認しましょう。

```
postgres=#  SELECT datid, datname FROM pg_stat_database;
 datid |  datname
-------+-----------
 12401 | postgres
     1 | template1
 12400 | template0
(3 rows)


postgres=# SELECT relid, relname FROM pg_stat_all_tables where relname = 'test';
 relid | relname
-------+---------
 16393 | test
(1 row)


postgres=# \! dir "C:\Program Files\PostgreSQL\9.6\data\base\12401\16393*"

 Directory of C:\Program Files\PostgreSQL\9.6\data\base\12401

09/09/2017  11:11 AM                 0 16393
               1 File(s)              0 bytes
               0 Dir(s)   1,733,013,504 bytes free


postgres=# insert into test values ('1');
INSERT 0 1
postgres=# commit;
WARNING:  there is no transaction in progress
COMMIT


postgres=# \! dir "C:\Program Files\PostgreSQL\9.6\data\base\12401\16393*"

 Directory of C:\Program Files\PostgreSQL\9.6\data\base\12401

09/09/2017  11:35 AM             8,192 16393
               1 File(s)          8,192 bytes
               0 Dir(s)   1,732,902,912 bytes free

postgres=# drop table test;
DROP TABLE
postgres=# commit;
WARNING:  there is no transaction in progress
COMMIT

postgres=# \! dir "C:\Program Files\PostgreSQL\9.6\data\base\12401\16393*"

 Directory of C:\Program Files\PostgreSQL\9.6\data\base\12401

09/09/2017  11:52 AM                 0 16393
               1 File(s)              0 bytes
               0 Dir(s)   1,732,911,104 bytes free
```

#問題

以下のcsvファイルをPostgreSQLデータベースに取り込み、次の問いに答えよ。
[全産業活動指数 原指数 月次(csv)](http://www.data.go.jp/data/dataset/meti_20140901_1053/resource/aeef28fa-8973-4567-b0d6-fdb381ab1bef)

ただし、相関係数はPostgerSQL上で計算すること。
それ以外の途中過程は自由です。創意工夫してください。

Q1：2003年1月～2015年6月までの全期間で鉱工業生産指数と最も高い相関を示す産業生産指数は何か。

Q2：年度別に産業間の相関を調べた場合、2004年度～2014年度までの10年間で鉱工業生産指数と最も高い相関を示す、年度と産業生産指数は何か。