派遣で働くエンジニアのスキルアップを応援するサイト

PRODUCED BY RECRUIT

SQL学びの入り口:画面を見てイメージを掴んでみよう #02

全3回で「SQL学びの入り口」を目指す本連載。今回は、学習に先立ち、SQLとはどのようなものなのか、実際の画面を見てみることにしましょう。

  1. ここから始める2つのQ&A
  2. 眺めることが自習の入り口?
  3. 自習で苦戦。そんなときは?

基本のSELECT文

例えばこんなデータがあったとします。それぞれ「生徒マスター」テーブル、「選択コース」テーブルと呼びます。

《生徒マスター》

《選択コース》

■データを取り出してみる

SQLでデータを取得するときに使う構文をSELECT文といいます。

例えば、生徒マスターから氏名を取得しよう、という場合は、

SELECT 氏名 FROM 生徒マスター;

のように書きます。

生徒・氏名・校舎すべてであれば、

SELECT * FROM 生徒マスター;

と書きます。


▲無愛想な画面で恐縮ですが、実行画面です。自分のパソコンでSQLを試す方法については第3回でご紹介します。

■条件を加えてみる

「新宿校舎の生徒」を取り出してみましょう。先ほどのSELECT文に以下を追加します。

WHERE 校舎='新宿'

WHERE ~では、さまざまな条件を組み合わせることができます。また、SELECTの結果には校舎がありませんが、校舎で絞り込まれていることにも注目してください。

ここでは文法や単語の意味を書いていませんが、何を指定しているかなんとなくわかるのではと思います。

これがSQLのSELECT文です。そしてこのSELECT文が学ぶべきSQLのほぼすべてです。

テーブルを組み合わせる

選択コースの方も見てみましょう。 SELECT * FROM 選択コース;です。同じですね。

選択コースには生徒番号がありますが、氏名がありません。生徒番号と氏名は生徒マスターで管理しているからです。

ですが、例えば選択コースをプリントアウトしたら「番号だけじゃわからないよ、名前も欲しいよ」と言われるに違いありません。

Excelで関数を使える人ならVLOOKUPやXLOOKUPを使いたくなる場面ですが、SQLの場合は「テーブルとテーブルを結びつける(join)」と考えます。

具体的には、次のように書きます。ちょっと長くなるので、読みやすくするために改行を入れました。

SELECT * FROM 選択コース
JOIN 生徒マスター
ON 選択コース.生徒番号 = 生徒マスター.生徒番号;

JOINの行で、結びつける相手(ここでは生徒マスター)を指定しています。ONの行で結びつけ方を指定しています。生徒番号が一致している、という指定です。

SELECTの後ろが*なので、選択コースの生徒番号とコース、生徒マスターの生徒番号と氏名と校舎が出てきてしまいました。コースと生徒番号と氏名だけになるように指定してみましょう。

SELECT
選択コース.コース,
生徒マスター.生徒番号,
生徒マスター.氏名
FROM 選択コース
JOIN 生徒マスター
ON 選択コース.生徒番号 = 生徒マスター.生徒番号;

■条件を加えてみる

「新宿校舎の生徒」に限定してみましょう。WHERE 校舎='新宿'です。

SELECT
選択コース.コース,
生徒マスター.生徒番号,
生徒マスター.氏名
FROM 選択コース
JOIN 生徒マスター
ON 選択コース.生徒番号 = 生徒マスター.生徒番号
WHERE 校舎='新宿';

■並べ替えてみる

コース順に並べ替えてみましょう。
ORDER BY コースを追加します。

SELECT
選択コース.コース,
生徒マスター.生徒番号,
生徒マスター.氏名
FROM 選択コース
JOIN 生徒マスター
ON 選択コース.生徒番号 = 生徒マスター.生徒番号
WHERE 校舎='新宿'
ORDER BY コース;

自分が欲しい物を“どんどん指定していく”イメージが掴めたのではないでしょうか。このように、データベースに対してデータを要求するSQL文を「クエリ(問い合わせ)」と呼びます。

件数を数える

SELECT文でデータを集計することができます。ここではコース毎の件数を数えていますが、例えば、テストの点数や商品の在庫数を保存しているテーブルであれば、平均や合計を出すこともできます。

SELECT
コース,
COUNT(*) AS 人数
FROM 選択コース
GROUP BY コース;

おまけ:繰り返しデータを非表示にする

最後に少しだけ“おまけ”です。ご興味ある方はご覧ください。

選択コース、生徒番号、氏名を選択コース順に並べたとき、国語、国語、国語……と並んでしまうのを1回だけ表示するようにしてみました。

データとしては「国語 C0001、谷内 ミケ」、「国語 C0003、北川 ジョン」それぞれの組み合わせに意味があるので、各行に「国語」が出るのが“正しい”のですが、見やすくするために加工した形で取り出すこともできる、というサンプルです。

SELECT
    CASE
        WHEN 選択コース.コース = LAG(選択コース.コース)
             OVER (ORDER BY 選択コース.コース)
        THEN ""
        ELSE 選択コース.コース
    END AS 選択コース,
    生徒マスター.生徒番号,
    生徒マスター.氏名
FROM 生徒マスター
JOIN 選択コース ON 生徒マスター.生徒番号 = 選択コース.生徒番号
ORDER BY 選択コース.コース;

これはあくまで、やろうと思えばこんなこともできるというもので、いきなり挑戦する必要はありません(データベースシステムによっては、そもそも対応していない可能性があります。第3回参照)。興味がある方は、「SQL ウィンドウ関数」というキーワードで検索してみてください。

次のステップは、具体的な自習方法を知ること

次回は、どのように独学を進めるといいのか、具体的な方法をご紹介します。

>> 次のステップはこちら

▼SQL学びの入り口

  1. ここから始める2つのQ&A
  2. 眺めることが自習の入り口?
  3. 自習で苦戦。そんなときは?
【著者】西村 めぐみ さん
1990年代、生産管理ソフトウェアの開発およびサポート業務/セミナー講師を担当。その後、書籍および雑誌での執筆、PCおよびMicrosoft Officeのeラーニング教材作成/指導、新人教育にも携わる。主な著書は『シェルの基本テクニック』(IDGジャパン)、『基本がわかるSQL入門 データベース&設計の基礎から楽しく学ぶ』『Accessではじめるデータベース超入門』 『Linux+コマンド入門 ——シェルとコマンドライン、基本の力』 (技術評論社)など。

※本記事に記載されている会社名、製品名はそれぞれ各社の商標および登録商標です。