SQLの基本構文
経営情報システム 第15回
「企業の経営課題を解決へと導くために日々学習を進めるあなた」。動画はこんな語りかけから始まります。このページでは動画の流れにそって、SELECT文の基本形(射影・選択・結合)、ORDER BYの昇順と降順、5つの演算子(異なる、BETWEEN、IS NULL、LIKE、UNION)をまとめました。まず動画を聞いて、あとからここで復習するのがおすすめです。
暗記より「結果のイメージ」を持とう
「企業の経営課題を解決へと導くために日々学習を進めるあなた」。動画はこう語りかけて、診断士1次試験のなかでも苦手意識を持つ方が多い情報処理の分野、とくにRDB(リレーショナルデータベース)を操作する標準的な言語SQLを掘り下げます。
最初に強調されるのは、いちばん大切にしてほしい目標です。単に暗記するのではなく、簡単なSQL文を実行したとき、どんなデータが抽出されるのかを理解すること。基本的な文の意味と、実行した結果のイメージを頭の中で押さえておく。これが今回の学習の最大の目的だと言います。
データベースには、検索のほかに新規登録、削除、更新といった操作ができます。その操作に使う言語がデータ操作言語で、動画は代表としてSELECTとORDER BYを取り上げます。
補足:動画では「代表的な2つ」と並べていますが、ORDER BYは独立した文ではなく、SELECT文の最後に付ける句です。PostgreSQLのSELECT文の書式でも、ORDER BYはSELECT文の書式の一部として示されています。
このページでは、動画の説明を自作の小さな表で確かめながら進めます。使うのは次の商品表と、仕入先表(北商事=札幌、南産業=福岡の2行)です。結果は実際にSQLiteで実行して確認しました。仕入先が空のところはNULLと書いてあります。
| 商品コード | 単価 | 仕入先 |
|---|---|---|
| 01A | 120 | 北商事 |
| 02B | 200 | 北商事 |
| 03B | 150 | NULL |
| 04A | 450 | 南産業 |
| 05C | 220 | NULL |
| 06B | 180 | 南産業 |
SELECT文の基本形は3つの部品
基本の形はSELECT 列名 FROM 表名 WHERE 条件です。長い呪文のように見えますが、動画は、1つずつ役割を分解するとすごくシンプルだと言います。
- SELECT 列名:どの列を選ぶかを指定します。専門用語では射影です。複数の列はカンマで区切ります。
- FROM 表名:どの表を選ぶかを指定します。複数の表もカンマで区切ります。
- WHERE 条件:どの行を選ぶかを指定します。専門用語では選択です。
射影と選択:縦と横で切り出す
聞き手の整理がわかりやすいので、そのまま使いましょう。大きな表があったとき、縦のラインを切り取るのが射影、横のラインを条件に合わせて抜き出すのが選択です。縦と横をクロスさせて、欲しいデータだけを切り出す感覚だと動画は言います。
商品表で試します。SELECT 商品コード, 単価 FROM 商品表 WHERE 単価 >= 200を実行すると、列は2つ(商品コードと単価)に、行は単価が200以上の3つに絞られます。
| 商品コード | 単価 |
|---|---|
| 02B | 200 |
| 04A | 450 |
| 05C | 220 |
補足:射影・選択・結合は、リレーショナルデータベースの関係演算の用語です。IPAの基本情報技術者試験シラバス(Ver.9.2)にも「関係演算(選択,射影,結合,商,直積)」と載っています。
大きな表の縦のラインを切り取るのが射影で、横のラインを条件に合わせて抜き出すのが選択、というイメージですね。
そのとおりです。縦と横をクロスさせて、欲しいデータだけを切り出す感覚ですね。
WHEREの条件で、表と表を結合する
動画は、WHEREの条件にはもう1つ重要な機能が隠れていると言います。条件をイコールで結ぶことで、別々の表のデータを関連付けて、1つの大きな表のように扱えます。これが結合で、「これも試験で問われる大事なポイント」とされています。
たとえばSELECT 商品表.商品コード, 仕入先表.所在地 FROM 商品表, 仕入先表 WHERE 商品表.仕入先 = 仕入先表.仕入先と書くと、仕入先が一致する行どうしが横につながり、4行の結果になります。01Aと02Bは札幌、04Aと06Bは福岡です。仕入先がNULLの2行は一致する相手がないので出てきません。
補足:FROMに表を2つ並べると、PostgreSQLの説明では、まず行の全組み合わせ(直積)ができ、表がN行とM行ならN×M行になります。この例ならWHEREを書かないと6×2=12行です。WHEREの結合条件は、その12行から相手が合う行だけを残すはたらきをします。なお結合はJOIN ... ON 条件という書き方でも表せます。動画で扱うのは、WHEREでイコールを使う書き方です。
ORDER BY:昇順・降順と、書かなかったとき
抽出したデータがバラバラの順に並んでいては見にくい。そこで登場するのがORDER BY 列名で、指定した列を基準に並べ替えます。並べ替えの方向を示す用語は2つです。
- ASC:昇順。小さい方から大きい方へ。
- DESC:降順。大きい方から小さい方へ。
動画が「試験でめちゃくちゃ狙われやすい」と言うのは、ASCもDESCも何も書いていない場合です。エラーにはならず、自動的に昇順で処理されます。デフォルトが昇順になっていることは、絶対に間違えないようにと念押しされます。
商品表でSELECT 商品コード, 単価 FROM 商品表 WHERE 単価 >= 150 ORDER BY 単価 DESCとすると、04A(450)、05C(220)、02B(200)、06B(180)、03B(150)の順です。DESCを外すかASCにすると、150から450へ逆向きに並びます。
補足:ここでの「何も書かない」は、ORDER BYの列名の後ろのASC・DESCを省略した場合です。PostgreSQLの説明にも「ASC order is the default」とあります。一方、ORDER BYそのものを書かなかったときは、行が返ってくる順序は決まっていません。説明には、その順序をあてにしてはいけないと書かれています。
ASCもDESCも書いていないとき、エラーになってしまうのでしょうか。
エラーではなく、自動的に昇順で処理されます。何も書かなければ昇順、これは試験でも狙われやすいところです。
条件に使う「5つの演算子」
ここから動画は、どんな操作をするかを細かく指示する5つの演算子を、1つずつ丁寧に確認します。聞き流しでも記憶に定着するように、という進め方です。まず全体を表にします。
| 書き方 | 動画の説明 |
|---|---|
| X ≠ Y(ノットイコール) | XとYが異なるデータ |
| 列 BETWEEN X AND Y | X以上Y以下のデータ |
| 列 IS NOT NULL | 空白でないデータ(空白は IS NULL) |
| 列 LIKE '%B' | 〇〇Bというデータ |
| UNION | 複数の結果を1つに統合 |
補足:動画は5つとも「演算子」と呼んでいますが、BETWEEN・IS NULLは、PostgreSQLの説明では演算子のようにふるまう比較述語(SQL標準で決まった特別な書き方)です。LIKEは、PostgreSQLの説明ではパターンマッチングの構文として別に扱われています。UNIONだけは条件ではなく、2つのSELECT文の結果を合わせる集合演算にあたります。以下では前の4つを「条件の書き方」、UNIONを「結果の合わせ方」として見ていきます。
異なる(≠)とBETWEEN:範囲を指定する
1つ目は、XとYが異なるデータを抽出するものです。動画の聞き手は「一致しないものを弾き出す感じ」と受け止めています。補足として、SQLでの書き方を確認します。字幕からはスライドの表記が分からないためです。PostgreSQLの説明では、<>が標準SQLの「等しくない」の書き方で、!=はその別名です。
2つ目のBETWEEN X AND Yは、X以上Y以下のデータを抽出します。動画は論理的な深掘りとして、これはZ >= X AND Z <= Y(ZがX以上、かつY以下)と全く同じ意味だと説明します。BETWEENのほうがすっきり書けます。試験では、この2つが同じ意味だと問われることがある、とのことです。
商品表ではWHERE 単価 BETWEEN 150 AND 220で、150と220ちょうどの行も含め、03B(150)、06B(180)、02B(200)、05C(220)の4行が出ます。単価 >= 150 AND 単価 <= 220と書いても同じ4行でした。
補足:PostgreSQLの説明でも、BETWEENは両端の値を範囲に含みます。ただしXとYの順に注意が必要で、2 BETWEEN 3 AND 1は偽(f)になります。小さい方を先に書きます。
IS NULL:「空白」ではなく「値がない」
3つ目は列 IS NOT NULLです。動画はNULLを「何もない空白」と説明し、空白でないデータを抽出するものだと言います。逆に空白のものだけを探したいときは列 IS NULLとします。データがちゃんと入っているか、抜けているかを確認するときに便利、という話です。
補足(動画の単純化の訂正):NULLは文字どおりの空白ではありません。MySQLの説明では、NULLは「a missing unknown value(欠けている不明な値)」を表し、0や空文字列は値だとされています。つまり、空文字列が入っている列はIS NULLにあたりません。PostgreSQLの説明でも、NULLは不明な値で、= NULLとは書かずIS NULLを使います。
商品表では、WHERE 仕入先 IS NULLで03Bと05Cの2行、IS NOT NULLで残りの4行が出ます。WHERE 仕入先 = ''(空文字列と等しい)は0行でした。
さらに、WHERE 仕入先 <> '北商事'の結果は04Aと06Bの2行だけです。仕入先がNULLの2行は、北商事かどうかも不明なので結果に入りません。PostgreSQLの説明では、入力のどちらかがNULLの比較は、真でも偽でもなくNULLを返すとされています。
空白でないものを探すのが IS NOT NULL でした。逆に空白のものだけを見つけたいときは、どう書くのですか。
その場合は IS NULL とします。これで空白のデータを抽出できます。
LIKE:「〇〇B」のあいまい検索
4つ目は列 LIKE '%B'で、〇〇Bというデータを抽出します。%が〇〇に相当し、0文字も含めて何文字でもOKという意味です。前が1文字でも10文字でも、極端な話、前に何もなくてBだけでも、最後がBで終わっていれば何でもよい。曖昧な条件で検索したいときに強力な演算子、と動画は言います。
商品表でWHERE 商品コード LIKE '%B'とすると、末尾がBの02B、03B、06Bの3行が出ます。
補足:PostgreSQLの説明では、%は0文字以上の任意の文字列に、_(アンダースコア)は任意の1文字に一致します。また、LIKEは文字列の全体に一致させます。途中に出てくるかを調べたいなら、前後を%で挟みます。
UNION:2つの結果を縦に積む
最後の5つ目はUNIONで、複数の検索結果を統合して1つの結果にします。書き方は、普通のSELECT文、次の行にUNION、その次の行にまたSELECT文です。上のSELECT文の結果と下のSELECT文の結果を、UNIONが挟んで1つに統合します。動画は「縦にガチャンコとくっつけるイメージ」と言い、WHEREで表を結合するのは横につなぐイメージ、UNIONは縦に積むイメージだと対比します。
例:SELECT 商品コード FROM 商品表 WHERE 仕入先 = '北商事' UNION SELECT 商品コード FROM 商品表 WHERE 単価 >= 200。上は01Aと02B、下は02B、04A、05Cです。合わせると01A、02B、04A、05Cの4つで、重なった02Bは1つにまとまります。
補足:PostgreSQLの説明では、UNIONは重複した行を取り除きます。重複を残したいときはUNION ALLとし、上の例なら02Bが2回出て5行になります。また、2つのSELECT文は、列の数が同じで、対応する列のデータ型が互換でなければなりません。行の並び順も決まっていないので、並べたいときは最後にORDER BYを付けます。
WHEREの条件でイコールを使って表を結合するのとは、また違ったくっつけ方ですね。
そうなんです。あちらは横につなぐイメージ、UNIONは縦に積むイメージです。実行結果のイメージを持つことが大事ですね。
まとめ
動画の整理
SELECT 列名 FROM 表名 WHERE 条件:列を選ぶのが射影、行を選ぶのが選択。- WHEREの条件をイコールで結ぶと、表と表を結合できる(動画は試験で問われると言います)。
ORDER BY 列名:ASCが昇順、DESCが降順。何も書かなければ昇順。- 5つの演算子:異なるデータ、BETWEEN(X以上Y以下。
>= AND <=と同じ意味)、IS NOT NULL(動画では空白でない)、LIKE(%Bは0文字以上+B)、UNION(結果を縦に統合)。
補足:動画とあわせて確認したい点(出典つき)
- ORDER BYはSELECT文の句。ORDER BY自体を書かないと、行の順序は決まっていない。
- NULLは空白や空文字列ではなく「値がない(不明)」。判定は IS NULL を使い、
= NULLは使わない。 - UNIONは重複を除く。残すなら UNION ALL。列の数と型をそろえる。
- 「等しくない」は標準SQLでは
<>。!=は別名。
動画の最後は、こんな問いかけで終わります。「複雑に絡み合った膨大な情報の海から、あなたならどんな新しい関係性や意味を抽出してみたいですか」。コンサルタントとして、データをどう料理するかが一番の見せどころだから、文字面だけを追うのではなく、データがどう動いて最終的にどんな形で手元に残るのかを意識してほしい、というメッセージです。ぜひご自身のビジネスの現場を想像しながら、考えてみてください。
動画で聞く
続けて読む
- 第10回 プログラミング言語の正体経営情報システム・ソフトウェア 003
- 第11回 ファイル分類と文字コード経営情報システム・ソフトウェア 004
- 第12回 プログラム実行の流れとWeb技術経営情報システム・ソフトウェア 005
- 第13回 OSSライセンスとコピーレフト経営情報システム・ソフトウェア 006
- 第14回 データベースの正規化経営情報システム・データベース 001
- 第16回 データパニックを防ぐDBMSの仕組み(別バージョン)経営情報システム・データベース 003
- 第17回 爆速アプリを支えるDBの正体経営情報システム・データベース 004
- 第18回 DWHとデータ分析のアーキテクチャ経営情報システム・データベース 005
- 第19回 OSI7階層とTCP/IP経営情報システム・ネットワーク 001
- 第20回 TCP/IP 4階層とプロトコルのリレー経営情報システム・ネットワーク 002
- 経営情報システムのWebテキスト一覧同じ科目の48本を一覧・検索
- 中小企業診断士 1次の講座トップ科目別プレイリスト・人気の講義・ファイナルペーパー

