基本情報でわかる SQL 「英語だと思って日本語に訳せばわかる」


2021-12-02 更新

error

この記事は基本情報技術者試験の旧制度( 2022 年以前)の記事ですが、試験対策ではなく、技術用語を理解する上では問題ないと考えています。
試験対策としてお読みになる場合は、現在の試験制度では出題されない午後問題を一部題材にしているので、ご注意ください。

この連載では、基本情報技術者試験によく出題されるテクノロジー関連の用語を、午前問題と午後問題のセットを使って解説します。

午前問題で用語の意味や概念を知り、午後問題で技術の活用方法を知ってください。それによって、単なる丸暗記では得られない明確さで、用語を理解できるようになります。

今回のテーマは、 SQL です。

SQL とは?

はじめに、 SQL とは何かを説明しましょう。

現在主流のデータベースの形式は、データを表に格納する「関係データベース」です。関係データベースは、「 RDBMS( Relational Database Management System )」というシステムによって実現されます。

RDBMS を使うことで、関係データベースに様々な操作ができますが、そのためには、専用の言語で命令を与えなければなりません。この言語が「 SQL ( Structured Query Language 、エスキューエル)」であり、 SQL で記述された命令文を「 SQL 文」と呼びます。 RDBMS には、いくつかの製品がありますが、 SQL の構文は、どの製品でも基本的に同じです。

 

SQL を理解するコツは、「英語だと思って日本語に訳してみること」です。 SQL の構文は、英語の構文とほとんど同じだからです。

RDBMS に命令を与えるのですから、

SQL の基本構文は、英語の命令文の「動詞+目的語」

です。

この基本構文に、前置詞や関係副詞などを使って、様々な意味を追加できます。その際に使われる単語の意味も、英語の単語の意味と同じです。とにかく「 SQL は英語」なのです。

 

SQL の主な命令を紹介しましょう。表の操作には、

  • データの登録
  • 読み出し
  • 更新
  • 削除

の 4 種類があり、それぞれ、 INSERT, SELECT, UPDATE, DELETE という動詞で示されます。

日本語に訳すと、「挿入せよ(登録せよ)」「選択せよ(読み出せ)」「更新せよ」「削除せよ」です。もとの英語では難しく感じるかもしれませんが、日本語に訳せば簡単に理解できるでしょう。

図 表の操作を行う SQL の主な命令と日本語訳
SQL の命令 日本語訳
INSERT データを挿入せよ
(登録せよ)
SELECT データを選択せよ
(読み出せ)
UPDATE データを更新せよ
DELETE データを削除せよ

SQL に関する午前問題

それでは、 SQL に関する午前問題を見てみましょう。

以下は、データを読み出す SELECT 命令の問題です。選択肢を見ると、知らない構文や単語が並んでいますが、心配はいりません。「英語だ」と思って日本語に訳してみれば、意味がわかるからです。

問 28 平成 25 年度 春期 午前

“中間テスト” 表からクラスごと,教科ごとの平均点を求め,クラス名,教科名の昇順に表示する SQL 文中の a に入れるべき字句はどれか。

中間テスト (クラス名, 教科名, 学生番号, 名前, 点数)

infoSQL 文は横スクロールすると全文をご覧になれます

〔SQL 文〕

SELECT クラス名, 教科名, AVG(点数) AS 平均点
FROM 中間テスト
[   a   ]

GROUP BY クラス名, 教科名 ORDER BY クラス名, AVG(点数) 

GROUP BY クラス名, 教科名 ORDER BY クラス名, 教科名

GROUP BY クラス名, 教科名, 学生番号 ORDER BY クラス名, 教科名, 平均点

GROUP BY クラス名, 平均点 ORDER BY クラス名, 教科名

まず、aの前までの SQL 文の意味を考えてみましょう。

英語の単語を日本語に訳すと、

「 SELECT 」は「選択せよ(読み出せ)」
「 AS 」は「~として」
「 FROM 」は「~から」

です。

したがって、

SELECT クラス名, 教科名、AVG(点数) AS 平均点 FROM 中間テスト

という SQL 文は、

“中間テスト” 表から、
“クラス名”、 “教科名” 、 “AVG(点数)” を
“平均点” として、読み出せ

という意味です。「 AVG(点数) 」は、その名前と構文から「点数の平均値( AVERAGE )を求める関数だ」と予測できるでしょう。それで、バッチリ合っています。

 

次に、aの中に入る SQL 文を、選択肢の中から選んでみましょう。

aには、問題文に示された「クラスごと、教科ごと」「クラス名、教科名の昇順」を意味する SQL 文が入るはずです。

どの選択肢にも、GROUP BYORDER BYという英語があります。これらを日本語に訳すと、

GROUP BYは「~によってグループ化して」であり、
ORDER BYは「~による順序で」

です。一方が「ごと」で、もう一方が「昇順」に該当するはずですから、GROUP BYが「ごと」で、ORDER BYが「昇順」でしょう。

したがって、

「クラスごと、教科ごと」と「クラス名、教科名の昇順」は、
SQL 文でGROUP BY クラス名, 教科名ORDER BY クラス名, 教科名であり、選択肢イが適切だと判断できます。

このように、「英語だ」と思って日本語に訳してみれば、 SQL 文の意味がわかるのです!

解答

SQL に関する午後問題

今度は、 SQL に関する午後問題を見てみましょう。

基本情報技術者試験の午後問題は、午前問題の知識を架空の事例に仕立てたものです。したがって、問題を解くために必要な知識は午前問題と同じなのですが、問題の内容がより実践的になっています。

SQL 文も、それを使うまでの経緯が、問題の冒頭で説明されます。まず、この経緯を読み取ってください。

問 3 平成 27 年度 秋期 午後 問3 から抜粋

電子部品の出荷データを管理する関係データベースの運用に関する次の記述を読んで,設問 1 ~ 4 に答えよ。

 C 社は,電子部品を製造販売する会社である。

 ある期間に出荷した特定の電子部品について,製造装置の設定ミスによる不具合が発生しているおそれがあるので,顧客への連絡と出荷済みの電子部品の無償交換(回収及び再出荷。以下,リコールという)を実施することにした。

 出荷情報は,図 1 に示す表で管理されている。下線付きの項目は主キーを表す。

info表は横スクロールすると全データをご覧になれます
顧客表
顧客番号 顧客名 住所 代表電話
0181 情報電機株式会社 東京都文京区本駒込OO-A 99-9999-9999
部品表
部品番号 部品名 単価
007551 スイッチ 80
出荷表
出荷番号 顧客番号 部品番号 出荷数 出荷金額 出荷日
150412 0181 007551 400 32000 20150115
150413 0059 000890 100 48000 20150115
図 1 表の構成とデータの格納例

設問 1

リコールの対象となる電子部品の出荷先の顧客番号,顧客名, 出荷番号,出荷日,出荷数を,顧客番号の昇順に表示する。リコールの対象となる電子部品の部品番号は “007551” で,出荷日は 2015 年 1 月 10 日から 2015 年 1 月 20 日までである。次の SQL 文のaに入れる正しい答えを,解答群の中から選べ。

SELECT 顧客表.顧客番号, 顧客表.顧客名,
       出荷表.出荷番号, 出荷表.出荷日, 出荷表.出荷数
  FROM 顧客表, 出荷表
  WHERE 出荷表.顧客番号 = 顧客表.顧客番号 AND
        出荷表.部品番号 = '007551' AND
        [   a   ]
  ORDER BY 顧客表.顧客番号

解答群

ア  出荷表.出荷日 =  ‘20150110’ OR 出荷表.出荷日 = ‘20150120’
イ  出荷表.出荷日 = ANY  (‘20150110’, ‘20150120')
ウ  出荷表.出荷日 BETWEEN '20150110' AND '20150120'
エ  出荷表.出荷日 IN (‘20150110’, ‘20150120')

部品の不具合があってリコールを実施するということです。それでは、設問を見てみましょう。

リコールの対象となる電子部品の出荷先の
顧客番号、顧客名、出荷番号、出荷日、出荷数を、
顧客番号の昇順に表示する

に対応する SQL 文を作ることがテーマです。

そして、リコールの対象となる電子部品の条件が

部品番号は “007551” で、
出荷日は 2015 年 1 月 10 日から 2015 年 1 月 20 日までである

ということも示されています。

SQL 文の「英語」を、これらの「日本語」の文章に対応付ければ、aに入る正しい答えがわかります。

 

SELECT 顧客表.顧客番号, 顧客表.顧客名, 出荷表.出荷番号, 出荷表.出荷日, 出荷表.出荷数
  /* 中略 */
  ORDER BY 顧客表.顧客番号

は、

顧客番号、顧客名、出荷番号、出荷日、出荷数を、
顧客番号の昇順に表示する

に該当します。FROM 顧客表, 出荷番号は、データを取り出す表を指定しているだけなので、気にする必要はありません。ポイントは、WHEREの後の部分です。

  WHERE 出荷表.顧客番号 = 顧客表.顧客番号 AND
        出荷表.部品番号 = '007551' AND
        [   a   ]

「 WHERE 」は、「~であるところの」という意味の「関係副詞」です。 SQL 文では、WHEREの後に条件を指定します。

条件は、「~かつ」を意味するANDでつながれて 3 つあります。

出荷表.顧客番号 = 顧客表.顧客番号

looks_one「出荷表の顧客番号と顧客表の顧客番号を結び付ける」という意味であり、複数の表(ここでは、顧客表と出荷表)からデータを取り出すときのお決まりの条件です。

出荷表.部品番号 = '007551'

looks_two

部品番号は “007551” で

という条件に該当します。

[   a   ]

looks_3したがって、残ったaは、

出荷日は 2015 年 1 月 10 日から 2015 年 1 月 20 日まで

に該当します。

 

解答群に示された SQL 文を日本語に訳して、

出荷日は 2015 年 1 月 10 日から 2015 年 1 月 20 日まで

に該当するものを選んでみましょう。

選択肢ア

出荷表.出荷日 = '20150110' OR 出荷表.出荷日 = '20150120'

ORが「または」という意味なので、
「出荷表の出荷日が 2015 年 1 月 10 日、または、 出荷表の出荷日が 2015 年 1 月 20 日」であり、「~から・・・まで」ではありません

選択肢イ

出荷表.出荷日 = ANY ('20150110', '20150120')

ANYが「いずれか」という意味なので、
「出荷表の出荷日が 2015 年 1 月 10 日、 2015 年 1 月 20 日のいずれか」であり、「~から・・・まで」ではありません

選択肢ウ

出荷表.出荷日 BETWEEN '20150110' AND '20150120'

BETWEEN ~ AND ・・・が「~から・・・まで」という意味なので、
「出荷表の出荷日が 2015 年 1 月 10 日から 2015 年 1 月 20 日まで」にピッタリ該当します

したがって、選択肢ウが正解です

念のため、選択肢エも見ておきましょう。

選択肢エ

出荷表.出荷日 IN  ('20150110', '20150120')

INが「~の中にある」という意味なので、
「出荷表の出荷日が 2015 年 1 月 10 日、 2015 年 1 月 20 日の中にある」であり、「~から・・・まで」ではありません。

解答

いかがでしたか? 「英語だと思って日本語に訳してみること」で、 SQL 文の読み方が「わかった」でしょう。

今後の試験対策としては、まず、教材(きっと何らかの試験対策教材をお持ちですね)に示された SQL の構文に、一通り目を通してください。 SQL 文の英語を日本語に訳して意味を理解できれば、構文を暗記する必要はありません。

その上で、できるだけ多くの過去問題を解いてください。問題を解くときも、 SQL 文の英語を日本語に訳して意味を考えてください。

もしも、知らない英単語に遭遇したら、英和辞典で意味を調べてください。そうすれば、きっと SQL 文の意味がわかるはずです。

最後にもう一度だけ言います。  SQL 文は英語 です。それでは、またお会いしましょう!

label 関連タグ
科目A試験は、
免除できます。
独習ゼミで科目A試験を1年間免除して、科目B試験だけに集中しましょう。
免除試験を受けた 74.9% の方が、
科目A免除資格を得ています。
科目A免除試験 最大 2 回の
受験チャンス !
info_outline
科目A免除試験 最大 2 回の
受験チャンス !
詳しく見てみるplay_circle_filled
label これまでの『基本情報でわかるテクノロジー』の連載一覧 label 著者