skillup

技術ブログ

Database

外部結合について 行列変換

投稿日:

今回から外部結合について学習します。

これはCASE式でもやった集合の考え方が大事になってきます。

例えば下記のようなテーブルCoursesとがあるとします。

name | course
——+———-
赤井 | SQL入門
赤井 | UNIX基礎
鈴木 | SQL入門
工藤 | SQL入門
工藤 | Java中級
吉田 | UNIX基礎
渡辺 | SQL入門

ここから下記のような表を作るとします。行から列にするとします。

name | sql | unix基礎 | java中級
——+—–+———-+———-
渡辺 | ○ |                 |
工藤 | ○ |                 | ○
赤井 | ○ |      ○        |
鈴木 | ○ |                 |
吉田 |     |       ○       |

この場合SQLは下記のようになります。

私の場合集計関数(GROUP BY)とCASE式を使って下記のような式を作りました。これでもできます。

が下記のようにも書けます。

下記のSQLでnameだけのテーブルを作り、これを通常のcoursesの共通エリアを考えます。

name
——
渡辺
工藤
赤井
鈴木
吉田

次は列から行になおします。

下記のようなテーブルがあり、( personnel)下記のようなテーブルをこんどは下記のように2列にするとします。さっきの逆ですね。

employee | child_1 | child_2 | child_3
———-+———+———+———
赤井        | 一郎      | 二郎     | 三郎
工藤        | 春子      | 夏子     |
鈴木        | 夏子      |            |
吉田        |             |            |

employee | child
———-+——-
吉田 |
吉田 |
吉田 |
工藤 |
工藤 | 春子
工藤 | 夏子
赤井 | 一郎
赤井 | 二郎
赤井 | 三郎
鈴木 |
鈴木 |
鈴木 | 夏子

この場合UNIONを使うとかけます。こういう時に使うんですね・・・

ちなみにALLを除くと重複行(鈴木 NULLや吉田 NULL)が一行になります。

-Database
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

slow-query-logについて

データベースを伴う部分でののチューニングですが、大きく分けると SQLを書き直す インデックスを張りなおす プログラム内部でキャッシュを有効化する 設定ファイルの修正 上記のようなかんじになるのではな …

no image

オブジェクト指向 データベース層

本日も引き続き「現場で役立つシステム設計の原則」を読み進めてます。 本日は主にデータベース層の考え方について。 Contents1 データべース層1.1 要点1.1.1 典型的なダメテーブル設計1.1 …

no image

HAVING句について NULL時の動き

HAVING句のNULLがあった時の挙動にたいしてメモリます。 COUNTの処理 対象上の列数を数えるのにCOUNTを使うと思いますが、COUNT(*)とCOUNT(列名)では動きが若干違っており、前 …

no image

MariaDBインストール

CentOS7からはyumでmysqlをインストールするとMariaDBがディフォルトになるようです。 せっかくなので、これを機にMariaDBを使ってみました。といってもMySQLとほとんど一緒でし …

no image

MySQLでtext型が大量にあるもののリストア 

MySQLでのリストアについて。 先日実務でtext型のカラムが複数あるテーブルを読もうとしたら下記エラーがでてこけました。

なにやら …