FROM句の対象テーブルから
SELECT句で選び取ったフィールド(列)表示
ここまでが既存の学習メモ内容
今回は、選択済みフィールド情報の中から特定のレコード(行)のみ抽出
だんだんややこしくなってきてる(゚д゚lll)
SELECT
M_配信リスト.[話数],
M_配信リスト.[タイトル],
M_配信リスト.[放送日],
M_配信リスト.[Season]
FROM
M_配信リスト
WHERE
M_配信リスト.[フィールド名]=抽出条件; ←【New】
1. SQLの構造
SELECT~FROM~に加え「WHERE句」が仲間入り。
SELECT 句
SELECT
M_配信リスト.[話数],
M_配信リスト.[タイトル],
M_配信リスト.[放送日],
M_配信リスト.[Season]
役割:どの列(フィールド)のデータを取得するかを指定
詳細:
テーブル名「M_配信リスト」の内、
[話数][タイトル][放送日][Season]フィールドを表示。
具体的なフィールド名をカンマ(,)で区切って
「どのテーブルの、どの項目か」を正確に指定する。
FROM 句
FROM M_配信リスト;
役割:データの取得元となるテーブルを指定
詳細:
「M_配信リスト」テーブルからデータを取るように指定。
これまでと違う点:
テーブル名の後につける;(セミコロン)は、この後に続くWHERE句が引き継ぐため、今回は不要。
WHERE 句
WHERE
M_配信リスト.Season = 3;
役割:データの取得元となるテーブルから、必要なレコードのみ抽出。
詳細:
「M_配信リスト」テーブルの内、[Season]フィールドに
「3」と入ったレコードのみ表示するように指定。
本SQLの締めくくりはWHERE句となるため、
命令の末尾を示す;(セミコロン)で閉じる。
※クエリデザイン設計後、SQLビューで確認したAccess自動形成文
フィールド名に[]ありと[]なしが混在し、WHERE句には大量のカッコ
2. 本SQLの役割
「M_配信リスト」テーブルに格納されたすべてのレコード(行)から
指定したフィールド(列)を抽出し・・・・・垂直の選択
その中のレコード(行)を絞り込む・・・・・水平の選択【New】
(⁰▿⁰)WHERE句は、Excelのフィルタリング機能と同じ役目を果たす
SQLの意味を理解しようとする際、まず英単語を日本語のイメージに置き換えてみるが...
①SELECT = 選ぶ:対象フィールド選択・・・・・わかる
②FROM = 出身:データの引用元・・・・・これもわかる
③WHERE = どこ:どこ情報・・えっ?また最初から説明?
てな感じで、直感的にイメージがつきやすいSELECTやFROMと比べ
WHEREだけ異次元のややこしさを覚えた。
この場合のWHEREは直訳の「どこ」というより「探す」とイメージした方が腑に落ちる。
ユーザーの指定条件に従いデータを探し出してくれる役割を持つ。
探す必要なし、つまり全レコードを拾って問題なければ、WHERE句は不要。いわばプルダウン機能のないExcelシート。
迷子の子猫ちゃんに「お家はどこ?」と訊くが手掛かりなし。
犬のおまわりさんは困り果てるけど、ないている子猫ちゃんを見捨てるわけにもいかず、とりあえず交番で把握する全世帯を1軒目から調べるしかない。
その内、子猫ちゃんが名前や住所を思い出し始めたら、その内容に従ってリストを徐々に絞り込んでいく。それがWHERE句の役目だろう。
3. Accessが自動形成するWHERE句のカッコ ((())) について
AccessのクエリデザインからSQLを生成すると、上記イラストの如く、
WHERE句に ((( ))) と多くのカッコが付いた。
Accessなりに「計算や条件の優先順位を間違えないように」と気遣ってくれているのだろうか。
ひとつずつ()を減らして試した結果、今回のSQLは()がなくても問題ないことが分かった。
4. WHERE句において、数値には引用符が不要/文字列には引用符が必要
今回の条件「Season:3」のように数字を条件にする場合、
フィールドのデータ型が数値なら「=3」と囲みなしで記入可。
「'(シングルクォーテーション)」や「" "(ダブルクォーテーション)」で囲まずそのまま記述できる。
データ型が文字列の場合は、囲みが必要となる。
5. データベースにとって、数値と文字列は全く別物
数値を抽出条件(WHERE句)とする場合
数値(3):
計算可能なデータとして扱われ、裸のまま記入しても、データベースは「これは数値の3だ」と即座に理解できる。
文字列を抽出条件(WHERE句)とする場合
文字列('Season3'):
文字列の場合は必ず ' '(シングルクォーテーション)などで囲み、「ここからここまでがデータとしての文字である」という境界線をデータベースに伝えなくてはならない。
6. 「名前の境界線」と「データの境界線」も全く別物
[](角カッコ):
「フィールド名」や「テーブル名」が、予約語や命令句(SELECTなど)と混同されないための名前の境界線。
' '(引用符):
フィールドの中に入っている「具体的なテキストデータ」を示すためのデータの境界線。