IT初心者のための基本情報ではじめる SQL 入門 ~データベース分野 2


2022-10-04 更新

この連載は、これから IT の勉強をはじめる人を対象としたものです。 基本情報技術者試験の出題分野ごとに、仕組み、主要な用語、および過去問題を紹介します。 受験対策としてだけでなく、 IT の基礎知識を幅広く得るために、ぜひお読みください。

今回は、データベース 分野 その 2 として SQL を取り上げます。

SQL が必要な理由

現在主流のデータベース方式は、データを表形式で格納する関係データベースです。 Oracle Database 、 SQL Server 、 DB2 、 MySQL などの代表的な DBMS 製品が、関係データベースを採用しています。 これらの DBMS をサーバーマシンにインストールすることで、データベースを実現できます。

info_outline関係データベースを説明した前回の記事

IT 初心者のための基本情報ではじめる データベース 入門 ~データベース分野 1

ユーザーは、専用の言語で DBMS に命令を与えて、表の作成や操作などを行います。 そのための言語が、 SQL ( Structures Query Language 、構造化照会言語)です。 DBMS を使うために SQL が必要なのです。

 

SQL の仕様は、 ISO( International Organization for Standardization 、国際標準化機構)や JIS ( Japanese Industrial Standards 、日本産業規格)で標準化されています。 したがって、どの DBMS 製品を使っていても、基本的に SQL のキーワードや構文は同じです。

ここで、基本的と断っているのは、 DBMS 製品によって若干の違いがあるからです。 情報処理推進機構が公開している「試験で使用する情報技術に関する用語・プログラム言語など Ver.5.0 」では、 JIS X 3005 規格群の SQL を使うと示されています。 この規格の内容を調べる必要はありません。 基本情報技術者試験には、特定の DBMS 製品に依存しない基本的な SQL が出題されるからです。

SQL の構文と主要な命令

SQL のキーワードや構文を使って記述された文を SQL 文と呼びます。 SQL 文は、すべて「~せよ」を意味する命令文です。 C 言語、 Java 、 Python などのプログラミング言語では、複数の命令を使って処理の流れを表しますが、 SQL では、基本的に 1 つの命令で 1 つの操作を表します(複数の命令をまとめることもできます)。

試験によく出る SQL の命令

SQL の構文は、英語の命令文と同様であり、

動詞(~せよ) 目的語(~を)

の順に言葉を並べます。

命令の種類は、

  • データを定義する命令
  • データを操作する命令
  • データを制御する命令

に大きく分けられます。

以下は、試験によく出題される命令です。 基本情報技術者試験のシラバスにある「データベース言語( SQL )」にも、これらの命令が示されています。

import_contacts 試験によく出る SQL の命令

CREATE TABLE 命令
テーブル(表)を作成せよ
SELECT 命令
データを選択(検索)せよ
INSERT 命令
データを挿入(登録)せよ
UPDATE 命令
データを更新せよ
DELETE 命令
データを削除せよ

CREATE TABLE は、データを定義する命令です。
SELECT 、 INSERT 、 UPDATE 、 DELETE は、データを操作する命令です。

関係データベースは、データを表形式で格納するので、命令の対象となる目的語は、表全体や表の中にあるデータです。

SQL 文を読んでみよう

SQL 文では、動詞と目的語の他にも、前置詞や関係副詞などが使われることもあります。 単語を並べる順序は、英語の構文と同様なので、英語の命令文だと思って SQL 文を見れば、意味を読み取れるでしょう。

 

以下に、 SQL 文の例を示します。

code 検索を行う SQL 文の例

swipeSQL 文は横スクロールできます

SELECT 氏名, 給与 FROM 社員 WHERE 給与 >= 300000

lightbulb 赤色文字は、 SQL として意味が決められたキーワードや記号です。

これは、

format_quote社員表から( FROM 社員 )、
給与が300000以上という条件で( WHERE 給与 >= 300000 )、
氏名列と給与列を検索せよ( SELECT 氏名, 給与format_quote

という意味です。 SELECT は動詞、 FROM は前置詞、 WHERE は関係副詞であり、 SQL として意味が決められたキーワードです。 これらのキーワードの後に、表や列や条件などを置くことで、 1 つの SQL 文が構成されます。

SQL は、英語の大文字と小文字を区別しません。 たとえば、 SELECT という命令は、 select と記述することも、 Select と記述することもできます。

 

この SQL 文を実行すると、実行結果が表形式で得られます。 この表は、 FROM の後に指定された表から条件に一致する行を選択し、指定された列だけを取り出したものです。 たとえば、以下のような表が得られます。

検索を行う SQL 文の実行結果として得られる表の例
氏名 給与
山田太郎 320000
鈴木花子 350000
佐藤三郎 330000

SQL の過去問題

SQL の分野の過去問題を 3 問ほど紹介しましょう。

CREATE TABLE で表を作成する SQL 文 と UPDATE でデータを更新する SQL 文

最初は、表を作成する SQL 文と、データを更新する SQL 文の問題です。

表を作成する SQL 文 は、

CREATE TABLE 表名(列名 データ型, 列名 データ型, ・・・, PRIMARY KEY(列名))

という構文で表を作成します。 データ型には、CHAR(文字数)で指定する文字列型や、INTで指定する整数型などがあります。
PRIMARY KEY(列名)は、列名で指定された列が主キー(レコードを一意に識別するためのユニークなデータ)であることを設定します。

 

データを更新する SQL 文は、

UPDATE 表名 SET 列名 = 更新後の値 WHERE 条件

という構文でデータを更新します。

問 31 平成 22 年度 秋期

“商品” 表に対してデータの更新処理が正しく実行できる UPDATE 文はどれか。 ここで, “商品” 表は次の CREATE 文で定義されている。

CREATE TABLE 商品
    (商品番号 CHAR(4), 商品名 CHAR(20), 仕入先番号 CHAR(6), 単価 INT, 
    PRIMARY KEY(商品番号))
商品
商品番号 商品名 仕入先番号 単価
S001 A XX0001 18000
S002 A YY0002 20000
S003 B YY0002 35000
S004 C ZZ0003 40000
S005 C XX0001 38000

UPDATE 商品 SET 商品番号 = 'S001' WHERE 商品番号 = 'S002'

UPDATE 商品 SET 商品番号 = 'S006' WHERE 商品名 = 'C'

UPDATE 商品 SET 商品番号 = NULL WHERE 商品番号 = 'S002'

UPDATE 商品 SET 商品番号 = 'D' WHERE 商品番号 = 'S003'

問題に示された CREATE TABLE 命令の SQL 文は、

format_quote4 文字の文字列型の商品番号列、
20 文字の文字列型の商品名列、
6 文字の文字列型の仕入先番号列、
整数型の単価列を持ち、
商品番号列を主キーとして、
商品表を作成せよ format_quote

という意味です。

 

問題の選択肢に示された SQL 文は、どれも商品表を更新する内容になっています。

問題を解くポイントは、主キーが重複する結果になる更新は、許可されない( SQL 文の実行結果がエラーになる)ということです。

先ほどの CREATE TABLE 命令によって、商品表の商品番号列が主キーに設定されています。 したがって、選択肢に示された SQL 文の中で、商品番号列が重複する結果にならない更新が、正しく実行できます。

選択肢アの SQL 文

商品番号列が ‘S002’ という条件で、商品表の商品番号列を ‘S001’ に更新せよ

という意味です。 この SQL 文を実行すると、商品番号列で ‘S001’ が重複してしまうので、エラーになります。

選択肢イの SQL 文

商品名列が ‘C’ という条件で、商品表の商品番号列を ‘S006’ に更新せよ

という意味です。 この SQL 文を実行すると、商品番号列で ‘S006’ が重複してしまうので、エラーになります。

選択肢ウの SQL 文

商品番号列が ‘S002’ という条件で、商品表の商品番号列を NULL に更新せよ

という意味です。 主キーは、重複が許可されませんが、 NULL (未設定)にすることも許可されないので、この SQL 文を実行するとエラーになります。

選択肢エの SQL 文

商品番号列が ‘S003’ という条件で、商品表の商品名列を ‘D’ に更新せよ

という意味です。 主キーが重複することも、 NULL になることもないので、この SQL 文は、正しく実行できます。

したがって、正解は、選択肢エです。

SELECT と WHERE でデータを検索する SQL 文

次は、表を検索する表を検索する SQL 文の問題です。

SELECT 列名 FROM 表名 WHERE 条件

という構文でデータを検索します。

複数の列を指定する場合は、列名をカンマで区切って並べます。

問 30 平成 23 年度 特別

次の表は,営業担当者のある年度の販売実績である。 この表の第 1 期から第 4 期の販売金額の平均が 4,000 万円以上で,どの期でも 3,000 万円以上販売している営業担当者の名前を求める SQL 文として,適切なものはどれか。 ここで,金額の単位は千円とする。

swipe表は横スクロールできます

販売実績
番号 名前 第 1 期 第 2 期 第 3 期 第 4 期
123 山田一 郎 29,600 31,900 36,600 41,500
594 鈴木 太郎 43,500 45,300 30,400 46,400
612 佐藤 花子 49,600 39,400 42,300 51,100

SELECT 名前 FROM 販売実績
    WHERE (第 1 期 + 第 2 期 + 第 3 期 + 第 4 期) / 4 >= 40000 OR
          第 1 期 >= 30000 OR 第 2 期 >= 30000 OR
          第 3 期 >= 30000 OR 第 4 期 >= 30000

SELECT 名前 FROM 販売実績
    WHERE (第 1 期 + 第 2 期 + 第 3 期 + 第 4 期) >= 40000 AND
          第 1 期 >= 30000 AND 第 2 期 >= 30000 AND
          第 3 期 >= 30000 AND 第 4 期 >= 30000

SELECT 名前 FROM 販売実績
    WHERE 第 1 期 > 40000 OR 第 2 期 > 40000 OR
          第 3 期 > 40000 OR 第 4 期 > 48800 AND
          第 1 期 >= 30000 OR 第 2 期 >= 30000 OR
          第 3 期 >= 30000 OR 第 4 期 >= 30000

SELECT 名前 FROM 販売実績
    WHERE (第 1 期 + 第 2 期 + 第 3 期 + 第 4 期) >= 160000 AND
          第 1 期 >= 30000 AND 第 2 期 >= 30000 AND
          第 3 期 >= 30000 AND 第 4 第 >= 30000

選択肢に示された SQL 文は、どれも SELECT 名前 FROM 販売実績 までが同じであり、 WHERE 以降の条件が異なります。 ここでは、

第 1 期から第 4 期の販売金額の平均が 4,000 万円以上で、かつ、どの期でも 3,000 万円以上販売している

という条件に該当するものを選びます。

選択肢ア
「かつ」を意味する AND ではなく、「または」意味する OR で条件が結ばれているので、不適切です。
選択肢イ
第 1 期から第 4 期の販売金額の平均ではなく、合計が 4,000 万円以上という条件になっているので、不適切です。
選択肢ウ
第 1 期から第 4 期の販売金額の平均ではなく、それぞれの期の金額に関する条件になっているので(かなりメチャクチャな条件です)、不適切です。
選択肢エ
第 1 期から第 4 期の販売金額の合計が 16,000 万円以上という条件になっていますが、これは平均が 4,000 万円以上と同じ意味であり、かつ、どの期でも 3,000 万円以上販売しているという条件があるので、適切です。

したがって、正解は、選択肢エです。

関数を使った SQL 文

SQL には、データの合計値や平均値などを求める関数が用意されています。 最後に紹介するのは、関数を使った SQL 文の問題です。

問 28 平成 27 年度 秋期

“出庫記録” 表に対する SQL 文のうち,最も大きな値が得られるものはどれか。

出庫記録
商品番号 日付 数量
NP200 2015-10-10 3
FP233 2015-10-10 2
NP200 2015-10-11 1
FP233 2015-10-11 2

SELECT AVG(数量) FROM 出庫記録 WHERE 商品番号 = 'NP200'

SELECT COUNT(*) FROM 出庫記録

SELECT MAX(数量) FROM 出庫記録

SELECT SUM(数量) FROM 出庫記録 WHERE 日付 = '2015-10-11'
選択肢ア
AVG(数量) は、数量列の平均値を求めます。
商品番号 = 'NP200' という条件に一致する行の数量は、 3 と 1 なので、それらの平均の 2 が得られます。
選択肢イ
COUNT(*) は、検索で一致したレコード数を求めます。
ここでは、 WHERE による条件の指定がないので、出庫記録表のすべてのレコードが検索に一致し、出庫記録表のレコード数である 4 が得られます。
COUNT(*) のカッコの中の * は、列が NULL に設定されているレコードもカウントすることを意味します。 このカッコの中に特定の列名を指定すると、その列が NULL でないレコードだけがカウントされます。
選択肢ウ
MAX(数量) は、数量列の最大値を求めます。
ここでも、 WHERE による条件の指定がないので、出庫記録表のすべてのレコードの数量の最大値である 3 が得られます。
選択肢エ
SUM(数量) は、数量列の合計値を求めます。
日付 = '2015-10-11' という条件に一致する行の数量は、 1 と 2 なので、それらの合計値の 3 が得られます。

以上のことから、最も大きな値は4であり、正解は選択肢イです。

今回は「データベース」その 2 として「 SQL 」が必要な理由、 SQL の構文と主要な命令、および SQL の過去問題を紹介しました。

次回は、「ネットワーク」その 1 として「ネットワーク全般」の分野を取り上げます。

それでは、またお会いしましょう!

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