データベースのNULL

データベースのNULL

データベースを扱っていると「NULL」と言うデータを良く見かけます。
データベースの値の初期値もNULLです。

では、データベースのNULLとはどんなものなのでしょうか?

データベースのNULLは空

データベースのNULLは、登録されたデータが空であることを意味しています。
空とは未設定の意味にも取れますが、そこに登録すべき値が無いと言う方が正確だと思います。
なのでデータベースの値の初期値はNULLにしておくことが多いです。

データベースの仕組みでは、どんな値が登録されても何らかの意味を持つ可能性が有ると判断しますが、NULLだけ空の意味しか持たず、「IS NULL」判定の式があります。
NULLは特別なデータです。

データベース システム開発におけるNULLの扱い

更にNULLには空には違いがないのですが、「未知・不明 (Unknown)」 の場合と「適用不能・非存在 (Not Applicable, Inapplicable)」 の場合があります。

例えば、電話番号がNULLの場合
未知・不明のNULLは「電話はあるが番号分からない」
適用不能・非存在のNULLは「電話を持っていない」
の違いがあります。

システム的にはどのように解釈してもシステム内で統一した認識があればよいのですが、例えば、「開発運用初期は000-0000-0000 が入っていた場合、在りえない値なので電話番号を不明として扱う場合に登録しておいた」つもりが、改修の際にNULLでないため実際の値として扱い不具合が出たなど、上の例は極端ですがもっと複雑なデータの場合は往々にして不具合発生の温床となりますので注意が必要です。

NULL を含む演算

NULLを含む演算の結果は、多くがNULLとなります。

売り上げの集計をしていて、一つでもNULLデータが混入していると、結果はNULLとなります。
集計の加算(足し算)だけでなく、客単価等を求めるために割り算などを使った場合も客数がNULLなら結果はNULLになります。

思わぬNULLデータを含む演算による不具合は良く発生するので注意が必要です。

下の結果のようにNULLになります。

NULLを含む演算結果

NULLを取り扱う工夫

思わぬところで不具合が発生してしてしまうNULLですが、なるべくそうならないように工夫することが可能です。

1.テーブルの列に NOT NULL 制約をかける

テーブルの列に NOT NULL制約をかけてしまい、NULLデータを登録(追加・更新)できないようにしてしまう。
追加や更新時にエラーで落ちてしまう不具合が発生するが、エラーハンドリングも取りやすい。

2.適宜 NULL 判定を入れる

isnull関数を使いNULLを妥当な数値やデータに変えます。
妥当性はシステムの性格にもよるので何とも言えないですが、NULL判定を上手く使い予期せぬ不具合を未然に防ぐようにします。

先ほどの演算結果の一部をisnull関数で書き換えてみました。

isnull関数でNULLをチェック
isnull関数でNULLをチェック

このisnull関数の他にもCase文を使ってチェックすることも可能です。
とりあえず例を載せておきます。

Case文を使ってNULLをチェック
Case文を使ってNULLをチェック

NULLの扱いについては「SQL Server NULL」でも少し説明しています。

以上、データベースにおけるNULLについての簡単な説明でした。

StarServer スパムメール設定

StarServer スパムメール設定 の「オイオイ~」なところ

SterServer を使い始めて5か月が経とうとしています。
安いし安定しているし、WordPressの応答もそこそこ早いしかなり満足しています。

ですが。。。
スパムメールの設定をしようとして「オイオイ~」ってなってしまいました。

スパムメールの設定には、「スパムメールの有効/無効の設定、スパムメールとして特定したメールの件名に付ける任意のヘッダー文字列の設定」「ホワイトリストの設定」「ブラックリストの設定」を行うことになります。

本当はメール受信拒否が設定できるともっとありがたいのですが、格安なので仕方ないのでしょうね。。。

で、なにが「オイオイ~」となる残念なことだったかというと

StarServer ヘルプがヘルプになってない?!

ワンポイント!「ホワイトリスト」「ブラックリスト」

「ホワイトリスト」と「ブラックリスト」への追加フォーマットに全く触れていません。
これって100%使うユーザーが居ないと確信してるからでしょうかね?

そもそもスパム設定を有効にしたら「自動的に迷惑メールのチェックが行われる」と言う時点で、かなり迷惑な設定だって思わないのでしょうか・・・
私には自動でされるのは迷惑で、確実に指定したメールアドレスのみ、スパムメールとしたい希望があります。
あっ、格安なので仕方ないですね・・・

で、更にこんなことも

Netowl Q&A掲示板 の運営の対応がまさしく機械任せ

スパムメール設定のブラックリストについて

質問者の問いに、心ある人が答えています。
しかし、少し力及ばず残念な回答になっています。

更に心ある人はWeb上でマニュアルまで探してって、お疲れ様です・・・そしてこの記事を書いている私にとってもWeb検索をしてこのページを発見したので、更に探さずに済み、ラッキーだったと言うか、ありがたい回答でした。ありがとうございました。

さて、Netowlと言うStarServerと言うか「ネットオウル運営チーム」さんですか、運営チーム自身のマニュアル作成の不手際のせいで遭難者が出ているのに、また助け舟を出した方もボロボロなのに、あっさり「質問の閉め切り」のみを行ってしまった、恥ずかしくも機械任せ&責任放棄しております。

StarServer は気に入っているので、かなりがっかりですね・・・

StarServer スパムメール設定 の ブラックリストにドメインを設定する方法

批判だけしていても何なので・・・「StarServer でスパムメール設定 の ブラックリストにドメインを設定する方法」の一部わかっている部分のみ回答を書きます。

ドメインを設定いするためには、

*@example.com

のようにアスタリスクを付けると正常に動きました。
サブドメインはテストしていませんが、*@subdomain.example.com で行けると思いますが、どうでしょうか?
ちなみに、やはり心ある人の報告のとおり、 @example.com や example.com のみの場合は、正常に動作しませんでした。

以上、「StarServer スパムメール設定 の ブラックリストにドメインを設定する方法」でネットオウル運営チームの「オイオイ~」的な対応にふと思ったので愚痴をこぼしました。
私が StarServer のスパムメール設定 の ブラックリストにドメインを設定するために、試験的にいくつかのパターンで設定した結果ですので、フォーマットはこれだけでないと思います。%とかも使えるかもしてません。正規表現の置き換えまでは使えない気がしますが、パワーが余っている人が居たら是非試してください。
結果を教えてもらえると嬉しいです。

Office 2016 32bit版 or 64bit版?

Office 2016 32bit版 or 64bit版?

ノートPCにOffice 2016 64bit版 をインストールしようとして、以下のメッセージが出てしまいインストールできませんでした。

Office 2010と Office 2016 は制約なく共存できると思っていたので、一瞬どうしようかと悩みました。

OS が64bit版 ならOffice は、64bit版 でも 32bit版 でも動くので結果的には 32bit版 をインストールしました。
もし、OS が 32bit版 なら64bit版をインストールできないので、そもそもこんな事態にはならないのですが、Officeのパッケージ版を買う時に32Bitか64Bitか迷いそうですね。

Office 2016 32bit版 or 64bit版 の違い

ちなみに、32bit版 と64bit版 の違いは、使用できるメモリ空間が異なります。
32Bitは4GBまで。
64Bitは32GBまで。

64BitはOSも64Bit なので、レジスタやメモリ空間が大きく効率よくメモリの処理を行えるので、体感できるかどうかは別として、32Bitよりも64Bitの方が処理が速いと思われます。
ただ、他の動かしているアプリケーションの影響の方が大きいかも知れないので、あくまでも理論上は速いと言えると思います。

その他、32bit版向けに開発されたアプリケーションやアドインは64bitで動作されないことが多く、また逆も多いです。
過去の受け継ぐプログラムによっても選択が変わると思います。

会社であればシステム管理者がそのあたりを管理してくれているので問題ないと思います。
個人であればあまり気にすることもないように思います。個人で4GBを越えるデータを取り扱うこともないと思うし。

Office 2016 32bit版 or 64bit版選ぶなら?

個人的にはなんとなく64Bitを選んでいます。
これからは64Bitが主力だろうし、特殊なCOMプログラムを使う予定もないので、64Bitかな。。。

以上、「Office 2016 32bit版 or 64bit版?」でした。

Search Console – Fatch as Google リダイレクトされました

Search Console – Fatch as Google リダイレクトされました

新しい記事を書いたので、Search Console の Fatch as Google 機能を使って記事をインデックスに登録してもらいました。

その際、「/」スラッシュを余分に付けてしまい、リダイレクトされましたと以下のように表示されました。

ステータスは「!」マークでエラーでも無いし、「インデック登録をリクエストしました」と出ていますのでスルーしようと思ったのですが、ちゃんとインデックスに登録されるのか少し気になって検索してみたところ、以下のような検索結果が出ました。

「リダイレクトされました」というエラーが・・・とありますが、エラーじゃないですよね?
「!」マークで注意を促していますがエラーではないです。
該当の行をクリックして詳細を確認すると、以下のような情報が表示されます。

指定されたURLが正規のURLでなかったために、示された予想される正規のURLに変換しリダイレクト先に指定しなおした感じです。
このリダイレクト先のURLは正しいURLなので再度 Fatch as Google を行う必要が無く助かります。

やはりエラーではないですね。
エラーで無いのにエラーと書いているWebサイトが上位を占めているところがとても気になります。

 

正常にインデックス登録が出来ているの?

念のため正常にインデックス登録が出来ているのか確かめてみました。

ちゃんと登録されていました。
即時で登録されていました。
確認方法なのですが、上のURLをコピーしてGoogle 検索します。
下のように検索します。

インデクスに登録されていると、該当のページが表示されます。
登録されていないと、該当のページは表示されません。

今回は即時で登録されていたため確認しやすかったのですが、遅延して登録されることもあります。

 

リダイレクトされる原因は?

さて、リダイレクトされる原因ですが、先にも書いた通り正規のURLでないからです。
正規と言うのは、URLの書き方で、「/」が多い、www を付けるのが正規なのか付けないのが正規なのか(Search Console の設定)、http かhttps なのか等々が関係してきます。
リダイレクト先のURLが正規のURLなので、それを確認すると解決できると思います。

完全に異なる(予想のできない)URLの場合は、アクセスできませんでしたのエラーになると思います。

 

以上、「Search Console – Fatch as Google リダイレクトされました」の検索結果に「あれ??」と思ったので書きました。

文字 Font の 色を指定する

文字 Font の 色を指定する

文字Fontの色を指定する

文字 Font の色を指定する時は、「color」プロパティを指定します。

color: #ff0000;

色の指定は、bodyに対して行い文書全体に指定もできますし、個別に指定することも出来ます。

文字 Font の色を指定する例

例をいくつか載せておきます。

bodyに対して行い文書全体に指定

全体に赤の文字色を指定します。

<html>
<head>
<style>
body {
    color: #ff0000;
}
</style>
</head>
<body>
これはFontの色指定のテストです。(赤指定)
</body>
</html>

h1タグの文字色をこげ茶色に指定

こげ茶の色を#662323にしました。
色は「原色大辞典」さんで調べると、指定する色値を簡単に取得できます。

<html>
<head>
<style>
body {
    color: #ff0000;
}
h1 {
    color: #662323;
}
</style>
</head>
<body>
<h1>h1タグの色はこげ茶</h1>
これはFontの色指定のテストです。(赤指定)
</body>
</html>

Class指定で文字色を青に指定

pタグにClass blue を指定し、blueクラスに青色を指定しています。

<html>
<head>
<style>
body {
    color: #ff0000;
}
h1 {
    color: #662323;
}
.blue {
    color: #0000ff;
}
</style>
</head>
<body>
<h1>h1タグの色はこげ茶</h1>
これはFontの色指定のテストです。(赤指定)
<p class='blue'>これはClassでFontの色指定のテストです。(青指定)</p>
</body>
</html>

以上、簡単な「文字 Font の 色を指定する」方法の紹介でした。

Windows 10 アップグレード 無償アップグレードの期間切れ後の状況

Windows 10 アップグレード 無償

既にWindows 7 や Windows 8.1 からの Windows 10 への無償アップグレードの期間はとっくに過ぎていますが、2018/02/01時点でまだ無償でアップグレードできました。

いろいろな条件があるのだと思いますが、まだ無償アップグレードを実施していない方も居ると思いますので、経緯だけ報告します。
ちなみに、公式には以下の通りです。
Windows 10 無償アップグレード キャンペーンは、2016年7月29日まで。
支援技術をご利用の方向け Windows 10 アップグレードは、2017年12月31日まで。

また、一度アップグレードして、またダウングレードした場合は、上の期間にかかわらず無償でアップグレードできるそうです。

今回は、一度も Windows 10 にアップグレードしていないPCで無償アップグレードを試みました。

アップグレードしたPCについて

今回 Windows 10 にアップグレードしたPCですが、ほぼ放置状態のDELLのノートPCです。
OSは Windows XP が入っており、CPU も celeron M でメモリも 1.5G といたってショボショボのPCです。
しかし、そんなショボショボのノートPCに頼らざるを得ない状況になり、急遽「Windows 10」にしよう!となった次第です。

ちなみに、無償アップグレードの期間が過ぎているのを知っていたので、 Windows 10 を別途購入して載せようと思っていたのですが、とりあえずやってみようと思いチャレンジしてみました。

インストール手順

まず、手持ちの Windows 7 starter にアップグレードしました。
クリーンインストールではなく、上書きインストールです。
サービスパック1まで当たっていました。

※ここで Windows 7 starter のライセンス認証を行いました。

HDDの空き容量に少し不安が有ったので、Windows 7 の Windows フォルダーやProgram files フォルダーを地道に削除しました。

次に「Windows 10 ダウンロード」へ行き、「ツールを今すぐダウンロード」をクリックしてツールをダウンロードしました。
その後、ツールを起動しそのまま Windows 10 のインストールを行いました。
その後は放置状態で数時間後に確認したら Windows 10 home が正常にインストールされており、ライセンス認証もされたままでした。

無償アップグレードはいつまで出来るの?

これは無償アップグレードいつ出来なくなっても仕方のないことなので、出来るときにやっておくのが良いと思います。
が、Windows 7 のサポート期間のうちはそのまま使いたいなどの要望もありますし。。。
一度アップグレードして戻すにしても、手間やリスクもあるわけで。。。

公式発表していてもまだできるってことは、簡単に検知できるような仕組みになっていなくて、疑わしきはOKって判断でライセンス認証を通しているのかもしれませんね。
とりあえず、上のインストール手順で無償アップグレードが出来ました。

まだ、Windows 10 の無償アップグレードしていないPCを持っている人は、気が向いたときに試してみてください。
以上、「Windows 10 アップグレード 無償」で出来た報告まで。

知っていると便利な Windows 10 仮想デスクトップ

Windows 10 仮想デスクトップ

Windows 10では、「仮想デスクトップ」という機能が追加されています。
仮想デスクトップは、複数の画面を持つことで、作業領域を広げる機能です。
1つの大きな仮想画面よりも、切り替えられる複数の画面の方が使い勝手が良いと思われます。

それぞれの仮想画面は作業ごとに別のアプリを起動しておき、会社独自のアプリケーション作業、WordやExcel作業、Web検索をしながらの資料や情報の整理、メールやスカイプなどの連絡、のように用途をわけておけば、ひとつずつアプリを開いたり閉じたりすることなく、作業に応じて手早く切り替えられます。
特に、画面が小さなノートPCで役立つオススメの機能です。

仮想デスクトップの作り方

仮想デスクトップは、タスクバーの「タスク ビュー」から起動します。
1)タスク ビューをクリックします。
タスク ビューの位置は下の通りです。

タスクバーの「タスク ビュー」

タスクバーの「タスク ビュー」

2)クリックすると、画面の右下に「+新しいデスクトップ」が表示されます。

画面の右下に「+新しいデスクトップ」が表示

画面の右下に「+新しいデスクトップ」が表示

3)「+新しいデスクトップ」をクリックすると、新しい仮想デスクトップが作成されます。

新しい仮想デスクトップが作成されます

新しい仮想デスクトップが作成されます

仮想デスクトップの切り替え方

仮想デスクトップを消す時も、タスクバーの「タスク ビュー」から行います。

1)タスク ビューをクリックします。

2)仮想デスクトップの一覧が表示されます。
表示したい仮想デスクトップの上にマウスカーソルを乗せクリックします。
これで切り替えられています。

仮想デスクトップの終わり方

仮想デスクトップを消す時も、タスクバーの「タスク ビュー」から行います。

1)タスク ビューをクリックします。

2)仮想デスクトップの一覧が表示されます。
削除したい仮想デスクトップの上にマウスカーソルを乗せると、乗せた仮想デスクトップの右上に「X」が表示されます。
更に表示された「X」の上にマウスカーソルを乗せると、「X」が赤表示されます。

「X」の上にマウスカーソルを乗せると、「X」が赤表示されます

「X」の上にマウスカーソルを乗せると、「X」が赤表示されます

3)赤くなっている「X」をクリックでその仮想デスクトップを消すことができます。

便利なショートカットキー

仮想デスクトップを素早く使うならショートカットキーがお勧めです。
[Windows]キー+[Ctrl]キー+[D]で新しいデスクトップの作成できます。
[Windows]キー+[Ctrl]キー+[矢印 →(←)]で、右(左)の仮想デスクトップへ素早く移動できます。
[Windows]キー+[Ctrl]+[F4]キーで、表示中の仮想デスクトップを閉じる消すことができます。
 ただし、仮想でないデスクトップを消そうとすると、残った仮想デスクトップが自動で消されてしまいます。
 消した仮想デスクトップ上にアプリが立ち上がっていると、仮想でないデスクトップに移されています。
[Windows]キー+[Tabキー]でタスクビューの表示ができます。

以上、「Windows 10 仮想デスクトップ」の簡単な使い方まで。

SQL Server INTERSECT

INTERSECT

INTERSECT は、ユニオンクエリと呼ばれ、1つのクエリ結果と別のクリエ結果の同じ行のみの結果を返します。
ユニオンクエリには、UNION, EXCEPT 句もあります。

ちなみに、SQL Server には、INTERSECT ALL はありません。

INTERSECT の使い方

1つの目のクエリ結果と、次のクリエ結果を比較し、同じ行(レコード)のみを結果として返します。

以下に簡単な例を書きます。
tble1の結果からtbl2と同じ結果(行)があるもののみ結果を返しています。

declare @tbl1 table(a_cd char(9), b_kbn char(1), c_kbn int)
insert into @tbl1 (a_cd,b_kbn,c_kbn) values ('000000001','1',0)
insert into @tbl1 (a_cd,b_kbn,c_kbn) values ('000000010','1',1)
insert into @tbl1 (a_cd,b_kbn,c_kbn) values ('000000020','2',1)
insert into @tbl1 (a_cd,b_kbn,c_kbn) values ('000000030','3',1)

declare @tbl2 table(a_cd char(9), b_kbn char(1), c_kbn int)
insert into @tbl2 (a_cd,b_kbn,c_kbn) values ('000000001','1',0)
insert into @tbl2 (a_cd,b_kbn,c_kbn) values ('000000010','1',1)
insert into @tbl2 (a_cd,b_kbn,c_kbn) values ('000000020','2',1)
insert into @tbl2 (a_cd,b_kbn,c_kbn) values ('000000030','3',2)

select * from @tbl1
INTERSECT
select * from @tbl2

left join 句を使用して同じこともできますが、INTERSECT 句を使った方がシンプルですね。

select t1.* from @tbl1 t1
left join @tbl2 t2
on t1.a_cd = t2.a_cd
and t1.b_kbn = t2.b_kbn
and t1.c_kbn = t2.c_kbn
where t2.a_cd is not null

以上、INTERSECT の簡単な使用方法でした。

SQL Server EXCEPT

EXCEPT

EXCEPT は、ユニオンクエリと呼ばれ、1つのクエリ結果から別のクリエ結果を差し引いて重複を取り除き結果を返します。
ユニオンクエリには、UNION, INTERSECT 句もあります。

ちなみに、SQL Server には、EXCEPT ALL はありません。

EXCEPT の使い方

1つの目のクエリ結果から、次のクリエ結果を差し引いて、重複を取り除き、結果を返します。

以下に簡単な例を書きます。
tble1の結果からtbl2と同じ結果(行)があるものを取り除き結果を返しています。

declare @tbl1 table(a_cd char(9), b_kbn char(1), c_kbn int)
insert into @tbl1 (a_cd,b_kbn,c_kbn) values ('000000001','1',0)
insert into @tbl1 (a_cd,b_kbn,c_kbn) values ('000000010','1',1)
insert into @tbl1 (a_cd,b_kbn,c_kbn) values ('000000020','2',1)
insert into @tbl1 (a_cd,b_kbn,c_kbn) values ('000000030','3',1)

declare @tbl2 table(a_cd char(9), b_kbn char(1), c_kbn int)
insert into @tbl2 (a_cd,b_kbn,c_kbn) values ('000000001','1',0)
insert into @tbl2 (a_cd,b_kbn,c_kbn) values ('000000010','1',1)
insert into @tbl2 (a_cd,b_kbn,c_kbn) values ('000000020','2',1)
insert into @tbl2 (a_cd,b_kbn,c_kbn) values ('000000030','3',2)

select * from @tbl1
except
select * from @tbl2

left join 句を使用して同じこともできますが、EXCEPT 句を使った方がシンプルですね。

select t1.* from @tbl1 t1
left join @tbl2 t2
on t1.a_cd = t2.a_cd
and t1.b_kbn = t2.b_kbn
and t1.c_kbn = t2.c_kbn
where t2.a_cd is null

以上、EXCEPT の簡単な使用方法でした。

SQL Server UNION と UNION ALL

UNION と UNION ALL

UNION と UNION ALL は、ユニオンクエリと呼ばれ、2つ以上のクエリ結果を結合して返します。
ユニオンクエリには、EXCEPT, INTERSECT 句もあります。

UNION と UNION ALL の違い

2つ以上のクエリ結果を結合して返します。
違いは、すべての結果を返すか、重複した行(レコード)は一行にして返すかの違いです。
使用するデータによっては、重複データを取り除きたい場合もあるし、すべてのレコードが必要な場合もあるので、選択して使用します。

以下に簡単な例を書きます。

declare @tbl1 table(a_cd char(9), b_kbn char(1), c_kbn int)
insert into @tbl1 (a_cd,b_kbn,c_kbn) values ('000000001','1',0)
insert into @tbl1 (a_cd,b_kbn,c_kbn) values ('000000010','1',1)
insert into @tbl1 (a_cd,b_kbn,c_kbn) values ('000000020','2',1)
insert into @tbl1 (a_cd,b_kbn,c_kbn) values ('000000030','2',1)

declare @tbl2 table(a_cd char(9), b_kbn char(1), c_kbn int)
insert into @tbl2 (a_cd,b_kbn,c_kbn) values ('000000001','1',0)
insert into @tbl2 (a_cd,b_kbn,c_kbn) values ('000000010','1',1)
insert into @tbl2 (a_cd,b_kbn,c_kbn) values ('000000020','2',1)
insert into @tbl2 (a_cd,b_kbn,c_kbn) values ('000000030','2',1)

select * from @tbl1
union
select * from @tbl2
order by a_cd

select * from @tbl1
union all
select * from @tbl2
order by a_cd

UNION , UNION ALL はクエリを結合するので、ネストなどもできます。
下の例は、tbl1とtbl2を先にUNION結合し、後からtbl3をUNION ALL結合しています。
()で順序をつけることができます。

declare @tbl1 table(a_cd char(9), b_kbn char(1), c_kbn int)
insert into @tbl1 (a_cd,b_kbn,c_kbn) values ('000000001','1',0)
insert into @tbl1 (a_cd,b_kbn,c_kbn) values ('000000010','1',1)
insert into @tbl1 (a_cd,b_kbn,c_kbn) values ('000000020','2',1)
insert into @tbl1 (a_cd,b_kbn,c_kbn) values ('000000030','2',1)

declare @tbl2 table(a_cd char(9), b_kbn char(1), c_kbn int)
insert into @tbl2 (a_cd,b_kbn,c_kbn) values ('000000001','1',0)
insert into @tbl2 (a_cd,b_kbn,c_kbn) values ('000000010','1',1)
insert into @tbl2 (a_cd,b_kbn,c_kbn) values ('000000020','2',1)
insert into @tbl2 (a_cd,b_kbn,c_kbn) values ('000000030','2',1)

declare @tbl3 table(a_cd char(9), b_kbn char(1), c_kbn int)
insert into @tbl3 (a_cd,b_kbn,c_kbn) values ('000000001','1',0)
insert into @tbl3 (a_cd,b_kbn,c_kbn) values ('000000010','1',1)
insert into @tbl3 (a_cd,b_kbn,c_kbn) values ('000000020','2',2)
insert into @tbl3 (a_cd,b_kbn,c_kbn) values ('000000030','2',2)

select * from @tbl3
union all
(
select * from @tbl1
union
select * from @tbl2
)
order by a_cd

以上、UNION と UNION ALL の簡単な使用方法でした。