Vagrant – 環境構築(旧)

概要

以降はVagrant導入後最初にインストールしたBoxの導入記録。

Vagrant CloudのCentos/7を選び、共有フォルダ-設定を試みたところ、なかなかうまく共有できなかった。

このBoxのリリースがv2004.01と結構古かったので、その後bento/Centos-7.7に変更し、比較的スムーズにフォルダー共有ができた。

Boxの導入

Boxのインストール

仮想環境のBoxをインストール。今回はVagrant Cloudから提供されているCentosOS/7を選んだ。

  • Vagrantからのインストールの場合は以下のコマンド。
    • >vagrant box add centos/7
  • 他のサイトからの場合、名前を指定してインストールする場合は以下のコマンド。
    • >vagrant box add name url/local_file

今回はVirtualBoxの仮想環境なので3を選択。以下の処理に10分オーダーの時間がかかる。

インストールされたBoxの存在確認。

この時点でSSDの容量は141 /237GB free。

仮想環境のVagrant設定

ドライブ直下にVagrantディレクトリー、その下にCentOS7のディレクトリーを作成し、そこに移動。

移動後のディレクトリー内で初期設定。ここでこのディレクトリー内にvagrantfileが作成されて、仮想環境が利用可能になる。

この時点でSSD 141/237GB freeとなり、6~7GBを使っている。

仮想環境の利用

仮想環境の起動

vagrant upコマンドで仮想環境を起動。

仮想環境へのログイン

現バージョンでは、Windowsでもvagrant sshで接続できた。

バージョンを確認。

実行中の仮想環境の確認

仮想マシンを立ち上げたコンソールとは別のコンソールを立ち上げ、vagrant statusで確認。

仮想環境からのログアウト

CentOSのexitコマンドでログアウト。

仮想環境の停止

Windowsプロンプトでvagran haltコマンドを実行して停止。

仮想環境停止の確認

停止後のWindows環境でvagrant statusを実行すると仮想環境の停止を確認できる。

 

MySQL – 日付・時刻のフォーマット

概要

日付、時刻のフォーマットにはDATE_FORMAT()、TIME_FORMAT()を使う。

DATE_FORMAT(date, format);

TIME_FORMAT(time, format);

datetimeにはDATETIME型の値を入れてもよい。

書式の雛形

以下のデータで日付・時刻の書式を確認する。

日付

日付4or2桁でゼロ埋め %Y %m %d
日付ゼロ埋めなし %y %c %e
月名(短縮/全部) %b / %M
曜日名(番号/短縮/全部) %w / %a / %W

※曜日番号は日曜~土曜が0~6

時刻

24時間制の時刻(ゼロ埋め) %H
24時間制の時刻(ゼロ埋めなし) %k
12時間制の時刻 %h
分(ゼロ埋め) %i
秒(ゼロ埋め) %s
AM/PM %p

※12時間制の時刻は0時/12時の扱いに一貫性がない。

 

Vagrant -vagrantfile

初期状態

VagrantとvirtualBoxのCentOS7をインストールして初期実行後のvagrantfileの内容。ファイルはCentOS7の環境構築で指定したディレクトリー下にある。

実質的な内容は以下のとおり。

 

Vagrant – メモリーとディスクの容量設定

準備

vagrantfile中、virtualBox設定の部分をコメントアウトし有効にする。

メモリーの設定

メモリーの割り当て容量設定は、vagrantfileに1行書くか、コメントアウトされている以下の行のコメントを外して容量を書き換えるとよい。

数値はMB単位のメモリー割当量で、上記は1024MB = 1GBを意味している。

ディスク容量の設定

仮想マシンのディスクに割り当てる容量を設定・変更する場合、プラグインをインストールした上でvagrantfileに1行追加する。

プラグインのインストール

ホスト側でvagrant-disksizeプラグインをインストールする。

vagrantfileへの追加

以下の1行をvagrantfileに追加する(***に割り当てる容量をGB単位で指定)。

config.disksize.size = "***GB"

設定の反映

メモリー/ディスクの設定をvagrantfileに書いた後、vagrantを起動/再起動する。

メモリーとディスクの容量のみ設定したvagrantfileの有効部分は以下のようになる。

メモリー容量の確認

ディスク容量の確認

 

MySQL – DISTINCTによる重複の排除

概要

DISTINCTはフィールドの重複を除いた結果を返す。

確認に使用するデータ

以下のデータを使う。日時ごとのパスタのメニューの注文票で、パスタはソースと麺の種類の組み合わせ。

フィールドの重複を除いた抽出

まずソース、麺それぞれのフィールドから重複を除いた結果を抽出。ソースの種類、麺の種類は3種類のため、それぞれ3つのレコードが返される。

日付による集計

日付単位の表示

DATETIMEで登録されているフィールドを日付のみの表現に変更する。その結果、同じ日付で複数のソースと麺の組み合わせのレコードになる。

日付ごとのユニークデータの数

単一のフィールド

単一フィールド中のユニークなデータの数は以下のようにしてカウントする。

COUNT(DISTINCT col)

以下は、日付ごとにグルーピングし、各日付で重複を除いたソースの数をカウントしている。2/2はクリームとトマトの2種類だけというのが反映されている。

また、日付ごとの麺の種類の数もカウントしてみる。2/2がスパゲッティーとリングイネの2種類になっている。

複数フィールド

複数フィールドの組み合わせがユニークなものの数のカウントは以下のようにする。

COUNT(DISTINCT CONCAT(col1, col2, ...))

以下の例では、ソースとパスタの組み合わせがユニークなものの数を日付ごとに集計する。2/2はトマトスパゲッティーが2回、2/3はオイルスパゲッティーがあり、重複を除いてカウントしている。

 

MySQL – グループごとの最大値のレコード

概要

インラインビューグルーピングを使って、レコード中のある列の値が最大値/最小値となるレコードをグループごとに抽出できる。

以下、実行例に沿ってその方法を整理する。

実行例

以下のデータを使う。

ここでは各科目ごとの最高点をとった学生と教科を抽出する。

手順

グループごとの最大値

科目によってグルーピングし、各科目の最高得点を得る。

インラインビューによる最高得点列の追加

インラインビューに別名を定義し、元のテーブルと併記することで、全レコードに新たな最高スコアの列が追加される。

最高得点のレコードの追加

各学生・科目のレコードのうち、スコアが最高スコアに等しいレコードを抽出する。

 

MySQL – シェアの計算

概要

インラインビューを使って、各レコードのある列の値のシェアを計算できる。

以下、実行例に沿ってその方法を整理する。

実行例

以下のデータを使う。

ここでは各成分の量quantityのシェアを計算する。

手順

合計値の計算

合計値はSUM()関数で計算。

インラインビューによる合計列の追加

インラインビューに別名を定義し、元のテーブルと併記することで、全レコードに新たな合計値の列が追加される。

各レコードのシェアの計算

各レコードのquantityを合計値で割ってシェアを計算する。

 

MySQL – 最小値・最大値のレコードの抽出

概要

インラインビューを使って、レコード中のある列が最大値/最小値となるレコードを抽出できる。

以下、実行例に沿ってその方法を整理する。

実行例

以下のデータを使う。

ここでは、全学生・全教科のうち、最低得点とその得点を取った学生と科目を表示させる。

手順

最低得点の取得

まず、全体の最低得点は以下で得られる。

インラインビューによる最低得点列の追加

インラインビューに別名を定義し、元のテーブルと併記することで、全レコードに新たな最低スコアの列が追加される。

最低得点レコードの抽出

各学生のレコードのうち、スコアが最低スコアに等しいレコードを抽出する。

 

MySQL – インラインビュー

確認用データ

以下のデータを使う。

基本形

FROM句の中にSELECTクエリーを書いてエイリアスをつけると、それがテーブルとして参照される。

インラインビューにはエイリアスを付けないとエラーになる。

テーブルとインラインビューの併記

エイリアスによる修飾

テーブルとインラインビューを並べて使える。不明確さをなくすために、テーブル名またはエイリアスで列名を修飾する。

列名のエイリアス

インラインビューの列名にエイリアスを定義してもよい。

集約関数の利用

インラインビューで集約関数を使うと威力を発揮。以下の例では、全レコード中の最高得点と最低得点を各レコードに付加している。

このようにすると、最高得点や最低得点のレコードを抽出することができる。

 

MySQL – グループ化と集約~GROUP BY

概要

グループ化はGROUP BY文でグループ化する列を指定する。ほとんどの場合、以下のように集約関数を適用する。

SELECT FUNC(col) FROM table GROUP BY col;

上記の分では、table中の列colによってグループ化し、そのグループごとに集約関数FUNC()を適用した結果を返す。

実行例

以下のデータを使う。学生ごとの履修科目と得点のデータのイメージ。

COUNTの例

以下の例では、学生でグルーピングして科目数をカウントしている。これにより、各学生の履修科目数が得られる。

以下の例では、科目でグルーピングして科目数をカウントしている。これにより、各科目の被履修数が得られる。

MIN/MAXの例

以下の例では、科目でグルーピングして点数の最小値と最大値を表示させている。

SELECTsubjectも表示させている。上記の例ではsubjectでグルーピングしているので適切に表示されるが、subjectの値に使われるレコードは不定なので不適切に使うと以下のようになる。

SUM/AVGの例

以下の例では、学生ごとの合計点数と教科ごとの平均点数をグルーピングにより計算している。

HAVING

各科目が履修された数は以下のようだった。

ここで、履修数が2よりも多い科目だけを抽出したいとする。

WHERE句でできそうだがエラーになる。

集約結果によって抽出したい場合は、HAVING句を使う。

WHERE句との組み合わせの例。scoreが80以上の履修数を科目ごとにカウント。

さらに、scoreが80以上の数が1より大きい科目のみHAVING句で取り出す。