技術とか戦略とか

証券レガシーシステムを8年間いじった普通のSEによるブログ。技術のみではなく趣味の戦略考察についても。PCから見た方が色々見やすいと思います。

情報処理技術者試験対策「select文の結果の結合等(集合演算子)」

今回は、select文の結果を結合する文法の紹介です。
結果を結合するためには、集合演算子のUNION(重複排除したい場合はUNION ALL)を用います。
実務では複数のselect文の結果を1回のSQL文発行で取得したいことが結構あるので、知っておくと便利です。
情報処理技術者試験でも出題されることがあります。
 
ついでに、UNIONやUNION ALL以外の集合演算子についても紹介します。
 
【文法】
select文
集合演算子
select文
[集合演算子 select文…]
[order by…]
 
※集合演算子には以下のようなものがある
・UNION
 前後のselect文の結果を結合する。
 重複する結果は1行にまとめられる。
・UNION ALL
 前後のselect文の結果を結合する。
 重複する結果はまとめられない。
・MINUS、EXCEPT
 前のselect文の結果から後のselect文の結果を取り除く。
 OracleはMINUS、それ以外はEXCEPTを用いる。
 (MySQLではサポート外)
・INTERSECT
 前のselect文の結果と後のselect文の結果で一致するものだけを抽出する。
 (MySQLではサポート外)
 
※「order by」は個別のselect文にはかからず、集合演算子で結合した結果全体にかかる。

 

【対象テーブル例】
・A支店商品
  +--------+--------+
  | 商品ID | 商品名 |
  +--------+--------+
  | 1      | 商品1 |
  | 2      | 商品2 |
  | 3      | 商品3 |
  +--------+--------+
 
・B支店商品
  +--------+--------+
  | 商品ID | 商品名 |
  +--------+--------+
  | 3      | 商品3 |
  | 4      | 商品4 |
  | 5      | 商品5 |
  +--------+--------+
 
【使用例】
・UNION
select * from A支店商品
union
select * from B支店商品
order by 商品ID;

  +--------+--------+
  | 商品ID | 商品名 |
  +--------+--------+
  | 1      | 商品1 |
  | 2      | 商品2 |
  | 3      | 商品3 |
  | 4      | 商品4 |
  | 5      | 商品5 |
  +--------+--------+
 
・UNION ALL
select * from A支店商品
union all
select * from B支店商品
order by 商品ID;

  +--------+--------+
  | 商品ID | 商品名 |
  +--------+--------+
  | 1      | 商品1 |
  | 2      | 商品2 |
  | 3      | 商品3 |
  | 3      | 商品3 |
  | 4      | 商品4 |
  | 5      | 商品5 |
  +--------+--------+
 
・MINUS(EXCEPT)
select * from A支店商品
minus
select * from B支店商品
order by 商品ID;

  +--------+--------+
  | 商品ID | 商品名 |
  +--------+--------+
  | 1      | 商品1 |
  | 2      | 商品2 |
  +--------+--------+
 
・INTERSECT
select * from A支店商品
intersect
select * from B支店商品
order by 商品ID;

  +--------+--------+
  | 商品ID | 商品名 |
  +--------+--------+
  | 3      | 商品3 |
  +--------+--------+
 
---------------------
目次

https://1drv.ms/b/s!AivF3bzWXOzuhG1Xk5hscKYqkLkM

Visual Studio 2017 C1083エラーの対処(stdio.hがない場合)

fatal error C1083: include ファイルを開けません。'stdio.h':No such file or directory
こんなエラーが出た時の対処法について。
 
ネットでは所説諸々出ていますが、私の場合はstdio.h自体がありませんでした。
調べてみたら原因はこれでした。
Windows 10 SDK をインストールしていなかった」
CLコンパイラにだけ用があったので VC++ 2017 バージョン しか落としていなかったのですが、それが良くなかったようです。
 

f:id:akira2kun:20180918000609j:plain

 
※別のエラーの解消のために Windows8.1 SDK はインストールしていたのですが、そこにはstdio.hはありませんでした。
 Windows8.1で開発しているのに Windows 10 SDK をインストールするのが正しいという…。
x86用とx64用の Visual C++ ATL と x86用とx64用の Visual C++ MFC も念のためインストールしましたが恐らく不要です。
Windows 10 SDK をインストールした後は、stdio.hがあるディレクトリをインクルードディレクトリに指定する必要があります。

Sakuraエディタのマクロをバッチファイルで複数ファイルに対して実行

表題の通りです。

実務で使う機会があったのでメモします。

 

置換するだけならgrep置換機能で良いのですが、古いバージョンだとこの機能が入っていませんし、ソート→マージ等の置換以外の機能を使いたくなることもあるので。

 

以下、例を用いて説明します。

 

【フォルダ構成】

C┬Program Files (x86)─sakura─sakura.exe

 └tmp┬work─(マクロの処理対象のファイル)

      ├CRLF→LF.mac

      └CRLF→LF.bat

 

【ファイルの中身】

・CRLF→LF.mac

S_ReplaceAll('\\r\\n', '\\n', 60); // すべて置換

S_ReDraw(0); // 再描画

FileSave( ); // 上書き保存

WinClose( ); // 閉じる

 

・CRLF→LF.bat

rem forループでworkフォルダの中のファイルを順番にSakuraで開く。その際CRLF→LF.macを呼び出す。

cd C:\tmp\work

for %%a in (*) do (call :method %%a)

exit

:method"C:\Program Files (x86)\sakura\sakura.exe"  %1 -M=C:\tmp\CRLF→LF.mac

goto :eof

 

【処理結果】

C:\tmp\work の直下のファイルについて、改行コードの置換が一括で行われる。(WindowsのCRLF→UnixのLF)

ブログを複数人で編集する方法を調べてみた

ブログを複数人で編集しないか、という話が来たので、その方法を調べてみました。
 
はてなブログのブログメンバー機能を使う】
はてなブログにそのままズバリの機能がありました。

http://help.hatenablog.com/entry/blog-members
 
ただし、ブログ所有者が有料プラン「はてなブログPro」に加入している必要があります。
月額600円かかるそうです。
(私は加入していません)

http://hatenablog.com/guide/pro?plus_via=admin_members_plus_disabled_alert

 
仮に他の方がはてなブログProに加入していれば、下記の手順で記事の移転が可能です。

https://gattolibero.hatenablog.com/entry/%E3%82%B5%E3%83%96%E3%81%AE%E8%A8%98%E4%BA%8B%E3%82%92%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%96%E3%83%AD%E3%82%B0%E3%81%AB%E5%BC%95%E3%81%A3%E8%B6%8A%E3%81%99

(「はてなブログのサブで書いた記事をメインブログの方に引っ越ししてみた。 - 自由ネコ」の記事を引用)
 
トラックバック機能について】
トラックバック機能を使って緩やかに繋がるのも一案だと思ったのですが、はてなブログはそもそもトラックバック機能がないそうです…。
その代替(?)として、他のはてなブログで言及が来ると通知が来るというのはあるそうなのですが…。

https://blog.hylogics.com/entry/hatenablog_notify

(「はてなブログにはトラックバックがないけど言及されると通知が来る - HYLOGICS」の記事を引用)
 
はてなブログ以外のブログを使う】
例えばWordPressは複数人での管理が可能です。

https://pasolack.com/wordpress/user/

(「WordPressを複数人で管理!ユーザーの追加と権限の種類を使いこなす方法 _ Pasolack-パソラック-」の記事を引用)
 
有料でのオプションという話は調べてもなかったので、無料でできるはずです。
 
なお、はてなブログからWordPressへの移転はコピペでの移転が一番無難みたいです。。
(私のブログはテキストファイル&jpegファイルでバックアップを取っているので、コピペ移転はそこまで大変ではないですが…)

http://hukugyouhoukoku.hatenablog.com/entry/2018/04/04/234405

(「はてなブログからWordPressに移行しようと移行方法を考える - 子持ち主婦がネットで稼げるのか!?検証ブログ」の記事を引用)

情報処理技術者試験対策「SQL(副問合せ・相関副問合せ)」

今回は副問合せと相関副問合せの紹介です。
副問合せは試験だけでなく実務でも頻出です。
相関副問合せについては、副問合せでも同じ検索結果を出すことが可能なので実務では忘れがちかもしれませんが、試験には出題されますし、性能面を考慮すると相関副問合せを使った方が良いケースが多いです。
 
なお、今回は紹介しませんが、副問合せはFROM句にも書くことができます。
 
【文法】
・副問合せ(単一行を返す場合のみ使用可能)
…where カラム名 比較演算子 (select…)
 
・副問合せ(副問合せの何れかの結果と一致することを確認)
…where カラム名 IN (select…)
 
・副問合せ(副問合せのどの結果とも一致しないことを確認)
…where カラム名 NOT IN (select…)
 
・副問合せ(副問合せの全ての結果と比較し、全ての結果よりも(大きい、小さい等))
…where カラム名 比較演算子 ALL (select…)
 
・副問合せ(副問合せの何れかの結果よりも(大きい、小さい等))
…where カラム名 比較演算子 SOME (select…)
 ※SOMEの代わりにANYを使用しても良い
 
・相関問い合わせ(副問合せ部で存在する行のみ抽出)
…from テーブル1
…where EXISTS (select 1 FROM テーブル2 WHERE カラム名 = テーブル1.カラム名 …)
 ※上記は正式な文法ではないが、通常は上記のように使う
 ※EXISTSの前のNOTをつけると存在しない行のみ抽出することができる
 ※EXISTSの中のSELECT文のカラム指定は何でも良い
 
【対象テーブル例】
・商品
  +--------+--------+
  | 商品ID | 商品名 |
  +--------+--------+
  | 1      | 商品1 |
  | 2      | 商品2 |
  | 3      | 商品3 |
  | 4      | 商品4 |
  | 5      | 商品5 |
  +--------+--------+
 
・消費者テスト結果
  +--------+------+
  | 商品ID | 得点 |
  +--------+------+
  | 1      | 80   |
  | 2      | 85   |
  | 3      | 90   |
  | 5      | 95   |
  +--------+------+
 
・合格基準点
  +------+
  | 得点 |
  +------+
  | 90   |
  +------+
 
【使用例】
asは省略可能である。
実務でも試験でも使用頻度が高い文法のみ例を記載する。
 
・=演算子
select s.商品名
from   商品 as s
join   消費者テスト結果 as t
on    (s.商品ID = t.商品ID)
where  t.得点 = (select max(t_tmp.得点)
                 from   消費者テスト結果 as t_tmp);

select s.商品名
from   商品 as s
join   消費者テスト結果 as t
on    (s.商品ID = t.商品ID)
where  t.得点 = 95;

+--------+
| 商品名 |
+--------+
| 商品5 |
+--------+
 
・不等号演算子
select s.商品名
from   商品 as s
join   消費者テスト結果 as t
on    (s.商品ID = t.商品ID)
where  t.得点 > (select k.得点
                 from   合格基準点 as k)

select s.商品名
from   商品 as s
join   消費者テスト結果 as t
on    (s.商品ID = t.商品ID)
where  t.得点 > 90;

+--------+
| 商品名 |
+--------+
| 商品3 |
| 商品5 |
+--------+
 
・IN句
select s.商品名
from   商品 as s
where  s.商品ID IN (select t.商品ID
                    from   消費者テスト結果 as t)

select s.商品名
from   商品 as s
where  s.商品ID IN (1,2,3,5)

+--------+
| 商品名 |
+--------+
| 商品1 |
| 商品2 |
| 商品3 |
| 商品5 |
+--------+
 
・EXISTS句
select s.商品名
from   商品 as s
where  EXISTS (select 1
               from   消費者テスト結果 as t
               where  t.商品ID = s.商品ID)

+--------+
| 商品名 |
+--------+
| 商品1 |
| 商品2 |
| 商品3 |
| 商品5 |
+--------+
 ※上記のIN句の例と同じ結果となる
 
【性能について補足】
EXISTS句と同様のことはIN句でも可能だが、一般的にはEXISTS句の方が性能は良くなる傾向にある。
上記の例で言うと、IN句の場合は副問合せの結果(1,2,3,5)に対して主問合せで全件検索をかけるが、EXISTS句の場合は「t.商品ID = s.商品ID」の検索にインデックスを適用可能だからである。
(あくまでも一般論であることに注意する。DBMSによって挙動が異なることが予想され、IN句に対してインデックスが適用可能とする文献もある。)
 
---------------------
目次

https://1drv.ms/b/s!AivF3bzWXOzuhG1Xk5hscKYqkLkM

情報処理技術者試験対策「データベースの障害復旧」

今回は、データベースの障害復旧について説明します。試験頻出です。
また、関連するファイル・概念の説明もついでに行います。
 
【データベースの復旧に用いるファイル・概念】

  • チェックポイント
    障害回復操作を開始すべき時点。一定時間感覚で訪れる。
    なお、チェックポイントでは、データベースの状態や障害回復操作を開始すべき時点の情報を保存したチェックポイントファイルが生成される。
  • バックアップファイル
    障害復旧のためにデータベースのある時点の内容全体をコピーしたファイル。
  • ログファイル(ジャーナルファイル
    データベースの更新前や更新後の情報を書き出したファイル。
     

【障害復旧方法】
直前のチェックポイント時点でコミットされていないトランザクションについては障害復旧が必要になる。

  • 障害発生時点でコミットしていないトランザクション
    更新前のログファイルを用いて処理開始時点の状態に戻す。
    ロールバック
  • 障害発生時点でコミットしているトランザクション
    バックアップファイルを適用してから、更新後のログファイルを用いてコミット時点の状態に進める。
    (ロールフォワード)

https://cdn-ak.f.st-hatena.com/images/fotolife/a/akira2kun/20180912/20180912235353.jpg


【障害復旧とは直接関係ないが重要なファイル】

  • ダンプファイル
    ファイルやメモリの内容を出力したファイルであるが、DBMSにおいては各テーブルの定義情報や全レコードを出力したファイルのことを指す。
    実務では、他の環境にデータを移したり、テスト環境等で簡易的にバックアップを取ったりする時に用いる。
    (プログラム開発者にとってはこれが一番馴染み深いと思います。MySQLではSQL文(DDL文+INSERT文)がそのままダンプファイルとして出力されるので、中身も理解しやすいです。)
     


---------------------
 
目次

https://1drv.ms/b/s!AivF3bzWXOzuhG1Xk5hscKYqkLkM

COBOL:CONTINUEの挙動

COBOLのCONTINUEの細かい挙動を説明したページがいつの間にか消えていたので、バックアップ代わりに記事化します。
 
【CONTINUEの挙動】
「CONTINUE」は、何もしないことを明示するための命令です。
分岐が発生する場合に、ある分岐の場合は何もしないということを明示するために使うのが一般的な使い方です。
 
(例:FLG≠1の場合は何もしない)
IF FLG = 1 THEN
  …
ELSE
  CONTINUE
END-IF.
 
なお、以下のように何も書かなくても挙動的には同じになりますが、コンパイラによってはコンパイル時にエラーやワーニングが出るかもしれません。
 
IF FLG = 1 THEN
  …
ELSE
END-IF.
 
【NEXT SENTENCEとの挙動の違い】
混同されやすい命令として「NEXT SENTENCE」があります。
「NEXT SENTENCE」は次の文にジャンプするというもので、挙動的には次のピリオド(.)がある場所まで遷移するというものです。
ピリオドへのGOTOだと思ってもらって間違いありません。
 
ジャンプが発生するため、「CONTINUE」とは挙動が異なります。
 
(例:FLG1=1かつFLG2≠1の場合、処理②は実行される)
IF FLG1 = 1 THEN
  IF FLG2 = 1 THEN
    処理①
  ELSE
    CONTINUE
  END-IF
  処理②
END-IF.
 
(例:FLG1=1かつFLG2≠1の場合、処理②は実行されない)
IF FLG1 = 1 THEN
  IF FLG2 = 1 THEN
    処理①
  ELSE
    NEXT SENTENCE
  END-IF
  処理②
END-IF.
 
【EVALUATE文と併用した場合の挙動】
COBOL(COBOL85以降)では、EVALUATE文による多岐選択が可能で、C言語javaで言うswitch文と同じようなことができます。
switch文内でもCONTINUEを使用することが可能ですが、CONTINUEを使用しないとCONTINUE使用時と異なる挙動を示すようになるので注意が必要です。
CONTINUEを使わない場合は、前後2つの条件がOR条件で繋がるような形になります。
 
(例:FLG=2の場合は何もしない、FLG=3の場合は処理②を実行)
EVALUATE FLG
  WHEN 1
    処理①
  WHEN 2
    CONTINUE
  WHEN 3
    処理②
  WHEN OTHER
    処理③
END-EVALUATE.
 
(例:FLG=2の場合とFLG=3の場合は処理②を実行)
EVALUATE FLG
  WHEN 1
    処理①
  WHEN 2
  WHEN 3
    処理②
  WHEN OTHER
    処理③
END-EVALUATE.