プログラ生活

プログラム初学者のためのポイントを書いていこうと思います。たまに脇道それた記事もありますが、息抜きだとおもって気長にお付き合いください。

【SQL Server(連載)】SELECT文 (レコードの抽出 WHERE) -4-

www.pon-x.jp

前回は、SELECT文においてカラムの制御を勉強しました。
今回は、行(レコード)を制御したいと思います。

ちなみにリレーショナルデータベースにおいて列(カラム)はデータの属性(種類)でありこれを定義したテーブルについて、行(レコード)を増やしていくという構造です。
この際、レコードの数をデータ量と呼んだりもします。

さてさて、ではやっていきましょう。

レコードを制御するためのWHERE句

PersonTypeカラムは以下のデータが存在します。

  1. IN
  2. EM
  3. SP
  4. SC
  5. VC
  6. GC

このうち、PersonTypeがEMのレコードだけを抽出したいと思います。
SQLは以下の通り。

SELECT * 
FROM Person.Person
WHERE PersonType='EM'

以下のような結果となり、データ数が273になったとおもいます。
f:id:hanabusa-snow:20201120102319p:plain

複数条件をつけるときは、論理演算で考える。

論理演算とは、AND、OR、NOT等で条件を複合的に考えるものです。
上記条件に加えて、TitleがNULLであるという条件を加えます。
NULLであるという条件は、[カラム名] IS NULL で指定します。
ちなみにNULLでないという指定は、[カラム名] IS NOT NULL で指定します。

SQLは以下の通り

SELECT * 
FROM Person.Person
WHERE PersonType='EM' AND Title IS NULL

以下のような結果となり、データ数が267になったとおもいます。
f:id:hanabusa-snow:20201120102746p:plain
AND条件(論理積)は、条件を厳しくしていくものなので、増やせば増やすほどデータ数が減っていくイメージをもつとよいでしょう。

では、次にOR条件を確認します。
PersonTypeがEMである、もしくはTitleがNULLであるレコードを抽出します。
上記のSQLのANDをORに変えるだけですね。

SELECT * 
FROM Person.Person
WHERE PersonType='EM' OR Title IS NULL

以下のような結果となり、データ数が18969になったとおもいます。
f:id:hanabusa-snow:20201120103054p:plain

OR条件(論理和)は、いずれかの条件を満たしているレコードを抽出するため条件が緩くなり、増やせば増やすほどデータが増えていくイメージをもつとよいでしょう。

IN句

PersonTypeカラムは以下のとおりでしたね。

  1. IN
  2. EM
  3. SP
  4. SC
  5. VC
  6. GC

ちなみに、このなかから、EMとSPとVCとGCのいずれかのレコードを抽出するといったとき、OR条件で結ぶのはコードを書くのが大変ですよね。
その時役に立つのが、IN句です。
以下のように書くことができます。

SELECT * 
FROM Person.Person
WHERE PersonType IN ('EM','SP','VC','GC')

結果は以下の通り
f:id:hanabusa-snow:20201120104105p:plain
結構よく使うので覚えておいた方がよいでしょう。

重複削除

そもそも、PersonTypeに存在するデータが6種類だってなんでわかったの??と思いませんでしたか??
こんなとき、カラム内のデータの重複を削除してくれる便利な「DISTINCT」というのがあります。

SELECT DISTINCT PersonType
FROM Person.Person

結果は以下の通り
f:id:hanabusa-snow:20201120104121p:plain

これで、存在するデータの種類を把握することができます。







以上、次回も引き続きSELECTです。