【初級編⑫】なんとなく書いていたSQLのSELECT文を根本から理解する(1/2)

「プログラムは得意だけどSQLがニガテ」なんてことを言う人をたまに見かけます。SQLがニガテというか、SELECT文がニガテな人が多いようです。確かに.NETなどのプログラムは、基本的に一行ずつ処理が実行されるので処理結果を確認しやすいですが、SQLはSELECTやWHERE等指定した命令が組み合わさった最終結果しか見えないので、途中経過は頭の中でイメージしないといけません。

この処理の途中経過を頭の中でイメージできるようになれば、すぐにSQLは得意!と言えるようになると思います。

SELECT文の処理を理解する為には、Excelでデータを加工する手順が非常に分かりやすいです。Excelの操作ならほとんどの方ができると思いますので、今回はExcelの操作を例にSELECT文が実行される様子を説明したいと思います。

SELECT文 = Excelでデータ加工

SELECT文が実行される仕組みは、Excelの表を加工することとほぼ同じだと思って下さい。大量にレコードのある表から、目的のレコード(結果)を抽出する手順はだいたい次のようになると思います。

<Excelで表を加工する手順>
手順 内容
対象の表が存在するシートを選択する
オートフィルタを使用して絞り込む
不要な列を非表示にする
不足している列を付け足す
並び替える

今回は、次の図のようなExcelの表の加工をしてみたいと思います。これまで使用してきた社員マスタがあって、その中から「女性社員の年収を求めて、その年収の昇順に並べたリスト」を作ります。

Excel表の加工

Excelの操作

それでは社員マスタ全件をExcelに貼り付けたとして、作業を進めていきます。

①対象の表が存在するシートを選択する

Excelの操作は、まず①対象の表が存在するシートを選択する、を行います。実はこれも立派な処理です。人間が操作する場合は、まずExcelファイルそのものを選んで、次にシートを選ぶという操作をしていますよね。

シートを選択する

②オートフィルタを使用して絞り込む

次は、オートフィルタを使用してレコードを絞り込みます。ここでは、「性別が女性」という条件でレコードを絞り込みますので、「性別」列に対して[女]でオートフィルタをかけます。そうすると、レコードが2行だけになりました。

オートフィルタ

③不要な列を非表示にする

次に、「年齢」と「生年月日」列は不要なので非表示にします。ここではあえて削除はしていないのですが、削除をしてしまうと、それはデータベースではテーブルのスキーマを変更(列を削除)することになるからです。それでは、「年齢」「生年月日」「部署コード」列を非表示にします。

不要な列を非表示

④不足している列を付け足す

年収を求めたいので、年収を表示する列を新たに追加します。年収の値は「給料*12」で求めます。Excelの操作では、普通は先に列を追加して関数を入力して、オートフィルしてからレコードを絞り込みますが、今回はSQLの説明ですのでちょっと手順が違います。

ExcelのH1セルに[年収]と見出しをつけ、H4セルに[=F4 * 12]と関数を入力します。そして、H4セルを下にオートフィルすれば、H7セルにも給料*12の値がセットされます。

不足している列を追加

⑤並び替える

最後に「年収」の昇順で並び替えます。表の範囲を選択した上で「並び替え」から「年収」の昇順で並び替えをすると完成します。

「年収」列の昇順で並び替え

これが、Excelで表を加工する際の手順になります。ほとんどの方が違和感なくこの操作をされているのではないでしょうか。実はSQLも、動作原理はこれとほぼ同じなんです。






SQLの動作

上で行ったExcelの操作をSQLで実行した場合の、SQLの動作を順番に当てはめながら説明していきます。ここからはSQL Server Management Studioを使用します。

最初に、完成形のSELECT文からお見せします。上のExcelで行った操作をSELECT文にすると次のようになります。

SELECT 社員番号, 名前, 性別, 給料, 給料 * 12 AS '年収'
FROM Table_Syain
WHERE 性別 = '女'
ORDER BY 年収

完成形のSQL

このSELECT文の意味が分からない人は、先に【初級編⑥】SELECT文の基本的な構文をご覧になった方がいいです。

それでは、①から順番に進めていきます。

①対象の表が存在するシートを選択する

Excelでは対象の表が存在するシートを選択する場合、普通にマウスでクリックしていました。これがSELECT文だとFROM句にあたります。FROM句の後ろにテーブル名を書くことで、SELECT文を実行するテーブルを指定することになります。

SELECT *
FROM Table_Syain

FROM句

②オートフィルタを使用して絞り込む

Excelの操作では、「性別」が[女性]であるレコードだけを絞り込みました。これがSELECT文だとWHERE句にあたります。WHERE句の後ろに条件を書くことで、条件に該当するレコードだけに絞り込まれます。

SELECT *
FROM Table_Syain
WHERE 性別 = '女'

WHERE句

③不要な列を非表示にする

Excelの操作では、不要な列は非表示にしていました。これがSELECT文だと考え方は反対で、表示(選択)したい列だけをSELECT句に書くことになります。表示したくない列は書かないということになります。

SELECT 社員番号, 名前, 性別, 給料
FROM Table_Syain
WHERE 性別 = '女'

SELECT句

④不足している列を付け足す

Excelの操作だと、不足している列は表示させたいセルに直接入力しました。これがSELECT文だと、③のところでも表示させたい列はSELECT句に書いたように、もともとテーブルに存在しない列(自作列)でも、SELECT句に書けば表示されるようになります。

SELECT 社員番号, 名前, 性別, 給料
FROM Table_Syain
WHERE 性別 = '女'

SELECT句に直接書く

⑤並び替える

Excelの操作だと、並び替えたいセル範囲を選択して、Excelの「並び替え機能」を使って並び替えました。これがSELECT文だと、ORDER BY句に並び替えのキーとなる列名を書くことで並び替えがされます。

SELECT 社員番号, 名前, 性別, 給料, 給料 * 12 AS '年収'
FROM Table_Syain
WHERE 性別 = '女'
ORDER BY 年収

SELECT句に直接書く

どうでしょうか?SELECT文の挙動が、Excelで表を加工することと殆ど同じであることが分かっていただけたかと思います。結局データベースのテーブルも、Excelと同じ「表」なんです。その表の加工の仕方は結局Excelを加工するのと殆ど同じで、手動でマウス操作をしていた一つ一つの操作が、SQLでは個別に命令文が用意されているというだけの話なんです。

Excelで表を加工する際の手順と、SELECT文でそれに対応する箇所を纏めます。

<Excelで表を加工する手順とSELECT文でそれに対応する箇所>
手順 Excelでの操作 対応するSELECT文の箇所
対象の表が存在するシートを選択する FROM句にテーブル名を指定する
オートフィルタを使用して絞り込む WHERE句で抽出条件を指定する
不要な列を非表示にする SELECT句に表示する列だけ記述する
不足している列を付け足す SELECT句に表示したい列を直接記述する
並び替える ORDER BY句に並び替えたい列を指定する

この記事と関連性の高い記事