SQL WHERE句でデータを絞り込む
「社員マスタ」と「部署マスタ」というテーブルがあります。
今回は、社員マスタに「年齢」カラムを追加してあります。
社員コード | 社員名 | 部署コード | 年齢 |
---|---|---|---|
1 | テスト社員1 | 1 | 22 |
2 | テスト社員2 | 1 | 30 |
3 | テスト社員3 | null | 20 |
4 | テスト社員4 | 2 | 30 |
部署コード | 部署名 |
---|---|
1 | 開発部 |
2 | 営業部 |
年齢が25歳以上で営業部に所属する社員を表示したい。
SQL
は下記のようになります。
SELECT T1.社員名
,T2.部署名
FROM 社員マスタ AS T1
LEFT JOIN 部署マスタ AS T2
ON T1.部署コード = T2.部署コード
WHERE T1.年齢 >= 25
AND T1.部署コード = 2
社員名 | 部署名 |
---|---|
テスト社員2 | 開発部 |
テスト社員4 | 営業部 |
取得するデータを絞り込むには、WHERE
句で条件を指定します。
FROM句の結合条件との違い
FROM
句の結合条件とWHERE
句の条件を混同しないように注意が必要です。
例えば、上記のSQL
のWHERE
句の条件をFROM
句の結合条件に移動させてみます。
SELECT T1.社員名
,T2.部署名
FROM 社員マスタ AS T1
LEFT JOIN 部署マスタ AS T2
ON T1.部署コード = T2.部署コード
AND T1.年齢 >= 25
AND T1.部署コード = 2
社員名 | 部署名 |
---|---|
テスト社員1 | null |
テスト社員2 | 開発部 |
テスト社員3 | null |
テスト社員4 | 営業部 |
LEFT JOIN
では、結合条件に関わらず、メインのテーブルは必ず出力するため、いくら結合条件を追加しても、社員マスタのデータはWHERE
句で絞りこまない限り全件出力されてしまいます。
また、テスト社員1は開発部(部署コード=1)に属していますが、結合条件で部署コード = 2
を指定したため、条件に合わず部署マスタとひもづけることができないため、部署名はnull
になってしまいます。
ちなみにLEFT JOIN
(外部結合)でなくJOIN
(内部結合)で結合すれば、結合条件に合わないデータは取得されないため、WHERE句で指定した場合と同じ結果が得られますが、可読性を考慮して、データの絞り込みはWHERE
句で行うようにしましょう。
結合条件で条件を指定する例
例えば、部門マスタに削除フラグというカラムがあり、削除フラグ=1
の部署は、社員がその部署に所属していたとしても表示したくない場合があります。
年齢が25歳以上の社員を表示したい。ただし所属部署が削除されていた場合(削除フラグ=1
)は部署名には何も表示したくない。
部署コード | 部署名 | 削除フラグ |
---|---|---|
1 | 開発部 | 0 |
2 | 営業部 | 1 |
SELECT T1.社員名
,T2.部署名
FROM 社員マスタ AS T1
LEFT JOIN 部署マスタ AS T2
ON T1.部署コード = T2.部署コード
AND T1.削除フラグ <> 1
WHERE T1.年齢 >= 25
社員名 | 部署名 |
---|---|
テスト社員2 | 開発部 |
テスト社員4 | null |
結合条件で削除フラグ<>1
の条件があるため、社員マスタのテスト社員4と部署マスタの営業部は紐付かず、「営業部」とは表示されません。
ただし、結合条件で紐付かなくても、外部結合(LEFT JOIN
)の場合はテスト社員4のデータ自体は出力されます。
また、テスト社員1とテスト社員3のデータが出力されないのはWHERE
句の年齢の条件にマッチしないためです。